PolyFEM
Loading...
Searching...
No Matches
VariableToSimulation.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <polyfem/Common.hpp>
8
9#include <Eigen/Core>
10
11#include <cassert>
12#include <functional>
13#include <memory>
14#include <string>
15#include <utility>
16#include <vector>
17
18namespace polyfem::solver
19{
22 {
23 public:
24 VariableToSimulation(std::vector<std::shared_ptr<State>> states,
25 std::vector<std::shared_ptr<DiffCache>> diff_caches,
27 diff_caches(std::move(diff_caches)),
29 {
30 assert(this->states.size() > 0);
31 }
32
33 virtual ~VariableToSimulation() = default;
34
35 inline virtual void update(const Eigen::VectorXd &x)
36 {
38 }
39
40 virtual std::string name() const = 0;
41
42 virtual ParameterType get_parameter_type() const = 0;
43 virtual Eigen::VectorXd compute_adjoint_term(const Eigen::VectorXd &x) const = 0;
44 virtual Eigen::VectorXd inverse_eval();
45
46 virtual void set_output_indexing(const json &args);
47 Eigen::VectorXi get_output_indexing(const Eigen::VectorXd &x) const;
48
49 virtual Eigen::VectorXd apply_parametrization_jacobian(const Eigen::VectorXd &term, const Eigen::VectorXd &x) const;
50
51 const std::vector<std::shared_ptr<State>> states;
52 const std::vector<std::shared_ptr<DiffCache>> diff_caches;
54
55 protected:
56 virtual void update_state(const Eigen::VectorXd &state_variable, const Eigen::VectorXi &indices);
57
58 Eigen::VectorXi output_indexing_; // if a derived class overrides apply_parametrization_jacobian(term, x), this is not necessarily used.
59 };
60
63 {
64 public:
65 virtual ~VariableToSimulationGroup() = default;
66
69 inline void update(const Eigen::VectorXd &x)
70 {
71 for (auto &v2s : data)
72 v2s->update(x);
73 }
74
78 void compute_state_variable(const ParameterType type, const State *state_ptr, const Eigen::VectorXd &x, Eigen::VectorXd &state_variable) const;
79
83 Eigen::VectorXd compute_adjoint_term(const Eigen::VectorXd &x) const;
84
91 virtual Eigen::VectorXd apply_parametrization_jacobian(const ParameterType type, const State *state_ptr, const Eigen::VectorXd &x, const std::function<Eigen::VectorXd()> &grad) const;
92
93 std::vector<std::shared_ptr<VariableToSimulation>> data;
94 };
95
96 // state variable dof = dim * n_vertices
98 {
99 public:
102
103 std::string name() const override { return "shape"; }
104
106
107 Eigen::VectorXd compute_adjoint_term(const Eigen::VectorXd &x) const override;
108 Eigen::VectorXd inverse_eval() override;
109
110 void set_output_indexing(const json &args) override;
111
112 protected:
113 virtual void update_state(const Eigen::VectorXd &state_variable, const Eigen::VectorXi &indices) override;
114 };
115
116 // To optimize per element elastic parameters
117 // state variable dof = 2 * n_elements
119 {
120 public:
123
124 std::string name() const override { return "elastic"; }
125
127
128 Eigen::VectorXd compute_adjoint_term(const Eigen::VectorXd &x) const override;
129 Eigen::VectorXd inverse_eval() override;
130
131 protected:
132 void update_state(const Eigen::VectorXd &state_variable, const Eigen::VectorXi &indices) override;
133 };
134
135 // To optimize the friction constant
136 // state variable dof = 1
138 {
139 public:
142
143 std::string name() const override { return "friction"; }
144
146
147 Eigen::VectorXd compute_adjoint_term(const Eigen::VectorXd &x) const override;
148 Eigen::VectorXd inverse_eval() override;
149
150 protected:
151 void update_state(const Eigen::VectorXd &state_variable, const Eigen::VectorXi &indices) override;
152 };
153
154 // To optimize the damping constant psi and phi
155 // state variable dof = 2
157 {
158 public:
161
162 std::string name() const override { return "damping"; }
163
165
166 Eigen::VectorXd compute_adjoint_term(const Eigen::VectorXd &x) const override;
167 Eigen::VectorXd inverse_eval() override;
168
169 protected:
170 void update_state(const Eigen::VectorXd &state_variable, const Eigen::VectorXi &indices) override;
171 };
172
173 // To optimize the per node initial condition
174 // state variable dof = dim * n_bases
176 {
177 public:
180
181 std::string name() const override { return "initial"; }
182
184
185 Eigen::VectorXd compute_adjoint_term(const Eigen::VectorXd &x) const override;
186 Eigen::VectorXd inverse_eval() override;
187
188 protected:
189 void update_state(const Eigen::VectorXd &state_variable, const Eigen::VectorXi &indices) override;
190 };
191
192 // To optimize the per node Dirichlet values, only work in transient simulations
193 // state variable dof = dim * n_time_steps * n_dirichlet_nodes
195 {
196 public:
199
200 std::string name() const override { return "dirichlet"; }
201
202 void set_dirichlet_boundaries(const std::vector<int> &dirichlet_boundaries)
203 {
204 dirichlet_boundaries_ = dirichlet_boundaries;
205 }
206
208
209 Eigen::VectorXd compute_adjoint_term(const Eigen::VectorXd &x) const override;
210 Eigen::VectorXd inverse_eval() override;
211
212 void set_output_indexing(const json &args) override;
213
214 protected:
215 void update_state(const Eigen::VectorXd &state_variable, const Eigen::VectorXi &indices) override;
216
217 private:
218 std::string variable_to_string(const Eigen::VectorXd &variable);
219
220 std::vector<int> dirichlet_boundaries_;
221 };
222
224 {
225 public:
228
229 std::string name() const override { return "dirichlet-nodes"; }
230
231 void set_dirichlet_nodes(const Eigen::VectorXi &dirichlet_nodes)
232 {
233 dirichlet_nodes_ = dirichlet_nodes;
234 }
235
237
238 Eigen::VectorXd compute_adjoint_term(const Eigen::VectorXd &x) const override;
239 Eigen::VectorXd inverse_eval() override;
240
241 void set_output_indexing(const json &args) override;
242
243 protected:
244 void update_state(const Eigen::VectorXd &state_variable, const Eigen::VectorXi &indices) override;
245
246 private:
247 std::string variable_to_string(const Eigen::VectorXd &variable);
248
249 Eigen::VectorXi dirichlet_nodes_;
250 };
251
252 // To optimize the per node pressure boundaries
253 // Each pressure boundary will have the same value
254 // state variable dof = dim * n_time_steps
256 {
257 public:
260
261 std::string name() const override { return "pressure"; }
262
263 void set_pressure_boundaries(const std::vector<int> &pressure_boundaries)
264 {
265 pressure_boundaries_ = pressure_boundaries;
266 }
267
269
270 Eigen::VectorXd compute_adjoint_term(const Eigen::VectorXd &x) const override;
271 Eigen::VectorXd inverse_eval() override;
272
273 void set_output_indexing(const json &args) override;
274
275 protected:
276 void update_state(const Eigen::VectorXd &state_variable, const Eigen::VectorXi &indices) override;
277
278 private:
279 std::string variable_to_string(const Eigen::VectorXd &variable);
280
281 std::vector<int> pressure_boundaries_;
282 };
283
284 // state variable dof = dim * n_vertices - periodic dof
286 {
287 public:
290
291 std::string name() const override { return "periodic-shape"; }
292
294
295 Eigen::VectorXd compute_adjoint_term(const Eigen::VectorXd &x) const override;
296 Eigen::VectorXd inverse_eval() override;
297
298 void update(const Eigen::VectorXd &x) override;
299
300 Eigen::VectorXd apply_parametrization_jacobian(const Eigen::VectorXd &term, const Eigen::VectorXd &x) const override;
301
302 protected:
303 std::unique_ptr<PeriodicMeshToMesh> periodic_mesh_map;
305 };
306} // namespace polyfem::solver
int x
main class that contains the polyfem solver and all its state
Definition State.hpp:113
Eigen::VectorXd eval(const Eigen::VectorXd &x) const override
Eval y = f(x).
Eigen::VectorXd compute_adjoint_term(const Eigen::VectorXd &x) const override
void update_state(const Eigen::VectorXd &state_variable, const Eigen::VectorXi &indices) override
void update_state(const Eigen::VectorXd &state_variable, const Eigen::VectorXi &indices) override
void set_dirichlet_nodes(const Eigen::VectorXi &dirichlet_nodes)
std::string variable_to_string(const Eigen::VectorXd &variable)
Eigen::VectorXd compute_adjoint_term(const Eigen::VectorXd &x) const override
Eigen::VectorXd compute_adjoint_term(const Eigen::VectorXd &x) const override
std::string variable_to_string(const Eigen::VectorXd &variable)
void update_state(const Eigen::VectorXd &state_variable, const Eigen::VectorXi &indices) override
void set_dirichlet_boundaries(const std::vector< int > &dirichlet_boundaries)
Eigen::VectorXd compute_adjoint_term(const Eigen::VectorXd &x) const override
void update_state(const Eigen::VectorXd &state_variable, const Eigen::VectorXi &indices) override
Eigen::VectorXd compute_adjoint_term(const Eigen::VectorXd &x) const override
void update_state(const Eigen::VectorXd &state_variable, const Eigen::VectorXi &indices) override
Eigen::VectorXd compute_adjoint_term(const Eigen::VectorXd &x) const override
void update_state(const Eigen::VectorXd &state_variable, const Eigen::VectorXi &indices) override
Eigen::VectorXd compute_adjoint_term(const Eigen::VectorXd &x) const override
Eigen::VectorXd apply_parametrization_jacobian(const Eigen::VectorXd &term, const Eigen::VectorXd &x) const override
std::unique_ptr< PeriodicMeshToMesh > periodic_mesh_map
void set_pressure_boundaries(const std::vector< int > &pressure_boundaries)
std::string variable_to_string(const Eigen::VectorXd &variable)
void update_state(const Eigen::VectorXd &state_variable, const Eigen::VectorXi &indices) override
Eigen::VectorXd compute_adjoint_term(const Eigen::VectorXd &x) const override
virtual void update_state(const Eigen::VectorXd &state_variable, const Eigen::VectorXi &indices) override
void set_output_indexing(const json &args) override
Eigen::VectorXd compute_adjoint_term(const Eigen::VectorXd &x) const override
ParameterType get_parameter_type() const override
A collection of VariableToSimulation.
void compute_state_variable(const ParameterType type, const State *state_ptr, const Eigen::VectorXd &x, Eigen::VectorXd &state_variable) const
Evaluate the variable to simulations and overwrite the state_variable based on x.
Eigen::VectorXd compute_adjoint_term(const Eigen::VectorXd &x) const
Computes the sum of adjoint terms for all VariableToSimulation.
virtual Eigen::VectorXd apply_parametrization_jacobian(const ParameterType type, const State *state_ptr, const Eigen::VectorXd &x, const std::function< Eigen::VectorXd()> &grad) const
Maps the partial gradient wrt.
void update(const Eigen::VectorXd &x)
Update parameters in simulators.
std::vector< std::shared_ptr< VariableToSimulation > > data
Maps the optimization variable to the state variable.
virtual Eigen::VectorXd apply_parametrization_jacobian(const Eigen::VectorXd &term, const Eigen::VectorXd &x) const
const std::vector< std::shared_ptr< DiffCache > > diff_caches
virtual ParameterType get_parameter_type() const =0
VariableToSimulation(std::vector< std::shared_ptr< State > > states, std::vector< std::shared_ptr< DiffCache > > diff_caches, CompositeParametrization parametrization)
virtual Eigen::VectorXd compute_adjoint_term(const Eigen::VectorXd &x) const =0
virtual void update_state(const Eigen::VectorXd &state_variable, const Eigen::VectorXi &indices)
virtual void set_output_indexing(const json &args)
const std::vector< std::shared_ptr< State > > states
virtual void update(const Eigen::VectorXd &x)
virtual std::string name() const =0
Eigen::VectorXi get_output_indexing(const Eigen::VectorXd &x) const
nlohmann::json json
Definition Common.hpp:9