NGSolve
4.9
|
00001 #ifndef FILE_HCURLHDIVFES 00002 #define FILE_HCURLHDIVFES 00003 00004 /*********************************************************************/ 00005 /* File: hcurlhdivfes.hh */ 00006 /* Author: Joachim Schoeberl */ 00007 /* Date: 12. Jan. 2002 */ 00008 /*********************************************************************/ 00009 00010 namespace ngcomp 00011 { 00012 00013 /* 00014 Finite Element Space 00015 */ 00016 00017 00019 class NGS_DLL_HEADER NedelecFESpace : public FESpace 00020 { 00022 Array<ngstd::INT<2> > edgepoints; 00024 // Array<int[2]> parentedges; 00025 Array<INT<2> > parentedges; 00027 Array<short int> finelevelofedge; 00028 00030 Array<int> nelevel; 00031 00032 protected: 00033 bool discontinuous; 00034 00035 public: 00037 /* 00038 NedelecFESpace (const MeshAccess & ama, 00039 int aorder, int adim, bool acomplex, bool adiscontinuous = 0); 00040 */ 00042 NedelecFESpace (const MeshAccess & ama, const Flags & flags, bool parseflags=false); 00044 virtual ~NedelecFESpace (); 00045 00047 virtual const char * GetType() 00048 { return "Nedelec"; } 00049 00050 static FESpace * Create (const MeshAccess & ma, const Flags & flags); 00051 00053 virtual void Update(LocalHeap & lh); 00055 virtual void UpdateCouplingDofArray(); 00056 00058 virtual int GetNDof () const; 00060 virtual int GetNDofLevel (int level) const; 00061 00063 virtual void GetDofNrs (int elnr, Array<int> & dnums) const; 00065 virtual void GetSDofNrs (int selnr, Array<int> & dnums) const; 00066 00068 int EdgePoint1 (int ednr) const { return edgepoints[ednr][0]; } 00070 int EdgePoint2 (int ednr) const { return edgepoints[ednr][1]; } 00071 00073 int ParentEdge1 (int ednr) const { return parentedges[ednr][0]; } 00075 int ParentEdge2 (int ednr) const { return parentedges[ednr][1]; } 00076 00078 int FineLevelOfEdge (int ednr) const { return finelevelofedge[ednr]; } 00079 00080 enum { SB_AFW, SB_HIPTMAIR, SB_POTENTIAL, SB_JAC }; 00082 virtual Table<int> * CreateSmoothingBlocks (int type = 0) const; 00083 virtual Table<int> * CreateSmoothingBlocks (const Flags & precflags) const; 00084 00085 SparseMatrix<double> * CreateGradient() const; 00086 00087 template <class MAT> 00088 void TransformMat (int elnr, bool boundary, 00089 MAT & mat, TRANSFORM_TYPE tt) const; 00090 00091 template <class VEC> 00092 void TransformVec (int elnr, bool boundary, 00093 VEC & vec, TRANSFORM_TYPE tt) const; 00094 00095 00096 virtual void VTransformMR (int elnr, bool boundary, 00097 const FlatMatrix<double> & mat, TRANSFORM_TYPE tt) const 00098 { 00099 TransformMat (elnr, boundary, mat, tt); 00100 } 00101 00102 virtual void VTransformMC (int elnr, bool boundary, 00103 const FlatMatrix<Complex> & mat, TRANSFORM_TYPE tt) const 00104 { 00105 TransformMat (elnr, boundary, mat, tt); 00106 } 00107 00108 virtual void VTransformMR (int elnr, bool boundary, 00109 const SliceMatrix<double> & mat, TRANSFORM_TYPE tt) const 00110 { 00111 TransformMat (elnr, boundary, mat, tt); 00112 } 00113 00114 virtual void VTransformMC (int elnr, bool boundary, 00115 const SliceMatrix<Complex> & mat, TRANSFORM_TYPE tt) const 00116 { 00117 TransformMat (elnr, boundary, mat, tt); 00118 } 00119 00120 00121 00122 00123 00124 virtual void VTransformVR (int elnr, bool boundary, 00125 const FlatVector<double> & vec, TRANSFORM_TYPE tt) const 00126 { 00127 TransformVec (elnr, boundary, vec, tt); 00128 } 00129 00130 virtual void VTransformVC (int elnr, bool boundary, 00131 const FlatVector<Complex> & vec, TRANSFORM_TYPE tt) const 00132 { 00133 TransformVec (elnr, boundary, vec, tt); 00134 } 00135 00136 00137 00138 00139 virtual string GetClassName () const 00140 { 00141 return "NedelecFESpace"; 00142 } 00143 00144 00145 virtual void GetVertexDofNrs (int vnr, Array<int> & dnums) const; 00146 virtual void GetEdgeDofNrs (int ednr, Array<int> & dnums) const; 00147 virtual void GetFaceDofNrs (int fanr, Array<int> & dnums) const; 00148 virtual void GetInnerDofNrs (int elnr, Array<int> & dnums) const; 00149 }; 00150 00151 00152 00153 00155 class NGS_DLL_HEADER NedelecFESpace2 : public FESpace 00156 { 00157 public: 00159 // enum NEDELEC_TYPE { N1, BDM1, BDM1A, N2, BDM2A, BDM2 }; 00160 00161 private: 00163 int zorder; 00165 Array<short int> gradientedge; 00167 Array<short int> gradientface; 00168 00170 int ned; 00172 int nfa; 00174 int nel; 00176 int n_edge_dofs; 00177 int n_z_edge_dofs; 00178 int n_plane_edge_dofs; 00179 int n_trig_face_dofs; 00180 int n_quad_face_dofs; 00181 int n_tet_el_dofs; 00182 int n_prism_el_dofs; 00183 int n_prism_nograd_el_dofs; 00184 int n_pyramid_el_dofs; 00186 Array<int> first_face_dof; 00187 Array<int> first_el_dof; 00189 BitArray gradientdomains; 00191 BitArray gradientboundaries; 00193 Array<int> ndlevel; 00194 00195 FiniteElement * curltet; 00196 FiniteElement * curlprism; 00197 FiniteElement * curlpyramid; 00198 00199 public: 00201 NedelecFESpace2 (const MeshAccess & ama, const Flags & flags, bool parseflags=false); 00203 ~NedelecFESpace2 (); 00204 00206 virtual const char * GetType() 00207 { return "Nedelec2"; } 00208 00209 virtual string GetClassName () const 00210 { 00211 return "NedelecFESpace2"; 00212 } 00213 00214 00216 virtual void Update(LocalHeap & lh); 00217 00219 virtual int GetNDof () const; 00221 virtual int GetNDofLevel (int level) const; 00222 00224 virtual void GetDofNrs (int elnr, Array<int> & dnums) const; 00225 00227 virtual void GetSDofNrs (int selnr, Array<int> & dnums) const; 00228 00229 virtual const FiniteElement & GetFE (int elnr, LocalHeap & lh) const; 00230 00232 void SetGradientDomains (const BitArray & adoms); 00234 void SetGradientBoundaries (const BitArray & abnds); 00235 00237 void GetTransformation (ELEMENT_TYPE eltype, 00238 int elnr, 00239 const Array<int> & eorient, 00240 const Array<int> & forient, 00241 FlatVector<double> & fac) const; 00242 00243 00244 template <class MAT> 00245 void TransformMat (int elnr, bool boundary, 00246 MAT & mat, TRANSFORM_TYPE tt) const; 00247 00248 template <class VEC> 00249 void TransformVec (int elnr, bool boundary, 00250 VEC & vec, TRANSFORM_TYPE tt) const; 00251 00252 00253 00254 virtual void VTransformMR (int elnr, bool boundary, 00255 const FlatMatrix<double> & mat, TRANSFORM_TYPE tt) const 00256 { 00257 TransformMat (elnr, boundary, mat, tt); 00258 } 00259 00260 virtual void VTransformMC (int elnr, bool boundary, 00261 const FlatMatrix<Complex> & mat, TRANSFORM_TYPE tt) const 00262 { 00263 TransformMat (elnr, boundary, mat, tt); 00264 } 00265 00266 virtual void VTransformMR (int elnr, bool boundary, 00267 const SliceMatrix<double> & mat, TRANSFORM_TYPE tt) const 00268 { 00269 TransformMat (elnr, boundary, mat, tt); 00270 } 00271 00272 virtual void VTransformMC (int elnr, bool boundary, 00273 const SliceMatrix<Complex> & mat, TRANSFORM_TYPE tt) const 00274 { 00275 TransformMat (elnr, boundary, mat, tt); 00276 } 00277 00278 00279 00280 00281 virtual void VTransformVR (int elnr, bool boundary, 00282 const FlatVector<double> & vec, TRANSFORM_TYPE tt) const 00283 { 00284 TransformVec (elnr, boundary, vec, tt); 00285 } 00286 00287 virtual void VTransformVC (int elnr, bool boundary, 00288 const FlatVector<Complex> & vec, TRANSFORM_TYPE tt) const 00289 { 00290 TransformVec (elnr, boundary, vec, tt); 00291 } 00292 00294 virtual void LockSomeDofs (BaseMatrix & mat) const; 00296 virtual Table<int> * CreateSmoothingBlocks (int type = 0) const; 00298 virtual BitArray * CreateIntermediatePlanes (int type = 0) const; 00299 00301 SparseMatrix<double> * CreateGradient() const; 00302 00303 00304 virtual Array<int> * CreateDirectSolverClusters (const Flags & flags) const; 00305 00306 00307 virtual void GetVertexDofNrs (int vnr, Array<int> & dnums) const; 00308 virtual void GetEdgeDofNrs (int ednr, Array<int> & dnums) const; 00309 virtual void GetFaceDofNrs (int fanr, Array<int> & dnums) const; 00310 virtual void GetInnerDofNrs (int elnr, Array<int> & dnums) const; 00311 00312 // void AddGradient (double fac, const BaseVector & pot, BaseVector & grad) const; 00313 // void ApplyGradientT (const BaseVector & gradt, BaseVector & pott) const; 00314 }; 00315 00316 } 00317 00318 00319 #endif