PolyFEM
Loading...
Searching...
No Matches
AMIPSEnergy.cpp
Go to the documentation of this file.
1#include "AMIPSEnergy.hpp"
2
4
9
10namespace polyfem::assembler
11{
12 void AMIPSEnergy::add_multimaterial(const int index, const json &params, const Units &units)
13 {
14 assert(size() == 2 || size() == 3);
15
16 if (params.contains("use_rest_pose"))
17 {
18 use_rest_pose_ = params["use_rest_pose"].get<bool>();
19 }
20 }
21
22 Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, 0, 3, 3> AMIPSEnergy::gradient(
23 const RowVectorNd &p,
24 const double t,
25 const int el_id,
26 const Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, 0, 3, 3> &F) const
27 {
28 const double det = polyfem::utils::determinant(F);
29 if (det <= 0)
30 {
31 Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, 0, 3, 3> grad(size(), size());
32 grad.setConstant(std::nan(""));
33 return grad;
34 }
35
37 {
38 if (size() == 2)
39 return autogen::AMIPS2drest_gradient(p, t, el_id, F);
40 else
41 return autogen::AMIPS3drest_gradient(p, t, el_id, F);
42 }
43 else
44 {
45 if (size() == 2)
46 return autogen::AMIPS2d_gradient(p, t, el_id, F);
47 else
48 return autogen::AMIPS3d_gradient(p, t, el_id, F);
49 }
50 }
51
52 Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, 0, 9, 9> AMIPSEnergy::hessian(
53 const RowVectorNd &p,
54 const double t,
55 const int el_id,
56 const Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, 0, 3, 3> &F) const
57 {
58 const double det = polyfem::utils::determinant(F);
59 if (det <= 0)
60 {
61 Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, 0, 9, 9> hessian(size() * size(), size() * size());
62 hessian.setConstant(std::nan(""));
63 return hessian;
64 }
65
67 {
68 if (size() == 2)
69 return autogen::AMIPS2drest_hessian(p, t, el_id, F);
70 else
71 return autogen::AMIPS3drest_hessian(p, t, el_id, F);
72 }
73 else
74 {
75 if (size() == 2)
76 return autogen::AMIPS2d_hessian(p, t, el_id, F);
77 else
78 return autogen::AMIPS3d_hessian(p, t, el_id, F);
79 }
80 }
81
82} // namespace polyfem::assembler
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic, 0, 3, 3 > gradient(const RowVectorNd &p, const double t, const int el_id, const Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic, 0, 3, 3 > &F) const override
void add_multimaterial(const int index, const json &params, const Units &units) override
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic, 0, 9, 9 > hessian(const RowVectorNd &p, const double t, const int el_id, const Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic, 0, 3, 3 > &F) const override
Used for test only.
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic, 0, 3, 3 > AMIPS2drest_gradient(const RowVectorNd &p, const double t, const int el_id, const Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic, 0, 3, 3 > &F)
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic, 0, 3, 3 > AMIPS3drest_gradient(const RowVectorNd &p, const double t, const int el_id, const Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic, 0, 3, 3 > &F)
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic, 0, 3, 3 > AMIPS2d_gradient(const RowVectorNd &p, const double t, const int el_id, const Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic, 0, 3, 3 > &F)
Definition AMIPS2d.hpp:7
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic, 0, 9, 9 > AMIPS3d_hessian(const RowVectorNd &p, const double t, const int el_id, const Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic, 0, 3, 3 > &F)
Definition AMIPS3d.hpp:54
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic, 0, 9, 9 > AMIPS3drest_hessian(const RowVectorNd &p, const double t, const int el_id, const Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic, 0, 3, 3 > &F)
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic, 0, 9, 9 > AMIPS2drest_hessian(const RowVectorNd &p, const double t, const int el_id, const Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic, 0, 3, 3 > &F)
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic, 0, 9, 9 > AMIPS2d_hessian(const RowVectorNd &p, const double t, const int el_id, const Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic, 0, 3, 3 > &F)
Definition AMIPS2d.hpp:30
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic, 0, 3, 3 > AMIPS3d_gradient(const RowVectorNd &p, const double t, const int el_id, const Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic, 0, 3, 3 > &F)
Definition AMIPS3d.hpp:7
T determinant(const Eigen::Matrix< T, rows, cols, option, maxRow, maxCol > &mat)
nlohmann::json json
Definition Common.hpp:9
Eigen::Matrix< double, 1, Eigen::Dynamic, Eigen::RowMajor, 1, 3 > RowVectorNd
Definition Types.hpp:13