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 #ifndef _BIDOMAINDG0ASSEMBLER_HPP_
00031 #define _BIDOMAINDG0ASSEMBLER_HPP_
00032
00033 #include "UblasIncludes.hpp"
00034
00035
00036 #include <vector>
00037 #include <petscvec.h>
00038
00039 #include "AbstractDynamicAssemblerMixin.hpp"
00040 #include "AbstractLinearAssembler.hpp"
00041
00042 #include "BidomainPde.hpp"
00043 #include "HeartConfig.hpp"
00044 #include "Element.hpp"
00045 #include "BoundaryElement.hpp"
00046 #include "ChastePoint.hpp"
00047 #include "AbstractTetrahedralMesh.hpp"
00048 #include "BoundaryConditionsContainer.hpp"
00049
00067 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM>
00068 class BidomainDg0Assembler
00069 : public AbstractLinearAssembler<ELEMENT_DIM, SPACE_DIM, 2, false, BidomainDg0Assembler<ELEMENT_DIM, SPACE_DIM> >,
00070 public AbstractDynamicAssemblerMixin<ELEMENT_DIM, SPACE_DIM, 2>
00071 {
00072 public:
00073 static const unsigned E_DIM = ELEMENT_DIM;
00074 static const unsigned S_DIM = SPACE_DIM;
00075 static const unsigned P_DIM = 2u;
00077 protected:
00078
00079 typedef BidomainDg0Assembler<ELEMENT_DIM, SPACE_DIM> SelfType;
00080 typedef AbstractLinearAssembler<ELEMENT_DIM, SPACE_DIM, 2, false, SelfType> BaseClassType;
00082
00083 friend class AbstractStaticAssembler<ELEMENT_DIM, SPACE_DIM, 2, false, SelfType>;
00084
00086 BidomainPde<SPACE_DIM>* mpBidomainPde;
00087
00089 HeartConfig* mpConfig;
00090
00092 double mIionic;
00094 double mIIntracellularStimulus;
00096 double mIExtracellularStimulus;
00097
00099 bool mNullSpaceCreated;
00100
00104 std::vector<unsigned> mFixedExtracellularPotentialNodes;
00105
00111 unsigned mRowForAverageOfPhiZeroed;
00112
00116 void ResetInterpolatedQuantities();
00117
00124 void InitialiseForSolve(Vec initialSolution);
00125
00132 void IncrementInterpolatedQuantities(double phiI, const Node<SPACE_DIM>* pNode);
00133
00145 virtual void CheckCompatibilityCondition();
00146
00160 virtual c_matrix<double,2*(ELEMENT_DIM+1),2*(ELEMENT_DIM+1)> ComputeMatrixTerm(
00161 c_vector<double, ELEMENT_DIM+1> &rPhi,
00162 c_matrix<double, ELEMENT_DIM, ELEMENT_DIM+1> &rGradPhi,
00163 ChastePoint<SPACE_DIM> &rX,
00164 c_vector<double,2> &rU,
00165 c_matrix<double, 2, SPACE_DIM> &rGradU ,
00166 Element<ELEMENT_DIM,SPACE_DIM>* pElement);
00167
00181 virtual c_vector<double,2*(ELEMENT_DIM+1)> ComputeVectorTerm(
00182 c_vector<double, ELEMENT_DIM+1> &rPhi,
00183 c_matrix<double, ELEMENT_DIM, ELEMENT_DIM+1> &rGradPhi,
00184 ChastePoint<SPACE_DIM> &rX,
00185 c_vector<double,2> &u,
00186 c_matrix<double, 2, SPACE_DIM> &rGradU ,
00187 Element<ELEMENT_DIM,SPACE_DIM>* pElement);
00188
00205 #define COVERAGE_IGNORE //see NOTE above
00206 virtual c_vector<double, 2*ELEMENT_DIM> ComputeVectorSurfaceTerm(
00207 const BoundaryElement<ELEMENT_DIM-1,SPACE_DIM> &rSurfaceElement,
00208 c_vector<double,ELEMENT_DIM> &rPhi,
00209 ChastePoint<SPACE_DIM> &rX);
00210 #undef COVERAGE_IGNORE
00211
00220 virtual void PrepareForAssembleSystem(Vec existingSolution, double time);
00221
00232 virtual void FinaliseAssembleSystem(Vec existingSolution, double time);
00233
00240 virtual Vec GenerateNullBasis() const;
00241
00242 public:
00243
00252 BidomainDg0Assembler(AbstractTetrahedralMesh<ELEMENT_DIM,SPACE_DIM>* pMesh,
00253 BidomainPde<SPACE_DIM>* pPde,
00254 BoundaryConditionsContainer<ELEMENT_DIM, SPACE_DIM, 2>* pBcc,
00255 unsigned numQuadPoints = 2);
00256
00260 ~BidomainDg0Assembler();
00261
00272 void SetFixedExtracellularPotentialNodes(std::vector<unsigned> fixedExtracellularPotentialNodes);
00273
00279 void SetRowForAverageOfPhiZeroed(unsigned rowMeanPhiEZero);
00280 };
00281
00286 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM>
00287 struct AssemblerTraits<BidomainDg0Assembler<ELEMENT_DIM, SPACE_DIM> >
00288 {
00290 typedef BidomainDg0Assembler<ELEMENT_DIM, SPACE_DIM> CVT_CLS;
00292 typedef BidomainDg0Assembler<ELEMENT_DIM, SPACE_DIM> CMT_CLS;
00294 typedef BidomainDg0Assembler<ELEMENT_DIM, SPACE_DIM> INTERPOLATE_CLS;
00295 };
00296
00297 #endif