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
HyperElasticity.h
Go to the documentation of this file.
1
9
10#ifndef PBAT_PHYSICS_HYPER_ELASTICITY_H
11#define PBAT_PHYSICS_HYPER_ELASTICITY_H
12
13#include "PhysicsBasedAnimationToolkitExport.h"
14#include "pbat/Aliases.h"
15#include "pbat/math/linalg/mini/Matrix.h"
16
17#include <concepts>
18#include <exception>
19#include <fmt/core.h>
20#include <string>
21
22namespace pbat {
23namespace physics {
24
32PBAT_API std::pair<Scalar, Scalar> LameCoefficients(Scalar Y, Scalar nu);
33
43template <class TDerivedY, class TDerivednu>
44std::pair<VectorX, VectorX>
45LameCoefficients(Eigen::DenseBase<TDerivedY> const& Y, Eigen::DenseBase<TDerivednu> const& nu);
46
52template <class T>
53concept CHyperElasticEnergy = requires(T t)
54{
55 {
56 T::kDims
57 } -> std::convertible_to<int>;
58 {
60 } -> std::convertible_to<Scalar>;
61 {
63 } -> std::convertible_to<math::linalg::mini::SVector<Scalar, T::kDims * T::kDims>>;
64 {
66 } -> std::convertible_to<
68 {
69 t.evalWithGrad(
71 Scalar{},
72 Scalar{},
73 std::declval<math::linalg::mini::SVector<Scalar, T::kDims * T::kDims>&>())
74 } -> std::convertible_to<Scalar>;
75 {
76 t.evalWithGradAndHessian(
78 Scalar{},
79 Scalar{},
80 std::declval<math::linalg::mini::SVector<Scalar, T::kDims * T::kDims>&>(),
81 std::declval<
83 } -> std::convertible_to<Scalar>;
84 {t.gradAndHessian(
86 Scalar{},
87 Scalar{},
88 std::declval<math::linalg::mini::SVector<Scalar, T::kDims * T::kDims>&>(),
89 std::declval<
91};
92
93template <class TDerivedY, class TDerivednu>
94std::pair<VectorX, VectorX>
95LameCoefficients(Eigen::DenseBase<TDerivedY> const& Y, Eigen::DenseBase<TDerivednu> const& nu)
96{
97 bool const bYHasExpectedDimensions = (Y.rows() == 1) or (Y.cols() == 1);
98 bool const bNuHasExpectedDimensions = (nu.rows() == 1) or (nu.cols() == 1);
99 bool const bHaveSameDimensions = Y.size() == nu.size();
100 if (not(bYHasExpectedDimensions and bNuHasExpectedDimensions and bHaveSameDimensions))
101 {
102 std::string const what = fmt::format(
103 "Expected equivalent dimensions in Y and nu, with Y and nu being 1D arrays, but got "
104 "size(Y)={}, size(nu)={}",
105 Y.size(),
106 nu.size());
107 throw std::invalid_argument(what);
108 }
109 VectorX mu(Y.size());
110 VectorX lambda(Y.size());
111 for (auto i = 0; i < Y.size(); ++i)
112 {
113 std::tie(mu(i), lambda(i)) = LameCoefficients(Y(i), nu(i));
114 }
115 return {mu, lambda};
116}
117
118} // namespace physics
119} // namespace pbat
120
121#endif // PBAT_PHYSICS_HYPER_ELASTICITY_H
Definition Matrix.h:121
Concept for hyperelastic energy.
Definition HyperElasticity.h:53
The main namespace of the library.
Definition Aliases.h:15
Eigen::Vector< Scalar, Eigen::Dynamic > VectorX
Dynamic-size vector type.
Definition Aliases.h:33
double Scalar
Scalar type.
Definition Aliases.h:18