HArD::Core3D
Hybrid Arbitrary Degree::Core 3D - Library to implement 3D schemes with vertex, edge, face and cell polynomials as unknowns
vemcore.hpp
Go to the documentation of this file.
1 // Core data structures and methods required to implement the de Rham VEM sequence in 3D
2 //
3 // Provides:
4 // - Full and partial polynomial spaces on the element, faces, and edges
5 //
6 // Author: Jerome Droniou (jerome.droniou@monash.edu)
7 //
8 
9 
10 
11 #ifndef VEMCORE_HPP
12 #define VEMCORE_HPP
13 
14 #include <memory>
15 #include <iostream>
16 
17 #include <basis.hpp>
19 
26 namespace HArDCore3D
27 {
28 
35  //------------------------------------------------------------------------------
36 
38  class VEMCore
39  {
40  public:
41  // Types for element bases
48 
49  // Types for face bases
54 
55  // Type for edge basis
57 
59 
62  struct CellBases
63  {
66 
67  std::unique_ptr<PolyBasisCellType> Polykpo;
68  std::unique_ptr<PolyBasisCellType> Polyk;
69  std::unique_ptr<PolyBasisCellType> Polykmo;
70  std::unique_ptr<ShiftedBasis<PolyBasisCellType> > Polyk0;
71  std::unique_ptr<ShiftedBasis<PolyBasisCellType> > Polykpo0;
72  std::unique_ptr<Poly3BasisCellType> Polyk3;
73  std::unique_ptr<GolyBasisCellType> Golykmo;
74  std::unique_ptr<GolyComplBasisCellType> GolyComplk;
75  std::unique_ptr<GolyComplBasisCellType> GolyComplkpo;
76  std::unique_ptr<RolyBasisCellType> Rolykmo;
77  std::unique_ptr<RolyComplBasisCellType> RolyComplk;
78  std::unique_ptr<RolyComplBasisCellType> RolyComplkp2;
79  };
80 
82 
83  struct FaceBases
84  {
87 
88  std::unique_ptr<PolyBasisFaceType> Polykp2;
89  std::unique_ptr<PolyBasisFaceType> Polykpo;
90  std::unique_ptr<PolyBasisFaceType> Polyk;
91  std::unique_ptr<PolyBasisFaceType> Polykmo;
92  std::unique_ptr<ShiftedBasis<PolyBasisFaceType> > Polyk0;
93  std::unique_ptr<TangentFamily<PolyBasisFaceType>> Polykpo2;
94  std::unique_ptr<Poly2BasisFaceType> Polyk2;
95  std::unique_ptr<RolyBasisFaceType> Rolykmo;
96  std::unique_ptr<RolyComplBasisFaceType> RolyComplkmo;
97  std::unique_ptr<RolyComplBasisFaceType> RolyComplk;
98  std::unique_ptr<RolyComplBasisFaceType> RolyComplkpo;
99  };
100 
102 
103  struct EdgeBases
104  {
107 
108  std::unique_ptr<PolyBasisEdgeType> Polykpo;
109  std::unique_ptr<PolyBasisEdgeType> Polyk;
110  std::unique_ptr<PolyBasisEdgeType> Polykmo;
111  };
112 
114  VEMCore(const Mesh & mesh, size_t K, bool use_threads = true, std::ostream & output = std::cout);
115 
117  const Mesh & mesh() const
118  {
119  return m_mesh;
120  }
121 
123  const size_t & degree() const
124  {
125  return m_K;
126  }
127 
129  inline const CellBases & cellBases(size_t iT) const
130  {
131  // Make sure that the basis has been created
132  assert( m_cell_bases[iT] );
133  return *m_cell_bases[iT].get();
134  }
135 
137  inline const FaceBases & faceBases(size_t iF) const
138  {
139  // Make sure that the basis has been created
140  assert( m_face_bases[iF] );
141  return *m_face_bases[iF].get();
142  }
143 
145  inline const EdgeBases & edgeBases(size_t iE) const
146  {
147  // Make sure that the basis has been created
148  assert( m_edge_bases[iE] );
149  return *m_edge_bases[iE].get();
150  }
151 
152  private:
154  CellBases _construct_cell_bases(size_t iT);
155 
157  FaceBases _construct_face_bases(size_t iF);
158 
160  EdgeBases _construct_edge_bases(size_t iE);
161 
162  // Pointer to the mesh
163  const Mesh & m_mesh;
164  // Degree
165  const size_t m_K;
166  // Output stream
167  std::ostream & m_output;
168 
169  // Cell bases
170  std::vector<std::unique_ptr<CellBases> > m_cell_bases;
171  // Face bases
172  std::vector<std::unique_ptr<FaceBases> > m_face_bases;
173  // Edge bases
174  std::vector<std::unique_ptr<EdgeBases> > m_edge_bases;
175 
176  };
177 
178 } // end of namespace HArDCore3D
179 
180 #endif // VEMCORE_HPP
Family of functions expressed as linear combination of the functions of a given basis.
Definition: basis.hpp:388
Vector family for polynomial functions that are tangent to a certain place (determined by the generat...
Definition: basis.hpp:920
Vector family obtained by tensorization of a scalar family.
Definition: basis.hpp:609
Construct all polynomial spaces for the VEM sequence.
Definition: vemcore.hpp:39
Class to describe a mesh.
Definition: MeshND.hpp:17
bool use_threads
Definition: HHO_DiffAdvecReac.hpp:47
size_t K
Definition: HHO_DiffAdvecReac.hpp:46
std::unique_ptr< Poly2BasisFaceType > Polyk2
Definition: vemcore.hpp:94
std::unique_ptr< PolyBasisCellType > Polykmo
Definition: vemcore.hpp:69
Face GeometricSupport
Geometric support.
Definition: vemcore.hpp:86
std::unique_ptr< RolyBasisFaceType > Rolykmo
Definition: vemcore.hpp:95
std::unique_ptr< RolyComplBasisCellType > RolyComplkp2
Definition: vemcore.hpp:78
const CellBases & cellBases(size_t iT) const
Return cell bases for element iT.
Definition: vemcore.hpp:129
std::unique_ptr< PolyBasisEdgeType > Polykmo
Definition: vemcore.hpp:110
std::unique_ptr< PolyBasisEdgeType > Polyk
Definition: vemcore.hpp:109
std::unique_ptr< TangentFamily< PolyBasisFaceType > > Polykpo2
Definition: vemcore.hpp:93
const Mesh & mesh() const
Return a const reference to the mesh.
Definition: vemcore.hpp:117
Family< MonomialScalarBasisEdge > PolyBasisEdgeType
Definition: vemcore.hpp:56
const FaceBases & faceBases(size_t iF) const
Return face bases for face iF.
Definition: vemcore.hpp:137
Family< MonomialScalarBasisFace > PolyBasisFaceType
Definition: vemcore.hpp:50
std::unique_ptr< ShiftedBasis< PolyBasisFaceType > > Polyk0
Definition: vemcore.hpp:92
std::unique_ptr< PolyBasisFaceType > Polykpo
Definition: vemcore.hpp:89
std::unique_ptr< RolyComplBasisFaceType > RolyComplkpo
Definition: vemcore.hpp:98
std::unique_ptr< RolyComplBasisCellType > RolyComplk
Definition: vemcore.hpp:77
const size_t & degree() const
Return the polynomial degree.
Definition: vemcore.hpp:123
std::unique_ptr< GolyComplBasisCellType > GolyComplkpo
Definition: vemcore.hpp:75
std::unique_ptr< GolyBasisCellType > Golykmo
Definition: vemcore.hpp:73
TensorizedVectorFamily< PolyBasisCellType, 3 > Poly3BasisCellType
Definition: vemcore.hpp:43
Family< GradientBasis< ShiftedBasis< MonomialScalarBasisCell > > > GolyBasisCellType
Definition: vemcore.hpp:44
std::unique_ptr< PolyBasisFaceType > Polykmo
Definition: vemcore.hpp:91
std::unique_ptr< GolyComplBasisCellType > GolyComplk
Definition: vemcore.hpp:74
std::unique_ptr< RolyComplBasisFaceType > RolyComplk
Definition: vemcore.hpp:97
std::unique_ptr< PolyBasisCellType > Polyk
Definition: vemcore.hpp:68
Edge GeometricSupport
Geometric support.
Definition: vemcore.hpp:106
std::unique_ptr< Poly3BasisCellType > Polyk3
Definition: vemcore.hpp:72
std::unique_ptr< PolyBasisFaceType > Polyk
Definition: vemcore.hpp:90
VEMCore(const Mesh &mesh, size_t K, bool use_threads=true, std::ostream &output=std::cout)
Constructor.
Definition: vemcore.cpp:13
std::unique_ptr< PolyBasisFaceType > Polykp2
Definition: vemcore.hpp:88
std::unique_ptr< ShiftedBasis< PolyBasisCellType > > Polykpo0
Definition: vemcore.hpp:71
std::unique_ptr< RolyComplBasisFaceType > RolyComplkmo
Definition: vemcore.hpp:96
std::unique_ptr< PolyBasisEdgeType > Polykpo
Definition: vemcore.hpp:108
Family< RolyComplBasisFace > RolyComplBasisFaceType
Definition: vemcore.hpp:53
Cell GeometricSupport
Geometric support.
Definition: vemcore.hpp:65
std::unique_ptr< RolyBasisCellType > Rolykmo
Definition: vemcore.hpp:76
Family< CurlBasis< GolyComplBasisCell > > RolyBasisCellType
Definition: vemcore.hpp:46
std::unique_ptr< ShiftedBasis< PolyBasisCellType > > Polyk0
Definition: vemcore.hpp:70
Family< RolyComplBasisCell > RolyComplBasisCellType
Definition: vemcore.hpp:47
const EdgeBases & edgeBases(size_t iE) const
Return edge bases for edge iE.
Definition: vemcore.hpp:145
Family< GolyComplBasisCell > GolyComplBasisCellType
Definition: vemcore.hpp:45
std::unique_ptr< PolyBasisCellType > Polykpo
Definition: vemcore.hpp:67
Family< CurlBasis< ShiftedBasis< MonomialScalarBasisFace > > > RolyBasisFaceType
Definition: vemcore.hpp:52
Family< MonomialScalarBasisCell > PolyBasisCellType
Definition: vemcore.hpp:42
TangentFamily< PolyBasisFaceType > Poly2BasisFaceType
Definition: vemcore.hpp:51
Definition: ddr-magnetostatics.hpp:40
MeshND::Edge< 2 > Edge
Definition: Mesh2D.hpp:11
MeshND::Face< 2 > Face
Definition: Mesh2D.hpp:12
MeshND::Cell< 2 > Cell
Definition: Mesh2D.hpp:13
Structure to store element bases.
Definition: vemcore.hpp:63
Structure to store edge bases.
Definition: vemcore.hpp:104
Structure to store face bases.
Definition: vemcore.hpp:84