/* * Cellular birth has been tested in TestCaSingleCellWithBirth for one cell per lattice site. * This test adds to the above by further testing cellular birth considering multiple cells per lattice site. * A two-lattice mesh was created and only one lattice had free space to add one daughter cell. */ void TestMultipleCellsPerLatticeSiteWithBirth() throw (Exception) { EXIT_IF_PARALLEL; // Create a simple 2D PottsMesh PottsMeshGenerator<2> generator(2, 0, 0, 1, 0, 0); PottsMesh<2>* p_mesh = generator.GetMesh(); // Create cells std::vector<CellPtr> cells; MAKE_PTR(StemCellProliferativeType, p_stem_type); CellsGenerator<FixedDurationGenerationBasedCellCycleModel, 2> cells_generator; cells_generator.GenerateBasicRandom(cells, 3, p_stem_type); // Specify where cells lie std::vector<unsigned> location_indices; location_indices.push_back(0); location_indices.push_back(0); location_indices.push_back(1); // Create cell population CaBasedCellPopulation<2> cell_population(*p_mesh, cells, location_indices, 2); // Set up cell-based simulation OnLatticeSimulation<2> simulator(cell_population); std::string output_directory = "TestMultipleCellsPerLatticeSiteWithBirth"; simulator.SetOutputDirectory(output_directory); simulator.SetDt(0.1); simulator.SetEndTime(40); // Add update rule MAKE_PTR(DiffusionCaUpdateRule<2u>, p_diffusion_update_rule); p_diffusion_update_rule->SetDiffusionParameter(0.5); simulator.AddCaUpdateRule(p_diffusion_update_rule); // Run simulation simulator.Solve(); // Check the number of cells TS_ASSERT_EQUALS(simulator.rGetCellPopulation().GetNumRealCells(), 4u); // Test no deaths and some births TS_ASSERT_EQUALS(simulator.GetNumBirths(), 1u); TS_ASSERT_EQUALS(simulator.GetNumDeaths(), 0u); #ifdef CHASTE_VTK // Test that VTK writer has produced a file OutputFileHandler output_file_handler(output_directory, false); std::string results_dir = output_file_handler.GetOutputDirectoryFullPath(); // Initial condition file FileFinder vtk_file(results_dir + "results_from_time_0/results_0.vtu", RelativeTo::Absolute); TS_ASSERT(vtk_file.Exists()); // Final file FileFinder vtk_file2(results_dir + "results_from_time_0/results_400.vtu", RelativeTo::Absolute); TS_ASSERT(vtk_file2.Exists()); #endif //CHASTE_VTK }
void TestPottsSpheroidCellSorting() throw (Exception) { EXIT_IF_PARALLEL; // Potts simulations don't work in parallel because they depend on NodesOnlyMesh for writing. // Create a simple 3D PottsMesh unsigned domain_size = 10; unsigned element_number = 4; unsigned element_size = 2; PottsMeshGenerator<3> generator(domain_size, element_number, element_size, domain_size, element_number, element_size, domain_size, element_number, element_size); PottsMesh<3>* p_mesh = generator.GetMesh(); // Create cells std::vector<CellPtr> cells; MAKE_PTR(DifferentiatedCellProliferativeType, p_diff_type); CellsGenerator<FixedDurationGenerationBasedCellCycleModel, 3> cells_generator; cells_generator.GenerateBasicRandom(cells, p_mesh->GetNumElements(), p_diff_type); // Randomly label some cells boost::shared_ptr<AbstractCellProperty> p_label(CellPropertyRegistry::Instance()->Get<CellLabel>()); RandomlyLabelCells(cells, p_label, 0.5); // Create cell population PottsBasedCellPopulation<3> cell_population(*p_mesh, cells); cell_population.AddCellPopulationCountWriter<CellMutationStatesCountWriter>(); // So outputs the labelled cells // Set up cell-based simulation OnLatticeSimulation<3> simulator(cell_population); simulator.SetOutputDirectory("TestPotts3DCellSorting"); simulator.SetDt(0.1); simulator.SetEndTime(1.0); // Create update rules and pass to the simulation MAKE_PTR(VolumeConstraintPottsUpdateRule<3>, p_volume_constraint_update_rule); p_volume_constraint_update_rule->SetMatureCellTargetVolume(element_size*element_size*element_size); p_volume_constraint_update_rule->SetDeformationEnergyParameter(0.2); simulator.AddPottsUpdateRule(p_volume_constraint_update_rule); MAKE_PTR(DifferentialAdhesionPottsUpdateRule<3>, p_differential_adhesion_update_rule); p_differential_adhesion_update_rule->SetLabelledCellLabelledCellAdhesionEnergyParameter(0.16); p_differential_adhesion_update_rule->SetLabelledCellCellAdhesionEnergyParameter(0.11); p_differential_adhesion_update_rule->SetCellCellAdhesionEnergyParameter(0.02); p_differential_adhesion_update_rule->SetLabelledCellBoundaryAdhesionEnergyParameter(0.16); p_differential_adhesion_update_rule->SetCellBoundaryAdhesionEnergyParameter(0.16); simulator.AddPottsUpdateRule(p_differential_adhesion_update_rule); // Run simulation simulator.Solve(); // Check that the same number of cells TS_ASSERT_EQUALS(simulator.rGetCellPopulation().GetNumRealCells(), 64u); // Test no births or deaths TS_ASSERT_EQUALS(simulator.GetNumBirths(), 0u); TS_ASSERT_EQUALS(simulator.GetNumDeaths(), 0u); #ifdef CHASTE_VTK // Test that VTK writer has produced some files OutputFileHandler handler("TestPotts3DCellSorting", false); std::string results_dir = handler.GetOutputDirectoryFullPath(); // Initial condition file FileFinder vtk_file(results_dir + "results_from_time_0/results_0.vtu", RelativeTo::Absolute); TS_ASSERT(vtk_file.Exists()); // Final file FileFinder vtk_file2(results_dir + "results_from_time_0/results_10.vtu", RelativeTo::Absolute); TS_ASSERT(vtk_file2.Exists()); // Check that the second VTK file for Potts specific data (element IDs) VtkMeshReader<3,3> vtk_reader(results_dir + "results_from_time_0/results_10.vtu"); std::vector<double> cell_types; vtk_reader.GetPointData("Cell types", cell_types); TS_ASSERT_EQUALS(cell_types.size(), 1000u); // The cell types are between -1 and 5. Check the maximum TS_ASSERT_DELTA(*max_element(cell_types.begin(), cell_types.end()), 5.0, 1e-12); std::vector<double> cell_ids; vtk_reader.GetPointData("Cell IDs", cell_ids); // Prior to release 3.2 this was called "Element index". // It is changed to cell_id as this is preferable for VTK output. TS_ASSERT_EQUALS(cell_ids.size(), 1000u); TS_ASSERT_DELTA(*max_element(cell_ids.begin(), cell_ids.end()), 63.0, 1e-12); #endif //CHASTE_VTK }