AbstractFeAssemblerInterface.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 ABSTRACTFEASSEMBLERINTERFACE_HPP_
00037 #define ABSTRACTFEASSEMBLERINTERFACE_HPP_
00038
00039 #include <cassert>
00040 #include "UblasCustomFunctions.hpp"
00041 #include "PetscTools.hpp"
00042
00050 template <bool CAN_ASSEMBLE_VECTOR, bool CAN_ASSEMBLE_MATRIX>
00051 class AbstractFeAssemblerInterface : private boost::noncopyable
00052 {
00053 protected:
00055 Vec mVectorToAssemble;
00056
00058 Mat mMatrixToAssemble;
00059
00065 bool mAssembleMatrix;
00066
00068 bool mAssembleVector;
00069
00071 bool mZeroMatrixBeforeAssembly;
00072
00074 bool mZeroVectorBeforeAssembly;
00075
00077 PetscInt mOwnershipRangeLo;
00078
00080 PetscInt mOwnershipRangeHi;
00081
00089 virtual void DoAssemble()=0;
00090
00091 public:
00092
00096 AbstractFeAssemblerInterface();
00097
00105 void SetMatrixToAssemble(Mat& rMatToAssemble, bool zeroMatrixBeforeAssembly=true);
00106
00114 void SetVectorToAssemble(Vec& rVecToAssemble, bool zeroVectorBeforeAssembly);
00115
00119 void Assemble()
00120 {
00121 mAssembleMatrix = CAN_ASSEMBLE_MATRIX;
00122 mAssembleVector = CAN_ASSEMBLE_VECTOR;
00123 DoAssemble();
00124 }
00125
00129 void AssembleMatrix()
00130 {
00131 assert(CAN_ASSEMBLE_MATRIX);
00132 mAssembleMatrix = true;
00133 mAssembleVector = false;
00134 DoAssemble();
00135 }
00136
00140 void AssembleVector()
00141 {
00142 assert(CAN_ASSEMBLE_VECTOR);
00143 mAssembleMatrix = false;
00144 mAssembleVector = true;
00145 DoAssemble();
00146 }
00147
00151 virtual ~AbstractFeAssemblerInterface()
00152 {
00153 }
00154 };
00155
00156 template <bool CAN_ASSEMBLE_VECTOR, bool CAN_ASSEMBLE_MATRIX>
00157 AbstractFeAssemblerInterface<CAN_ASSEMBLE_VECTOR, CAN_ASSEMBLE_MATRIX>::AbstractFeAssemblerInterface()
00158 : mVectorToAssemble(NULL),
00159 mMatrixToAssemble(NULL),
00160 mZeroMatrixBeforeAssembly(true),
00161 mZeroVectorBeforeAssembly(true)
00162 {
00163 assert(CAN_ASSEMBLE_VECTOR || CAN_ASSEMBLE_MATRIX);
00164 }
00165
00166 template <bool CAN_ASSEMBLE_VECTOR, bool CAN_ASSEMBLE_MATRIX>
00167 void AbstractFeAssemblerInterface<CAN_ASSEMBLE_VECTOR, CAN_ASSEMBLE_MATRIX>::SetMatrixToAssemble(Mat& rMatToAssemble, bool zeroMatrixBeforeAssembly)
00168 {
00169 assert(rMatToAssemble);
00170 MatGetOwnershipRange(rMatToAssemble, &mOwnershipRangeLo, &mOwnershipRangeHi);
00171
00172 mMatrixToAssemble = rMatToAssemble;
00173 mZeroMatrixBeforeAssembly = zeroMatrixBeforeAssembly;
00174 }
00175
00176 template <bool CAN_ASSEMBLE_VECTOR, bool CAN_ASSEMBLE_MATRIX>
00177 void AbstractFeAssemblerInterface<CAN_ASSEMBLE_VECTOR, CAN_ASSEMBLE_MATRIX>::SetVectorToAssemble(Vec& rVecToAssemble, bool zeroVectorBeforeAssembly)
00178 {
00179 assert(rVecToAssemble);
00180 VecGetOwnershipRange(rVecToAssemble, &mOwnershipRangeLo, &mOwnershipRangeHi);
00181
00182 mVectorToAssemble = rVecToAssemble;
00183 mZeroVectorBeforeAssembly = zeroVectorBeforeAssembly;
00184 }
00185
00186 #endif // ABSTRACTFEASSEMBLERINTERFACE_HPP_