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