PolyFEM
Loading...
Searching...
No Matches
FrictionVariableToSimulation.cpp
Go to the documentation of this file.
2
7
8#include <Eigen/Core>
9
10#include <string>
11#include <cassert>
12
13namespace polyfem::solver
14{
15
17 DiffCachePtrs diff_caches,
18 CompositeParametrization parametrizations)
19 : states_(std::move(states)),
20 diff_caches_(std::move(diff_caches)),
21 parametrization_(std::move(parametrizations))
22 {
23 assert(!states_.empty());
24 assert(states_.size() == diff_caches_.size());
25
26 for (auto &s : states_)
27 {
28 if (!s->problem->is_time_dependent())
29 {
30 log_and_throw_adjoint_error("Fail to construct friction variable to simulation. Reason: Can't optimize friction for static problem.");
31 }
32 }
33 }
34
36 {
37 return "friction";
38 }
39
44
46 {
47 for (const auto &s : states_)
48 {
49 if (s.get() == &target)
50 {
51 return true;
52 }
53 }
54 return false;
55 }
56
57 void FrictionVariableToSimulation::update(const Eigen::VectorXd &x)
58 {
59 Eigen::VectorXd y = parametrization_.eval(x);
60 assert(y.size() == para_out_dof());
61
62 for (auto &s : states_)
63 {
64 s->args["contact"]["friction_coefficient"] = y(0);
65 }
66 }
67
68 void FrictionVariableToSimulation::update_state_variables(const Eigen::VectorXd &x, Eigen::VectorXd &state_variables) const
69 {
70 assert(state_variables.size() == para_out_dof());
71 state_variables = parametrization_.eval(x);
72 }
73
74 Eigen::VectorXd FrictionVariableToSimulation::compute_adjoint_term(const Eigen::VectorXd &x) const
75 {
76 Eigen::VectorXd term, cur_term;
77 for (int i = 0; i < int(states_.size()); ++i)
78 {
79 auto &state = states_[i];
80 auto &diff_cache = diff_caches_[i];
81
82 assert(state->problem->is_time_dependent());
83 Eigen::MatrixXd adjoint_p = get_adjoint_mat(*state, *diff_cache, 0);
84 Eigen::MatrixXd adjoint_nu = get_adjoint_mat(*state, *diff_cache, 1);
85 AdjointTools::dJ_friction_transient_adjoint_term(*state, *diff_cache, adjoint_nu, adjoint_p, cur_term);
86
87 if (term.size() != cur_term.size())
88 {
89 term = cur_term;
90 }
91 else
92 {
93 term += cur_term;
94 }
95 }
96
97 assert(term.size() == para_out_dof());
98 return parametrization_.apply_jacobian(term, x);
99 }
100
105
107 {
108 Eigen::VectorXd y(para_out_dof());
109 y(0) = states_[0]->args["contact"]["friction_coefficient"].get<double>();
111 }
112
113 Eigen::VectorXd FrictionVariableToSimulation::apply_parametrization_jacobian(const Eigen::VectorXd &, const Eigen::VectorXd &) const
114 {
115 // Not implemented because there's no user
116 log_and_throw_adjoint_error("apply_parametrization_jacobian is not implemented in {} variable to simulation.", name());
117 }
118
120 {
121 return 1;
122 }
123
124} // namespace polyfem::solver
int y
int x
main class that contains the polyfem solver and all its state
Definition State.hpp:114
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).
std::vector< std::shared_ptr< DiffCache > > DiffCachePtrs
Eigen::VectorXd compute_adjoint_term(const Eigen::VectorXd &x) const override
Compute adjoint contribution of objective gradient.
FrictionVariableToSimulation(StatePtrs states, DiffCachePtrs diff_caches, CompositeParametrization parametrizations)
Construct FrictionVariableToSimulation.
Eigen::VectorXd inverse_eval() const override
Compute optimization variables from forward simulation legacy::State.
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.
bool affect_state(const legacy::State &target) const override
Return true if current var2sim maps to target state.
int inverse_dof() const override
Compute optimization variables dof.
void update(const Eigen::VectorXd &x) override
Update forward simulation states from optimization variables.
std::vector< std::shared_ptr< legacy::State > > StatePtrs
void update_state_variables(const Eigen::VectorXd &x, Eigen::VectorXd &state_variables) const override
Update state variables from optimization variables.
void dJ_friction_transient_adjoint_term(const legacy::State &state, const DiffCache &diff_cache, const Eigen::MatrixXd &adjoint_nu, const Eigen::MatrixXd &adjoint_p, Eigen::VectorXd &one_form)
void log_and_throw_adjoint_error(const std::string &msg)
Definition Logger.cpp:79
Eigen::MatrixXd get_adjoint_mat(const legacy::State &state, const DiffCache &diff_cache, int type)
Get adjoint parameter nu or p.