AbstractAssemblerSolverHybrid.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
00037 #ifndef ABSTRACTASSEMBLERSOLVERHYBRID_HPP_
00038 #define ABSTRACTASSEMBLERSOLVERHYBRID_HPP_
00039
00040 #include "AbstractFeVolumeIntegralAssembler.hpp"
00041 #include "AbstractLinearPdeSolver.hpp"
00042 #include "NaturalNeumannSurfaceTermAssembler.hpp"
00043
00054 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM, unsigned PROBLEM_DIM, InterpolationLevel INTERPOLATION_LEVEL>
00055 class AbstractAssemblerSolverHybrid
00056 : public AbstractFeVolumeIntegralAssembler<ELEMENT_DIM, SPACE_DIM, PROBLEM_DIM, true, true, INTERPOLATION_LEVEL>
00057 {
00058 protected:
00059
00064 NaturalNeumannSurfaceTermAssembler<ELEMENT_DIM,SPACE_DIM,PROBLEM_DIM> mNaturalNeumannSurfaceTermAssembler;
00065
00067 BoundaryConditionsContainer<ELEMENT_DIM,SPACE_DIM,PROBLEM_DIM>* mpBoundaryConditions;
00068
00069
00070 public:
00071
00078 AbstractAssemblerSolverHybrid(AbstractTetrahedralMesh<ELEMENT_DIM,SPACE_DIM>* pMesh,
00079 BoundaryConditionsContainer<ELEMENT_DIM,SPACE_DIM,PROBLEM_DIM>* pBoundaryConditions)
00080 : AbstractFeVolumeIntegralAssembler<ELEMENT_DIM, SPACE_DIM, PROBLEM_DIM, true, true, INTERPOLATION_LEVEL>(pMesh),
00081 mNaturalNeumannSurfaceTermAssembler(pMesh,pBoundaryConditions),
00082 mpBoundaryConditions(pBoundaryConditions)
00083 {
00084 assert(pMesh);
00085 assert(pBoundaryConditions);
00086 }
00087
00091 virtual ~AbstractAssemblerSolverHybrid()
00092 {
00093 }
00094
00107 void SetupGivenLinearSystem(Vec currentSolution, bool computeMatrix, LinearSystem* pLinearSystem);
00108 };
00109
00110 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM, unsigned PROBLEM_DIM, InterpolationLevel INTERPOLATION_LEVEL>
00111 void AbstractAssemblerSolverHybrid<ELEMENT_DIM, SPACE_DIM, PROBLEM_DIM, INTERPOLATION_LEVEL>::SetupGivenLinearSystem(Vec currentSolution,
00112 bool computeMatrix,
00113 LinearSystem* pLinearSystem)
00114 {
00115 assert(pLinearSystem->rGetLhsMatrix() != NULL);
00116 assert(pLinearSystem->rGetRhsVector() != NULL);
00117
00118
00119 this->SetMatrixToAssemble(pLinearSystem->rGetLhsMatrix());
00120 this->SetVectorToAssemble(pLinearSystem->rGetRhsVector(), true);
00121
00122 if (currentSolution != NULL)
00123 {
00124 this->SetCurrentSolution(currentSolution);
00125 }
00126
00127 if (computeMatrix)
00128 {
00129 this->Assemble();
00130 }
00131 else
00132 {
00133 this->AssembleVector();
00134 }
00135
00136
00137
00138 mNaturalNeumannSurfaceTermAssembler.SetVectorToAssemble(pLinearSystem->rGetRhsVector(), false);
00139 mNaturalNeumannSurfaceTermAssembler.Assemble();
00140
00141 pLinearSystem->FinaliseRhsVector();
00142 pLinearSystem->SwitchWriteModeLhsMatrix();
00143
00144
00145 mpBoundaryConditions->ApplyDirichletToLinearProblem(*pLinearSystem, true);
00146
00148
00149
00150 pLinearSystem->FinaliseRhsVector();
00151 pLinearSystem->FinaliseLhsMatrix();
00152 }
00153
00154 #endif