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 "AbstractMesh.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;
00076
00077 protected:
00078
00079 typedef BidomainDg0Assembler<ELEMENT_DIM, SPACE_DIM> SelfType;
00080 typedef AbstractLinearAssembler<ELEMENT_DIM, SPACE_DIM, 2, false, SelfType> BaseClassType;
00081
00083 friend class AbstractStaticAssembler<ELEMENT_DIM, SPACE_DIM, 2, false, SelfType>;
00084
00085 BidomainPde<SPACE_DIM>* mpBidomainPde;
00086
00087 HeartConfig* mpConfig;
00088
00089
00090 double mIionic;
00091 double mIIntracellularStimulus;
00092 double mIExtracellularStimulus;
00093
00094 bool mNullSpaceCreated;
00095
00096 Vec mExternalVoltageMask;
00097 std::vector<unsigned> mFixedExtracellularPotentialNodes;
00098
00099 unsigned mRowForAverageOfPhiZeroed;
00100
00101 void ResetInterpolatedQuantities( void );
00102
00103 void InitialiseForSolve(Vec initialSolution);
00104
00105 void IncrementInterpolatedQuantities(double phi_i, const Node<SPACE_DIM>* pNode);
00106
00113 virtual c_matrix<double,2*(ELEMENT_DIM+1),2*(ELEMENT_DIM+1)> ComputeMatrixTerm(
00114 c_vector<double, ELEMENT_DIM+1> &rPhi,
00115 c_matrix<double, ELEMENT_DIM, ELEMENT_DIM+1> &rGradPhi,
00116 ChastePoint<SPACE_DIM> &rX,
00117 c_vector<double,2> &u,
00118 c_matrix<double, 2, SPACE_DIM> &rGradU ,
00119 Element<ELEMENT_DIM,SPACE_DIM>* pElement);
00120
00127 virtual c_vector<double,2*(ELEMENT_DIM+1)> ComputeVectorTerm(
00128 c_vector<double, ELEMENT_DIM+1> &rPhi,
00129 c_matrix<double, ELEMENT_DIM, ELEMENT_DIM+1> &rGradPhi,
00130 ChastePoint<SPACE_DIM> &rX,
00131 c_vector<double,2> &u,
00132 c_matrix<double, 2, SPACE_DIM> &rGradU ,
00133 Element<ELEMENT_DIM,SPACE_DIM>* pElement);
00134
00146 #define COVERAGE_IGNORE //see NOTE above
00147 virtual c_vector<double, 2*ELEMENT_DIM> ComputeVectorSurfaceTerm(
00148 const BoundaryElement<ELEMENT_DIM-1,SPACE_DIM> &rSurfaceElement,
00149 c_vector<double,ELEMENT_DIM> &rPhi,
00150 ChastePoint<SPACE_DIM> &rX);
00151 #undef COVERAGE_IGNORE
00152
00159 virtual void PrepareForAssembleSystem(Vec currentSolution, double time);
00160
00169 virtual void FinaliseAssembleSystem(Vec currentSolution, double currentTime);
00170
00171
00172 public:
00173
00177 BidomainDg0Assembler(AbstractMesh<ELEMENT_DIM,SPACE_DIM>* pMesh,
00178 BidomainPde<SPACE_DIM>* pPde,
00179 BoundaryConditionsContainer<ELEMENT_DIM, SPACE_DIM, 2>* pBcc,
00180 unsigned numQuadPoints = 2);
00181
00182 ~BidomainDg0Assembler();
00183
00194 void SetFixedExtracellularPotentialNodes(std::vector<unsigned> fixedExtracellularPotentialNodes);
00195
00196 void SetRowForAverageOfPhiZeroed(unsigned rowMeanPhiEZero);
00197 };
00198
00203 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM>
00204 struct AssemblerTraits<BidomainDg0Assembler<ELEMENT_DIM, SPACE_DIM> >
00205 {
00207 typedef BidomainDg0Assembler<ELEMENT_DIM, SPACE_DIM> CVT_CLS;
00209 typedef BidomainDg0Assembler<ELEMENT_DIM, SPACE_DIM> CMT_CLS;
00211 typedef BidomainDg0Assembler<ELEMENT_DIM, SPACE_DIM> INTERPOLATE_CLS;
00212 };
00213
00214 #endif