HArD::Core3D
Hybrid Arbitrary Degree::Core 3D - Library to implement 3D schemes with vertex, edge, face and cell polynomials as unknowns
ddrcore.hpp
Go to the documentation of this file.
1 // Core data structures and methods required to implement the discrete de Rham sequence in 3D
2 //
3 // Provides:
4 // - Full and partial polynomial spaces on the element, faces, and edges
5 //
6 // Author: Daniele Di Pietro (daniele.di-pietro@umontpellier.fr)
7 //
8 
9 /*
10  *
11  * This library was developed around HHO methods, although some parts of it have a more
12  * general purpose. If you use this code or part of it in a scientific publication,
13  * please mention the following book as a reference for the underlying principles
14  * of HHO schemes:
15  *
16  * The Hybrid High-Order Method for Polytopal Meshes: Design, Analysis, and Applications.
17  * D. A. Di Pietro and J. Droniou. Modeling, Simulation and Applications, vol. 19.
18  * Springer International Publishing, 2020, xxxi + 525p. doi: 10.1007/978-3-030-37203-3.
19  * url: https://hal.archives-ouvertes.fr/hal-02151813.
20  *
21  */
22 
23 /*
24  * The DDR sequence has been designed in
25  *
26  * Fully discrete polynomial de Rham sequences of arbitrary degree on polygons and polyhedra.
27  * D. A. Di Pietro, J. Droniou, and F. Rapetti, 33p, 2019. url: https://arxiv.org/abs/1911.03616.
28  *
29  * If you use this code in a scientific publication, please mention the above article.
30  *
31  */
32 
33 
34 #ifndef DDRCORE_HPP
35 #define DDRCORE_HPP
36 
37 #include <memory>
38 #include <iostream>
39 
40 #include <basis.hpp>
42 
49 namespace HArDCore3D
50 {
51 
58  //------------------------------------------------------------------------------
59 
61  class DDRCore
62  {
63  public:
64  // Types for element bases
71 
72  // Types for face bases
77 
78  // Type for edge basis
80 
82 
85  struct CellBases
86  {
89 
90  std::unique_ptr<PolyBasisCellType> Polykpo;
91  std::unique_ptr<PolyBasisCellType> Polyk;
92  std::unique_ptr<PolyBasisCellType> Polykmo;
93  std::unique_ptr<Poly3BasisCellType> Polyk3;
94  std::unique_ptr<GolyBasisCellType> Golykmo;
95  std::unique_ptr<GolyComplBasisCellType> GolyComplk;
96  std::unique_ptr<GolyComplBasisCellType> GolyComplkpo;
97  std::unique_ptr<RolyBasisCellType> Rolykmo;
98  std::unique_ptr<RolyComplBasisCellType> RolyComplk;
99  std::unique_ptr<RolyComplBasisCellType> RolyComplkp2;
100  };
101 
103 
104  struct FaceBases
105  {
108 
109  std::unique_ptr<PolyBasisFaceType> Polykpo;
110  std::unique_ptr<PolyBasisFaceType> Polyk;
111  std::unique_ptr<PolyBasisFaceType> Polykmo;
112  std::unique_ptr<Poly2BasisFaceType> Polyk2;
113  std::unique_ptr<RolyBasisFaceType> Rolykmo;
114  std::unique_ptr<RolyComplBasisFaceType> RolyComplk;
115  std::unique_ptr<RolyComplBasisFaceType> RolyComplkp2;
116  };
117 
119 
120  struct EdgeBases
121  {
124 
125  std::unique_ptr<PolyBasisEdgeType> Polykpo;
126  std::unique_ptr<PolyBasisEdgeType> Polyk;
127  std::unique_ptr<PolyBasisEdgeType> Polykmo;
128  };
129 
131  DDRCore(const Mesh & mesh, size_t K, bool use_threads = true, std::ostream & output = std::cout);
132 
134  const Mesh & mesh() const
135  {
136  return m_mesh;
137  }
138 
140  const size_t & degree() const
141  {
142  return m_K;
143  }
144 
146  inline const CellBases & cellBases(size_t iT) const
147  {
148  // Make sure that the basis has been created
149  assert( m_cell_bases[iT] );
150  return *m_cell_bases[iT].get();
151  }
152 
154  inline const FaceBases & faceBases(size_t iF) const
155  {
156  // Make sure that the basis has been created
157  assert( m_face_bases[iF] );
158  return *m_face_bases[iF].get();
159  }
160 
162  inline const EdgeBases & edgeBases(size_t iE) const
163  {
164  // Make sure that the basis has been created
165  assert( m_edge_bases[iE] );
166  return *m_edge_bases[iE].get();
167  }
168 
169  private:
171  CellBases _construct_cell_bases(size_t iT);
172 
174  FaceBases _construct_face_bases(size_t iF);
175 
177  EdgeBases _construct_edge_bases(size_t iE);
178 
179  // Pointer to the mesh
180  const Mesh & m_mesh;
181  // Degree
182  const size_t m_K;
183  // Output stream
184  std::ostream & m_output;
185 
186  // Cell bases
187  std::vector<std::unique_ptr<CellBases> > m_cell_bases;
188  // Face bases
189  std::vector<std::unique_ptr<FaceBases> > m_face_bases;
190  // Edge bases
191  std::vector<std::unique_ptr<EdgeBases> > m_edge_bases;
192 
193  };
194 
195 } // end of namespace HArDCore3D
196 
197 #endif // DDRCORE_HPP
Construct all polynomial spaces for the DDR sequence.
Definition: ddrcore.hpp:62
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
Class to describe a mesh.
Definition: MeshND.hpp:17
const size_t & degree() const
Return the polynomial degree.
Definition: ddrcore.hpp:140
std::unique_ptr< RolyBasisFaceType > Rolykmo
Definition: ddrcore.hpp:113
Family< MonomialScalarBasisFace > PolyBasisFaceType
Definition: ddrcore.hpp:73
std::unique_ptr< PolyBasisFaceType > Polykpo
Definition: ddrcore.hpp:109
std::unique_ptr< GolyComplBasisCellType > GolyComplkpo
Definition: ddrcore.hpp:96
const CellBases & cellBases(size_t iT) const
Return cell bases for element iT.
Definition: ddrcore.hpp:146
Family< MonomialScalarBasisCell > PolyBasisCellType
Definition: ddrcore.hpp:65
std::unique_ptr< RolyComplBasisFaceType > RolyComplkp2
Definition: ddrcore.hpp:115
std::unique_ptr< GolyBasisCellType > Golykmo
Definition: ddrcore.hpp:94
std::unique_ptr< PolyBasisEdgeType > Polykpo
Definition: ddrcore.hpp:125
Family< CurlBasis< GolyComplBasisCell > > RolyBasisCellType
Definition: ddrcore.hpp:69
std::unique_ptr< PolyBasisCellType > Polykpo
Definition: ddrcore.hpp:90
const Mesh & mesh() const
Return a const reference to the mesh.
Definition: ddrcore.hpp:134
Face GeometricSupport
Geometric support.
Definition: ddrcore.hpp:107
std::unique_ptr< PolyBasisFaceType > Polyk
Definition: ddrcore.hpp:110
const EdgeBases & edgeBases(size_t iE) const
Return edge bases for edge iE.
Definition: ddrcore.hpp:162
Edge GeometricSupport
Geometric support.
Definition: ddrcore.hpp:123
DDRCore(const Mesh &mesh, size_t K, bool use_threads=true, std::ostream &output=std::cout)
Constructor.
Definition: ddrcore.cpp:13
Cell GeometricSupport
Geometric support.
Definition: ddrcore.hpp:88
std::unique_ptr< Poly2BasisFaceType > Polyk2
Definition: ddrcore.hpp:112
std::unique_ptr< RolyComplBasisFaceType > RolyComplk
Definition: ddrcore.hpp:114
Family< GolyComplBasisCell > GolyComplBasisCellType
Definition: ddrcore.hpp:68
std::unique_ptr< RolyComplBasisCellType > RolyComplkp2
Definition: ddrcore.hpp:99
Family< CurlBasis< ShiftedBasis< MonomialScalarBasisFace > > > RolyBasisFaceType
Definition: ddrcore.hpp:75
std::unique_ptr< PolyBasisFaceType > Polykmo
Definition: ddrcore.hpp:111
TensorizedVectorFamily< PolyBasisCellType, 3 > Poly3BasisCellType
Definition: ddrcore.hpp:66
std::unique_ptr< PolyBasisEdgeType > Polykmo
Definition: ddrcore.hpp:127
std::unique_ptr< PolyBasisCellType > Polyk
Definition: ddrcore.hpp:91
std::unique_ptr< PolyBasisEdgeType > Polyk
Definition: ddrcore.hpp:126
std::unique_ptr< Poly3BasisCellType > Polyk3
Definition: ddrcore.hpp:93
std::unique_ptr< GolyComplBasisCellType > GolyComplk
Definition: ddrcore.hpp:95
std::unique_ptr< RolyComplBasisCellType > RolyComplk
Definition: ddrcore.hpp:98
Family< GradientBasis< ShiftedBasis< MonomialScalarBasisCell > > > GolyBasisCellType
Definition: ddrcore.hpp:67
std::unique_ptr< RolyBasisCellType > Rolykmo
Definition: ddrcore.hpp:97
const FaceBases & faceBases(size_t iF) const
Return face bases for face iF.
Definition: ddrcore.hpp:154
Family< MonomialScalarBasisEdge > PolyBasisEdgeType
Definition: ddrcore.hpp:79
std::unique_ptr< PolyBasisCellType > Polykmo
Definition: ddrcore.hpp:92
Family< RolyComplBasisCell > RolyComplBasisCellType
Definition: ddrcore.hpp:70
Family< RolyComplBasisFace > RolyComplBasisFaceType
Definition: ddrcore.hpp:76
TangentFamily< PolyBasisFaceType > Poly2BasisFaceType
Definition: ddrcore.hpp:74
bool use_threads
Definition: HHO_DiffAdvecReac.hpp:47
size_t K
Definition: HHO_DiffAdvecReac.hpp:46
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: ddrcore.hpp:86
Structure to store edge bases.
Definition: ddrcore.hpp:121
Structure to store face bases.
Definition: ddrcore.hpp:105