HArD::Core3D
Hybrid Arbitrary Degree::Core 3D - Library to implement 3D schemes with vertex, edge, face and cell polynomials as unknowns
Loading...
Searching...
No Matches
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
49namespace 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 {
88 typedef Cell GeometricSupport;
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
105 {
107 typedef Face GeometricSupport;
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
121 {
123 typedef Edge GeometricSupport;
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:389
Vector family for polynomial functions that are tangent to a certain place (determined by the generat...
Definition basis.hpp:948
Vector family obtained by tensorization of a scalar family.
Definition basis.hpp:610
Class to describe a mesh.
Definition MeshND.hpp:17
@ Matrix
Definition basis.hpp:67
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
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
const EdgeBases & edgeBases(size_t iE) const
Return edge bases for edge iE.
Definition ddrcore.hpp:162
std::unique_ptr< PolyBasisFaceType > Polyk
Definition ddrcore.hpp:110
Edge GeometricSupport
Geometric support.
Definition ddrcore.hpp:123
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
const size_t & degree() const
Return the polynomial degree.
Definition ddrcore.hpp:140
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
const CellBases & cellBases(size_t iT) const
Return cell bases for element iT.
Definition ddrcore.hpp:146
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:41
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