9#ifndef PBAT_SIM_DYNAMICS_FEMELASTODYNAMICS_H
10#define PBAT_SIM_DYNAMICS_FEMELASTODYNAMICS_H
48 fem::CElement TElement,
50 physics::CHyperElasticEnergy THyperElasticEnergy,
51 common::CFloatingPoint TScalar =
Scalar,
52 common::CIndex TIndex =
Index>
61 static auto constexpr kDims = Dims;
66 Eigen::Matrix<ScalarType, kDims, Eigen::Dynamic>
68 Eigen::Vector<ScalarType, Eigen::Dynamic>
m;
69 Eigen::Matrix<ScalarType, kDims, Eigen::Dynamic>
71 Eigen::Matrix<ScalarType, kDims, Eigen::Dynamic>
x;
72 Eigen::Matrix<ScalarType, kDims, Eigen::Dynamic>
v;
74 Eigen::Vector<IndexType, Eigen::Dynamic>
egU;
76 Eigen::Vector<ScalarType, Eigen::Dynamic>
78 Eigen::Matrix<ScalarType, Eigen::Dynamic, Eigen::Dynamic>
81 Eigen::Matrix<ScalarType, Eigen::Dynamic, Eigen::Dynamic>
83 Eigen::Vector<ScalarType, Eigen::Dynamic>
85 Eigen::Matrix<ScalarType, kDims * ElementType::kNodes, Eigen::Dynamic>
88 Eigen::Matrix<ScalarType, kDims * ElementType::kNodes, Eigen::Dynamic>
93 Eigen::Vector<IndexType, Eigen::Dynamic>
97 Eigen::Vector<bool, Eigen::Dynamic>
dmask;
116 Eigen::Ref<Eigen::Matrix<ScalarType, Eigen::Dynamic, Eigen::Dynamic>
const>
const& V,
117 Eigen::Ref<Eigen::Matrix<IndexType, Eigen::Dynamic, Eigen::Dynamic>
const>
const& C);
129 Eigen::Ref<Eigen::Matrix<ScalarType, Eigen::Dynamic, Eigen::Dynamic>
const>
const& V,
130 Eigen::Ref<Eigen::Matrix<IndexType, Eigen::Dynamic, Eigen::Dynamic>
const>
const& C);
136 template <
class TDerivedX0,
class TDerivedV0>
138 Eigen::DenseBase<TDerivedX0>
const& x0,
139 Eigen::DenseBase<TDerivedV0>
const& v0);
169 template <
typename TDerivedDirichletMask>
170 void Constrain(Eigen::DenseBase<TDerivedDirichletMask>
const& D);
184 template <
class TDerivedEg,
class TDerivedWg,
class TDerivedXg,
class TDerivedRhog>
186 Eigen::DenseBase<TDerivedEg>
const& eg,
187 Eigen::MatrixBase<TDerivedWg>
const& wg,
188 Eigen::MatrixBase<TDerivedXg>
const& Xg,
189 Eigen::MatrixBase<TDerivedRhog>
const& rhog);
211 class TDerivedLambdag>
213 Eigen::DenseBase<TDerivedEg>
const& eg,
214 Eigen::DenseBase<TDerivedWg>
const& wg,
215 Eigen::MatrixBase<TDerivedXg>
const& Xg,
216 Eigen::DenseBase<TDerivedMug>
const& mug,
217 Eigen::DenseBase<TDerivedLambdag>
const& lambdag);
231 template <
class TDerivedEg,
class TDerivedWg,
class TDerivedXg,
class TDerivedBg>
233 Eigen::DenseBase<TDerivedEg>
const& eg,
234 Eigen::MatrixBase<TDerivedWg>
const& wg,
235 Eigen::MatrixBase<TDerivedXg>
const& Xg,
236 Eigen::MatrixBase<TDerivedBg>
const& bg);
249 int eElasticComputationFlags,
256 auto M()
const {
return m.replicate(1,
kDims).transpose().reshaped(); };
261 auto aext()
const {
return (
fext *
m.cwiseInverse().asDiagonal()); }
343 Eigen::Ref<Eigen::Matrix<ScalarType, Eigen::Dynamic, Eigen::Dynamic>
const>
const& V,
344 Eigen::Ref<Eigen::Matrix<IndexType, Eigen::Dynamic, Eigen::Dynamic>
const>
const& C)
356 Eigen::Ref<Eigen::Matrix<ScalarType, Eigen::Dynamic, Eigen::Dynamic>
const>
const& V,
357 Eigen::Ref<Eigen::Matrix<IndexType, Eigen::Dynamic, Eigen::Dynamic>
const>
const& C)
359 mesh.Construct(V, C);
360 auto const nNodes =
mesh.X.cols();
363 Eigen::Matrix<ScalarType, Eigen::Dynamic, Eigen::Dynamic>::Zero(
kDims, nNodes));
370 auto const [mu, lambda] = physics::LameCoefficients(Y, nu);
373 Eigen::Vector<ScalarType, kDims> load = Eigen::Vector<ScalarType, kDims>::Zero();
374 load(load.rows() - 1) = rho *
ScalarType(-9.81);
378 int constexpr bdfstep = 1;
381 Constrain(Eigen::Vector<bool, Eigen::Dynamic>::Constant(nNodes,
false));
390template <
class TDerivedX0,
class TDerivedV0>
393 Eigen::DenseBase<TDerivedX0>
const& x0,
394 Eigen::DenseBase<TDerivedV0>
const& v0)
399 bdf.SetInitialConditions(x0.reshaped(), v0.reshaped());
411 auto constexpr kOrder = 2 * TElement::kOrder;
413 Eigen::Matrix<ScalarType, Eigen::Dynamic, Eigen::Dynamic>
const XgM =
414 mesh.template QuadraturePoints<kOrder>();
415 auto const nQuadPtsPerElementM = XgM.cols() / nElements;
418 Eigen::Vector<IndexType, Eigen::Dynamic>::LinSpaced(nElements,
IndexType(0), nElements - 1)
419 .replicate(1, nQuadPtsPerElementM)
424 Eigen::Vector<ScalarType, Eigen::Dynamic>::Constant(XgM.cols(), rho)
439 auto constexpr kOrder = TElement::kOrder;
442 Eigen::Matrix<ScalarType, Eigen::Dynamic, Eigen::Dynamic>
const XgU =
443 mesh.template QuadraturePoints<kOrder>();
444 auto const nQuadPtsPerElementU = XgU.cols() / nElements;
447 Eigen::Vector<IndexType, Eigen::Dynamic>::LinSpaced(nElements,
IndexType(0), nElements - 1)
448 .replicate(1, nQuadPtsPerElementU)
453 Eigen::Vector<ScalarType, Eigen::Dynamic>::Constant(XgU.cols(), mu) ,
454 Eigen::Vector<ScalarType, Eigen::Dynamic>::Constant(XgU.cols(), lambda) );
465 Eigen::Vector<ScalarType, kDims>
const& b)
467 auto constexpr kOrder = TElement::kOrder;
469 Eigen::Matrix<ScalarType, Eigen::Dynamic, Eigen::Dynamic>
const XgB =
470 mesh.template QuadraturePoints<kOrder>();
471 auto const nQuadPtsPerElementB = XgB.cols() / nElements;
474 Eigen::Vector<IndexType, Eigen::Dynamic>::LinSpaced(nElements,
IndexType(0), nElements - 1)
475 .replicate(1, nQuadPtsPerElementB)
480 b.replicate(1, XgB.cols())
505template <
typename TDerivedDirichletMask>
507 Eigen::DenseBase<TDerivedDirichletMask>
const& D)
510 std::is_same_v<typename TDerivedDirichletMask::Scalar, bool>,
511 "Dirichlet mask must be of type bool");
513 assert(D.size() == nNodes);
514 dmask = D.template cast<bool>();
516 auto it = std::stable_partition(
dbc.begin(),
dbc.end(), [&D](
IndexType i) { return not D[i]; });
517 ndbc = nNodes - std::distance(
dbc.begin(), it);
526template <
class TDerivedEg,
class TDerivedWg,
class TDerivedXg,
class TDerivedRhog>
528 Eigen::DenseBase<TDerivedEg>
const& eg,
529 Eigen::MatrixBase<TDerivedWg>
const& wg,
530 Eigen::MatrixBase<TDerivedXg>
const& Xg,
531 Eigen::MatrixBase<TDerivedRhog>
const& rhog)
534 Eigen::SparseMatrix<ScalarType, Eigen::RowMajor, IndexType> rhogwgN =
535 rhog.cwiseProduct(wg).asDiagonal() * N;
536 Eigen::SparseMatrix<ScalarType, Eigen::ColMajor, IndexType>
M = N.transpose() * rhogwgN;
538 for (
auto j = 0; j <
M.cols(); ++j)
539 m(j) =
M.col(j).sum();
553 class TDerivedLambdag>
556 Eigen::DenseBase<TDerivedEg>
const& eg,
557 Eigen::DenseBase<TDerivedWg>
const& wg,
558 Eigen::MatrixBase<TDerivedXg>
const& Xg,
559 Eigen::DenseBase<TDerivedMug>
const& mug,
560 Eigen::DenseBase<TDerivedLambdag>
const& lambdag)
565 lamegU.resize(2, eg.size());
568 UgU.resize(eg.size());
569 GgU.resize(
kDims * ElementType::kNodes, eg.size());
570 HgU.resize(
kDims * ElementType::kNodes,
kDims * ElementType::kNodes * eg.size());
579template <
class TDerivedEg,
class TDerivedWg,
class TDerivedXg,
class TDerivedBg>
582 Eigen::DenseBase<TDerivedEg>
const& eg,
583 Eigen::MatrixBase<TDerivedWg>
const& wg,
584 Eigen::MatrixBase<TDerivedXg>
const& Xg,
585 Eigen::MatrixBase<TDerivedBg>
const& bg)
587 Eigen::SparseMatrix<ScalarType, Eigen::RowMajor, IndexType> N =
589 fext = bg * wg.asDiagonal() * N;
601 auto xtildeBdf =
bdf.Inertia(0);
602 auto vtildeBdf =
bdf.Inertia(1);
603 auto betaTilde =
bdf.BetaTilde();
606 -(xtildeBdf + betaTilde * vtildeBdf) + (betaTilde * betaTilde) * (
aext().reshaped());
617 int eElasticComputationFlags,
631 eElasticComputationFlags,
632 eSpdCorrectionFlags);
644 io::Archive femElastoDynamicsArchive = archive[
"pbat.sim.dynamics.FemElastoDynamics"];
645 mesh.Serialize(femElastoDynamicsArchive);
646 bdf.Serialize(femElastoDynamicsArchive);
673 io::Archive const femElastoDynamicsArchive = archive[
"pbat.sim.dynamics.FemElastoDynamics"];
674 mesh.Deserialize(femElastoDynamicsArchive);
675 bdf.Deserialize(femElastoDynamicsArchive);
676 if (
bdf.Order() != 2)
678 throw std::runtime_error(
"FemElastoDynamics only supports BDF of order 2");
680 fext = femElastoDynamicsArchive
681 .
ReadData<Eigen::Matrix<ScalarType, Eigen::Dynamic, Eigen::Dynamic>>(
"fext");
682 m = femElastoDynamicsArchive.
ReadData<Eigen::Vector<ScalarType, Eigen::Dynamic>>(
"m");
683 xtilde = femElastoDynamicsArchive
684 .
ReadData<Eigen::Matrix<ScalarType, Eigen::Dynamic, Eigen::Dynamic>>(
"xtilde");
685 x = femElastoDynamicsArchive
686 .
ReadData<Eigen::Matrix<ScalarType, Eigen::Dynamic, Eigen::Dynamic>>(
"x");
687 v = femElastoDynamicsArchive
688 .
ReadData<Eigen::Matrix<ScalarType, Eigen::Dynamic, Eigen::Dynamic>>(
"v");
689 egU = femElastoDynamicsArchive.
ReadData<Eigen::Vector<IndexType, Eigen::Dynamic>>(
"egU");
690 wgU = femElastoDynamicsArchive.
ReadData<Eigen::Vector<ScalarType, Eigen::Dynamic>>(
"wgU");
691 GNegU = femElastoDynamicsArchive
692 .
ReadData<Eigen::Matrix<ScalarType, Eigen::Dynamic, Eigen::Dynamic>>(
"GNegU");
693 lamegU = femElastoDynamicsArchive
694 .
ReadData<Eigen::Matrix<ScalarType, Eigen::Dynamic, Eigen::Dynamic>>(
"lamegU");
695 UgU = femElastoDynamicsArchive.
ReadData<Eigen::Vector<ScalarType, Eigen::Dynamic>>(
"UgU");
696 GgU = femElastoDynamicsArchive
697 .
ReadData<Eigen::Matrix<ScalarType, Eigen::Dynamic, Eigen::Dynamic>>(
"GgU");
698 HgU = femElastoDynamicsArchive
699 .
ReadData<Eigen::Matrix<ScalarType, Eigen::Dynamic, Eigen::Dynamic>>(
"HgU");
701 dbc = femElastoDynamicsArchive.
ReadData<Eigen::Vector<IndexType, Eigen::Dynamic>>(
"dbc");
702 dmask = femElastoDynamicsArchive.
ReadData<Eigen::Vector<bool, Eigen::Dynamic>>(
"dmask");
BDF (Backward Differentiation Formula) time integration scheme.
Hyper elastic potential energy.
Functions to compute jacobians, their determinants, domain quadrature weights and mapping domain to r...
Utility functions computing common mesh quadrature quantities.
FEM shape functions and gradients.
Archive class for reading and writing data to HDF5 files.
Definition Archive.h:29
T ReadData(std::string const &path) const
Read data from the archive.
Definition Archive.h:179
void WriteMetaData(std::string const &key, T const &value)
Write metadata to the archive.
Definition Archive.h:158
void WriteData(std::string const &path, T const &data)
Write data to the archive.
Definition Archive.h:137
T ReadMetaData(std::string const &key) const
Read metadata from the archive.
Definition Archive.h:195
BDF (Backward Differentiation Formula) time integration scheme for a system of ODEs for an initial va...
Definition Bdf.h:77
Concepts for common types.
Concept for floating-point types.
Definition Concepts.h:56
Concept for integral types.
Definition Concepts.h:45
Reference finite element.
Definition Concepts.h:63
Concept for hyperelastic energy.
Definition HyperElasticity.h:53
Finite element mesh API and implementation.
auto ShapeFunctionMatrixAt(Eigen::DenseBase< TDerivedE > const &E, TIndex nNodes, Eigen::MatrixBase< TDerivedXi > const &Xi) -> Eigen::SparseMatrix< typename TDerivedXi::Scalar, Eigen::RowMajor, TIndex >
Constructs a shape function matrix for a given mesh, i.e. at the element quadrature points.
Definition ShapeFunctions.h:137
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
EHyperElasticSpdCorrection
Bit-flag enum for SPD projection type.
Definition HyperElasticPotential.h:38
auto ShapeFunctionGradientsAt(Eigen::DenseBase< TDerivedEg > const &Eg, Eigen::MatrixBase< TDerivedX > const &X, Eigen::MatrixBase< TDerivedXi > const &Xi) -> Eigen::Matrix< typename TDerivedXi::Scalar, TElement::kNodes, Eigen::Dynamic >
Computes nodal shape function gradients at evaluation points Xi.
Definition ShapeFunctions.h:383
void ToElementElasticity(Eigen::DenseBase< TDerivedE > const &E, Eigen::Index nNodes, Eigen::DenseBase< TDerivedeg > const &eg, Eigen::DenseBase< TDerivedwg > const &wg, Eigen::MatrixBase< TDerivedGNeg > const &GNeg, Eigen::DenseBase< TDerivedmug > const &mug, Eigen::DenseBase< TDerivedlambdag > const &lambdag, Eigen::MatrixBase< TDerivedx > const &x, Eigen::PlainObjectBase< TDerivedUg > &Ug, Eigen::PlainObjectBase< TDerivedGg > &Gg, Eigen::PlainObjectBase< TDerivedHg > &Hg, int eFlags=EElementElasticityComputationFlags::Potential, EHyperElasticSpdCorrection eSpdCorrection=EHyperElasticSpdCorrection::None)
Compute element elasticity and its derivatives at the given shape.
Definition HyperElasticPotential.h:934
Namespace for the dynamics module of the PBAT simulation library.
std::ptrdiff_t Index
Index type.
Definition Aliases.h:17
double Scalar
Scalar type.
Definition Aliases.h:18
A generic stateful finite element mesh representation.
Definition Mesh.h:45
auto DirichletCoordinates() const
Dirichlet nodal positions.
Definition FemElastoDynamics.h:283
Eigen::Matrix< ScalarType, kDims, Eigen::Dynamic > x
Definition FemElastoDynamics.h:71
auto FreeVelocities()
Free nodal velocities.
Definition FemElastoDynamics.h:323
void SetMassMatrix(Eigen::DenseBase< TDerivedEg > const &eg, Eigen::MatrixBase< TDerivedWg > const &wg, Eigen::MatrixBase< TDerivedXg > const &Xg, Eigen::MatrixBase< TDerivedRhog > const &rhog)
Compute, lump and set the mass matrix with variable density at quadrature points of the given quadr...
Definition FemElastoDynamics.h:527
void Construct(Eigen::Ref< Eigen::Matrix< ScalarType, Eigen::Dynamic, Eigen::Dynamic > const > const &V, Eigen::Ref< Eigen::Matrix< IndexType, Eigen::Dynamic, Eigen::Dynamic > const > const &C)
Construct an FemElastoDynamics problem on the mesh domain (V,C).
Definition FemElastoDynamics.h:355
void ComputeElasticEnergy(int eElasticComputationFlags, fem::EHyperElasticSpdCorrection eSpdCorrectionFlags)
Compute the quadrature point elastic energies of the current configuration into Ug,...
Definition FemElastoDynamics.h:616
BdfType bdf
Definition FemElastoDynamics.h:64
bool IsDirichletNode(IndexType node) const
Check if a node is Dirichlet constrained.
Definition FemElastoDynamics.h:267
Eigen::Matrix< ScalarType, kDims, Eigen::Dynamic > fext
Definition FemElastoDynamics.h:67
auto FreeCoordinates() const
Free nodal positions.
Definition FemElastoDynamics.h:308
Eigen::Vector< ScalarType, Eigen::Dynamic > m
Definition FemElastoDynamics.h:68
TScalar ScalarType
Definition FemElastoDynamics.h:59
Eigen::Vector< ScalarType, Eigen::Dynamic > UgU
Definition FemElastoDynamics.h:84
IndexType ndbc
Definition FemElastoDynamics.h:92
auto FreeVelocities() const
Free nodal velocities.
Definition FemElastoDynamics.h:313
auto M() const
k-dimensional mass matrix
Definition FemElastoDynamics.h:256
void SetInitialConditions(Eigen::DenseBase< TDerivedX0 > const &x0, Eigen::DenseBase< TDerivedV0 > const &v0)
Set the initial conditions for the initial value problem.
Definition FemElastoDynamics.h:392
Eigen::Vector< IndexType, Eigen::Dynamic > dbc
Definition FemElastoDynamics.h:94
TElement ElementType
Definition FemElastoDynamics.h:56
void Serialize(io::Archive &archive) const
Serialize to HDF5 group.
Definition FemElastoDynamics.h:641
Eigen::Vector< IndexType, Eigen::Dynamic > egU
Definition FemElastoDynamics.h:74
void SetElasticEnergy(Eigen::DenseBase< TDerivedEg > const &eg, Eigen::DenseBase< TDerivedWg > const &wg, Eigen::MatrixBase< TDerivedXg > const &Xg, Eigen::DenseBase< TDerivedMug > const &mug, Eigen::DenseBase< TDerivedLambdag > const &lambdag)
Compute and set the elastic energy quadrature for a heterogeneous material with variable Lame coeffic...
Definition FemElastoDynamics.h:555
Eigen::Vector< bool, Eigen::Dynamic > dmask
Definition FemElastoDynamics.h:97
void SetExternalLoad(Eigen::Vector< ScalarType, kDims > const &b)
Compute and set the external load vector given by fixed body forces .
Definition FemElastoDynamics.h:464
Eigen::Vector< ScalarType, Eigen::Dynamic > wgU
Definition FemElastoDynamics.h:77
void SetElasticEnergy(ScalarType mu, ScalarType lambda)
Set the elastic energy quadrature for a homogeneous material with Lame coefficients and .
Definition FemElastoDynamics.h:435
void SetExternalLoad(Eigen::DenseBase< TDerivedEg > const &eg, Eigen::MatrixBase< TDerivedWg > const &wg, Eigen::MatrixBase< TDerivedXg > const &Xg, Eigen::MatrixBase< TDerivedBg > const &bg)
Compute and set the external load vector given by variable body forces at quadrature points of the ...
Definition FemElastoDynamics.h:581
static auto constexpr kDims
Definition FemElastoDynamics.h:61
void Deserialize(io::Archive const &archive)
Deserialize from HDF5 group.
Definition FemElastoDynamics.h:670
FemElastoDynamics()=default
Construct an empty FemElastoDynamics problem.
auto DirichletCoordinates()
Dirichlet nodal positions.
Definition FemElastoDynamics.h:293
auto DirichletVelocities() const
Dirichlet nodal velocities.
Definition FemElastoDynamics.h:288
auto DirichletVelocities()
Dirichlet nodal velocities.
Definition FemElastoDynamics.h:298
auto FreeCoordinates()
Free nodal positions.
Definition FemElastoDynamics.h:318
bool IsDirichletDof(IndexType i) const
Check if a coordinate is Dirichlet constrained.
Definition FemElastoDynamics.h:273
void Constrain(Eigen::DenseBase< TDerivedDirichletMask > const &D)
Set the Dirichlet boundary conditions.
Definition FemElastoDynamics.h:506
fem::Mesh< TElement, Dims, TScalar, TIndex > MeshType
Definition FemElastoDynamics.h:55
Eigen::Matrix< ScalarType, kDims *ElementType::kNodes, Eigen::Dynamic > HgU
Definition FemElastoDynamics.h:89
auto FreeNodes() const
Array of unconstrained nodes.
Definition FemElastoDynamics.h:303
FemElastoDynamics(Eigen::Ref< Eigen::Matrix< ScalarType, Eigen::Dynamic, Eigen::Dynamic > const > const &V, Eigen::Ref< Eigen::Matrix< IndexType, Eigen::Dynamic, Eigen::Dynamic > const > const &C)
Construct an FemElastoDynamics problem on the mesh domain (V,C).
Definition FemElastoDynamics.h:342
Eigen::Matrix< ScalarType, Eigen::Dynamic, Eigen::Dynamic > GNegU
Definition FemElastoDynamics.h:79
integration::Bdf< TScalar, TIndex > BdfType
Definition FemElastoDynamics.h:58
auto DirichletNodes() const
Array of Dirichlet constrained nodes.
Definition FemElastoDynamics.h:278
THyperElasticEnergy ElasticEnergyType
Definition FemElastoDynamics.h:57
Eigen::Matrix< ScalarType, kDims *ElementType::kNodes, Eigen::Dynamic > GgU
Definition FemElastoDynamics.h:86
TIndex IndexType
Definition FemElastoDynamics.h:60
void SetTimeIntegrationScheme(ScalarType dt=ScalarType(1e-2), int s=1)
Set the BDF (backward differentiation formula) time integration scheme.
Definition FemElastoDynamics.h:491
void SetupTimeIntegrationOptimization()
Set the BDF inertial target for elasto dynamics.
Definition FemElastoDynamics.h:599
Eigen::Matrix< ScalarType, Eigen::Dynamic, Eigen::Dynamic > lamegU
Definition FemElastoDynamics.h:82
void SetMassMatrix(ScalarType rho)
Compute, lump and set the mass matrix with homogeneous density .
Definition FemElastoDynamics.h:408
MeshType mesh
Definition FemElastoDynamics.h:63
Eigen::Matrix< ScalarType, kDims, Eigen::Dynamic > v
Definition FemElastoDynamics.h:72
Eigen::Matrix< ScalarType, kDims, Eigen::Dynamic > xtilde
Definition FemElastoDynamics.h:70
auto aext() const
External acceleration.
Definition FemElastoDynamics.h:261