NGSolve  4.9
fem/vectorfacetfe.hpp
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