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 protected:
20 template <typename T>
21 T I4Bar(const RowVectorNd &p,
22 const double t,
23 const int el_id,
24 const DefGradMatrix<T> &def_grad) const
25 {
26 const T J = polyfem::utils::determinant(def_grad);
27 const auto Cbar = (def_grad.transpose() * def_grad / pow(J, 2.0 / 3.0)).eval();
28
29 const auto a_tmp = fiber_direction_(p, p, t, el_id);
30 assert(a_tmp.rows() == this->size() && a_tmp.cols() == 1);
31 Eigen::Matrix<T, Eigen::Dynamic, 1, 0, 3, 1> a(a_tmp.rows(), a_tmp.cols());
32 for (int i = 0; i < a.size(); ++i)
33 a(i) = T(a_tmp(i));
34
35 const Eigen::Matrix<T, 1, 1> tmp = a.transpose() * Cbar * a;
36 assert(tmp.rows() == 1 && tmp.cols() == 1);
37 return tmp(0, 0);
38 }
39
41 };
42} // namespace polyfem::assembler
virtual void add_multimaterial(const int index, const json &params, const Units &units) override
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
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