On this page This tutorial was generated from the file projects/Harvey2015/test/TestValidateSimulationLiteratePaper.hpp at revision r23521.
Note that the code is given in full at the bottom of the page.
This class was used to generate the results in Figure 3.
A script CompareParallelResults.py
is provided to aid comparison
of the output results of the simulation.
Note: before compiling this code you need to alter the precision of the output.
You can do so by adding single line setprecision(..)
to NodeLocationWriter
in the main code base
Index: cell_based/src/population/writers/population_writers/NodeLocationWriter.cpp
===================================================================
version: "2024.2"
--- cell_based/src/population/writers/population_writers/NodeLocationWriter.cpp (revision 21854)
+++ cell_based/src/population/writers/population_writers/NodeLocationWriter.cpp (working copy)
@@ -50,6 +50,7 @@
template<unsigned ELEMENT_DIM, unsigned SPACE_DIM>
void NodeLocationWriter<ELEMENT_DIM, SPACE_DIM>::VisitAnyPopulation(AbstractCellPopulation<SPACE_DIM, SPACE_DIM>* pCellPopulation)
{
+ *this->mpOutStream << setprecision(20);
for (typename AbstractMesh<SPACE_DIM, SPACE_DIM>::NodeIterator node_iter = pCellPopulation->rGetMesh().GetNodeIteratorBegin();
node_iter != pCellPopulation->rGetMesh().GetNodeIteratorEnd();
++node_iter)
Use# This test suite is designed to be run twice. Each run will take roughly a minute (depending on your machine configuration).
## in serial
scons build=GccOptNative projects/Harvey2015/test/TestValidateSimulationLiteratePaper.hpp
## In parallel
scons build=GccOptNative_2 projects/Harvey2015/test/TestValidateSimulationLiteratePaper.hpp
After this the positional output may be checked to machine output precision:
## May need to see this to $CHASTE_TEST_OUTPUT
export OUTPUT=/tmp/$USER/testoutput
./projects/Harvey2015/test/CompareParallelResults.py 2 $OUTPUT/ValidateSimulation3Rand1/results_from_time_0/results.viznodes $OUTPUT/ValidateSimulation3Rand2/results_from_time_0/results.viznodes
Code overview# The first thing to do is to include the necessary header files.
// The testing framework
#include <cxxtest/TestSuite.h>
#include "AbstractCellBasedTestSuite.hpp"
// Cell-based Chaste include files
#include "NodeBasedCellPopulation.hpp"
#include "CellBasedEventHandler.hpp"
#include "ParallelCellsGenerator.hpp"
#include "GeneralisedLinearSpringForce.hpp"
#include "FixedDurationGenerationBasedCellCycleModel.hpp"
#include "OffLatticeSimulation.hpp"
#include "SmartPointers.hpp"
// Needed for parallel code
#include "PetscSetupAndFinalize.hpp"
/**
*
* == The test suite ==
*/
class TestValidateSimulation : public AbstractCellBasedTestSuite
{
public :
void Test2dSimulation () throw ( Exception )
{
NodesOnlyMesh < 2 > mesh ;
mesh . SetCalculateNodeNeighbours ( false );
mesh . SetMaximumInteractionDistance ( 1.6 );
std :: vector < CellPtr > cells ;
Here we call a parallel helper method which reads the cell locations
from a file on disk.
The proliferative type ensures that the cells are not growing.
ParallelCellsGenerator < FixedDurationGenerationBasedCellCycleModel , 2 > generator ;
generator . GenerateParallelCells ( "projects/Harvey2015/test/data/2DCellsCircle.dat" ,
cells ,
mesh ,
CellPropertyRegistry :: Instance () -> Get < DifferentiatedCellProliferativeType > ());
// Create a node-based cell population
NodeBasedCellPopulation < 2 > node_based_cell_population ( mesh , cells );
// Set up cell-based simulation
OffLatticeSimulation < 2 > simulator ( node_based_cell_population );
Output from this simulation is to be found relative to CHASTE_TEST_OUTPUT
which by default is
/tmp/$USER/testoutput
The folder is suffixed by the number of processes involved in this calculation.
std :: ostringstream procs ;
procs << PetscTools :: GetNumProcs ();
std :: string output_directory = "ValidateSimulation3Rand" + procs . str ();
simulator . SetOutputDirectory ( output_directory );
// Create a force law and pass it to the simulation
MAKE_PTR ( GeneralisedLinearSpringForce < 2 > , p_force );
p_force -> SetCutOffLength ( 1.5 );
simulator . AddForce ( p_force );
simulator . SetDt ( 1.0 / 240.0 );
simulator . SetSamplingTimestepMultiple ( 240 );
simulator . SetEndTime ( 100.0 );
simulator . Solve ();
Report on the time taken to run the simulation
CellBasedEventHandler :: Headings ();
CellBasedEventHandler :: Report ();
}
};
Code# The full code is given below
File name TestValidateSimulationLiteratePaper.hpp
# // The testing framework
#include <cxxtest/TestSuite.h>
#include "AbstractCellBasedTestSuite.hpp"
// Cell-based Chaste include files
#include "NodeBasedCellPopulation.hpp"
#include "CellBasedEventHandler.hpp"
#include "ParallelCellsGenerator.hpp"
#include "GeneralisedLinearSpringForce.hpp"
#include "FixedDurationGenerationBasedCellCycleModel.hpp"
#include "OffLatticeSimulation.hpp"
#include "SmartPointers.hpp"
// Needed for parallel code
#include "PetscSetupAndFinalize.hpp"
/**
*
* == The test suite ==
*/
class TestValidateSimulation : public AbstractCellBasedTestSuite
{
public :
void Test2dSimulation () throw ( Exception )
{
NodesOnlyMesh < 2 > mesh ;
mesh . SetCalculateNodeNeighbours ( false );
mesh . SetMaximumInteractionDistance ( 1.6 );
std :: vector < CellPtr > cells ;
ParallelCellsGenerator < FixedDurationGenerationBasedCellCycleModel , 2 > generator ;
generator . GenerateParallelCells ( "projects/Harvey2015/test/data/2DCellsCircle.dat" ,
cells ,
mesh ,
CellPropertyRegistry :: Instance () -> Get < DifferentiatedCellProliferativeType > ());
// Create a node-based cell population
NodeBasedCellPopulation < 2 > node_based_cell_population ( mesh , cells );
// Set up cell-based simulation
OffLatticeSimulation < 2 > simulator ( node_based_cell_population );
std :: ostringstream procs ;
procs << PetscTools :: GetNumProcs ();
std :: string output_directory = "ValidateSimulation3Rand" + procs . str ();
simulator . SetOutputDirectory ( output_directory );
// Create a force law and pass it to the simulation
MAKE_PTR ( GeneralisedLinearSpringForce < 2 > , p_force );
p_force -> SetCutOffLength ( 1.5 );
simulator . AddForce ( p_force );
simulator . SetDt ( 1.0 / 240.0 );
simulator . SetSamplingTimestepMultiple ( 240 );
simulator . SetEndTime ( 100.0 );
simulator . Solve ();
CellBasedEventHandler :: Headings ();
CellBasedEventHandler :: Report ();
}
};