Chaste  Release::2017.1
AbstractPdeModifier.hpp
1 /*
2 
3 Copyright (c) 2005-2017, University of Oxford.
4 All rights reserved.
5 
6 University of Oxford means the Chancellor, Masters and Scholars of the
7 University of Oxford, having an administrative office at Wellington
8 Square, Oxford OX1 2JD, UK.
9 
10 This file is part of Chaste.
11 
12 Redistribution and use in source and binary forms, with or without
13 modification, are permitted provided that the following conditions are met:
14  * Redistributions of source code must retain the above copyright notice,
15  this list of conditions and the following disclaimer.
16  * Redistributions in binary form must reproduce the above copyright notice,
17  this list of conditions and the following disclaimer in the documentation
18  and/or other materials provided with the distribution.
19  * Neither the name of the University of Oxford nor the names of its
20  contributors may be used to endorse or promote products derived from this
21  software without specific prior written permission.
22 
23 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
24 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
27 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
28 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
29 GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
32 OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 
34 */
35 
36 #ifndef ABSTRACTPDEMODIFIER_HPP_
37 #define ABSTRACTPDEMODIFIER_HPP_
38 
39 #include "ChasteSerialization.hpp"
40 #include "ClassIsAbstract.hpp"
41 #include <boost/shared_ptr.hpp>
42 
43 #include "AbstractCellBasedSimulationModifier.hpp"
44 #include "TetrahedralMesh.hpp"
45 #include "AbstractLinearPde.hpp"
46 #include "AbstractBoundaryCondition.hpp"
47 
53 template<unsigned DIM>
55 {
56 private:
57 
67  template<class Archive>
68  void serialize(Archive & archive, const unsigned int version)
69  {
70  archive & boost::serialization::base_object<AbstractCellBasedSimulationModifier<DIM,DIM> >(*this);
71  archive & mpPde;
72  archive & mpBoundaryCondition;
74  archive & mDependentVariableName;
75 
76  // Note that archiving of mSolution is handled by the methods save/load_construct_data
77  archive & mOutputDirectory;
78  archive & mOutputGradient;
79  archive & mOutputSolutionAtPdeNodes;
80  }
81 
82 protected:
83 
87  boost::shared_ptr<AbstractLinearPde<DIM,DIM> > mpPde;
88 
92  boost::shared_ptr<AbstractBoundaryCondition<DIM> > mpBoundaryCondition;
93 
100 
106 
109 
112 
114  std::string mOutputDirectory;
115 
118 
124 
127 
132 
133 public:
134 
144  AbstractPdeModifier(boost::shared_ptr<AbstractLinearPde<DIM,DIM> > pPde=NULL,
145  boost::shared_ptr<AbstractBoundaryCondition<DIM> > pBoundaryCondition=boost::shared_ptr<AbstractBoundaryCondition<DIM> >(),
146  bool isNeumannBoundaryCondition=true,
147  Vec solution=nullptr);
148 
152  virtual ~AbstractPdeModifier();
153 
157  boost::shared_ptr<AbstractLinearPde<DIM,DIM> > GetPde();
158 
162  boost::shared_ptr<AbstractBoundaryCondition<DIM> > GetBoundaryCondition();
163 
168 
174  void SetDependentVariableName(const std::string& rName);
175 
181  std::string& rGetDependentVariableName();
182 
186  bool HasAveragedSourcePde();
187 
195  void SetUpSourceTermsForAveragedSourcePde(TetrahedralMesh<DIM,DIM>* pMesh, std::map<CellPtr, unsigned>* pCellPdeElementMap=nullptr);
196 
200  Vec GetSolution();
201 
205  Vec GetSolution() const;
206 
211 
221  virtual void SetupSolve(AbstractCellPopulation<DIM,DIM>& rCellPopulation, std::string outputDirectory);
222 
230  virtual void UpdateAtEndOfTimeStep(AbstractCellPopulation<DIM,DIM>& rCellPopulation)=0;
231 
241  virtual void UpdateAtEndOfOutputTimeStep(AbstractCellPopulation<DIM,DIM>& rCellPopulation);
242 
250  virtual void UpdateAtEndOfSolve(AbstractCellPopulation<DIM,DIM>& rCellPopulation);
251 
257  bool GetOutputGradient();
258 
264  void SetOutputGradient(bool outputGradient);
265 
271  void SetOutputSolutionAtPdeNodes(bool outputSolutionAtPdeNodes);
272 
280  void OutputSimulationModifierParameters(out_stream& rParamsFile);
281 };
282 
285 
286 #endif /*ABSTRACTPDEMODIFIER_HPP_*/
virtual void UpdateAtEndOfOutputTimeStep(AbstractCellPopulation< DIM, DIM > &rCellPopulation)
void SetOutputGradient(bool outputGradient)
virtual void UpdateAtEndOfTimeStep(AbstractCellPopulation< DIM, DIM > &rCellPopulation)=0
#define TEMPLATED_CLASS_IS_ABSTRACT_1_UNSIGNED(T)
friend class boost::serialization::access
virtual void SetupSolve(AbstractCellPopulation< DIM, DIM > &rCellPopulation, std::string outputDirectory)
void serialize(Archive &archive, const unsigned int version)
out_stream mpVizPdeSolutionResultsFile
void SetDependentVariableName(const std::string &rName)
virtual void UpdateAtEndOfSolve(AbstractCellPopulation< DIM, DIM > &rCellPopulation)
boost::shared_ptr< AbstractBoundaryCondition< DIM > > mpBoundaryCondition
void SetOutputSolutionAtPdeNodes(bool outputSolutionAtPdeNodes)
AbstractPdeModifier(boost::shared_ptr< AbstractLinearPde< DIM, DIM > > pPde=NULL, boost::shared_ptr< AbstractBoundaryCondition< DIM > > pBoundaryCondition=boost::shared_ptr< AbstractBoundaryCondition< DIM > >(), bool isNeumannBoundaryCondition=true, Vec solution=nullptr)
void OutputSimulationModifierParameters(out_stream &rParamsFile)
std::string & rGetDependentVariableName()
boost::shared_ptr< AbstractBoundaryCondition< DIM > > GetBoundaryCondition()
void SetUpSourceTermsForAveragedSourcePde(TetrahedralMesh< DIM, DIM > *pMesh, std::map< CellPtr, unsigned > *pCellPdeElementMap=nullptr)
TetrahedralMesh< DIM, DIM > * GetFeMesh() const
gcov doesn&#39;t like this file...
boost::shared_ptr< AbstractLinearPde< DIM, DIM > > GetPde()
boost::shared_ptr< AbstractLinearPde< DIM, DIM > > mpPde
TetrahedralMesh< DIM, DIM > * mpFeMesh