NGSolve
4.9
|
00001 #ifndef VECTOR_FACET_FE_HPP__ 00002 #define VECTOR_FACET_FE_HPP__ 00003 00004 /*********************************************************************/ 00005 /* File: vectorfacetfe.hpp */ 00006 /* Author: A. Sinwel, (J. Schoeberl) */ 00007 /* Date: 2008 */ 00008 /*********************************************************************/ 00009 00010 00011 namespace ngfem 00012 { 00013 /* 00014 facet element with tangential facet components. 00015 to be changed similar to scalar facetfe 00016 */ 00017 00018 template <int D> 00019 // class NGS_DLL_HEADER VectorFacetFacetFiniteElement : public FiniteElement 00020 class NGS_DLL_HEADER VectorFacetFacetFiniteElement : public HCurlFiniteElement<D> 00021 { 00022 protected: 00023 int vnums[8]; 00024 00025 INT<2> order_inner; 00026 using HCurlFiniteElement<D>::eltype; 00027 using HCurlFiniteElement<D>::order; 00028 00029 public: 00030 00031 VectorFacetFacetFiniteElement () 00032 // : FiniteElement(), 00033 : order_inner( INT<2>(0,0) ) 00034 { 00035 for ( int i = 0; i < 8; i++ ) 00036 vnums[i] = -1; 00037 } 00038 00039 VectorFacetFacetFiniteElement (int dim, ELEMENT_TYPE aeltype); 00040 00041 void SetVertexNumbers (FlatArray<int> & avnums); 00042 00043 void SetOrder (int o); 00044 00045 void SetOrder (INT<2> oi); 00046 00047 virtual void ComputeNDof () = 0; 00048 00049 virtual void CalcShape ( const IntegrationPoint & ip, FlatMatrixFixWidth<D> shape ) const = 0; 00050 00051 virtual const FlatMatrixFixWidth<D> GetShape (const IntegrationPoint & ip, 00052 LocalHeap & lh) const = 0; 00053 }; 00054 00055 00056 00060 class NGS_DLL_HEADER VectorFacetFacetSegm : public VectorFacetFacetFiniteElement<1> 00061 { 00062 public: 00063 VectorFacetFacetSegm (int aorder=0); 00064 00065 virtual void ComputeNDof(); 00066 00068 virtual void CalcShape (const IntegrationPoint & ip, 00069 FlatMatrixFixWidth<1> shape) const; 00070 00071 virtual const FlatMatrixFixWidth<1> GetShape (const IntegrationPoint & ip, 00072 LocalHeap & lh) const 00073 { 00074 FlatMatrixFixWidth<1> shape(ndof, lh); 00075 CalcShape (ip, shape); 00076 return shape; 00077 } 00078 00079 }; 00080 00081 00085 class VectorFacetFacetTrig : public VectorFacetFacetFiniteElement<2> 00086 { 00087 public: 00088 VectorFacetFacetTrig (int aorder=0); 00089 virtual void ComputeNDof(); 00090 00092 virtual void CalcShape (const IntegrationPoint & ip, 00093 FlatMatrixFixWidth<2> shape) const; 00094 00095 virtual const FlatMatrixFixWidth<2> GetShape (const IntegrationPoint & ip, 00096 LocalHeap & lh) const 00097 { 00098 FlatMatrixFixWidth<2> shape(ndof, lh); 00099 CalcShape (ip, shape); 00100 return shape; 00101 } 00102 }; 00103 00104 00108 class VectorFacetFacetQuad : public VectorFacetFacetFiniteElement<2> 00109 { 00110 public: 00111 VectorFacetFacetQuad (int aorder=0); 00112 virtual void ComputeNDof(); 00113 00115 virtual void CalcShape (const IntegrationPoint & ip, 00116 FlatMatrixFixWidth<2> shape) const; 00117 00118 virtual const FlatMatrixFixWidth<2> GetShape (const IntegrationPoint & ip, 00119 LocalHeap & lh) const 00120 { 00121 FlatMatrixFixWidth<2> shape(ndof, lh); 00122 CalcShape (ip, shape); 00123 return shape; 00124 } 00125 00126 }; 00127 00128 00129 template <int D> 00130 class NGS_DLL_HEADER VectorFacetVolumeFiniteElement : public HCurlFiniteElement<D> 00131 { 00132 protected: 00133 int vnums[8]; 00134 INT<2> facet_order[6]; 00135 int first_facet_dof[7]; 00136 bool highest_order_dc; 00137 using HCurlFiniteElement<D>::eltype; 00138 using HCurlFiniteElement<D>::order; 00139 00140 public: 00141 VectorFacetVolumeFiniteElement () // : nv(0), nf(0) 00142 { highest_order_dc=false; } 00143 00144 VectorFacetVolumeFiniteElement (ELEMENT_TYPE aeltype); 00145 00146 void SetHighestOrderDC(bool set){highest_order_dc=set;} 00147 void SetVertexNumbers (FlatArray<int> & avnums); 00148 00149 void SetOrder(int ao); 00150 00151 void SetOrder(FlatArray<int> & ao); 00152 void SetOrder(FlatArray<INT<2> > & ao); 00153 00154 INT<2> GetFacetOrder(int j) const 00155 { return facet_order[j]; } 00156 int GetVertexNumber(int j) const 00157 { return vnums[j]; } 00158 00159 00160 // virtual void TransformFacetToVolumeShape ( int fanr, FlatMatrix<> shape1d, 00161 // FlatMatrix<> shape ) const; 00162 00163 virtual void CalcShape (const IntegrationPoint & ip, FlatMatrixFixWidth<D> shape) const; 00164 virtual void CalcShape (const IntegrationPoint & ip, int facet, FlatMatrixFixWidth<D> shape) const = 0; 00165 00166 virtual int GetNExtraShapes( int facet) const {return 0;} 00167 virtual void CalcExtraShape (const IntegrationPoint & ip, int facet, FlatMatrixFixWidth<D> xshape) const {xshape = 0.0;} 00168 00169 virtual void GetFacetDofNrs(int afnr, Array<int>& fdnums) const; 00170 00171 virtual int GetFacetNDof(int afnr) const 00172 { return first_facet_dof[afnr+1] - first_facet_dof[afnr]; }; 00173 00174 virtual int GetFirstFacetDof(int afnr) const { 00175 return first_facet_dof[afnr];}; 00176 00177 virtual void ComputeNDof () = 0; 00178 00180 virtual void GetInternalDofs (Array<int> & idofs) const; 00181 00182 // utility 00183 // virtual int GetNF() const { return nf; }; 00184 // virtual int GetNV() const { return nv; }; 00185 // virtual void GetVertexNumbers(Array<int>&) const; 00186 // virtual void GetFacetOrders(Array<INT<2> >&) const; 00187 }; 00188 00189 00190 00191 class VectorFacetVolumeTrig : public VectorFacetVolumeFiniteElement<2> 00192 { 00193 public: 00194 VectorFacetVolumeTrig() : VectorFacetVolumeFiniteElement<2>(ET_TRIG) { ; } 00195 virtual void ComputeNDof(); 00196 00197 virtual void CalcShape ( const IntegrationPoint & ip, int facet, FlatMatrixFixWidth<2> shape) const; 00198 virtual int GetNExtraShapes( int facet) const {return 1;}; 00199 virtual void CalcExtraShape ( const IntegrationPoint & ip, int facet, FlatMatrixFixWidth<2> xshape) const; 00200 }; 00201 00202 00203 00204 class VectorFacetVolumeQuad : public VectorFacetVolumeFiniteElement<2> 00205 { 00206 public: 00207 VectorFacetVolumeQuad() : VectorFacetVolumeFiniteElement<2> (ET_QUAD) { ; } 00208 virtual void ComputeNDof(); 00209 00210 virtual void CalcShape (const IntegrationPoint & ip, int facet, FlatMatrixFixWidth<2> shape) const; 00211 virtual int GetNExtraShapes( int facet) const {return 1;}; 00212 virtual void CalcExtraShape ( const IntegrationPoint & ip, int facet, FlatMatrixFixWidth<2> xshape) const; 00213 00214 }; 00215 00216 00217 class VectorFacetVolumeTet : public VectorFacetVolumeFiniteElement<3> 00218 { 00219 public: 00220 VectorFacetVolumeTet() : VectorFacetVolumeFiniteElement<3> (ET_TET) { ; } 00221 virtual void ComputeNDof(); 00222 00223 virtual void CalcShape (const IntegrationPoint & ip, int facet, FlatMatrixFixWidth<3> shape) const; 00224 virtual int GetNExtraShapes( int facet) const {return 2*(facet_order[facet][0]+2);}; 00225 virtual void CalcExtraShape ( const IntegrationPoint & ip, int facet, FlatMatrixFixWidth<3> xshape) const; 00226 }; 00227 00228 00229 00230 class VectorFacetVolumeHex : public VectorFacetVolumeFiniteElement<3> 00231 { 00232 public: 00233 VectorFacetVolumeHex() : VectorFacetVolumeFiniteElement<3>(ET_HEX) { ; }; 00234 virtual void ComputeNDof(); 00235 00236 virtual void CalcShape ( const IntegrationPoint & ip, int facet, FlatMatrixFixWidth<3> shape ) const; 00237 // virtual int GetNExtraShapes( int facet) const {return 2*(2*facet_order[facet][0]+3);}; 00238 // virtual void CalcExtraShape ( const IntegrationPoint & ip, int facet, FlatMatrixFixWidth<3> xshape) const; 00239 }; 00240 00241 00242 00243 class VectorFacetVolumePrism : public VectorFacetVolumeFiniteElement<3> 00244 { 00245 public: 00246 VectorFacetVolumePrism() : VectorFacetVolumeFiniteElement<3> (ET_PRISM) { ; }; 00247 virtual void ComputeNDof(); 00248 00249 virtual void CalcShape ( const IntegrationPoint & ip, int facet, FlatMatrixFixWidth<3> shape) const; 00250 virtual int GetNExtraShapes( int facet) const; 00251 virtual void CalcExtraShape ( const IntegrationPoint & ip, int facet, FlatMatrixFixWidth<3> xshape) const; 00252 }; 00253 00254 00255 class VectorFacetVolumePyramid : public VectorFacetVolumeFiniteElement<3> 00256 { 00257 public: 00258 VectorFacetVolumePyramid() : VectorFacetVolumeFiniteElement<3> (ET_PYRAMID) { ; }; 00259 virtual void ComputeNDof(); 00260 00261 virtual void CalcShape (const IntegrationPoint & ip, int facet, FlatMatrixFixWidth<3> shape ) const; 00262 // virtual int GetNExtraShapes( int facet) const; 00263 // virtual void CalcExtraShape ( const IntegrationPoint & ip, int facet, FlatMatrixFixWidth<3> xshape) const; 00264 00265 }; 00266 00267 } 00268 00269 00270 00271 #endif 00272 00273