29 class ElasticForm : public Form
31 friend class ElasticForceDerivative;
36 ElasticForm(
const int n_bases,
37 std::vector<basis::ElementBases> &bases,
38 const std::vector<basis::ElementBases> &geom_bases,
39 const assembler::Assembler &assembler,
40 assembler::AssemblyValsCache &ass_vals_cache,
41 const double t,
const double dt,
43 const double jacobian_threshold = 0.,
46 std::string name()
const override {
return "elastic"; }
52 virtual double value_unweighted(
const Eigen::VectorXd &
x)
const override;
57 Eigen::VectorXd value_per_element_unweighted(
const Eigen::VectorXd &
x)
const override;
62 virtual void first_derivative_unweighted(
const Eigen::VectorXd &
x, Eigen::VectorXd &gradv)
const override;
67 void second_derivative_unweighted(
const Eigen::VectorXd &
x,
StiffnessMatrix &hessian)
const override;
74 bool is_step_valid(
const Eigen::VectorXd &x0,
const Eigen::VectorXd &x1)
const override;
78 bool is_step_collision_free(
const Eigen::VectorXd &x0,
const Eigen::VectorXd &x1)
const override;
83 void update_quantities(
const double t,
const Eigen::VectorXd &
x)
override
93 double max_step_size(
const Eigen::VectorXd &x0,
const Eigen::VectorXd &x1)
const override;
97 void solution_changed(
const Eigen::VectorXd &new_x)
override;
100 void finish()
override;
104 std::vector<basis::ElementBases> &bases_;
105 const std::vector<basis::ElementBases> &geom_bases_;
107 const assembler::Assembler &assembler_;
108 assembler::AssemblyValsCache &ass_vals_cache_;
110 const double jacobian_threshold_;
113 const bool is_volume_;
116 mutable std::unique_ptr<utils::MatrixCache> mat_cache_;
119 void compute_cached_stiffness();
121 Eigen::VectorXd x_prev_;
123 mutable std::vector<utils::Tree> quadrature_hierarchy_;
124 int quadrature_order_;
NLOHMANN_JSON_SERIALIZE_ENUM(CollisionProxyTessellation, {{CollisionProxyTessellation::REGULAR, "regular"}, {CollisionProxyTessellation::IRREGULAR, "irregular"}})
Eigen::SparseMatrix< double, Eigen::ColMajor > StiffnessMatrix