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