function* computeConcentrations(
{
numExecutions,
numIterations,
numCells,
activatorDiffusion,
activatorRemovalRate,
activatorProductionRate,
inhibitorDiffusion,
inhibitorRemovalRate,
substanceCDiffusion,
substanceCRemovalRate,
autocatalysisSaturation,
hormoneLife,
inhibitorConstant,
boundary = "tight"
},
{ activatorX, inhibitorX, substanceCX, sourceDensity }
) {
const dac = 1 - activatorRemovalRate - 2 * activatorDiffusion;
let dbc = 1 - inhibitorRemovalRate - 2 * inhibitorDiffusion;
let hormoneConcentration = 0.5;
let lifeOfInhibitor = 0;
for (let i = 0; i <= numExecutions; i++) {
for (let j = 0; j <= numIterations; j++) {
let activatorLeftCell = activatorX[numCells],
inhibitorLeftCell = inhibitorX[numCells],
substanceCLeftCell = substanceCX[numCells];
activatorX[numCells + 1] = activatorX[1];
inhibitorX[numCells + 1] = inhibitorX[1];
substanceCX[numCells + 1] = substanceCX[1];
let bsa = 0;
for (let k = 0; k <= numCells; k++) {
const activatorConcentration = activatorX[k],
inhibitorConcentration = inhibitorX[k],
substanceCConcentration = substanceCX[k];
const saturatingSelfReinforcement =
sourceDensity[k] *
((activatorConcentration * activatorConcentration) /
(1 +
autocatalysisSaturation *
activatorConcentration *
activatorConcentration) +
0.0000001);
const activatorExchangeWithNeighbor =
activatorDiffusion * (activatorLeftCell + activatorX[k + 1]) +
saturatingSelfReinforcement /
(inhibitorConstant + inhibitorConcentration);
const inhibitorExchangeWithNeighbor =
inhibitorDiffusion * (inhibitorLeftCell + inhibitorX[k + 1]) +
saturatingSelfReinforcement;
activatorX[k] =
activatorConcentration * dac + activatorExchangeWithNeighbor;
inhibitorX[k] =
inhibitorConcentration * dbc + inhibitorExchangeWithNeighbor;
bsa = bsa + hormoneLife * activatorConcentration;
if (substanceCRemovalRate > 0) {
substanceCX[k] =
substanceCConcentration +
substanceCRemovalRate * activatorConcentration -
substanceCRemovalRate * substanceCConcentration +
substanceCDiffusion *
(substanceCLeftCell -
substanceCConcentration +
(substanceCX[k + 1] - substanceCConcentration));
}
activatorLeftCell = activatorConcentration;
inhibitorLeftCell = inhibitorConcentration;
substanceCLeftCell = substanceCConcentration;
}
hormoneConcentration =
hormoneConcentration * (1 - hormoneLife) + bsa / numCells;
lifeOfInhibitor = inhibitorRemovalRate / hormoneConcentration;
dbc = 1 - 2 * inhibitorDiffusion - lifeOfInhibitor;
}
yield {
i,
activatorX,
inhibitorX,
substanceCX
};
}
return true;
}