21 class ElasticForm : public Form
26 ElasticForm(
const int n_bases,
27 std::vector<basis::ElementBases> &bases,
28 const std::vector<basis::ElementBases> &geom_bases,
29 const assembler::Assembler &assembler,
30 assembler::AssemblyValsCache &ass_vals_cache,
31 const double t,
const double dt,
33 const double jacobian_threshold = 0.,
36 std::string name()
const override {
return "elastic"; }
42 virtual double value_unweighted(
const Eigen::VectorXd &
x)
const override;
47 Eigen::VectorXd value_per_element_unweighted(
const Eigen::VectorXd &
x)
const override;
52 virtual void first_derivative_unweighted(
const Eigen::VectorXd &
x, Eigen::VectorXd &gradv)
const override;
57 void second_derivative_unweighted(
const Eigen::VectorXd &
x,
StiffnessMatrix &hessian)
const override;
64 bool is_step_valid(
const Eigen::VectorXd &x0,
const Eigen::VectorXd &x1)
const override;
68 bool is_step_collision_free(
const Eigen::VectorXd &x0,
const Eigen::VectorXd &x1)
const override;
73 void update_quantities(
const double t,
const Eigen::VectorXd &
x)
override
83 double max_step_size(
const Eigen::VectorXd &x0,
const Eigen::VectorXd &x1)
const override;
87 void solution_changed(
const Eigen::VectorXd &new_x)
override;
94 void force_material_derivative(
const double t,
const Eigen::MatrixXd &
x,
const Eigen::MatrixXd &x_prev,
const Eigen::MatrixXd &adjoint, Eigen::VectorXd &term);
102 void force_shape_derivative(
const double t,
const int n_verts,
const Eigen::MatrixXd &
x,
const Eigen::MatrixXd &x_prev,
const Eigen::MatrixXd &adjoint, Eigen::VectorXd &term);
105 void finish()
override;
109 std::vector<basis::ElementBases> &bases_;
110 const std::vector<basis::ElementBases> &geom_bases_;
112 const assembler::Assembler &assembler_;
113 assembler::AssemblyValsCache &ass_vals_cache_;
115 const double jacobian_threshold_;
118 const bool is_volume_;
121 mutable std::unique_ptr<utils::MatrixCache> mat_cache_;
124 void compute_cached_stiffness();
126 Eigen::VectorXd x_prev_;
128 mutable std::vector<utils::Tree> quadrature_hierarchy_;
129 int quadrature_order_;
NLOHMANN_JSON_SERIALIZE_ENUM(CollisionProxyTessellation, {{CollisionProxyTessellation::REGULAR, "regular"}, {CollisionProxyTessellation::IRREGULAR, "irregular"}})
Eigen::SparseMatrix< double, Eigen::ColMajor > StiffnessMatrix