31 class ElasticForm : public Form
33 friend class ElasticForceDerivative;
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,
45 const double jacobian_threshold = 0.,
47 const unsigned conservative_max_iter = 100000);
49 std::string name()
const override {
return "elastic"; }
55 virtual double value_unweighted(
const Eigen::VectorXd &
x)
const override;
60 Eigen::VectorXd value_per_element_unweighted(
const Eigen::VectorXd &
x)
const override;
65 virtual void first_derivative_unweighted(
const Eigen::VectorXd &
x, Eigen::VectorXd &gradv)
const override;
70 void second_derivative_unweighted(
const Eigen::VectorXd &
x,
StiffnessMatrix &hessian)
const override;
77 bool is_step_valid(
const Eigen::VectorXd &x0,
const Eigen::VectorXd &x1)
const override;
81 bool is_step_collision_free(
const Eigen::VectorXd &x0,
const Eigen::VectorXd &x1)
const override;
86 void update_quantities(
const double t,
const Eigen::VectorXd &
x)
override
96 double max_step_size(
const Eigen::VectorXd &x0,
const Eigen::VectorXd &x1)
const override;
99 void finish()
override;
103 void post_step(
const polysolve::nonlinear::PostStepData &data)
override;
107 std::vector<basis::ElementBases> &bases_;
108 const std::vector<basis::ElementBases> &geom_bases_;
110 const assembler::Assembler &assembler_;
111 assembler::AssemblyValsCache &ass_vals_cache_;
113 const double jacobian_threshold_;
115 const unsigned conservative_max_iter_;
117 const bool is_volume_;
120 mutable std::unique_ptr<utils::MatrixCache> mat_cache_;
123 void compute_cached_stiffness();
132 void commit_refinement(
const int id, utils::Tree &subdivision_tree)
const;
134 Eigen::VectorXd x_prev_;
136 mutable std::vector<utils::Tree> quadrature_hierarchy_;
137 int quadrature_order_;
142 mutable std::optional<std::pair<int, utils::Tree>> pending_refinement_;
NLOHMANN_JSON_SERIALIZE_ENUM(CollisionProxyTessellation, {{CollisionProxyTessellation::REGULAR, "regular"}, {CollisionProxyTessellation::IRREGULAR, "irregular"}})
Eigen::SparseMatrix< double, Eigen::ColMajor > StiffnessMatrix