CellBasedPdeHandler.hpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #ifndef CELLBASEDPDEHANDLER_HPP_
00037 #define CELLBASEDPDEHANDLER_HPP_
00038
00039 #include <map>
00040 #include <memory>
00041
00042 #include "ChasteSerialization.hpp"
00043 #include <boost/serialization/vector.hpp>
00044
00045 #include "AbstractCellPopulation.hpp"
00046 #include "PdeAndBoundaryConditions.hpp"
00047 #include "BoundaryConditionsContainer.hpp"
00048 #include "TetrahedralMesh.hpp"
00049 #include "ChasteCuboid.hpp"
00050
00059 template<unsigned DIM>
00060 class CellBasedPdeHandler : public Identifiable
00061 {
00062
00063 friend class TestCellBasedPdeHandler;
00064 friend class TestOffLatticeSimulationWithPdes;
00065 friend class TestOnLatticeSimulationWithPdes;
00066
00067 private:
00068
00070 friend class boost::serialization::access;
00077 template<class Archive>
00078 void serialize(Archive & archive, const unsigned int version)
00079 {
00080 archive & mPdeAndBcCollection;
00081 archive & mWriteAverageRadialPdeSolution;
00082 archive & mWriteDailyAverageRadialPdeSolution;
00083 archive & mSetBcsOnCoarseBoundary;
00084 archive & mNumRadialIntervals;
00085 archive & mAverageRadialSolutionVariableName;
00086 }
00087
00088 protected:
00089
00091 AbstractCellPopulation<DIM>* mpCellPopulation;
00092
00094 std::vector<PdeAndBoundaryConditions<DIM>*> mPdeAndBcCollection;
00095
00097 std::string mDirPath;
00098
00100 out_stream mpVizPdeSolutionResultsFile;
00101
00103 out_stream mpAverageRadialPdeSolutionResultsFile;
00104
00106 bool mWriteAverageRadialPdeSolution;
00107
00109 bool mWriteDailyAverageRadialPdeSolution;
00110
00112 std::string mAverageRadialSolutionVariableName;
00113
00115 bool mSetBcsOnCoarseBoundary;
00116
00118 unsigned mNumRadialIntervals;
00119
00121 TetrahedralMesh<DIM,DIM>* mpCoarsePdeMesh;
00122
00124 std::map<CellPtr, unsigned> mCellPdeElementMap;
00125
00130 bool mDeleteMemberPointersInDestructor;
00131
00138 void InitialiseCellPdeElementMap();
00139
00152 virtual void WritePdeSolution(double time);
00153
00162 void WriteAverageRadialPdeSolution(double time);
00163
00168 bool PdeSolveNeedsCoarseMesh();
00169
00170 public:
00171
00178 CellBasedPdeHandler(AbstractCellPopulation<DIM>* pCellPopulation, bool deleteMemberPointersInDestructor=false);
00179
00183 virtual ~CellBasedPdeHandler();
00184
00190 const AbstractCellPopulation<DIM>* GetCellPopulation() const;
00191
00195 TetrahedralMesh<DIM,DIM>* GetCoarsePdeMesh();
00196
00203 void OpenResultsFiles(std::string outputDirectory);
00204
00209 void CloseResultsFiles();
00210
00214 bool GetWriteAverageRadialPdeSolution();
00215
00219 bool GetWriteDailyAverageRadialPdeSolution();
00220
00227 void UpdateCellPdeElementMap();
00228
00232 bool GetImposeBcsOnCoarseBoundary();
00233
00237 unsigned GetNumRadialIntervals();
00238
00245 virtual void SolvePdeAndWriteResultsToFile(unsigned samplingTimestepMultiple);
00246
00255 virtual std::auto_ptr<BoundaryConditionsContainer<DIM,DIM,1> > ConstructBoundaryConditionsContainer(
00256 PdeAndBoundaryConditions<DIM>* pPdeAndBc,
00257 TetrahedralMesh<DIM,DIM>* pMesh);
00258
00267 double GetPdeSolutionAtPoint(const c_vector<double,DIM>& rPoint, const std::string& rVariable);
00268
00276 unsigned FindCoarseElementContainingCell(CellPtr pCell);
00277
00284 virtual Vec GetPdeSolution(const std::string& rName = "");
00285
00296 void SetWriteAverageRadialPdeSolution(const std::string& rName,
00297 unsigned numRadialIntervals=10,
00298 bool writeDailyResults=false);
00299
00307 void SetImposeBcsOnCoarseBoundary(bool setBcsOnCoarseBoundary);
00308
00316 virtual void UseCoarsePdeMesh(double stepSize, ChasteCuboid<DIM> meshCuboid, bool centreOnCellPopulation = false);
00317
00323 void AddPdeAndBc(PdeAndBoundaryConditions<DIM>* pPdeAndBc);
00324
00330 virtual void OutputParameters(out_stream& rParamsFile);
00331 };
00332
00333 #include "SerializationExportWrapper.hpp"
00334 EXPORT_TEMPLATE_CLASS_SAME_DIMS(CellBasedPdeHandler)
00335
00336 namespace boost
00337 {
00338 namespace serialization
00339 {
00344 template<class Archive, unsigned DIM>
00345 inline void save_construct_data(
00346 Archive & ar, const CellBasedPdeHandler<DIM> * t, const BOOST_PFTO unsigned int file_version)
00347 {
00348
00349 const AbstractCellPopulation<DIM>* p_cell_population = t->GetCellPopulation();
00350 ar & p_cell_population;
00351 }
00352
00356 template<class Archive, unsigned DIM>
00357 inline void load_construct_data(
00358 Archive & ar, CellBasedPdeHandler<DIM> * t, const unsigned int file_version)
00359 {
00360
00361 AbstractCellPopulation<DIM>* p_cell_population;
00362 ar >> p_cell_population;
00363
00364
00365 ::new(t)CellBasedPdeHandler<DIM>(p_cell_population, true);
00366 }
00367 }
00368 }
00369
00370 #endif