PhysicsBasedAnimationToolkit 0.0.10
Cross-platform C++20 library of algorithms and data structures commonly used in computer graphics research on physically-based simulation.
Loading...
Searching...
No Matches
MeshQuadrature.h
Go to the documentation of this file.
1
8
9#ifndef PBAT_FEM_MESHQUADRATURE_H
10#define PBAT_FEM_MESHQUADRATURE_H
11
12#include "Concepts.h"
13#include "Jacobian.h"
14#include "ShapeFunctions.h"
15#include "pbat/Aliases.h"
17
18#include <exception>
19#include <fmt/format.h>
20
21namespace pbat::fem {
22
39template <CElement TElement, int QuadratureOrder, class TDerivedDetJe>
40void ToMeshQuadratureWeights(Eigen::MatrixBase<TDerivedDetJe>& detJeThenWg)
41{
42 PBAT_PROFILE_NAMED_SCOPE("pbat.fem.ToMeshQuadratureWeights");
43 using ScalarType = typename TDerivedDetJe::Scalar;
44 using QuadratureType = typename TElement::template QuadratureType<QuadratureOrder, ScalarType>;
45 if (detJeThenWg.rows() != QuadratureType::kPoints)
46 {
47 throw std::invalid_argument(
48 fmt::format(
49 "detJeThenWg must have {} rows, but has {}",
50 QuadratureType::kPoints,
51 detJeThenWg.rows()));
52 }
53 auto const wg = common::ToEigen(QuadratureType::weights);
54 detJeThenWg.array().colwise() *= wg.array();
55}
56
74template <CElement TElement, int QuadratureOrder, class TDerivedE, class TDerivedX>
76 Eigen::MatrixBase<TDerivedE> const& E,
77 Eigen::MatrixBase<TDerivedX> const& X)
78 -> Eigen::Matrix<
79 typename TDerivedX::Scalar,
80 TElement::template QuadratureType<QuadratureOrder, typename TDerivedX::Scalar>::kPoints,
81 Eigen::Dynamic>
82{
83 PBAT_PROFILE_NAMED_SCOPE("pbat.fem.MeshQuadratureWeights");
84 using ElementType = TElement;
87 return detJeThenWg;
88}
89
104template <int QuadratureOrder, CMesh TMesh>
105auto MeshQuadratureWeights(TMesh const& mesh) -> Eigen::Matrix<
106 typename TMesh::ScalarType,
107 TMesh::ElementType::template QuadratureType<QuadratureOrder, typename TMesh::ScalarType>::
108 kPoints,
109 Eigen::Dynamic>
110{
112}
113
124template <common::CIndex TIndex>
125auto MeshQuadratureElements(TIndex nElements, TIndex nQuadPtsPerElement)
126{
127 using IndexVectorType = Eigen::Vector<TIndex, Eigen::Dynamic>;
128 return IndexVectorType::LinSpaced(nElements, TIndex(0), nElements - 1)
129 .replicate(TIndex(1), nQuadPtsPerElement)
130 .transpose();
131}
132
143template <common::CIndex TIndex, class TDerivedwg>
144auto MeshQuadratureElements(TIndex nElements, Eigen::DenseBase<TDerivedwg> const& wg)
145{
146 bool const bAreDimensionsCorrect = (wg.size() % nElements) == 0;
147 if (not bAreDimensionsCorrect)
148 {
149 throw std::invalid_argument(
150 fmt::format(
151 "nElements must match the number of columns in wg, or wg's flattened size must be "
152 "a multiple of nElements but got {} and {}",
153 nElements,
154 wg.size()));
155 }
156 auto const nQuadPtsPerElement = wg.size() / nElements;
157 return MeshQuadratureElements(nElements, nQuadPtsPerElement);
158}
159
169template <class TDerivedE, class TDerivedwg>
171 Eigen::DenseBase<TDerivedE> const& E,
172 Eigen::DenseBase<TDerivedwg> const& wg)
173{
174 return MeshQuadratureElements(E.cols(), wg);
175}
176
188template <
189 CElement TElement,
190 int QuadratureOrder,
191 common::CArithmetic TScalar = Scalar,
192 common::CIndex TIndex = Index>
193auto MeshReferenceQuadraturePoints(TIndex nElements)
194{
195 using QuadratureType = typename TElement::template QuadratureType<QuadratureOrder, TScalar>;
196 auto const Xi =
197 common::ToEigen(QuadratureType::points).template bottomRows<QuadratureType::kDims>();
198 return Xi.replicate(1, nElements);
199}
200
210template <int QuadratureOrder, CMesh TMesh>
211auto MeshReferenceQuadraturePoints(TMesh const& mesh)
212{
213 using ElementType = typename TMesh::ElementType;
214 using ScalarType = typename TMesh::ScalarType;
216}
217
218} // namespace pbat::fem
219
220#endif // PBAT_FEM_MESHQUADRATURE_H
Functions to compute jacobians, their determinants, domain quadrature weights and mapping domain to r...
FEM shape functions and gradients.
Concepts for common types.
Concept for arithmetic types.
Definition Concepts.h:31
Concept for integral types.
Definition Concepts.h:45
auto ToEigen(R &&r) -> Eigen::Map< Eigen::Vector< std::ranges::range_value_t< R >, Eigen::Dynamic > const >
Map a range of scalars to an eigen vector of such scalars.
Definition Eigen.h:28
Finite Element Method (FEM)
Definition Concepts.h:19
auto MeshQuadratureElements(TIndex nElements, TIndex nQuadPtsPerElement)
Computes the element quadrature points indices for each quadrature point, given the number of element...
Definition MeshQuadrature.h:125
auto MeshQuadratureWeights(Eigen::MatrixBase< TDerivedE > const &E, Eigen::MatrixBase< TDerivedX > const &X) -> Eigen::Matrix< typename TDerivedX::Scalar, TElement::template QuadratureType< QuadratureOrder, typename TDerivedX::Scalar >::kPoints, Eigen::Dynamic >
Computes the inner product weights such that .
Definition MeshQuadrature.h:75
auto MeshReferenceQuadraturePoints(TIndex nElements)
Computes the element quadrature points in reference element space.
Definition MeshQuadrature.h:193
auto DeterminantOfJacobian(Eigen::MatrixBase< TDerived > const &J) -> typename TDerived::Scalar
Computes the determinant of a (potentially non-square) Jacobian matrix.
Definition Jacobian.h:68
void ToMeshQuadratureWeights(Eigen::MatrixBase< TDerivedDetJe > &detJeThenWg)
Computes the inner product weights such that .
Definition MeshQuadrature.h:40
std::ptrdiff_t Index
Index type.
Definition Aliases.h:17
double Scalar
Scalar type.
Definition Aliases.h:18