PhysicsBasedAnimationToolkit 0.0.10
Cross-platform C++20 library of algorithms and data structures commonly used in computer graphics research on physically-based simulation.
|
Hyper elastic potential energy. More...
#include "Concepts.h"
#include "DeformationGradient.h"
#include "PhysicsBasedAnimationToolkitExport.h"
#include "pbat/Aliases.h"
#include "pbat/common/Eigen.h"
#include "pbat/math/linalg/FilterEigenvalues.h"
#include "pbat/math/linalg/SparsityPattern.h"
#include "pbat/math/linalg/mini/Eigen.h"
#include "pbat/math/linalg/mini/Product.h"
#include "pbat/physics/HyperElasticity.h"
#include "pbat/profiling/Profiling.h"
#include <Eigen/Eigenvalues>
#include <exception>
#include <fmt/core.h>
#include <span>
#include <string>
#include <tbb/parallel_for.h>
Go to the source code of this file.
Namespaces | |
namespace | pbat |
The main namespace of the library. | |
namespace | pbat::fem |
Finite Element Method (FEM) | |
Enumerations | |
enum class | pbat::fem::EHyperElasticSpdCorrection : std::uint32_t { None , Projection , Absolute } |
Bit-flag enum for SPD projection type. | |
enum | pbat::fem::EElementElasticityComputationFlags : int { Potential = 1 << 0 , Gradient = 1 << 1 , Hessian = 1 << 2 } |
Bit-flag enum for element elasticity computation flags. | |
Functions | |
math::linalg::EEigenvalueFilter | pbat::fem::ToEigenvalueFilter (EHyperElasticSpdCorrection mode) |
Convert EHyperElasticSpdCorrection to EEigenvalueFilter. | |
template<CElement TElement, int Dims, physics::CHyperElasticEnergy THyperElasticEnergy, class TDerivedE, class TDerivedeg, class TDerivedwg, class TDerivedGNeg, class TDerivedmug, class TDerivedlambdag, class TDerivedx, class TDerivedUg, class TDerivedGg, class TDerivedHg> | |
void | pbat::fem::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. | |
template<physics::CHyperElasticEnergy THyperElasticEnergy, CMesh TMesh, class TDerivedeg, class TDerivedwg, class TDerivedGNeg, class TDerivedmug, class TDerivedlambdag, class TDerivedx, class TDerivedUg, class TDerivedGg, class TDerivedHg> | |
void | pbat::fem::ToElementElasticity (TMesh const &mesh, 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 using mesh. | |
template<CElement TElement, int Dims, class TDerivedE, class TDerivedeg, class TDerivedHg, class TDerivedIn, class TDerivedOut> | |
void | pbat::fem::GemmHyperElastic (Eigen::DenseBase< TDerivedE > const &E, Eigen::Index nNodes, Eigen::DenseBase< TDerivedeg > const &eg, Eigen::MatrixBase< TDerivedHg > const &Hg, Eigen::MatrixBase< TDerivedIn > const &X, Eigen::DenseBase< TDerivedOut > &Y) |
Apply the hessian matrix as a linear operator \( Y += \mathbf{H} X \). | |
template<CMesh TMesh, class TDerivedeg, class TDerivedHg, class TDerivedIn, class TDerivedOut> | |
void | pbat::fem::GemmHyperElastic (TMesh const &mesh, Eigen::DenseBase< TDerivedeg > const &eg, Eigen::MatrixBase< TDerivedHg > const &Hg, Eigen::MatrixBase< TDerivedIn > const &X, Eigen::DenseBase< TDerivedOut > &Y) |
Apply the hessian matrix as a linear operator \( Y += \mathbf{H} X \) using mesh. | |
template<CElement TElement, int Dims, Eigen::StorageOptions Options, class TDerivedE, class TDerivedeg> | |
auto | pbat::fem::ElasticHessianSparsity (Eigen::DenseBase< TDerivedE > const &E, Eigen::Index nNodes, Eigen::DenseBase< TDerivedeg > const &eg) -> math::linalg::SparsityPattern< typename TDerivedE::Scalar, Options > |
Construct the hessian matrix's sparsity pattern. | |
template<Eigen::StorageOptions Options, CMesh TMesh> | |
auto | pbat::fem::ElasticHessianSparsity (TMesh const &mesh) -> math::linalg::SparsityPattern< typename TMesh::IndexType, Options > |
Construct the hessian matrix's sparsity pattern. | |
template<CElement TElement, int Dims, Eigen::StorageOptions Options, class TDerivedE, class TDerivedeg, class TDerivedHg> | |
auto | pbat::fem::HyperElasticHessian (Eigen::DenseBase< TDerivedE > const &E, Eigen::Index nNodes, Eigen::DenseBase< TDerivedeg > const &eg, Eigen::MatrixBase< TDerivedHg > const &Hg) -> Eigen::SparseMatrix< typename TDerivedHg::Scalar, Options, typename TDerivedE::Scalar > |
Construct the hessian matrix's sparse representation. | |
template<Eigen::StorageOptions Options, CMesh TMesh, class TDerivedeg, class TDerivedHg> | |
auto | pbat::fem::HyperElasticHessian (TMesh const &mesh, Eigen::DenseBase< TDerivedeg > const &eg, Eigen::MatrixBase< TDerivedHg > const &Hg) -> Eigen::SparseMatrix< typename TDerivedHg::Scalar, Options, typename TMesh::IndexType > |
Construct the hessian matrix using mesh. | |
template<CElement TElement, int Dims, class TDerivedE, class TDerivedHg, Eigen::StorageOptions Options, class TDerivedH> | |
void | pbat::fem::ToHyperElasticHessian (Eigen::DenseBase< TDerivedE > const &E, Eigen::Index nNodes, Eigen::DenseBase< TDerivedHg > const &Hg, math::linalg::SparsityPattern< typename TDerivedE::Scalar, Options > const &sparsity, Eigen::SparseCompressedBase< TDerivedH > &H) |
Construct the hessian matrix using mesh with sparsity pattern. | |
template<CMesh TMesh, class TDerivedHg, Eigen::StorageOptions Options, class TDerivedH> | |
void | pbat::fem::ToHyperElasticHessian (TMesh const &mesh, Eigen::DenseBase< TDerivedHg > const &Hg, math::linalg::SparsityPattern< typename TMesh::IndexType, Options > const &sparsity, Eigen::SparseCompressedBase< typename TDerivedHg::Scalar > &H) |
Construct the hessian matrix using mesh with sparsity pattern. | |
template<CElement TElement, int Dims, Eigen::StorageOptions Options, class TDerivedE, class TDerivedHg> | |
auto | pbat::fem::HyperElasticHessian (Eigen::DenseBase< TDerivedE > const &E, Eigen::Index nNodes, Eigen::DenseBase< TDerivedHg > const &Hg, math::linalg::SparsityPattern< typename TDerivedE::Scalar, Options > const &sparsity) -> Eigen::SparseMatrix< typename TDerivedHg::Scalar, Options, typename TDerivedE::Scalar > |
template<Eigen::StorageOptions Options, CMesh TMesh, class TDerivedHg> | |
auto | pbat::fem::HyperElasticHessian (TMesh const &mesh, Eigen::DenseBase< TDerivedHg > const &Hg, math::linalg::SparsityPattern< typename TMesh::IndexType, Options > const &sparsity) -> Eigen::SparseMatrix< typename TDerivedHg::Scalar, Options, typename TMesh::IndexType > |
Construct the hessian matrix using mesh with sparsity pattern. | |
template<CElement TElement, int Dims, class TDerivedE, class TDerivedeg, class TDerivedGg, class TDerivedG> | |
void | pbat::fem::ToHyperElasticGradient (Eigen::DenseBase< TDerivedE > const &E, Eigen::Index nNodes, Eigen::DenseBase< TDerivedeg > const &eg, Eigen::MatrixBase< TDerivedGg > const &Gg, Eigen::PlainObjectBase< TDerivedG > &G) |
Compute the gradient vector into existing output. | |
template<CElement TElement, int Dims, physics::CHyperElasticEnergy THyperElasticEnergy, class TDerivedE, class TDerivedeg, class TDerivedwg, class TDerivedGNeg, class TDerivedmug, class TDerivedlambdag, class TDerivedx, class TDerivedGg, class TDerivedG> | |
void | pbat::fem::ToHyperElasticGradient (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::MatrixBase< TDerivedGg > const &Gg, Eigen::PlainObjectBase< TDerivedG > &G) |
Compute the gradient vector into existing output. | |
template<CMesh TMesh, class TDerivedeg, class TDerivedGg, class TDerivedOut> | |
void | pbat::fem::ToHyperElasticGradient (TMesh const &mesh, Eigen::DenseBase< TDerivedeg > const &eg, Eigen::MatrixBase< TDerivedGg > const &Gg, Eigen::PlainObjectBase< TDerivedOut > &G) |
Compute the gradient vector using mesh (updates existing output) | |
template<CMesh TMesh, physics::CHyperElasticEnergy THyperElasticEnergy, class TDerivedE, class TDerivedeg, class TDerivedwg, class TDerivedGNeg, class TDerivedmug, class TDerivedlambdag, class TDerivedx, class TDerivedGg, class TDerivedG> | |
void | pbat::fem::ToHyperElasticGradient (TMesh const &mesh, 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::MatrixBase< TDerivedGg > const &Gg, Eigen::PlainObjectBase< TDerivedG > &G) |
Compute the gradient vector into existing output. | |
template<CElement TElement, int Dims, class TDerivedE, class TDerivedeg, class TDerivedGg> | |
auto | pbat::fem::HyperElasticGradient (Eigen::DenseBase< TDerivedE > const &E, Eigen::Index nNodes, Eigen::DenseBase< TDerivedeg > const &eg, Eigen::MatrixBase< TDerivedGg > const &Gg) -> Eigen::Vector< typename TDerivedGg::Scalar, Eigen::Dynamic > |
Compute the gradient vector (allocates output) | |
template<CMesh TMesh, class TDerivedeg, class TDerivedGg> | |
auto | pbat::fem::HyperElasticGradient (TMesh const &mesh, Eigen::DenseBase< TDerivedeg > const &eg, Eigen::MatrixBase< TDerivedGg > const &Gg) |
Compute the gradient vector (allocates output) | |
template<CElement TElement, int Dims, physics::CHyperElasticEnergy THyperElasticEnergy, class TDerivedE, class TDerivedeg, class TDerivedwg, class TDerivedGNeg, class TDerivedmug, class TDerivedlambdag, class TDerivedx, class TDerivedGg> | |
auto | pbat::fem::HyperElasticGradient (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::MatrixBase< TDerivedGg > const &Gg) |
Compute the gradient vector (allocates output) | |
template<CMesh TMesh, physics::CHyperElasticEnergy THyperElasticEnergy, class TDerivedeg, class TDerivedwg, class TDerivedGNeg, class TDerivedmug, class TDerivedlambdag, class TDerivedx, class TDerivedGg> | |
auto | pbat::fem::HyperElasticGradient (TMesh const &mesh, 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::MatrixBase< TDerivedGg > const &Gg) |
Compute the gradient vector (allocates output) | |
template<physics::CHyperElasticEnergy THyperElasticEnergy, CMesh TMesh, class TDerivedeg, class TDerivedGg> | |
auto | pbat::fem::HyperElasticGradient (TMesh const &mesh, Eigen::DenseBase< TDerivedeg > const &eg, Eigen::MatrixBase< TDerivedGg > const &Gg) |
Compute the gradient vector using mesh (allocates output) | |
template<class TDerivedUg> | |
auto | pbat::fem::HyperElasticPotential (Eigen::DenseBase< TDerivedUg > const &Ug) -> typename TDerivedUg::Scalar |
Compute the total elastic potential. | |
template<CElement TElement, int Dims, physics::CHyperElasticEnergy THyperElasticEnergy, class TDerivedE, class TDerivedeg, class TDerivedwg, class TDerivedGNeg, class TDerivedmug, class TDerivedlambdag, class TDerivedx> | |
auto | pbat::fem::HyperElasticPotential (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) |
Compute the total elastic potential from element data and quadrature. | |
template<CElement TElement, int Dims, class TDerivedE, class TDerivedeg, class TDerivedGg, class TDerivedOut> | |
void | pbat::fem::ToHyperElasticGradient (Eigen::DenseBase< TDerivedE > const &E, Eigen::Index nNodes, Eigen::DenseBase< TDerivedeg > const &eg, Eigen::MatrixBase< TDerivedGg > const &Gg, Eigen::PlainObjectBase< TDerivedOut > &G) |
Hyper elastic potential energy.