NGSolve
4.9
|
00001 #ifndef FILE_HDIVFE 00002 #define FILE_HDIVFE 00003 00004 /*********************************************************************/ 00005 /* File: hdivfe.hpp */ 00006 /* Author: Joachim Schoeberl */ 00007 /* Date: 5. Jul. 2001 */ 00008 /*********************************************************************/ 00009 00010 namespace ngfem 00011 { 00012 00017 template <int D> 00018 class NGS_DLL_HEADER HDivFiniteElement : public FiniteElement 00019 { 00020 public: 00021 enum { DIM = D }; 00022 00023 public: 00025 HDivFiniteElement (ELEMENT_TYPE aeltype, int andof, int aorder) 00026 : FiniteElement (aeltype, andof, aorder) { ; } 00027 00029 HDivFiniteElement () 00030 { 00031 ; 00032 } 00033 00035 virtual ~HDivFiniteElement () { ; } 00036 00038 virtual string ClassName() const {return "HDivFiniteElement";} 00039 00041 virtual void CalcShape (const IntegrationPoint & ip, 00042 FlatMatrixFixWidth<DIM> shape) const = 0; 00043 00045 virtual void CalcDivShape (const IntegrationPoint & ip, 00046 FlatVector<> divshape) const; 00047 00049 virtual void CalcMappedShape (const MappedIntegrationPoint<DIM,DIM> & sip, 00050 FlatMatrixFixWidth<DIM> shape) const; 00051 00053 virtual void CalcMappedDivShape (const MappedIntegrationPoint<DIM,DIM> & sip, 00054 FlatVector<> divshape) const; 00055 00056 00057 00058 const FlatMatrixFixWidth<DIM> GetShape (const IntegrationPoint & ip, 00059 LocalHeap & lh) const 00060 { 00061 FlatMatrixFixWidth<DIM> shape(ndof, lh); 00062 CalcShape (ip, shape); 00063 return shape; 00064 } 00065 00066 const FlatVector<> GetDivShape (const IntegrationPoint & ip, 00067 LocalHeap & lh) const 00068 { 00069 FlatVector<> divshape(ndof, lh); 00070 CalcDivShape (ip, divshape); 00071 return divshape; 00072 } 00073 00074 00075 virtual void Evaluate (const IntegrationRule & ir, FlatVector<double> coefs, 00076 FlatMatrixFixWidth<D> vals) const 00077 { 00078 MatrixFixWidth<D> shape(ndof); 00079 for (int i = 0; i < ir.GetNIP(); i++) 00080 { 00081 CalcShape (ir[i], shape); 00082 vals.Row(i) = Trans(shape) * coefs; 00083 } 00084 } 00085 00086 00087 protected: 00088 00090 virtual void CalcShape1 (const IntegrationPoint & ip, 00091 FlatMatrixFixWidth<DIM> shape) const { ; } 00092 00094 virtual void CalcShape2 (const IntegrationPoint & ip, 00095 FlatMatrixFixWidth<DIM> shape) const { ; } 00096 00098 void ComputeFaceMoments (int fnr, ScalarFiniteElement<DIM-1> & testfe, 00099 FlatMatrix<> & moments, 00100 int order, int shape = 1) const; 00101 }; 00102 00103 00104 00105 00110 template <int D> 00111 class NGS_DLL_HEADER HDivNormalFiniteElement : public FiniteElement 00112 { 00113 public: 00114 enum { DIM = D }; 00115 00116 public: 00118 HDivNormalFiniteElement (ELEMENT_TYPE aeltype, int andof, int aorder) 00119 : FiniteElement (aeltype, andof, aorder){;} 00120 00122 virtual ~HDivNormalFiniteElement () { ; } 00123 00125 virtual void CalcShape (const IntegrationPoint & ip, 00126 FlatVector<> shape) const = 0; 00127 00129 const FlatVector<> GetShape (const IntegrationPoint & ip, 00130 LocalHeap & lh) const 00131 { 00132 FlatVector<> shape(ndof, lh); 00133 CalcShape (ip, shape); 00134 return shape; 00135 } 00136 00137 }; 00138 00139 00140 00141 00142 00143 00144 00145 00146 00147 00148 00149 00150 00151 00152 00153 00154 00155 } 00156 00157 #endif 00158 00159 00160