Skip to content

Commit ecb0501

Browse files
committed
Document FEM Mesh
1 parent e069d99 commit ecb0501

File tree

1 file changed

+63
-31
lines changed

1 file changed

+63
-31
lines changed

source/pbat/fem/Mesh.h

Lines changed: 63 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,13 @@
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+
111
#ifndef PBAT_FEM_MESH_H
212
#define PBAT_FEM_MESH_H
313

@@ -17,6 +27,12 @@
1727
namespace pbat {
1828
namespace fem {
1929

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+
*/
2036
template <CElement TElement, int Dims>
2137
struct Mesh
2238
{
@@ -26,32 +42,40 @@ struct Mesh
2642

2743
Mesh() = default;
2844
/**
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
3350
*/
3451
Mesh(Eigen::Ref<MatrixX const> const& V, Eigen::Ref<IndexMatrixX const> const& C);
3552

3653
/**
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
4057
*/
4158
template <int QuadratureOrder>
4259
MatrixX QuadraturePoints() const;
4360
/**
4461
* @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
4764
*/
4865
template <int QuadratureOrder>
4966
Vector<TElement::template QuadratureType<QuadratureOrder>::kPoints> QuadratureWeights() const;
5067

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
5370
};
5471

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+
*/
5579
template <CElement TElement, int Dims>
5680
struct LinearMeshView
5781
{
@@ -60,32 +84,34 @@ struct LinearMeshView
6084
static int constexpr kOrder = ElementType::kOrder; ///< Shape function order
6185

6286
/**
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
6792
*/
6893
LinearMeshView(Eigen::Ref<MatrixX const> const& V, Eigen::Ref<IndexMatrixX const> const& C);
6994

7095
/**
7196
* @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
7499
*/
75100
template <int QuadratureOrder>
76101
MatrixX QuadraturePoints() const;
77102
/**
78103
* @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
81106
*/
82107
template <int QuadratureOrder>
83108
Vector<TElement::template QuadratureType<QuadratureOrder>::kPoints> QuadratureWeights() const;
84109

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
87112
};
88113

114+
namespace detail {
89115
template <CElement TElement>
90116
class NodalKey
91117
{
@@ -161,6 +187,8 @@ class NodalKey
161187
int mSize; ///< Number of non-zero affine shape function values
162188
};
163189

190+
} // namespace detail
191+
164192
template <CElement TElement, int Dims>
165193
Mesh<TElement, Dims>::Mesh(
166194
Eigen::Ref<MatrixX const> const& V,
@@ -186,6 +214,7 @@ Mesh<TElement, Dims>::Mesh(
186214
assert(C.rows() == kVerticesPerCell);
187215
assert(V.rows() == kDims);
188216

217+
using detail::NodalKey;
189218
using NodeMap = std::map<NodalKey<ElementType>, Index>;
190219

191220
auto const numberOfCells = C.cols();
@@ -241,6 +270,7 @@ Mesh<TElement, Dims>::Mesh(
241270
}
242271
}
243272

273+
namespace detail {
244274
template <CElement TElement, int Dims, int QuadratureOrder, class TDerivedX, class TDerivedE>
245275
inline MatrixX
246276
MeshQuadraturePoints(Eigen::MatrixBase<TDerivedX> const& X, Eigen::MatrixBase<TDerivedE> const& E)
@@ -268,13 +298,6 @@ MeshQuadraturePoints(Eigen::MatrixBase<TDerivedX> const& X, Eigen::MatrixBase<TD
268298
return Xg;
269299
}
270300

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-
278301
template <CElement TElement, int Dims, int QuadratureOrder>
279302
inline MatrixX MeshQuadratureWeights()
280303
{
@@ -285,12 +308,21 @@ inline MatrixX MeshQuadratureWeights()
285308
return wg;
286309
}
287310

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+
288320
template <CElement TElement, int Dims>
289321
template <int QuadratureOrder>
290322
inline Vector<TElement::template QuadratureType<QuadratureOrder>::kPoints>
291323
Mesh<TElement, Dims>::QuadratureWeights() const
292324
{
293-
return MeshQuadratureWeights<ElementType, kDims, QuadratureOrder>();
325+
return detail::MeshQuadratureWeights<ElementType, kDims, QuadratureOrder>();
294326
}
295327

296328
template <CElement TElement, int Dims>
@@ -327,15 +359,15 @@ template <CElement TElement, int Dims>
327359
template <int QuadratureOrder>
328360
inline MatrixX LinearMeshView<TElement, Dims>::QuadraturePoints() const
329361
{
330-
return MeshQuadraturePoints<ElementType, kDims, QuadratureOrder>(X, E);
362+
return detail::MeshQuadraturePoints<ElementType, kDims, QuadratureOrder>(X, E);
331363
}
332364

333365
template <CElement TElement, int Dims>
334366
template <int QuadratureOrder>
335367
inline Vector<TElement::template QuadratureType<QuadratureOrder>::kPoints>
336368
LinearMeshView<TElement, Dims>::QuadratureWeights() const
337369
{
338-
return MeshQuadratureWeights<ElementType, kDims, QuadratureOrder>();
370+
return detail::MeshQuadratureWeights<ElementType, kDims, QuadratureOrder>();
339371
}
340372

341373
} // namespace fem

0 commit comments

Comments
 (0)