20 : varforms_(std::move(varforms)),
21 diff_caches_(std::move(diff_caches)),
22 parametrization_(std::move(parametrizations))
30 if (varform->primary_space().basis_list().size() !=
elem_num_)
51 if (varform.get() == &target)
78 Eigen::VectorXd term, cur_term;
79 for (
int i = 0; i < int(
varforms_.size()); ++i)
84 if (varform->get_problem().is_time_dependent())
96 if (term.size() != cur_term.size())
119 auto params_map = varform.primary_assembler().parameters();
122 auto search_lambda = params_map.find(
"lambda");
123 auto search_mu = params_map.find(
"mu");
124 if (search_lambda == params_map.end() || search_mu == params_map.end())
129 int dim = varform.get_mesh().dimension();
135 if (!varform.get_mesh().is_volume())
137 auto mesh2d =
dynamic_cast<const mesh::Mesh2D *
>(&varform.get_mesh());
142 auto mesh3d =
dynamic_cast<const mesh::Mesh3D *
>(&varform.get_mesh());
147 lambdas(e) = search_lambda->second(RowVectorNd::Zero(dim), barycenter, 0.0f, e);
148 mus(e) = search_mu->second(RowVectorNd::Zero(dim), barycenter, 0.0f, e);
152 params << lambdas, mus;
RowVectorNd face_barycenter(const int index) const override
face barycenter
virtual RowVectorNd cell_barycenter(const int c) const =0
cell barycenter
Eigen::VectorXd apply_jacobian(const Eigen::VectorXd &grad_full, const Eigen::VectorXd &x) const override
Apply jacobian for chain rule.
Eigen::VectorXd inverse_eval(const Eigen::VectorXd &y) const override
Eval x = f^-1 (y).
int inverse_size(int y_size) const override
Compute DOF of x given DOF of y.
Eigen::VectorXd eval(const Eigen::VectorXd &x) const override
Eval y = f(x).
void update_state_variables(const Eigen::VectorXd &x, Eigen::VectorXd &state_variables) const override
Update varform variables from optimization variables.
Eigen::VectorXd inverse_eval() const override
Compute optimization variables from forward simulation varform::DifferentiableVarForm.
ParameterType parameter_type() const override
std::string name() const override
Eigen::VectorXd compute_adjoint_term(const Eigen::VectorXd &x) const override
Compute adjoint contribution of objective gradient.
void update(const Eigen::VectorXd &x) override
Update forward simulation varforms from optimization variables.
CompositeParametrization parametrization_
Eigen::VectorXd apply_parametrization_jacobian(const Eigen::VectorXd &term, const Eigen::VectorXd &x) const override
Apply parametrization jacobian to compute the gradient w.r.t.
int inverse_dof() const override
Compute optimization variables dof.
DiffCachePtrs diff_caches_
std::vector< std::shared_ptr< varform::DifferentiableVarForm > > VarFormPtrs
std::vector< std::shared_ptr< DiffCache > > DiffCachePtrs
ElasticVariableToSimulation(VarFormPtrs varforms, DiffCachePtrs diff_caches, CompositeParametrization parametrizations)
Construct ElasticVariableToSimulation.
bool affects_varform(const varform::DifferentiableVarForm &target) const override
Return true if current var2sim maps to target varform.
void log_and_throw_adjoint_error(const std::string &msg)
Eigen::MatrixXd get_adjoint_mat(const varform::DifferentiableVarForm &varform, const DiffCache &diff_cache, int type)
Get adjoint parameter nu or p.
Eigen::Matrix< double, 1, Eigen::Dynamic, Eigen::RowMajor, 1, 3 > RowVectorNd