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