NGSolve  4.9
comp/l2hofespace.hpp
00001 #ifndef FILE_L2HOFESPACE
00002 #define FILE_L2HOFESPACE
00003 
00004 /*********************************************************************/
00005 /* File:   l2hofespace.hpp                                           */
00006 /* Author: Start                                                     */
00007 /* Date:   23.Feb. 2003                                              */
00008 /*********************************************************************/
00009 
00010 namespace ngcomp
00011 {
00012   
00017   class NGS_DLL_HEADER L2HighOrderFESpace : public FESpace
00018   {
00019   protected:
00020     // Number of Elements
00021     int nel;
00022     // Degrees of Freedom 
00023     int ndof;
00024     // Levels 
00025     Array<int> ndlevel;
00026     // if order is relative to mesh order 
00027     bool var_order;
00028     // variable order is set to mesh_order + rel_order 
00029     int rel_order;
00030     // order of elements 
00031     Array<INT<3> > order_inner;
00032     // table of first element dofnumber 
00033     Array<int> first_element_dof;
00034     bool all_dofs_together;
00035   public:
00036 
00037     L2HighOrderFESpace (const MeshAccess & ama, const Flags & flags, bool parseflags=false);
00039     virtual ~L2HighOrderFESpace ();
00040     // Create if order=0 ElementFESpace Constructor, else L2HOFE 
00041     static FESpace * Create (const MeshAccess & ma, const Flags & flags);
00042     // Creates also for order=0 a L2HighOrderFESpace 
00043     static FESpace * CreateHO (const MeshAccess & ma, const Flags & flags) 
00044     {
00045       return new L2HighOrderFESpace (ma, flags, true);
00046     }  
00047   
00048     virtual string GetClassName () const
00049     {
00050       return "L2HighOrderFESpace";
00051     }
00052 
00053     bool AllDofsTogether(){return all_dofs_together;};
00055     virtual void Update(LocalHeap & lh);
00057     virtual void UpdateDofTables();
00059     virtual void UpdateCouplingDofArray();    
00061     virtual int GetNDof () const;
00063     virtual int GetNDofLevel (int level) const;
00065     virtual const FiniteElement & GetFE (int elnr, LocalHeap & lh) const;
00067     virtual const FiniteElement & GetSFE (int elnr, LocalHeap & lh) const;
00070     virtual const FiniteElement & GetFacetFE (int fnr, LocalHeap & lh) const;
00071 
00072     virtual void GetDofNrs (int elnr, Array<int> & dnums) const;
00074     virtual void GetSDofNrs (int selnr, Array<int> & dnums) const;
00076     virtual Table<int> * CreateSmoothingBlocks (const Flags & precflags) const;
00078  
00079     virtual void GetVertexDofNrs (int vnr, Array<int> & dnums) const;
00080     virtual void GetEdgeDofNrs (int ednr, Array<int> & dnums) const;
00081     virtual void GetFaceDofNrs (int fanr, Array<int> & dnums) const;
00082     virtual void GetInnerDofNrs (int elnr, Array<int> & dnums) const;
00083 
00084 
00085     IntRange GetElementDofs (int nr) const
00086     {
00087       return IntRange (first_element_dof[nr], 
00088                        first_element_dof[nr+1]);
00089     }
00090 
00091     /*
00092     int GetFirstInnerDof(int elnr) const  
00093     { return (first_element_dof[elnr]); }
00094 
00095   
00096     virtual int GetNElemDofs(int elnr) const 
00097     { return(first_element_dof[elnr+1] - first_element_dof[elnr]+1); }
00098     */
00099   };
00100 
00101 
00102 
00103 
00104 
00105 
00106 
00107 
00108 
00109 
00110 
00111 
00112   class NGS_DLL_HEADER L2SurfaceHighOrderFESpace : public FESpace
00113   {
00114   protected:
00115   
00116     // Level
00117     int level;
00118 
00119     // Number of Elements
00120     int nel;
00121 
00122     Array<int> first_element_dof;
00123     int ndof;
00124 
00125 
00126     // if order is relative to mesh order 
00127     bool var_order;
00128     // variable order is set to mesh_order + rel_order 
00129     int rel_order;
00130     // order of elements 
00131     Array<INT<3> > order_cell;
00132 
00133   public:
00134 
00135     L2SurfaceHighOrderFESpace (const MeshAccess & ama, const Flags & flags, bool parseflags=false);
00137     virtual ~L2SurfaceHighOrderFESpace ();
00138 
00139     static FESpace * Create (const MeshAccess & ma, const Flags & flags);
00140 
00141     virtual string GetClassName () const
00142     {
00143       return "L2SurfaceHighOrderFESpace";
00144     }
00145 
00147     virtual void Update(LocalHeap & lh);
00149     //virtual void UpdateDofTables();
00151     virtual int GetNDof () const;
00153     virtual const FiniteElement & GetFE (int elnr, LocalHeap & lh) const;
00155     virtual const FiniteElement & GetSFE (int elnr, LocalHeap & lh) const;
00157     virtual void GetDofNrs (int elnr, Array<int> & dnums) const;
00159     virtual void GetSDofNrs (int selnr, Array<int> & dnums) const;
00160   
00161     virtual Table<int> * CreateSmoothingBlocks ( int type = 0) const;
00162 
00164     virtual void GetInnerDofNrs (int elnr, Array<int> & dnums) const;
00165     virtual void GetVertexDofNrs (int vnr, Array<int> & dnums) const;
00166     virtual void GetEdgeDofNrs (int ednr, Array<int> & dnums) const;
00167     virtual void GetFaceDofNrs (int fanr, Array<int> & dnums) const;
00168 
00169     virtual bool VarOrder() const { return var_order; } 
00170     virtual int GetRelOrder() const { return rel_order; }   
00171 
00172   };
00173 
00174 }
00175 
00176 #endif
00177