NGSolve
4.9
|
00001 #ifndef FILE_HCURLHOFESPACE 00002 #define FILE_HCURLHOFESPACE 00003 00004 /*********************************************************************/ 00005 /* File: hcurlhofespace.hpp */ 00006 /* Author: Sabine Zaglmayr, Start-project */ 00007 /* Date: 20. Maerz 2003 */ 00008 /*********************************************************************/ 00009 00010 namespace ngcomp 00011 { 00012 00018 class NGS_DLL_HEADER HCurlHighOrderFESpace : public FESpace 00019 { 00020 protected: 00021 // Level 00022 int level; 00023 Array<int> first_edge_dof; 00024 Array<int> first_inner_dof; 00025 Array<int> first_face_dof; 00026 00027 int fn; 00029 int rel_order; 00030 00031 INT<3> rel_orders; 00032 00033 Array<int> order_edge; 00034 Array<bool> fine_edge; 00035 Array<bool> fine_face; 00036 Array<int> cell_ngrad; 00037 Array<int> face_ngrad; 00038 Array<INT<2> > order_face; 00039 Array<INT<3> > order_inner; 00040 Array<int> order_avertex; 00041 Array<bool> usegrad_edge; 00042 Array<bool> usegrad_face; 00043 Array<bool> usegrad_cell; 00044 Array<INT<3> > dom_order_min; 00045 Array<INT<3> > dom_order_max; 00046 int maxorder, minorder; 00047 00048 00049 BitArray gradientdomains; 00050 BitArray gradientboundaries; 00051 00052 bool usegrad; 00053 bool var_order; 00054 00055 int ndof; 00056 int nedfine; 00057 int uniform_order_inner; 00058 int uniform_order_face; 00059 int uniform_order_edge; 00060 int augmented; 00061 00062 00063 Flags flags; 00064 int smoother; 00065 bool level_adapted_order; 00066 bool nograds; 00067 00068 bool fast_pfem; 00069 bool discontinuous; 00070 00071 public: 00072 00073 HCurlHighOrderFESpace (const MeshAccess & ama, const Flags & flags, bool parseflags=false); 00075 virtual ~HCurlHighOrderFESpace (); 00076 00077 // static FESpace * Create (const MeshAccess & ma, const Flags & flags); 00078 00079 virtual string GetClassName () const 00080 { 00081 return "HCurlHighOrderFESpace"; 00082 } 00083 00085 virtual void Update(LocalHeap & lh); 00087 virtual int GetNDof () const; 00089 virtual const FiniteElement & GetFE (int elnr, LocalHeap & lh) const; 00091 virtual const FiniteElement & GetSFE (int selnr, LocalHeap & lh) const; 00093 virtual void GetDofNrs (int elnr, Array<int> & dnums) const; 00095 virtual void GetSDofNrs (int selnr, Array<int> & dnums) const; 00097 00098 00100 void SetGradientDomains (const BitArray & adoms); 00102 void SetGradientBoundaries (const BitArray & abnds); 00103 00104 virtual Table<int> * CreateSmoothingBlocks (const Flags & precflags) const; 00105 00106 //virtual BitArray * CreateIntermediatePlanes (int type = 0) const; 00108 virtual Array<int> * CreateDirectSolverClusters (const Flags & precflags) const; 00110 SparseMatrix<double> * CreateGradient() const; 00111 00112 int GetFirstEdgeDof(int e) const { return first_edge_dof[e]; }; 00113 int GetFirstFaceDof(int f) const { return first_face_dof[f]; }; 00114 int GetFirstCellDof(int c) const { return first_inner_dof[c]; }; 00115 00116 INT<2> GetFaceOrder(const int i) {return order_face[i];} 00117 00118 int GetSmoothingType() const {return smoother;} 00119 00120 bool GetNoGrads() const {return nograds;}; 00121 virtual void UpdateDofTables(); 00122 virtual void UpdateCouplingDofArray(); 00123 int GetMaxOrder() const {return maxorder;}; 00124 int GetMinOrder() const {return minorder;}; 00125 00126 00127 virtual void GetVertexDofNrs (int vnr, Array<int> & dnums) const; 00128 virtual void GetEdgeDofNrs (int ednr, Array<int> & dnums) const; 00129 virtual void GetFaceDofNrs (int fanr, Array<int> & dnums) const; 00130 virtual void GetInnerDofNrs (int elnr, Array<int> & dnums) const; 00131 00132 bool GetFineEdge( const int i ) const {return fine_edge[i]; }; 00133 bool GetFineFace( const int i ) const {return fine_face[i]; }; 00134 00135 virtual bool VarOrder() const { return var_order; } 00136 00137 virtual int GetRelOrder() const { return rel_order; } 00138 00139 virtual bool Discontinuous() const { return discontinuous; } 00140 00141 virtual int GetNLowOrderNodeDofs ( NODE_TYPE nt ) const 00142 { 00143 if ( nt == NT_EDGE ) return 1; 00144 else return 0; 00145 } 00146 00147 IntRange GetEdgeDofs (int nr) const 00148 { 00149 return IntRange (first_edge_dof[nr], 00150 first_edge_dof[nr+1]); 00151 } 00152 00153 IntRange GetFaceDofs (int nr) const 00154 { 00155 return IntRange (first_face_dof[nr], 00156 first_face_dof[nr+1]); 00157 } 00158 00159 IntRange GetElementDofs (int nr) const 00160 { 00161 return IntRange (first_inner_dof[nr], 00162 first_inner_dof[nr+1]); 00163 } 00164 }; 00165 00166 } 00167 00168 #endif 00169