20 Eigen::VectorXi active_dimensions,
21 Eigen::VectorXi active_geom_nodes)
22 : dim_(varforms[0]->get_mesh().dimension()),
23 vertex_num_(varforms[0]->get_mesh().n_vertices()),
24 varforms_(std::move(varforms)),
25 diff_caches_(std::move(diff_caches)),
26 parametrization_(std::move(parametrizations)),
27 active_dimensions_(std::move(active_dimensions)),
28 active_geom_nodes_(std::move(active_geom_nodes))
69 if (varform.get() == &target)
85 Eigen::MatrixXd vertices;
86 varform->get_vertices(vertices);
93 vertices(node_id, d) =
y(ni * active_dim_num + di);
96 varform->set_vertex_positions(vertices);
114 state_variables(vertex_id *
dim_ + d) =
y(ni * active_dim_num + di);
121 Eigen::VectorXd term, cur_term;
122 for (
int i = 0; i <
varforms_.size(); ++i)
127 if (varform->get_problem().is_time_dependent())
130 Eigen::MatrixXd adjoint_nu =
get_adjoint_mat(*varform, *diff_cache, 1);
133 else if (varform->is_homogenization())
152 if (term.size() != cur_term.size())
172 active_term(i * active_dim_num + di) = term(vertex_id *
dim_ + d);
195 x(i * active_dim_num + di) = p(d);
215 active_term(i * active_dim_num + di) = term(vertex_id *
dim_ + d);
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).
Eigen::VectorXi active_geom_nodes_
bool affects_varform(const varform::DifferentiableVarForm &target) const override
Return true if current var2sim maps to target varform.
ParameterType parameter_type() const override
void update_state_variables(const Eigen::VectorXd &x, Eigen::VectorXd &state_variables) const override
Update varform variables from optimization variables.
ShapeVariableToSimulation(VarFormPtrs varforms, DiffCachePtrs diff_caches, CompositeParametrization parametrizations, Eigen::VectorXi active_dimensions, Eigen::VectorXi active_geom_nodes)
Construct ShapeVariableToSimulation.
std::vector< std::shared_ptr< varform::DifferentiableVarForm > > VarFormPtrs
int inverse_dof() const override
Compute optimization variables dof.
std::vector< std::shared_ptr< DiffCache > > DiffCachePtrs
Eigen::VectorXd compute_adjoint_term(const Eigen::VectorXd &x) const override
Compute adjoint contribution of objective gradient.
Eigen::VectorXi active_dimensions_
Eigen::VectorXd inverse_eval() const override
Compute optimization variables from forward simulation varform::DifferentiableVarForm.
CompositeParametrization parametrization_
int para_out_dof() const
Return variable dof after parametrization mapping.
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.
std::string name() const override
DiffCachePtrs diff_caches_
void update(const Eigen::VectorXd &x) override
Update forward simulation varforms from optimization variables.
bool is_active_dims_valid(const Eigen::VectorXi &active_dimensions, const std::vector< std::shared_ptr< varform::DifferentiableVarForm > > &varforms, std::string &reason)
Validate active dimensions selection given varforms.
bool is_active_geom_nodes_valid(const Eigen::VectorXi &active_geom_nodes, const std::vector< std::shared_ptr< varform::DifferentiableVarForm > > &varforms, std::string &reason)
Validate active geometry nodes selection given varforms.
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.