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 "AbstractTetrahedralMesh.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
00063 AbstractLinearParabolicPde<ELEMENT_DIM, SPACE_DIM>* mpParabolicPde;
00064
00065 typedef SimpleDg0ParabolicAssembler<ELEMENT_DIM, SPACE_DIM, NON_HEART, CONCRETE> SelfType;
00066 typedef AbstractLinearAssembler<ELEMENT_DIM, SPACE_DIM, 1, NON_HEART, SelfType> BaseClassType;
00067
00068 friend class AbstractStaticAssembler<ELEMENT_DIM, SPACE_DIM, 1, NON_HEART, SelfType>;
00069
00070 #define COVERAGE_IGNORE //In case these protoypes show up as code
00071 protected:
00085 virtual c_matrix<double,1*(ELEMENT_DIM+1),1*(ELEMENT_DIM+1)> ComputeMatrixTerm(
00086 c_vector<double, ELEMENT_DIM+1>& rPhi,
00087 c_matrix<double, SPACE_DIM, ELEMENT_DIM+1>& rGradPhi,
00088 ChastePoint<SPACE_DIM>& rX,
00089 c_vector<double,1>& rU,
00090 c_matrix<double,1,SPACE_DIM>& rGradU ,
00091 Element<ELEMENT_DIM,SPACE_DIM>* pElement);
00092
00103 virtual c_vector<double,1*(ELEMENT_DIM+1)> ComputeVectorTerm(
00104 c_vector<double, ELEMENT_DIM+1>& rPhi,
00105 c_matrix<double, SPACE_DIM, ELEMENT_DIM+1>& rGradPhi,
00106 ChastePoint<SPACE_DIM>& rX,
00107 c_vector<double,1>& rU,
00108 c_matrix<double, 1, SPACE_DIM>& rGradU ,
00109 Element<ELEMENT_DIM,SPACE_DIM>* pElement);
00110
00119 virtual c_vector<double, ELEMENT_DIM> ComputeVectorSurfaceTerm(
00120 const BoundaryElement<ELEMENT_DIM-1,SPACE_DIM>& rSurfaceElement,
00121 c_vector<double, ELEMENT_DIM>& rPhi,
00122 ChastePoint<SPACE_DIM>& rX);
00123 #undef COVERAGE_IGNORE //In case these protoypes show up as code
00124
00125 public:
00126
00135 SimpleDg0ParabolicAssembler(AbstractTetrahedralMesh<ELEMENT_DIM,SPACE_DIM>* pMesh,
00136 AbstractLinearParabolicPde<ELEMENT_DIM,SPACE_DIM>* pPde,
00137 BoundaryConditionsContainer<ELEMENT_DIM,SPACE_DIM,1>* pBoundaryConditions,
00138 unsigned numQuadPoints = 2);
00139
00143 virtual void PrepareForSolve();
00144
00154 Vec Solve(Vec currentSolutionOrGuess=NULL, double currentTime=0.0);
00155 };
00156
00157
00171 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM, bool NON_HEART, class CONCRETE>
00172 struct AssemblerTraits<SimpleDg0ParabolicAssembler<ELEMENT_DIM, SPACE_DIM, NON_HEART, CONCRETE> >
00173 {
00175 typedef typename boost::mpl::if_<boost::mpl::is_void_<CONCRETE>,
00176 SimpleDg0ParabolicAssembler<ELEMENT_DIM, SPACE_DIM, NON_HEART, CONCRETE>,
00177 typename AssemblerTraits<CONCRETE>::CVT_CLASS>::type
00178 CVT_CLASS;
00179
00181 typedef typename boost::mpl::if_<boost::mpl::is_void_<CONCRETE>,
00182 SimpleDg0ParabolicAssembler<ELEMENT_DIM, SPACE_DIM, NON_HEART, CONCRETE>,
00183 typename AssemblerTraits<CONCRETE>::CMT_CLASS>::type
00184 CMT_CLASS;
00185
00187 typedef typename boost::mpl::if_<boost::mpl::is_void_<CONCRETE>,
00188 AbstractAssembler<ELEMENT_DIM, SPACE_DIM, 1u>,
00189 typename AssemblerTraits<CONCRETE>::INTERPOLATE_CLASS>::type
00190 INTERPOLATE_CLASS;
00191 };
00192
00193
00194 #endif //_SIMPLEDG0PARABOLICASSEMBLER_HPP_