PolyFEM
Loading...
Searching...
No Matches
IsochoricNeoHookean.hpp
Go to the documentation of this file.
1#pragma once
2
5
6namespace polyfem::assembler
7{
8 class IsochoricNeoHookean : public GenericElastic<IsochoricNeoHookean>
9 {
10 public:
12
13 // sets material params
14 void add_multimaterial(const int index, const json &params, const Units &units) override;
15
16 std::string name() const override { return "IsochoricNeoHookean"; }
17 std::map<std::string, ParamFunc> parameters() const override;
18
19 template <typename T>
21 const RowVectorNd &p,
22 const double t,
23 const int el_id,
24 const DefGradMatrix<T> &def_grad) const
25 {
26 double lambda, mu;
27 params_.lambda_mu(p, p, t, el_id, lambda, mu);
28
29 const T J = polyfem::utils::determinant(def_grad);
30 const auto Cbar = (def_grad.transpose() * def_grad / pow(J, 2.0 / 3.0)).eval();
31 const T I1_bar = Cbar.trace();
32
33 // Isochoric NK strain energy: Psi_iso = mu/2 * (I1_bar - 3)
34 return (mu / 2.0) * (I1_bar - T(3.0));
35 }
36
37 private:
39 };
40} // namespace polyfem::assembler
void add_multimaterial(const int index, const json &params, const Units &units) override
T elastic_energy(const RowVectorNd &p, const double t, const int el_id, const DefGradMatrix< T > &def_grad) const
std::map< std::string, ParamFunc > parameters() const override
void lambda_mu(double px, double py, double pz, double x, double y, double z, double t, int el_id, double &lambda, double &mu) const
Used for test only.
Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic, 0, 3, 3 > DefGradMatrix
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