NGSolve
4.9
|
00001 #ifndef FILE_FACETFE 00002 #define FILE_FACETFE 00003 00004 /*********************************************************************/ 00005 /* File: facetfe.hpp */ 00006 /* Author: A. Sinwel, H. Egger, J. Schoeberl */ 00007 /* Date: 2008 */ 00008 /*********************************************************************/ 00009 00010 namespace ngfem 00011 { 00012 00013 /* 00014 * Facet Finite Elements 00015 */ 00016 00017 template <int D> 00018 class NGS_DLL_HEADER FacetVolumeFiniteElement; 00019 00020 00021 template <int D> 00022 class FacetFEFacet : virtual public ScalarFiniteElement<D> 00023 { 00024 int fnr; 00025 const FacetVolumeFiniteElement<D> & fe; 00026 public: 00027 FacetFEFacet (int afnr, 00028 const FacetVolumeFiniteElement<D> & afe, 00029 ELEMENT_TYPE aeltype, int andof, int aorder) 00030 : ScalarFiniteElement<D> (aeltype, andof, aorder), fnr(afnr), fe(afe) { ; } 00031 00032 virtual void CalcShape (const IntegrationPoint & ip, 00033 FlatVector<> shape) const 00034 { 00035 fe.CalcFacetShapeVolIP(fnr, ip, shape); 00036 } 00037 }; 00038 00039 00040 00041 template <int D> 00042 class NGS_DLL_HEADER FacetVolumeFiniteElement : public FiniteElement 00043 { 00044 protected: 00045 int vnums[8]; 00046 int facet_order[6]; 00047 int first_facet_dof[7]; 00048 00049 using FiniteElement::eltype; 00050 using FiniteElement::ndof; 00051 using FiniteElement::order; 00052 00053 public: 00054 00055 void SetVertexNumbers (FlatArray<int> & avnums) 00056 { 00057 for (int i = 0; i < avnums.Size(); i++) 00058 vnums[i] = avnums[i]; 00059 } 00060 00061 void SetOrder (int ao) 00062 { 00063 order = ao; 00064 for (int i = 0; i < 6; i++) 00065 facet_order[i] = ao; 00066 } 00067 00068 void SetOrder (FlatArray<int> & ao) 00069 { 00070 for (int i=0; i<ao.Size(); i++) 00071 facet_order[i] = ao[i]; 00072 00073 order = facet_order[0]; // integration order 00074 for (int i = 1; i < ao.Size(); i++) 00075 order = max(order, ao[i]); 00076 } 00077 00078 FacetFEFacet<D> Facet (int fnr) const 00079 { 00080 return FacetFEFacet<D> (fnr, *this, eltype, 00081 GetFacetDofs(fnr).Size(), facet_order[fnr]); 00082 } 00083 00084 virtual void CalcFacetShapeVolIP (int fnr, const IntegrationPoint & ip, 00085 FlatVector<> shape) const = 0; 00086 00087 00088 00089 /* 00090 // please use Facet(k).CalcShape (ip, shape) instead 00091 // ip .. vol point 00092 // shape .. size is facet.ndof 00093 00094 void CalcFacetShape(int fnr, const IntegrationPoint & ip, FlatVector<> shape) const; 00095 void EvaluateFacet (int fnr, const IntegrationRule & ir, FlatVector<> coefs, FlatVector<> values) const; 00096 void EvaluateFacetTrans (int fnr, const IntegrationRule & ir, FlatVector<> values, FlatVector<> coefs) const; 00097 void SelectFacet (int afn) const { facetnr = afn; } 00098 */ 00099 00100 00101 IntRange GetFacetDofs(int fnr) const 00102 { 00103 return IntRange (first_facet_dof[fnr], first_facet_dof[fnr+1]); 00104 } 00105 00106 virtual string ClassName() const { return "FacetVolumeFiniteElement"; } 00107 00108 virtual void ComputeNDof () = 0; 00109 }; 00110 00111 } 00112 00113 00114 00115 #endif