PolyFEM
Loading...
Searching...
No Matches
InversionBarrier.hpp
Go to the documentation of this file.
1#pragma once
2
5
6// Standalone inversion barrier, split out of the former ModifiedNeoHookeanElasticity
7// (ported from the original positive-jacobian branch, commit c59afca4, later reverted
8// in 342cb860) so it can be combined with any elasticity model via SumModel/MaterialSum.
9namespace polyfem::assembler
10{
12 {
13 public:
15
19
20 double compute_energy(const NonLinearAssemblerData &data) const override;
21 Eigen::VectorXd assemble_gradient(const NonLinearAssemblerData &data) const override;
22 Eigen::MatrixXd assemble_hessian(const NonLinearAssemblerData &data) const override;
23
24 VectorNd compute_rhs(const AutodiffHessianPt &pt) const override;
25
26 void add_multimaterial(const int index, const json &params, const Units &units, const std::string &root_path) override;
27
28 std::string name() const override { return "InversionBarrier"; }
29 bool allow_inversion() const override { return false; }
30 std::map<std::string, ParamFunc> parameters() const override;
31
32 void assign_stress_tensor(const OutputData &data,
33 const int all_size,
34 const ElasticityTensorType &type,
35 Eigen::MatrixXd &all,
36 const std::function<Eigen::MatrixXd(const Eigen::MatrixXd &)> &fun) const override;
37
38 private:
40 // Activation threshold for the barrier: zero for J >= JBarrierThreshold, diverges to +inf as J -> 0.
42 };
43} // namespace polyfem::assembler
virtual void assemble_gradient(const bool is_volume, const int n_basis, const std::vector< basis::ElementBases > &bases, const std::vector< basis::ElementBases > &gbases, const AssemblyValsCache &cache, const double t, const double dt, const Eigen::MatrixXd &displacement, const Eigen::MatrixXd &displacement_prev, Eigen::MatrixXd &rhs) const
virtual void assemble_hessian(const bool is_volume, const int n_basis, const bool project_to_psd, const std::vector< basis::ElementBases > &bases, const std::vector< basis::ElementBases > &gbases, const AssemblyValsCache &cache, const double t, const double dt, const Eigen::MatrixXd &displacement, const Eigen::MatrixXd &displacement_prev, utils::MatrixCache &mat_cache, StiffnessMatrix &grad) const
virtual double assemble_energy(const bool is_volume, const std::vector< basis::ElementBases > &bases, const std::vector< basis::ElementBases > &gbases, const AssemblyValsCache &cache, const double t, const double dt, const Eigen::MatrixXd &displacement, const Eigen::MatrixXd &displacement_prev) const
Definition Assembler.hpp:81
VectorNd compute_rhs(const AutodiffHessianPt &pt) const override
void add_multimaterial(const int index, const json &params, const Units &units, const std::string &root_path) override
std::string name() const override
void assign_stress_tensor(const OutputData &data, const int all_size, const ElasticityTensorType &type, Eigen::MatrixXd &all, const std::function< Eigen::MatrixXd(const Eigen::MatrixXd &)> &fun) const override
Eigen::MatrixXd assemble_hessian(const NonLinearAssemblerData &data) const override
std::map< std::string, ParamFunc > parameters() const override
double compute_energy(const NonLinearAssemblerData &data) const override
Eigen::VectorXd assemble_gradient(const NonLinearAssemblerData &data) const override
Used for test only.
Eigen::Matrix< AutodiffScalarHessian, Eigen::Dynamic, 1, 0, 3, 1 > AutodiffHessianPt
Eigen::Matrix< double, Eigen::Dynamic, 1, 0, 3, 1 > VectorNd
Definition Types.hpp:11
nlohmann::json json
Definition Common.hpp:9