NGSolve
4.9
|
00001 00004 /* facetfespace.*pp 00005 * An fespace for functions living on the facets (=edges in 2D, faces in 3D) 00006 * - the functions on different facets are independent (no continuity accross 00007 * vertices ( or edges in 3D)) 00008 * - the functions on the facets are accessed via the elements 00009 * (=FacetVolumeElements), which then can access their facets; 00010 * see facetfe.hpp for details 00011 * - the ordering of dofs is facet'wise 00012 * - no low-order space 00013 * - no prolongation so far (will probably never be needed) 00014 * - some additional utility functions 00015 */ 00016 #ifndef FACET_FESPACE_HPP 00017 #define FACET_FESPACE_HPP 00018 00019 namespace ngcomp 00020 { 00021 00022 class NGS_DLL_HEADER FacetFESpace : public FESpace 00023 { 00024 protected: 00025 // Level 00026 int level; 00027 // Number of Facets 00028 int nfa; 00029 // Number of coarse facets, number of fine facets; 00030 int ncfa; 00031 // Number of Elements 00032 int nel; 00033 00034 Array<int> first_facet_dof; 00035 Array<int> first_inner_dof; // for highest_order_dc 00036 00037 // relative order to mesh-order 00038 int rel_order; 00039 00040 Array<INT<2> > order_facet; 00041 Array<bool> fine_facet; 00042 00043 int ndof; 00044 Array<int> ndlevel; 00045 bool var_order; 00046 bool highest_order_dc; 00047 00048 public: 00050 FacetFESpace (const MeshAccess & ama, const Flags & flags, bool parseflags=false); 00052 virtual ~FacetFESpace (); 00054 virtual string GetClassName () const 00055 { 00056 return "FacetFESpace"; 00057 } 00058 00060 virtual void Update(LocalHeap & lh); 00061 00062 // virtual void UpdateDofTables(); 00063 virtual void UpdateCouplingDofArray(); 00065 virtual int GetNDof () const; 00067 virtual int GetNDofLevel (int level) const; 00069 virtual const FiniteElement & GetFE (int elnr, LocalHeap & lh) const; 00071 virtual const FiniteElement & GetSFE (int selnr, LocalHeap & lh) const; 00073 virtual void GetDofNrs (int elnr, Array<int> & dnums) const; 00075 00076 IntRange GetFacetDofs (int nr) const 00077 { 00078 return IntRange (first_facet_dof[nr], first_facet_dof[nr+1]); 00079 } 00080 00081 virtual void GetFacetDofNrs (int nr, Array<int> & dnums) const 00082 { 00083 dnums.SetSize(0); 00084 dnums += nr; 00085 dnums += GetFacetDofs(nr); 00086 } 00087 00089 virtual int GetNFacetDofs (int felnr) const 00090 { return (first_facet_dof[felnr+1]-first_facet_dof[felnr] + 1); } 00092 virtual void GetSDofNrs (int selnr, Array<int> & dnums) const; 00094 virtual Table<int> * CreateSmoothingBlocks (const Flags & precflags) const; 00096 virtual Array<int> * CreateDirectSolverClusters (const Flags & precflags) const; 00097 00098 // some utility functions for convenience 00100 // virtual void GetVertexNumbers(int elnr, Array<int>& vnums) 00101 // { ma.GetElVertices(elnr, vnums); }; 00103 00104 virtual INT<2> GetFacetOrder(int fnr) 00105 { return order_facet[fnr]; }; 00106 00107 00108 virtual int GetFirstFacetDof(int fanr) const 00109 { 00110 return first_facet_dof[fanr]; 00111 } 00112 00113 virtual void GetVertexDofNrs ( int nr, Array<int> & dnums ) const 00114 { 00115 dnums.SetSize(0); 00116 } 00117 00118 virtual void GetEdgeDofNrs ( int nr, Array<int> & dnums ) const 00119 { 00120 dnums.SetSize(0); 00121 if ( ma.GetDimension() == 3 ) return; 00122 00123 dnums += nr; 00124 dnums += GetFacetDofs(nr); 00125 } 00126 00127 virtual void GetFaceDofNrs (int nr, Array<int> & dnums) const 00128 { 00129 dnums.SetSize(0); 00130 if (ma.GetDimension() == 2) return; 00131 00132 dnums += nr; 00133 dnums += GetFacetDofs(nr); 00134 } 00135 00136 virtual void GetInnerDofNrs (int elnr, Array<int> & dnums) const 00137 { 00138 dnums.SetSize(0); 00139 } 00140 00141 }; 00142 00143 00144 } 00145 00146 00147 00148 #endif