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 #include "Identifiable.hpp"
00051
00060 template<unsigned DIM>
00061 class CellBasedPdeHandler : public Identifiable
00062 {
00063
00064 friend class TestCellBasedPdeHandler;
00065 friend class TestOffLatticeSimulationWithPdes;
00066 friend class TestOnLatticeSimulationWithPdes;
00067
00068 private:
00069
00071 friend class boost::serialization::access;
00078 template<class Archive>
00079 void serialize(Archive & archive, const unsigned int version)
00080 {
00081 archive & mPdeAndBcCollection;
00082 archive & mWriteAverageRadialPdeSolution;
00083 archive & mWriteDailyAverageRadialPdeSolution;
00084 archive & mSetBcsOnCoarseBoundary;
00085 archive & mNumRadialIntervals;
00086 archive & mAverageRadialSolutionVariableName;
00087 }
00088
00089 protected:
00090
00092 AbstractCellPopulation<DIM>* mpCellPopulation;
00093
00095 std::vector<PdeAndBoundaryConditions<DIM>*> mPdeAndBcCollection;
00096
00098 std::string mDirPath;
00099
00101 out_stream mpVizPdeSolutionResultsFile;
00102
00104 out_stream mpAverageRadialPdeSolutionResultsFile;
00105
00107 bool mWriteAverageRadialPdeSolution;
00108
00110 bool mWriteDailyAverageRadialPdeSolution;
00111
00113 std::string mAverageRadialSolutionVariableName;
00114
00116 bool mSetBcsOnCoarseBoundary;
00117
00119 unsigned mNumRadialIntervals;
00120
00122 TetrahedralMesh<DIM,DIM>* mpCoarsePdeMesh;
00123
00125 std::map<CellPtr, unsigned> mCellPdeElementMap;
00126
00131 bool mDeleteMemberPointersInDestructor;
00132
00139 void InitialiseCellPdeElementMap();
00140
00146 virtual void WritePdeSolution(double time);
00147
00153 void WriteAverageRadialPdeSolution(double time);
00154
00159 bool PdeSolveNeedsCoarseMesh();
00160
00161 public:
00162
00169 CellBasedPdeHandler(AbstractCellPopulation<DIM>* pCellPopulation, bool deleteMemberPointersInDestructor=false);
00170
00174 virtual ~CellBasedPdeHandler();
00175
00181 const AbstractCellPopulation<DIM>* GetCellPopulation() const;
00182
00186 TetrahedralMesh<DIM,DIM>* GetCoarsePdeMesh();
00187
00194 void OpenResultsFiles(std::string outputDirectory);
00195
00200 void CloseResultsFiles();
00201
00205 bool GetWriteAverageRadialPdeSolution();
00206
00210 bool GetWriteDailyAverageRadialPdeSolution();
00211
00218 void UpdateCellPdeElementMap();
00219
00223 bool GetImposeBcsOnCoarseBoundary();
00224
00228 unsigned GetNumRadialIntervals();
00229
00236 virtual void SolvePdeAndWriteResultsToFile(unsigned samplingTimestepMultiple);
00237
00246 virtual std::auto_ptr<BoundaryConditionsContainer<DIM,DIM,1> > ConstructBoundaryConditionsContainer(
00247 PdeAndBoundaryConditions<DIM>* pPdeAndBc,
00248 TetrahedralMesh<DIM,DIM>* pMesh);
00249
00258 double GetPdeSolutionAtPoint(const c_vector<double,DIM>& rPoint, const std::string& rVariable);
00259
00267 unsigned FindCoarseElementContainingCell(CellPtr pCell);
00268
00275 virtual Vec GetPdeSolution(const std::string& rName = "");
00276
00287 void SetWriteAverageRadialPdeSolution(const std::string& rName,
00288 unsigned numRadialIntervals=10,
00289 bool writeDailyResults=false);
00290
00298 void SetImposeBcsOnCoarseBoundary(bool setBcsOnCoarseBoundary);
00299
00307 virtual void UseCoarsePdeMesh(double stepSize, ChasteCuboid<DIM> meshCuboid, bool centreOnCellPopulation = false);
00308
00314 void AddPdeAndBc(PdeAndBoundaryConditions<DIM>* pPdeAndBc);
00315
00321 virtual void OutputParameters(out_stream& rParamsFile);
00322 };
00323
00324 #include "SerializationExportWrapper.hpp"
00325 EXPORT_TEMPLATE_CLASS_SAME_DIMS(CellBasedPdeHandler)
00326
00327 namespace boost
00328 {
00329 namespace serialization
00330 {
00335 template<class Archive, unsigned DIM>
00336 inline void save_construct_data(
00337 Archive & ar, const CellBasedPdeHandler<DIM> * t, const BOOST_PFTO unsigned int file_version)
00338 {
00339
00340 const AbstractCellPopulation<DIM>* p_cell_population = t->GetCellPopulation();
00341 ar & p_cell_population;
00342 }
00343
00347 template<class Archive, unsigned DIM>
00348 inline void load_construct_data(
00349 Archive & ar, CellBasedPdeHandler<DIM> * t, const unsigned int file_version)
00350 {
00351
00352 AbstractCellPopulation<DIM>* p_cell_population;
00353 ar >> p_cell_population;
00354
00355
00356 ::new(t)CellBasedPdeHandler<DIM>(p_cell_population, true);
00357 }
00358 }
00359 }
00360
00361 #endif