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
HyperElasticPotential.h File Reference

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)
 

Detailed Description

Hyper elastic potential energy.

Author
Quoc-Minh Ton-That (tonth.nosp@m.at.q.nosp@m.uocmi.nosp@m.nh@g.nosp@m.mail..nosp@m.com)
Date
2025-02-11