void VolumeTrackingModifier<DIM>::UpdateCellData(AbstractCellPopulation<DIM,DIM>& rCellPopulation) { // Make sure the cell population is updated rCellPopulation.Update(); /** * This hack is needed because in the case of a MeshBasedCellPopulation in which * multiple cell divisions have occurred over one time step, the Voronoi tessellation * (while existing) is out-of-date. Thus, if we did not regenerate the Voronoi * tessellation here, an assertion may trip as we try to access a Voronoi element * whose index exceeds the number of elements in the out-of-date tessellation. * * \todo work out how to properly fix this (#1986) */ if (bool(dynamic_cast<MeshBasedCellPopulation<DIM>*>(&rCellPopulation))) { static_cast<MeshBasedCellPopulation<DIM>*>(&(rCellPopulation))->CreateVoronoiTessellation(); } // Iterate over cell population for (typename AbstractCellPopulation<DIM>::Iterator cell_iter = rCellPopulation.Begin(); cell_iter != rCellPopulation.End(); ++cell_iter) { // Get the volume of this cell double cell_volume = rCellPopulation.GetVolumeOfCell(*cell_iter); // Store the cell's volume in CellData cell_iter->GetCellData()->SetItem("volume", cell_volume); } }
/* * Next, we define the {{{UpdateCellData()}}} method itself. This is a helper * method that computes the height (y coordinate) of each cell in the population * and stores this in the {{{CellData}}} property. */ void UpdateCellData(AbstractCellPopulation<2,2>& rCellPopulation) { /* * We begin by calling {{{Update()}}} on the cell population, which ensures that * it is in a coherent state. */ rCellPopulation.Update(); /* * Next, we iterate over the cell population... */ for (AbstractCellPopulation<2>::Iterator cell_iter = rCellPopulation.Begin(); cell_iter != rCellPopulation.End(); ++cell_iter) { /* * ...find its height... */ double cell_height = rCellPopulation.GetLocationOfCellCentre(*cell_iter)[1]; /* * ...and store this in the {{{CellData}}} item "height". */ cell_iter->GetCellData()->SetItem("height", cell_height); } }
void DeltaNotchTrackingModifier<DIM>::UpdateCellData(AbstractCellPopulation<DIM,DIM>& rCellPopulation) { // Make sure the cell population is updated rCellPopulation.Update(); // First recover each cell's Notch and Delta concentrations from the ODEs and store in CellData for (typename AbstractCellPopulation<DIM>::Iterator cell_iter = rCellPopulation.Begin(); cell_iter != rCellPopulation.End(); ++cell_iter) { DeltaNotchCellCycleModel* p_model = static_cast<DeltaNotchCellCycleModel*>(cell_iter->GetCellCycleModel()); double this_delta = p_model->GetDelta(); double this_notch = p_model->GetNotch(); // Note that the state variables must be in the same order as listed in DeltaNotchOdeSystem cell_iter->GetCellData()->SetItem("notch", this_notch); cell_iter->GetCellData()->SetItem("delta", this_delta); } // Next iterate over the population to compute and store each cell's neighbouring Delta concentration in CellData for (typename AbstractCellPopulation<DIM>::Iterator cell_iter = rCellPopulation.Begin(); cell_iter != rCellPopulation.End(); ++cell_iter) { // Get the set of neighbouring location indices std::set<unsigned> neighbour_indices = rCellPopulation.GetNeighbouringLocationIndices(*cell_iter); // Compute this cell's average neighbouring Delta concentration and store in CellData if (!neighbour_indices.empty()) { double mean_delta = 0.0; for (std::set<unsigned>::iterator iter = neighbour_indices.begin(); iter != neighbour_indices.end(); ++iter) { CellPtr p_cell = rCellPopulation.GetCellUsingLocationIndex(*iter); double this_delta = p_cell->GetCellData()->GetItem("delta"); mean_delta += this_delta/neighbour_indices.size(); } cell_iter->GetCellData()->SetItem("mean delta", mean_delta); } else { // If this cell has no neighbours, such as an isolated cell in a CaBasedCellPopulation, store 0.0 for the cell data cell_iter->GetCellData()->SetItem("mean delta", 0.0); } } }