PolyFEM
Loading...
Searching...
No Matches
MacroStrainALForm.cpp
Go to the documentation of this file.
3
4namespace polyfem::solver
5{
7 : macro_strain_constraint_(macro_strain_constraint)
8 {
9 }
10
11 double MacroStrainALForm::value_unweighted(const Eigen::VectorXd &x) const
12 {
13 const Eigen::VectorXi indices_ = macro_strain_constraint_.get_fixed_entry().array() + (x.size() - macro_strain_constraint_.dim() * macro_strain_constraint_.dim());
14 return (x(indices_) - values).squaredNorm() / 2.0;
15 }
16
17 void MacroStrainALForm::first_derivative_unweighted(const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const
18 {
19 const Eigen::VectorXi indices = macro_strain_constraint_.get_fixed_entry().array() + (x.size() - macro_strain_constraint_.dim() * macro_strain_constraint_.dim());
20 gradv.setZero(x.size());
21 gradv(indices) = x(indices) - values;
22 }
23
24 void MacroStrainALForm::second_derivative_unweighted(const Eigen::VectorXd &x, StiffnessMatrix &hessian) const
25 {
26 const Eigen::VectorXi indices = macro_strain_constraint_.get_fixed_entry().array() + (x.size() - macro_strain_constraint_.dim() * macro_strain_constraint_.dim());
27 hessian.resize(x.size(), x.size());
28 hessian.setZero();
29 for (int i = 0; i < indices.size(); i++)
30 hessian.coeffRef(indices(i), indices(i)) += 1;
31 }
32
33 void MacroStrainALForm::update_quantities(const double t, const Eigen::VectorXd &)
34 {
37 }
38
39 double MacroStrainALForm::compute_error(const Eigen::VectorXd &x) const
40 {
41 const Eigen::VectorXi indices = macro_strain_constraint_.get_fixed_entry().array() + (x.size() - macro_strain_constraint_.dim() * macro_strain_constraint_.dim());
42 return (x(indices).array() - values.array()).matrix().squaredNorm();
43 }
44}
int x
Eigen::MatrixXd eval(const double t) const
const Eigen::VectorXi & get_fixed_entry() const
const assembler::MacroStrainValue & macro_strain_constraint_
MacroStrainALForm(const assembler::MacroStrainValue &macro_strain_constraint)
void second_derivative_unweighted(const Eigen::VectorXd &x, StiffnessMatrix &hessian) const override
Compute the second derivative of the value wrt x.
double compute_error(const Eigen::VectorXd &x) const
void first_derivative_unweighted(const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override
Compute the first derivative of the value wrt x.
void update_quantities(const double t, const Eigen::VectorXd &x) override
Update time-dependent fields.
double value_unweighted(const Eigen::VectorXd &x) const override
Compute the contact barrier potential value.
Eigen::VectorXd flatten(const Eigen::MatrixXd &X)
Flatten rowwises.
Eigen::SparseMatrix< double, Eigen::ColMajor > StiffnessMatrix
Definition Types.hpp:20