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 #ifndef _SIMPLEDG0PARABOLICASSEMBLER_HPP_
00029 #define _SIMPLEDG0PARABOLICASSEMBLER_HPP_
00030
00031 #include <vector>
00032
00033 #include "UblasCustomFunctions.hpp"
00034 #include "AbstractMesh.hpp"
00035
00036 #include "AbstractLinearParabolicPde.hpp"
00037 #include "AbstractLinearAssembler.hpp"
00038 #include "AbstractDynamicAssemblerMixin.hpp"
00039 #include "BoundaryConditionsContainer.hpp"
00040
00041
00042 #include <boost/mpl/if.hpp>
00043 #include <boost/mpl/void.hpp>
00044
00045
00051 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM, bool NON_HEART, class CONCRETE = boost::mpl::void_>
00052 class SimpleDg0ParabolicAssembler
00053 : public AbstractLinearAssembler<ELEMENT_DIM, SPACE_DIM, 1, NON_HEART, SimpleDg0ParabolicAssembler<ELEMENT_DIM, SPACE_DIM, NON_HEART, CONCRETE> >,
00054 public AbstractDynamicAssemblerMixin<ELEMENT_DIM, SPACE_DIM, 1>
00055 {
00056 public:
00057 static const unsigned E_DIM = ELEMENT_DIM;
00058 static const unsigned S_DIM = SPACE_DIM;
00059 static const unsigned P_DIM = 1u;
00060 private:
00061 AbstractLinearParabolicPde<SPACE_DIM>* mpParabolicPde;
00062
00063 typedef SimpleDg0ParabolicAssembler<ELEMENT_DIM, SPACE_DIM, NON_HEART, CONCRETE> SelfType;
00064 typedef AbstractLinearAssembler<ELEMENT_DIM, SPACE_DIM, 1, NON_HEART, SelfType> BaseClassType;
00066 friend class AbstractStaticAssembler<ELEMENT_DIM, SPACE_DIM, 1, NON_HEART, SelfType>;
00067
00068 #define COVERAGE_IGNORE //In case these protoypes show up as code
00069 protected:
00076 virtual c_matrix<double,1*(ELEMENT_DIM+1),1*(ELEMENT_DIM+1)> ComputeMatrixTerm(
00077 c_vector<double, ELEMENT_DIM+1> &rPhi,
00078 c_matrix<double, ELEMENT_DIM, ELEMENT_DIM+1> &rGradPhi,
00079 ChastePoint<SPACE_DIM> &rX,
00080 c_vector<double,1> &u,
00081 c_matrix<double,1,SPACE_DIM> &rGradU ,
00082 Element<ELEMENT_DIM,SPACE_DIM>* pElement);
00083
00087 virtual c_vector<double,1*(ELEMENT_DIM+1)> ComputeVectorTerm(
00088 c_vector<double, ELEMENT_DIM+1> &rPhi,
00089 c_matrix<double, ELEMENT_DIM, ELEMENT_DIM+1> &rGradPhi,
00090 ChastePoint<SPACE_DIM> &rX,
00091 c_vector<double,1> &u,
00092 c_matrix<double, 1, SPACE_DIM> &rGradU ,
00093 Element<ELEMENT_DIM,SPACE_DIM>* pElement);
00094
00095
00100 virtual c_vector<double, ELEMENT_DIM> ComputeVectorSurfaceTerm(
00101 const BoundaryElement<ELEMENT_DIM-1,SPACE_DIM> &rSurfaceElement,
00102 c_vector<double, ELEMENT_DIM> &rPhi,
00103 ChastePoint<SPACE_DIM> &rX );
00104 #undef COVERAGE_IGNORE //In case these protoypes show up as code
00105
00106
00107 public:
00111 SimpleDg0ParabolicAssembler(AbstractMesh<ELEMENT_DIM,SPACE_DIM>* pMesh,
00112 AbstractLinearParabolicPde<SPACE_DIM>* pPde,
00113 BoundaryConditionsContainer<ELEMENT_DIM,SPACE_DIM,1>* pBoundaryConditions,
00114 unsigned numQuadPoints = 2);
00115
00119 virtual void PrepareForSolve();
00120
00121 Vec Solve(Vec currentSolutionOrGuess=NULL, double currentTime=0.0);
00122 };
00123
00124
00138 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM, bool NON_HEART, class CONCRETE>
00139 struct AssemblerTraits<SimpleDg0ParabolicAssembler<ELEMENT_DIM, SPACE_DIM, NON_HEART, CONCRETE> >
00140 {
00141 typedef typename boost::mpl::if_<boost::mpl::is_void_<CONCRETE>,
00142 SimpleDg0ParabolicAssembler<ELEMENT_DIM, SPACE_DIM, NON_HEART, CONCRETE>,
00143 typename AssemblerTraits<CONCRETE>::CVT_CLS>::type
00144 CVT_CLS;
00145 typedef typename boost::mpl::if_<boost::mpl::is_void_<CONCRETE>,
00146 SimpleDg0ParabolicAssembler<ELEMENT_DIM, SPACE_DIM, NON_HEART, CONCRETE>,
00147 typename AssemblerTraits<CONCRETE>::CMT_CLS>::type
00148 CMT_CLS;
00150 typedef typename boost::mpl::if_<boost::mpl::is_void_<CONCRETE>,
00151 AbstractAssembler<ELEMENT_DIM, SPACE_DIM, 1u>,
00152 typename AssemblerTraits<CONCRETE>::INTERPOLATE_CLS>::type
00153 INTERPOLATE_CLS;
00154 };
00155
00156
00157 #endif //_SIMPLEDG0PARABOLICASSEMBLER_HPP_