PolyFEM
Loading...
Searching...
No Matches
GenericFiber.hpp
Go to the documentation of this file.
1#pragma once
2
5
6namespace polyfem::assembler
7{
8 template <typename FiberModel>
9 class GenericFiber : public GenericElastic<FiberModel>
10 {
11 public:
13 virtual ~GenericFiber() = default;
14
15 // sets material params
16 virtual void add_multimaterial(const int index, const json &params, const Units &units) override;
17 virtual void set_size(const int size) override;
18
19 std::map<std::string, Assembler::ParamFunc> parameters() const override;
20
21 protected:
22 template <typename T>
23 T I4Bar(const RowVectorNd &p,
24 const double t,
25 const int el_id,
26 const DefGradMatrix<T> &def_grad) const
27 {
28 return I4Bar_generic(p, t, el_id, def_grad, false, true);
29 }
30 template <typename T>
32 const double t,
33 const int el_id,
34 const DefGradMatrix<T> &def_grad) const
35 {
36 return I4Bar_generic(p, t, el_id, def_grad, true, true);
37 }
38
39 template <typename T>
41 const double t,
42 const int el_id,
43 const DefGradMatrix<T> &def_grad,
44 const bool normalize,
45 const bool isocoric) const
46 {
47 const T J = polyfem::utils::determinant(def_grad);
48 const T powJ = isocoric ? (this->size() == 2 ? J : pow(J, 2.0 / 3.0)) : T(1);
49 const auto Cbar = (def_grad.transpose() * def_grad / powJ).eval();
50
51 auto a_tmp = fiber_direction_(p, p, t, el_id);
52 assert((a_tmp.rows() == this->size() && a_tmp.cols() == 1) || (a_tmp.rows() == this->size() && a_tmp.cols() == this->size()));
53 const bool is_a_vector = a_tmp.cols() == 1;
54
55 if (normalize)
56 {
57 if (is_a_vector)
58 a_tmp.normalize();
59 else
60 a_tmp /= a_tmp.trace();
61 }
62
63 const int d = a_tmp.rows();
64 if (is_a_vector)
65 {
66 // compute a^T * Cbar * a
67 T res = T(0);
68 for (int i = 0; i < d; ++i)
69 for (int j = 0; j < d; ++j)
70 res += T(a_tmp(i)) * Cbar(i, j) * T(a_tmp(j));
71
72 return res;
73 }
74 else
75 {
76 // compute trace(Cbar * a)
77 T res = T(0);
78 for (int i = 0; i < d; ++i)
79 for (int j = 0; j < d; ++j)
80 res += Cbar(i, j) * T(a_tmp(j, i));
81 return res;
82 }
83
84 // Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic, 0, 3, 3> a(a_tmp.rows(), a_tmp.cols());
85 // for (int i = 0; i < a.rows(); ++i)
86 // for (int j = 0; j < a.cols(); ++j)
87 // a(i, j) = T(a_tmp(i, j));
88
89 // const T tmp = is_a_vector ? (a.transpose() * Cbar * a)(0, 0) : (Cbar * a).trace();
90 // // assert(tmp.rows() == 1 && tmp.cols() == 1);
91 // return tmp;
92 }
93
95 };
96} // namespace polyfem::assembler
virtual void add_multimaterial(const int index, const json &params, const Units &units) override
T I4Bar_generic(const RowVectorNd &p, const double t, const int el_id, const DefGradMatrix< T > &def_grad, const bool normalize, const bool isocoric) const
T I4Bar(const RowVectorNd &p, const double t, const int el_id, const DefGradMatrix< T > &def_grad) const
virtual void set_size(const int size) override
T I4Bar_with_norm(const RowVectorNd &p, const double t, const int el_id, const DefGradMatrix< T > &def_grad) const
std::map< std::string, Assembler::ParamFunc > parameters() const override
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