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
FemElastoDynamics.h
Go to the documentation of this file.
1
8
9#ifndef PBAT_SIM_DYNAMICS_FEMELASTODYNAMICS_H
10#define PBAT_SIM_DYNAMICS_FEMELASTODYNAMICS_H
11
14#include "pbat/fem/Jacobian.h"
15#include "pbat/fem/Mesh.h"
18#include "pbat/io/Archive.h"
21
22#include <algorithm>
23#include <cassert>
24#include <exception>
25#include <type_traits>
26
27namespace pbat::sim::dynamics {
28
47template <
48 fem::CElement TElement,
49 int Dims,
50 physics::CHyperElasticEnergy THyperElasticEnergy,
51 common::CFloatingPoint TScalar = Scalar,
52 common::CIndex TIndex = Index>
54{
56 using ElementType = TElement;
57 using ElasticEnergyType = THyperElasticEnergy;
59 using ScalarType = TScalar;
60 using IndexType = TIndex;
61 static auto constexpr kDims = Dims;
62
65
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;
73
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>
91
93 Eigen::Vector<IndexType, Eigen::Dynamic>
97 Eigen::Vector<bool, Eigen::Dynamic> dmask;
100
104 FemElastoDynamics() = default;
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);
156 void SetExternalLoad(Eigen::Vector<ScalarType, kDims> const& b);
162 void SetTimeIntegrationScheme(ScalarType dt = ScalarType(1e-2), int s = 1);
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);
206 template <
207 class TDerivedEg,
208 class TDerivedWg,
209 class TDerivedXg,
210 class TDerivedMug,
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,
250 fem::EHyperElasticSpdCorrection eSpdCorrectionFlags);
256 auto M() const { return m.replicate(1, kDims).transpose().reshaped(); };
261 auto aext() const { return (fext * m.cwiseInverse().asDiagonal()); }
267 bool IsDirichletNode(IndexType node) const { return dmask(node); }
273 bool IsDirichletDof(IndexType i) const { return dmask(i / kDims); }
278 auto DirichletNodes() const { return dbc.tail(ndbc); }
283 auto DirichletCoordinates() const { return x(Eigen::placeholders::all, DirichletNodes()); }
288 auto DirichletVelocities() const { return v(Eigen::placeholders::all, DirichletNodes()); }
293 auto DirichletCoordinates() { return x(Eigen::placeholders::all, DirichletNodes()); }
298 auto DirichletVelocities() { return v(Eigen::placeholders::all, DirichletNodes()); }
303 auto FreeNodes() const { return dbc.head(dbc.size() - ndbc); }
308 auto FreeCoordinates() const { return x(Eigen::placeholders::all, FreeNodes()); }
313 auto FreeVelocities() const { return v(Eigen::placeholders::all, FreeNodes()); }
318 auto FreeCoordinates() { return x(Eigen::placeholders::all, FreeNodes()); }
323 auto FreeVelocities() { return v(Eigen::placeholders::all, FreeNodes()); }
328 void Serialize(io::Archive& archive) const;
333 void Deserialize(io::Archive const& archive);
334};
335
336template <
337 fem::CElement TElement,
338 int Dims,
339 physics::CHyperElasticEnergy THyperElasticEnergy,
341 common::CIndex TIndex>
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)
345{
346 Construct(V, C);
347}
348
349template <
350 fem::CElement TElement,
351 int Dims,
352 physics::CHyperElasticEnergy THyperElasticEnergy,
354 common::CIndex TIndex>
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)
358{
359 mesh.Construct(V, C);
360 auto const nNodes = mesh.X.cols();
362 mesh.X,
363 Eigen::Matrix<ScalarType, Eigen::Dynamic, Eigen::Dynamic>::Zero(kDims, nNodes));
364 // Mass
365 ScalarType constexpr rho{1e3};
366 SetMassMatrix(rho);
367 // Elasticity
368 ScalarType constexpr Y = 1e6;
369 ScalarType constexpr nu = 0.45;
370 auto const [mu, lambda] = physics::LameCoefficients(Y, nu);
371 SetElasticEnergy(mu, lambda);
372 // External load
373 Eigen::Vector<ScalarType, kDims> load = Eigen::Vector<ScalarType, kDims>::Zero();
374 load(load.rows() - 1) = rho * ScalarType(-9.81);
375 SetExternalLoad(load);
376 // Time integration scheme
377 ScalarType constexpr dt{1e-2};
378 int constexpr bdfstep = 1;
379 SetTimeIntegrationScheme(dt, bdfstep);
380 // Unconstrained
381 Constrain(Eigen::Vector<bool, Eigen::Dynamic>::Constant(nNodes, false));
382}
383
384template <
385 fem::CElement TElement,
386 int Dims,
387 physics::CHyperElasticEnergy THyperElasticEnergy,
389 common::CIndex TIndex>
390template <class TDerivedX0, class TDerivedV0>
391inline void
393 Eigen::DenseBase<TDerivedX0> const& x0,
394 Eigen::DenseBase<TDerivedV0> const& v0)
395{
396 x = x0.reshaped(kDims, x0.size() / kDims);
397 v = v0.reshaped(kDims, v0.size() / kDims);
398 bdf.SetOrder(2);
399 bdf.SetInitialConditions(x0.reshaped(), v0.reshaped());
400}
401
402template <
403 fem::CElement TElement,
404 int Dims,
405 physics::CHyperElasticEnergy THyperElasticEnergy,
407 common::CIndex TIndex>
409 ScalarType rho)
410{
411 auto constexpr kOrder = 2 * TElement::kOrder;
412 IndexType const nElements = static_cast<IndexType>(mesh.E.cols());
413 Eigen::Matrix<ScalarType, Eigen::Dynamic, Eigen::Dynamic> const XgM =
414 mesh.template QuadraturePoints<kOrder>();
415 auto const nQuadPtsPerElementM = XgM.cols() / nElements;
416 // Mass
418 Eigen::Vector<IndexType, Eigen::Dynamic>::LinSpaced(nElements, IndexType(0), nElements - 1)
419 .replicate(1, nQuadPtsPerElementM)
420 .transpose()
421 .reshaped() /*eg*/,
422 fem::MeshQuadratureWeights<kOrder>(mesh).reshaped() /*wg*/,
423 XgM /*Xg*/,
424 Eigen::Vector<ScalarType, Eigen::Dynamic>::Constant(XgM.cols(), rho) /*rhog*/
425 );
426}
427
428template <
429 fem::CElement TElement,
430 int Dims,
431 physics::CHyperElasticEnergy THyperElasticEnergy,
433 common::CIndex TIndex>
434inline void
436 ScalarType mu,
437 ScalarType lambda)
438{
439 auto constexpr kOrder = TElement::kOrder;
440 IndexType const nElements = static_cast<IndexType>(mesh.E.cols());
441 // Compute mesh quadrature points
442 Eigen::Matrix<ScalarType, Eigen::Dynamic, Eigen::Dynamic> const XgU =
443 mesh.template QuadraturePoints<kOrder>();
444 auto const nQuadPtsPerElementU = XgU.cols() / nElements;
445 // Elasticity
447 Eigen::Vector<IndexType, Eigen::Dynamic>::LinSpaced(nElements, IndexType(0), nElements - 1)
448 .replicate(1, nQuadPtsPerElementU)
449 .transpose()
450 .reshaped() /*eg*/,
451 fem::MeshQuadratureWeights<kOrder>(mesh).reshaped() /*wg*/,
452 XgU /*Xg*/,
453 Eigen::Vector<ScalarType, Eigen::Dynamic>::Constant(XgU.cols(), mu) /*mug*/,
454 Eigen::Vector<ScalarType, Eigen::Dynamic>::Constant(XgU.cols(), lambda) /*lambdag*/);
455}
456
457template <
458 fem::CElement TElement,
459 int Dims,
460 physics::CHyperElasticEnergy THyperElasticEnergy,
462 common::CIndex TIndex>
463inline void
465 Eigen::Vector<ScalarType, kDims> const& b)
466{
467 auto constexpr kOrder = TElement::kOrder;
468 IndexType const nElements = static_cast<IndexType>(mesh.E.cols());
469 Eigen::Matrix<ScalarType, Eigen::Dynamic, Eigen::Dynamic> const XgB =
470 mesh.template QuadraturePoints<kOrder>();
471 auto const nQuadPtsPerElementB = XgB.cols() / nElements;
472 // External load
474 Eigen::Vector<IndexType, Eigen::Dynamic>::LinSpaced(nElements, IndexType(0), nElements - 1)
475 .replicate(1, nQuadPtsPerElementB)
476 .transpose()
477 .reshaped() /*eg*/,
478 fem::MeshQuadratureWeights<kOrder>(mesh).reshaped() /*wg*/,
479 XgB /*Xg*/,
480 b.replicate(1, XgB.cols()) /*bg*/
481 );
482}
483
484template <
485 fem::CElement TElement,
486 int Dims,
487 physics::CHyperElasticEnergy THyperElasticEnergy,
489 common::CIndex TIndex>
490inline void
498
499template <
500 fem::CElement TElement,
501 int Dims,
502 physics::CHyperElasticEnergy THyperElasticEnergy,
504 common::CIndex TIndex>
505template <typename TDerivedDirichletMask>
507 Eigen::DenseBase<TDerivedDirichletMask> const& D)
508{
509 static_assert(
510 std::is_same_v<typename TDerivedDirichletMask::Scalar, bool>,
511 "Dirichlet mask must be of type bool");
512 IndexType const nNodes = static_cast<IndexType>(mesh.X.cols());
513 assert(D.size() == nNodes);
514 dmask = D.template cast<bool>();
515 dbc.setLinSpaced(nNodes, IndexType(0), nNodes - 1);
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);
518}
519
520template <
521 fem::CElement TElement,
522 int Dims,
523 physics::CHyperElasticEnergy THyperElasticEnergy,
525 common::CIndex TIndex>
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)
532{
533 auto N = fem::ShapeFunctionMatrixAt(mesh, eg.derived(), Xg.derived());
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;
537 m.resize(M.cols());
538 for (auto j = 0; j < M.cols(); ++j)
539 m(j) = M.col(j).sum();
540}
541
542template <
543 fem::CElement TElement,
544 int Dims,
545 physics::CHyperElasticEnergy THyperElasticEnergy,
547 common::CIndex TIndex>
548template <
549 class TDerivedEg,
550 class TDerivedWg,
551 class TDerivedXg,
552 class TDerivedMug,
553 class TDerivedLambdag>
554inline void
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)
561{
562 egU = eg;
563 wgU = wg;
565 lamegU.resize(2, eg.size());
566 lamegU.row(0) = mug;
567 lamegU.row(1) = lambdag;
568 UgU.resize(eg.size());
569 GgU.resize(kDims * ElementType::kNodes, eg.size());
570 HgU.resize(kDims * ElementType::kNodes, kDims * ElementType::kNodes * eg.size());
571}
572
573template <
574 fem::CElement TElement,
575 int Dims,
576 physics::CHyperElasticEnergy THyperElasticEnergy,
578 common::CIndex TIndex>
579template <class TDerivedEg, class TDerivedWg, class TDerivedXg, class TDerivedBg>
580inline void
582 Eigen::DenseBase<TDerivedEg> const& eg,
583 Eigen::MatrixBase<TDerivedWg> const& wg,
584 Eigen::MatrixBase<TDerivedXg> const& Xg,
585 Eigen::MatrixBase<TDerivedBg> const& bg)
586{
587 Eigen::SparseMatrix<ScalarType, Eigen::RowMajor, IndexType> N =
588 fem::ShapeFunctionMatrixAt(mesh, eg.derived(), Xg.derived());
589 fext = bg * wg.asDiagonal() * N;
590}
591
592template <
593 fem::CElement TElement,
594 int Dims,
595 physics::CHyperElasticEnergy THyperElasticEnergy,
597 common::CIndex TIndex>
600{
601 auto xtildeBdf = bdf.Inertia(0);
602 auto vtildeBdf = bdf.Inertia(1);
603 auto betaTilde = bdf.BetaTilde();
604 xtilde.resize(kDims, xtildeBdf.size() / kDims);
605 xtilde.reshaped() =
606 -(xtildeBdf + betaTilde * vtildeBdf) + (betaTilde * betaTilde) * (aext().reshaped());
607}
608
609template <
610 fem::CElement TElement,
611 int Dims,
612 physics::CHyperElasticEnergy THyperElasticEnergy,
614 common::CIndex TIndex>
615inline void
617 int eElasticComputationFlags,
618 fem::EHyperElasticSpdCorrection eSpdCorrectionFlags)
619{
621 mesh,
622 egU,
623 wgU,
624 GNegU,
625 lamegU.row(0),
626 lamegU.row(1),
627 x.reshaped(),
628 UgU,
629 GgU,
630 HgU,
631 eElasticComputationFlags,
632 eSpdCorrectionFlags);
633}
634
635template <
636 fem::CElement TElement,
637 int Dims,
638 physics::CHyperElasticEnergy THyperElasticEnergy,
640 common::CIndex TIndex>
642 io::Archive& archive) const
643{
644 io::Archive femElastoDynamicsArchive = archive["pbat.sim.dynamics.FemElastoDynamics"];
645 mesh.Serialize(femElastoDynamicsArchive);
646 bdf.Serialize(femElastoDynamicsArchive);
647 femElastoDynamicsArchive.WriteData("fext", fext);
648 femElastoDynamicsArchive.WriteData("m", m);
649 femElastoDynamicsArchive.WriteData("xtilde", xtilde);
650 femElastoDynamicsArchive.WriteData("x", x);
651 femElastoDynamicsArchive.WriteData("v", v);
652 femElastoDynamicsArchive.WriteData("egU", egU);
653 femElastoDynamicsArchive.WriteData("wgU", wgU);
654 femElastoDynamicsArchive.WriteData("GNegU", GNegU);
655 femElastoDynamicsArchive.WriteData("lamegU", lamegU);
656 femElastoDynamicsArchive.WriteData("UgU", UgU);
657 femElastoDynamicsArchive.WriteData("GgU", GgU);
658 femElastoDynamicsArchive.WriteData("HgU", HgU);
659 femElastoDynamicsArchive.WriteMetaData("ndbc", ndbc);
660 femElastoDynamicsArchive.WriteData("dbc", dbc);
661 femElastoDynamicsArchive.WriteData("dmask", dmask);
662}
663
664template <
665 fem::CElement TElement,
666 int Dims,
667 physics::CHyperElasticEnergy THyperElasticEnergy,
669 common::CIndex TIndex>
671 io::Archive const& archive)
672{
673 io::Archive const femElastoDynamicsArchive = archive["pbat.sim.dynamics.FemElastoDynamics"];
674 mesh.Deserialize(femElastoDynamicsArchive);
675 bdf.Deserialize(femElastoDynamicsArchive);
676 if (bdf.Order() != 2)
677 {
678 throw std::runtime_error("FemElastoDynamics only supports BDF of order 2");
679 }
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");
700 ndbc = femElastoDynamicsArchive.ReadMetaData<IndexType>("ndbc");
701 dbc = femElastoDynamicsArchive.ReadData<Eigen::Vector<IndexType, Eigen::Dynamic>>("dbc");
702 dmask = femElastoDynamicsArchive.ReadData<Eigen::Vector<bool, Eigen::Dynamic>>("dmask");
703}
704
705} // namespace pbat::sim::dynamics
706
707#endif // PBAT_SIM_DYNAMICS_FEMELASTODYNAMICS_H
(De)serializer
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
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
bool IsDirichletNode(IndexType node) const
Check if a node is Dirichlet constrained.
Definition FemElastoDynamics.h:267
auto FreeCoordinates() const
Free nodal positions.
Definition FemElastoDynamics.h:308
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
void Serialize(io::Archive &archive) const
Serialize to HDF5 group.
Definition FemElastoDynamics.h:641
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
void SetExternalLoad(Eigen::Vector< ScalarType, kDims > const &b)
Compute and set the external load vector given by fixed body forces .
Definition FemElastoDynamics.h:464
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
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
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
auto DirichletNodes() const
Array of Dirichlet constrained nodes.
Definition FemElastoDynamics.h:278
Eigen::Matrix< ScalarType, kDims *ElementType::kNodes, Eigen::Dynamic > GgU
Definition FemElastoDynamics.h:86
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
auto aext() const
External acceleration.
Definition FemElastoDynamics.h:261