AbstractLinearPdeSolver.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 #ifndef ABSTRACTLINEARPDESOLVER_HPP_
00030 #define ABSTRACTLINEARPDESOLVER_HPP_
00031
00032 #include "LinearSystem.hpp"
00033 #include "BoundaryConditionsContainer.hpp"
00034 #include "AbstractTetrahedralMesh.hpp"
00035 #include "HeartEventHandler.hpp"
00036
00041 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM, unsigned PROBLEM_DIM>
00042 class AbstractLinearPdeSolver : boost::noncopyable
00043 {
00044 protected:
00045
00047 LinearSystem* mpLinearSystem;
00048
00050 AbstractTetrahedralMesh<ELEMENT_DIM,SPACE_DIM>* mpMesh;
00051
00052 public:
00053
00059 AbstractLinearPdeSolver(AbstractTetrahedralMesh<ELEMENT_DIM,SPACE_DIM>* pMesh)
00060 : mpLinearSystem(NULL),
00061 mpMesh(pMesh)
00062 {
00063 assert(pMesh!=NULL);
00064 }
00065
00069 virtual ~AbstractLinearPdeSolver()
00070 {
00071 if (mpLinearSystem)
00072 {
00073 delete mpLinearSystem;
00074 }
00075 }
00076
00086 virtual void InitialiseForSolve(Vec initialSolution = NULL);
00087
00094 virtual void PrepareForSetupLinearSystem(Vec currentSolution)
00095 {
00096 }
00097
00105 virtual void FinaliseLinearSystem(Vec currentSolution)
00106 {
00107 }
00108
00118 virtual void FollowingSolveLinearSystem(Vec currentSolution)
00119 {
00120 }
00121
00133 virtual void SetupLinearSystem(Vec currentSolution, bool computeMatrix)=0;
00134
00138 LinearSystem* GetLinearSystem()
00139 {
00140 return mpLinearSystem;
00141 }
00142 };
00143
00144 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM, unsigned PROBLEM_DIM>
00145 void AbstractLinearPdeSolver<ELEMENT_DIM, SPACE_DIM, PROBLEM_DIM>::InitialiseForSolve(Vec initialSolution)
00146 {
00147 if (this->mpLinearSystem == NULL)
00148 {
00149 unsigned preallocation=(mpMesh->CalculateMaximumContainingElementsPerProcess() + ELEMENT_DIM);
00150 if (ELEMENT_DIM > 1)
00151 {
00152
00153 preallocation--;
00154 }
00155 preallocation *= PROBLEM_DIM;
00156
00157 HeartEventHandler::BeginEvent(HeartEventHandler::COMMUNICATION);
00158 if (initialSolution == NULL)
00159 {
00160
00161
00162
00163
00164 Vec template_vec = mpMesh->GetDistributedVectorFactory()->CreateVec(PROBLEM_DIM);
00165
00166 this->mpLinearSystem = new LinearSystem(template_vec, preallocation);
00167
00168 VecDestroy(template_vec);
00169 }
00170 else
00171 {
00172
00173
00174
00175
00176
00177 this->mpLinearSystem = new LinearSystem(initialSolution, preallocation);
00178 }
00179
00180 HeartEventHandler::EndEvent(HeartEventHandler::COMMUNICATION);
00181 }
00182 }
00183
00184 #endif