1
+ /* *
2
+ * @file Mesh.h
3
+ * @author Quoc-Minh Ton-That ([email protected] )
4
+ * @brief Finite element mesh API and implementation.
5
+ * @date 2025-02-11
6
+ *
7
+ * @copyright Copyright (c) 2025
8
+ *
9
+ */
10
+
1
11
#ifndef PBAT_FEM_MESH_H
2
12
#define PBAT_FEM_MESH_H
3
13
17
27
namespace pbat {
18
28
namespace fem {
19
29
30
+ /* *
31
+ * @brief A generic stateful finite element mesh representation.
32
+ *
33
+ * @tparam TElement Type satisfying concept CElement
34
+ * @tparam Dims Embedding dimensions of the mesh
35
+ */
20
36
template <CElement TElement, int Dims>
21
37
struct Mesh
22
38
{
@@ -26,32 +42,40 @@ struct Mesh
26
42
27
43
Mesh () = default ;
28
44
/* *
29
- * @brief Constructs a finite element mesh given some input geometric mesh. The cells of the
30
- * input mesh should list its vertices in Lagrange order.
31
- * @param V Dims x |#vertices| matrix of vertex positions
32
- * @param C Element::AffineBase::Vertices x |#cells| matrix of cell vertex indices into V
45
+ * @brief Constructs a finite element mesh given some input geometric mesh.
46
+ *
47
+ * @warning The cells of the input mesh should list its vertices in Lagrange order.
48
+ * @param V `Dims x |# vertices|` matrix of vertex positions
49
+ * @param C `|Element::AffineBase::Vertices| x |# cells|` matrix of cell vertex indices into V
33
50
*/
34
51
Mesh (Eigen::Ref<MatrixX const > const & V, Eigen::Ref<IndexMatrixX const > const & C);
35
52
36
53
/* *
37
- * @brief Compute quadrature points in domain space for on this mesh.
38
- * @tparam QuadratureOrder
39
- * @return
54
+ * @brief Compute quadrature points in domain space on this mesh.
55
+ * @tparam QuadratureOrder Quadrature order
56
+ * @return `kDims x |# element quad.pts.|` matrix of quadrature points
40
57
*/
41
58
template <int QuadratureOrder>
42
59
MatrixX QuadraturePoints () const ;
43
60
/* *
44
61
* @brief Obtain quadrature weights on the reference element of this mesh
45
- * @tparam QuadratureOrder
46
- * @return
62
+ * @tparam QuadratureOrder Quadrature order
63
+ * @return `|# element quad.pts.|` vector of quadrature weights
47
64
*/
48
65
template <int QuadratureOrder>
49
66
Vector<TElement::template QuadratureType<QuadratureOrder>::kPoints > QuadratureWeights () const ;
50
67
51
- MatrixX X; // /< Dims x |#nodes| nodal positions
52
- IndexMatrixX E; // /< Element::Nodes x |#elements| element nodal indices
68
+ MatrixX X; // /< `kDims x |# nodes|` nodal positions
69
+ IndexMatrixX E; // /< `| Element::Nodes| x |# elements|` element nodal indices
53
70
};
54
71
72
+ /* *
73
+ * @brief A non-owning view over a linear finite element mesh.
74
+ *
75
+ * @tparam TElement Type satisfying concept CElement
76
+ * @tparam Dims Embedding dimensions of the mesh
77
+ * @pre TElement::kOrder == 1
78
+ */
55
79
template <CElement TElement, int Dims>
56
80
struct LinearMeshView
57
81
{
@@ -60,32 +84,34 @@ struct LinearMeshView
60
84
static int constexpr kOrder = ElementType::kOrder ; // /< Shape function order
61
85
62
86
/* *
63
- * @brief Constructs a finite element mesh given some input geometric mesh. The cells of the
64
- * input mesh should list its vertices in Lagrange order.
65
- * @param V Dims x |#vertices| matrix of vertex positions
66
- * @param C Element::AffineBase::Vertices x |#cells| matrix of cell vertex indices into V
87
+ * @brief Constructs a finite element mesh given some input geometric mesh.
88
+ *
89
+ * @warning The cells of the input mesh should list its vertices in Lagrange order.
90
+ * @param V `kDims x |# vertices|` matrix of vertex positions
91
+ * @param C `|Element::AffineBase::Vertices| x |# cells|` matrix of cell vertex indices into V
67
92
*/
68
93
LinearMeshView (Eigen::Ref<MatrixX const > const & V, Eigen::Ref<IndexMatrixX const > const & C);
69
94
70
95
/* *
71
96
* @brief Compute quadrature points in domain space for on this mesh.
72
- * @tparam QuadratureOrder
73
- * @return
97
+ * @tparam QuadratureOrder Quadrature order
98
+ * @return `kDims x |# element quad.pts.|` matrix of quadrature points
74
99
*/
75
100
template <int QuadratureOrder>
76
101
MatrixX QuadraturePoints () const ;
77
102
/* *
78
103
* @brief Obtain quadrature weights on the reference element of this mesh
79
- * @tparam QuadratureOrder
80
- * @return
104
+ * @tparam QuadratureOrder Quadrature order
105
+ * @return `|# element quad.pts.|` vector of quadrature weights
81
106
*/
82
107
template <int QuadratureOrder>
83
108
Vector<TElement::template QuadratureType<QuadratureOrder>::kPoints > QuadratureWeights () const ;
84
109
85
- Eigen::Ref<MatrixX const > X; // /< Dims x |#nodes| nodal positions
86
- Eigen::Ref<IndexMatrixX const > E; // /< Element::Nodes x |#elements| element nodal indices
110
+ Eigen::Ref<MatrixX const > X; // /< `kDims x |# nodes|` nodal positions
111
+ Eigen::Ref<IndexMatrixX const > E; // /< `| Element::Nodes| x |# elements|` element nodal indices
87
112
};
88
113
114
+ namespace detail {
89
115
template <CElement TElement>
90
116
class NodalKey
91
117
{
@@ -161,6 +187,8 @@ class NodalKey
161
187
int mSize ; // /< Number of non-zero affine shape function values
162
188
};
163
189
190
+ } // namespace detail
191
+
164
192
template <CElement TElement, int Dims>
165
193
Mesh<TElement, Dims>::Mesh(
166
194
Eigen::Ref<MatrixX const > const & V,
@@ -186,6 +214,7 @@ Mesh<TElement, Dims>::Mesh(
186
214
assert (C.rows () == kVerticesPerCell );
187
215
assert (V.rows () == kDims );
188
216
217
+ using detail::NodalKey;
189
218
using NodeMap = std::map<NodalKey<ElementType>, Index>;
190
219
191
220
auto const numberOfCells = C.cols ();
@@ -241,6 +270,7 @@ Mesh<TElement, Dims>::Mesh(
241
270
}
242
271
}
243
272
273
+ namespace detail {
244
274
template <CElement TElement, int Dims, int QuadratureOrder, class TDerivedX , class TDerivedE >
245
275
inline MatrixX
246
276
MeshQuadraturePoints (Eigen::MatrixBase<TDerivedX> const & X, Eigen::MatrixBase<TDerivedE> const & E)
@@ -268,13 +298,6 @@ MeshQuadraturePoints(Eigen::MatrixBase<TDerivedX> const& X, Eigen::MatrixBase<TD
268
298
return Xg;
269
299
}
270
300
271
- template <CElement TElement, int Dims>
272
- template <int QuadratureOrder>
273
- inline MatrixX Mesh<TElement, Dims>::QuadraturePoints() const
274
- {
275
- return MeshQuadraturePoints<ElementType, kDims , QuadratureOrder>(X, E);
276
- }
277
-
278
301
template <CElement TElement, int Dims, int QuadratureOrder>
279
302
inline MatrixX MeshQuadratureWeights ()
280
303
{
@@ -285,12 +308,21 @@ inline MatrixX MeshQuadratureWeights()
285
308
return wg;
286
309
}
287
310
311
+ } // namespace detail
312
+
313
+ template <CElement TElement, int Dims>
314
+ template <int QuadratureOrder>
315
+ inline MatrixX Mesh<TElement, Dims>::QuadraturePoints() const
316
+ {
317
+ return detail::MeshQuadraturePoints<ElementType, kDims , QuadratureOrder>(X, E);
318
+ }
319
+
288
320
template <CElement TElement, int Dims>
289
321
template <int QuadratureOrder>
290
322
inline Vector<TElement::template QuadratureType<QuadratureOrder>::kPoints >
291
323
Mesh<TElement, Dims>::QuadratureWeights() const
292
324
{
293
- return MeshQuadratureWeights<ElementType, kDims , QuadratureOrder>();
325
+ return detail:: MeshQuadratureWeights<ElementType, kDims , QuadratureOrder>();
294
326
}
295
327
296
328
template <CElement TElement, int Dims>
@@ -327,15 +359,15 @@ template <CElement TElement, int Dims>
327
359
template <int QuadratureOrder>
328
360
inline MatrixX LinearMeshView<TElement, Dims>::QuadraturePoints() const
329
361
{
330
- return MeshQuadraturePoints<ElementType, kDims , QuadratureOrder>(X, E);
362
+ return detail:: MeshQuadraturePoints<ElementType, kDims , QuadratureOrder>(X, E);
331
363
}
332
364
333
365
template <CElement TElement, int Dims>
334
366
template <int QuadratureOrder>
335
367
inline Vector<TElement::template QuadratureType<QuadratureOrder>::kPoints >
336
368
LinearMeshView<TElement, Dims>::QuadratureWeights() const
337
369
{
338
- return MeshQuadratureWeights<ElementType, kDims , QuadratureOrder>();
370
+ return detail:: MeshQuadratureWeights<ElementType, kDims , QuadratureOrder>();
339
371
}
340
372
341
373
} // namespace fem
0 commit comments