/* The third public method overrides {{{VerifyBoundaryCondition()}}}. * This method is called during the {{{Solve()}}} method in {{{OffLatticeSimulation}}} * at the end of each timestep, just after {{{ImposeBoundaryCondition()}}}, and checks * that each cell in the population now satisfies {{{MyBoundaryCondition}}}. */ bool VerifyBoundaryCondition() { bool condition_satisfied = true; for (AbstractCellPopulation<2>::Iterator cell_iter = this->mpCellPopulation->Begin(); cell_iter != this->mpCellPopulation->End(); ++cell_iter) { c_vector<double, 2> cell_location = this->mpCellPopulation->GetLocationOfCellCentre(*cell_iter); double y_coordinate = cell_location(1); if ((y_coordinate < 0.0) || (y_coordinate > 5.0)) { condition_satisfied = false; break; } } return condition_satisfied; }
void display_layer_update_callback(Layer *layer, GContext* ctx) { time_t now = time(NULL); struct tm *tick_time = localtime(&now); graphics_context_set_fill_color(ctx, GColorWhite); int minutes = 0; int hour = tick_time->tm_hour; /* convert 24 hours to 12 hours */ if (hour > 12) { hour = hour - 12; } if (hour == 0) { hour = 12; } int col, row, height; for (col = 0; col < 12; col++) { for (row = 0; row < 6; row++) { height = col; /* Hour mode */ if (row == 0) { if (12 - col > hour) { continue; } } else { if (minutes++ < tick_time->tm_min) { height = (11 - col); } else { continue; } } graphics_fill_rect(ctx, cell_location(row, height), 0, GCornerNone); } } }
void display_layer_update_callback(Layer *me, GContext* ctx) { (void)me; PblTm t; get_time(&t); unsigned short display_hour = get_display_hour(t.tm_hour); graphics_context_set_fill_color(ctx, GColorWhite); for (int cell_column_index = 0; cell_column_index < display_hour/10; cell_column_index++) { graphics_fill_rect(ctx, cell_location(0, cell_column_index), 0, GCornerNone); } for (int cell_column_index = 0; cell_column_index < display_hour%10; cell_column_index++) { graphics_fill_rect(ctx, cell_location(1, cell_column_index), 0, GCornerNone); } for (int cell_column_index = 0; cell_column_index < t.tm_min/10; cell_column_index++) { graphics_fill_rect(ctx, cell_location(2, cell_column_index), 0, GCornerNone); } for (int cell_column_index = 0; cell_column_index < t.tm_min%10; cell_column_index++) { graphics_fill_rect(ctx, cell_location(3, cell_column_index), 0, GCornerNone); } for (int cell_column_index = 0; cell_column_index < t.tm_sec/10; cell_column_index++) { graphics_fill_rect(ctx, cell_location(4, cell_column_index), 0, GCornerNone); } for (int cell_column_index = 0; cell_column_index < t.tm_sec%10; cell_column_index++) { graphics_fill_rect(ctx, cell_location(5, cell_column_index), 0, GCornerNone); } }
void TestCaBasedSquareMonolayer() { PottsMeshGenerator<2> generator(10, 0, 0, 10, 0, 0); PottsMesh<2>* p_mesh = generator.GetMesh(); // Scale so cells are on top of those in the above centre based tests p_mesh->Scale(1.0,sqrt(3.0)*0.5); // Specify where cells lie std::vector<unsigned> location_indices; for (unsigned i=0; i<100; i++) { location_indices.push_back(i); } std::vector<CellPtr> cells; MAKE_PTR(DifferentiatedCellProliferativeType, p_differentiated_type); CellsGenerator<UniformCellCycleModel, 2> cells_generator; cells_generator.GenerateBasicRandom(cells, location_indices.size(), p_differentiated_type); // Make cells with x<5.0 apoptotic (so no source term) boost::shared_ptr<AbstractCellProperty> p_apoptotic_property = cells[0]->rGetCellPropertyCollection().GetCellPropertyRegistry()->Get<ApoptoticCellProperty>(); for (unsigned i=0; i<cells.size(); i++) { c_vector<double,2> cell_location; cell_location = p_mesh->GetNode(i)->rGetLocation(); if (cell_location(0) < 5.0) { cells[i]->AddCellProperty(p_apoptotic_property); } // Set initial condition for PDE cells[i]->GetCellData()->SetItem("variable",1.0); } TS_ASSERT_EQUALS(p_apoptotic_property->GetCellCount(), 50u); CaBasedCellPopulation<2> cell_population(*p_mesh, cells, location_indices); // Set up simulation time for file output SimulationTime::Instance()->SetEndTimeAndNumberOfTimeSteps(1.0, 10); // Create PDE and boundary condition objects MAKE_PTR_ARGS(AveragedSourceParabolicPde<2>, p_pde, (cell_population, 0.1, 1.0, -1.0)); MAKE_PTR_ARGS(ConstBoundaryCondition<2>, p_bc, (1.0)); // Create a ChasteCuboid on which to base the finite element mesh used to solve the PDE ChastePoint<2> lower(-5.0, -5.0); ChastePoint<2> upper(15.0, 15.0); MAKE_PTR_ARGS(ChasteCuboid<2>, p_cuboid, (lower, upper)); // Create a PDE modifier and set the name of the dependent variable in the PDE MAKE_PTR_ARGS(ParabolicBoxDomainPdeModifier<2>, p_pde_modifier, (p_pde, p_bc, false, p_cuboid)); p_pde_modifier->SetDependentVariableName("variable"); // For coverage, output the solution gradient p_pde_modifier->SetOutputGradient(true); p_pde_modifier->SetupSolve(cell_population,"TestAveragedParabolicPdeWithNodeOnSquare"); // Run for 10 time steps for (unsigned i=0; i<10; i++) { SimulationTime::Instance()->IncrementTimeOneStep(); p_pde_modifier->UpdateAtEndOfTimeStep(cell_population); p_pde_modifier->UpdateAtEndOfOutputTimeStep(cell_population); } // Test the solution at some fixed points to compare with other cell populations CellPtr p_cell_0 = cell_population.GetCellUsingLocationIndex(0); TS_ASSERT_DELTA(cell_population.GetLocationOfCellCentre(p_cell_0)[0], 0, 1e-4); TS_ASSERT_DELTA(cell_population.GetLocationOfCellCentre(p_cell_0)[1], 0.0, 1e-4); TS_ASSERT_DELTA( p_cell_0->GetCellData()->GetItem("variable"), 0.8513, 2e-2); // Low tolerance as mesh is slightly larger than for off-lattice models // Checking it doesn't change for this cell population TS_ASSERT_DELTA(p_cell_0->GetCellData()->GetItem("variable"), 0.8343, 1e-4); }
void TestNodeBasedSquareMonolayer() { HoneycombMeshGenerator generator(10,10,0); MutableMesh<2,2>* p_generating_mesh = generator.GetMesh(); NodesOnlyMesh<2>* p_mesh = new NodesOnlyMesh<2>; p_mesh->ConstructNodesWithoutMesh(*p_generating_mesh, 1.5); std::vector<CellPtr> cells; MAKE_PTR(DifferentiatedCellProliferativeType, p_differentiated_type); CellsGenerator<UniformCellCycleModel, 2> cells_generator; cells_generator.GenerateBasicRandom(cells, p_mesh->GetNumNodes(), p_differentiated_type); // Make cells with x<5.0 apoptotic (so no source term) boost::shared_ptr<AbstractCellProperty> p_apoptotic_property = cells[0]->rGetCellPropertyCollection().GetCellPropertyRegistry()->Get<ApoptoticCellProperty>(); for (unsigned i=0; i<cells.size(); i++) { c_vector<double,2> cell_location; cell_location = p_mesh->GetNode(i)->rGetLocation(); if (cell_location(0) < 5.0) { cells[i]->AddCellProperty(p_apoptotic_property); } // Set initial condition for PDE cells[i]->GetCellData()->SetItem("variable",1.0); } TS_ASSERT_EQUALS(p_apoptotic_property->GetCellCount(), 50u); NodeBasedCellPopulation<2> cell_population(*p_mesh, cells); // Set up simulation time for file output SimulationTime::Instance()->SetEndTimeAndNumberOfTimeSteps(1.0, 10); // Create PDE and boundary condition objects MAKE_PTR_ARGS(AveragedSourceParabolicPde<2>, p_pde, (cell_population, 0.1, 1.0, -1.0)); MAKE_PTR_ARGS(ConstBoundaryCondition<2>, p_bc, (1.0)); // Create a ChasteCuboid on which to base the finite element mesh used to solve the PDE ChastePoint<2> lower(-5.0, -5.0); ChastePoint<2> upper(15.0, 15.0); MAKE_PTR_ARGS(ChasteCuboid<2>, p_cuboid, (lower, upper)); // Create a PDE modifier and set the name of the dependent variable in the PDE MAKE_PTR_ARGS(ParabolicBoxDomainPdeModifier<2>, p_pde_modifier, (p_pde, p_bc, false, p_cuboid)); p_pde_modifier->SetDependentVariableName("variable"); // For coverage, output the solution gradient p_pde_modifier->SetOutputGradient(true); p_pde_modifier->SetupSolve(cell_population,"TestAveragedParabolicPdeWithNodeOnSquare"); // Run for 10 time steps for (unsigned i=0; i<10; i++) { SimulationTime::Instance()->IncrementTimeOneStep(); p_pde_modifier->UpdateAtEndOfTimeStep(cell_population); p_pde_modifier->UpdateAtEndOfOutputTimeStep(cell_population); } // Test the solution at some fixed points to compare with other cell populations CellPtr p_cell_0 = cell_population.GetCellUsingLocationIndex(0); TS_ASSERT_DELTA(cell_population.GetLocationOfCellCentre(p_cell_0)[0], 0, 1e-4); TS_ASSERT_DELTA(cell_population.GetLocationOfCellCentre(p_cell_0)[1], 0.0, 1e-4); TS_ASSERT_DELTA( p_cell_0->GetCellData()->GetItem("variable"), 0.8513, 1e-4); // Clear memory delete p_mesh; }