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