PolyFEM
Loading...
Searching...
No Matches
ElasticForm.hpp
Go to the documentation of this file.
1#pragma once
2
3#include "Form.hpp"
4
8
12
13#include <memory>
14#include <optional>
15#include <utility>
16#include <vector>
17
18namespace polyfem::solver
19{
21 {
24 };
28 {ElementInversionCheck::Conservative, "Conservative"}})
29
31 class ElasticForm : public Form
32 {
33 friend class ElasticForceDerivative;
34
35 public:
38 ElasticForm(const int n_bases,
39 std::vector<basis::ElementBases> &bases,
40 const std::vector<basis::ElementBases> &geom_bases,
41 const assembler::Assembler &assembler,
42 assembler::AssemblyValsCache &ass_vals_cache,
43 const double t, const double dt,
44 const bool is_volume,
45 const double jacobian_threshold = 0.,
47 const unsigned conservative_max_iter = 100000);
48
49 std::string name() const override { return "elastic"; }
50
51 protected:
55 virtual double value_unweighted(const Eigen::VectorXd &x) const override;
56
60 Eigen::VectorXd value_per_element_unweighted(const Eigen::VectorXd &x) const override;
61
65 virtual void first_derivative_unweighted(const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override;
66
70 void second_derivative_unweighted(const Eigen::VectorXd &x, StiffnessMatrix &hessian) const override;
71
72 public:
77 bool is_step_valid(const Eigen::VectorXd &x0, const Eigen::VectorXd &x1) const override;
78
81 bool is_step_collision_free(const Eigen::VectorXd &x0, const Eigen::VectorXd &x1) const override;
82
86 void update_quantities(const double t, const Eigen::VectorXd &x) override
87 {
88 t_ = t;
89 x_prev_ = x;
90 }
91
96 double max_step_size(const Eigen::VectorXd &x0, const Eigen::VectorXd &x1) const override;
97
99 void finish() override;
100
103 void post_step(const polysolve::nonlinear::PostStepData &data) override;
104
105 private:
106 const int n_bases_;
107 std::vector<basis::ElementBases> &bases_;
108 const std::vector<basis::ElementBases> &geom_bases_;
109
110 const assembler::Assembler &assembler_;
111 assembler::AssemblyValsCache &ass_vals_cache_;
112 double t_;
113 const double jacobian_threshold_;
114 const ElementInversionCheck check_inversion_;
115 const unsigned conservative_max_iter_;
116 const double dt_;
117 const bool is_volume_;
118
119 StiffnessMatrix cached_stiffness_;
120 mutable std::unique_ptr<utils::MatrixCache> mat_cache_;
121
123 void compute_cached_stiffness();
124
132 void commit_refinement(const int id, utils::Tree &subdivision_tree) const;
133
134 Eigen::VectorXd x_prev_;
135
136 mutable std::vector<utils::Tree> quadrature_hierarchy_;
137 int quadrature_order_;
138
142 mutable std::optional<std::pair<int, utils::Tree>> pending_refinement_;
143 };
144} // namespace polyfem::solver
int x
NLOHMANN_JSON_SERIALIZE_ENUM(CollisionProxyTessellation, {{CollisionProxyTessellation::REGULAR, "regular"}, {CollisionProxyTessellation::IRREGULAR, "irregular"}})
Eigen::SparseMatrix< double, Eigen::ColMajor > StiffnessMatrix
Definition Types.hpp:24