NGSolve  4.9
comp/hcurlhdivfes.hpp
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