PolyFEM
Loading...
Searching...
No Matches
AMIPSEnergy.hpp
Go to the documentation of this file.
1#pragma once
2
7
8#include <polyfem/Common.hpp>
9
10#include <Eigen/Dense>
11
12#include <functional>
13#include <iostream>
14#include <vector>
15
16namespace polyfem::assembler
17{
18 class AMIPSEnergy : public GenericElastic<AMIPSEnergy>
19 {
20 public:
22
23 // sets material params
24 void add_multimaterial(const int index, const json &params, const Units &units) override;
25
26 std::string name() const override { return "AMIPS"; }
27 std::map<std::string, ParamFunc> parameters() const override;
28
29 template <typename T>
31 const RowVectorNd &p,
32 const double t,
33 const int el_id,
34 const DefGradMatrix<T> &def_grad) const
35 {
36 using std::pow;
37 using MatrixNT = Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic, 0, 3, 3>;
38
39 MatrixNT F = MatrixNT::Zero(size(), size());
40 for (int i = 0; i < size(); ++i)
41 {
42 for (int j = 0; j < size(); ++j)
43 {
44 for (int k = 0; k < size(); ++k)
45 {
46 F(i, j) += def_grad(i, k) * canonical_transformation_[el_id](k, j);
47 }
48 }
49 }
50
51 const T J = polyfem::utils::determinant(F);
52 return (F.transpose() * F).trace() / pow(J, 2. / size());
53 }
54
55 private:
56 std::vector<Eigen::MatrixXd> canonical_transformation_;
57 };
58} // namespace polyfem::assembler
std::string name() const override
std::vector< Eigen::MatrixXd > canonical_transformation_
void add_multimaterial(const int index, const json &params, const Units &units) override
std::map< std::string, ParamFunc > parameters() const override
T elastic_energy(const RowVectorNd &p, const double t, const int el_id, const DefGradMatrix< T > &def_grad) const
Used for test only.
Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic, 0, 3, 3 > DefGradMatrix
T determinant(const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic, 0, 3, 3 > &mat)
nlohmann::json json
Definition Common.hpp:9
Eigen::Matrix< double, 1, Eigen::Dynamic, Eigen::RowMajor, 1, 3 > RowVectorNd
Definition Types.hpp:11