PolyFEM
Loading...
Searching...
No Matches
DampingVariableToSimulation.cpp
Go to the documentation of this file.
2
3#include <polyfem/Common.hpp>
8
9#include <Eigen/Core>
10
11#include <cassert>
12#include <string>
13
14namespace polyfem::solver
15{
16
18 DiffCachePtrs diff_caches,
19 CompositeParametrization parametrizations)
20 : varforms_(std::move(varforms)),
21 diff_caches_(std::move(diff_caches)),
22 parametrization_(std::move(parametrizations))
23 {
24 assert(!varforms_.empty());
25 assert(varforms_.size() == diff_caches_.size());
26
27 for (auto &varform : varforms_)
28 {
29 if (!varform->get_problem().is_time_dependent())
30 {
31 log_and_throw_adjoint_error("Fail to construct damping variable to simulation. Reason: Can't optimize damping for static problem.");
32 }
33 }
34 }
35
37 {
38 return "damping";
39 }
40
45
47 {
48 for (const auto &varform : varforms_)
49 {
50 if (varform.get() == &target)
51 {
52 return true;
53 }
54 }
55 return false;
56 }
57
58 void DampingVariableToSimulation::update(const Eigen::VectorXd &x)
59 {
60 Eigen::VectorXd y = parametrization_.eval(x);
61 assert(y.size() == para_out_dof());
62
63 double psi = y(0);
64 double phi = y(1);
65
66 for (auto &varform : varforms_)
67 {
68 varform->set_damping_coefficients(psi, phi);
69 }
70 }
71
72 void DampingVariableToSimulation::update_state_variables(const Eigen::VectorXd &x, Eigen::VectorXd &state_variables) const
73 {
74 assert(state_variables.size() == para_out_dof());
75 state_variables = parametrization_.eval(x);
76 }
77
78 Eigen::VectorXd DampingVariableToSimulation::compute_adjoint_term(const Eigen::VectorXd &x) const
79 {
80 Eigen::VectorXd term, cur_term;
81 for (int i = 0; i < int(varforms_.size()); ++i)
82 {
83 auto &varform = varforms_[i];
84 auto &diff_cache = diff_caches_[i];
85
86 assert(varform->get_problem().is_time_dependent());
87 Eigen::MatrixXd adjoint_p = get_adjoint_mat(*varform, *diff_cache, 0);
88 Eigen::MatrixXd adjoint_nu = get_adjoint_mat(*varform, *diff_cache, 1);
89 AdjointTools::dJ_damping_transient_adjoint_term(*varform, *diff_cache, adjoint_nu, adjoint_p, cur_term);
90
91 if (term.size() != cur_term.size())
92 {
93 term = cur_term;
94 }
95 else
96 {
97 term += cur_term;
98 }
99 }
100
101 assert(term.size() == para_out_dof());
102 return parametrization_.apply_jacobian(term, x);
103 }
104
109
111 {
112 Eigen::VectorXd y(para_out_dof());
113 json material = varforms_[0]->get_args()["materials"];
114 if (material.is_array())
115 {
116 material = material[0];
117 }
118
119 y(0) = material["psi"].get<double>();
120 y(1) = material["phi"].get<double>();
122 }
123
124 Eigen::VectorXd DampingVariableToSimulation::apply_parametrization_jacobian(const Eigen::VectorXd &, const Eigen::VectorXd &) const
125 {
126 // Not implemented because there's no user
127 log_and_throw_adjoint_error("apply_parametrization_jacobian is not implemented in {} variable to simulation.", name());
128 }
129
131 {
132 return 2;
133 }
134
135} // namespace polyfem::solver
int y
int x
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::VectorXd inverse_eval() const override
Compute optimization variables from forward simulation varform::DifferentiableVarForm.
int inverse_dof() const override
Compute optimization variables dof.
std::vector< std::shared_ptr< varform::DifferentiableVarForm > > VarFormPtrs
DampingVariableToSimulation(VarFormPtrs varforms, DiffCachePtrs diff_caches, CompositeParametrization parametrizations)
Construct DampingVariableToSimulation.
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.
void update(const Eigen::VectorXd &x) override
Update forward simulation varforms from optimization variables.
void update_state_variables(const Eigen::VectorXd &x, Eigen::VectorXd &state_variables) const override
Update varform variables from optimization variables.
std::vector< std::shared_ptr< DiffCache > > DiffCachePtrs
Eigen::VectorXd compute_adjoint_term(const Eigen::VectorXd &x) const override
Compute adjoint contribution of objective gradient.
bool affects_varform(const varform::DifferentiableVarForm &target) const override
Return true if current var2sim maps to target varform.
Optimization-facing interface implemented by differentiated VarForm adapters.
void dJ_damping_transient_adjoint_term(const varform::DifferentiableVarForm &varform, const DiffCache &diff_cache, const Eigen::MatrixXd &adjoint_nu, const Eigen::MatrixXd &adjoint_p, Eigen::VectorXd &one_form)
nlohmann::json json
Definition Common.hpp:9
void log_and_throw_adjoint_error(const std::string &msg)
Definition Logger.cpp:79
Eigen::MatrixXd get_adjoint_mat(const varform::DifferentiableVarForm &varform, const DiffCache &diff_cache, int type)
Get adjoint parameter nu or p.