PolyFEM
Loading...
Searching...
No Matches
SpatialIntegralForms.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <polyfem/State.hpp>
4#include <polyfem/Common.hpp>
8
9#include <Eigen/Core>
10
11#include <set>
12#include <string>
13#include <vector>
14#include <memory>
15#include <utility>
16
17namespace polyfem::solver
18{
20 {
21 public:
22 SpatialIntegralForm(const VariableToSimulationGroup &variable_to_simulations, std::shared_ptr<const State> state, std::shared_ptr<const DiffCache> diff_cache, const json &args)
23 : StaticForm(variable_to_simulations), state_(std::move(state)), diff_cache_(std::move(diff_cache))
24 {
25 }
26
27 std::string name() const override { return "spatial_integral"; }
28
29 Eigen::VectorXd compute_adjoint_rhs_step(const int time_step, const Eigen::VectorXd &x, const State &state, const DiffCache &diff_cache) const override;
30 double value_unweighted_step(const int time_step, const Eigen::VectorXd &x) const override;
31 void compute_partial_gradient_step(const int time_step, const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override;
32
33 protected:
35
37
38 std::shared_ptr<const State> state_;
39 std::shared_ptr<const DiffCache> diff_cache_;
41 std::set<int> ids_;
42 };
43
45 {
46 public:
47 ElasticEnergyForm(const VariableToSimulationGroup &variable_to_simulations, std::shared_ptr<const State> state, std::shared_ptr<const DiffCache> diff_cache, const json &args)
48 : SpatialIntegralForm(variable_to_simulations, std::move(state), std::move(diff_cache), args)
49 {
51
52 auto tmp_ids = args["volume_selection"].get<std::vector<int>>();
53 ids_ = std::set(tmp_ids.begin(), tmp_ids.end());
54 }
55
56 std::string name() const override { return "elastic_energy"; }
57
58 void compute_partial_gradient_step(const int time_step, const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override;
59
60 protected:
62 };
63
65 {
66 public:
67 StressNormForm(const VariableToSimulationGroup &variable_to_simulations, std::shared_ptr<const State> state, std::shared_ptr<const DiffCache> diff_cache, const json &args)
68 : SpatialIntegralForm(variable_to_simulations, std::move(state), std::move(diff_cache), args)
69 {
71
72 auto tmp_ids = args["volume_selection"].get<std::vector<int>>();
73 ids_ = std::set(tmp_ids.begin(), tmp_ids.end());
74
75 if (args["power"] > 0)
76 in_power_ = args["power"];
77 }
78
79 std::string name() const override { return "stress_norm"; }
80
81 void compute_partial_gradient_step(const int time_step, const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override;
82
83 protected:
85
86 private:
87 int in_power_ = 2;
88 };
89
91 {
92 public:
93 DirichletEnergyForm(const VariableToSimulationGroup &variable_to_simulations, std::shared_ptr<const State> state, std::shared_ptr<const DiffCache> diff_cache, const json &args)
94 : SpatialIntegralForm(variable_to_simulations, std::move(state), std::move(diff_cache), args)
95
96 {
97 std::string formulation = state_->formulation();
98 if (!(formulation == "Laplacian" || formulation == "Electrostatics"))
99 log_and_throw_adjoint_error("DirichletEnergyForm can only be used with Laplacian or Electrostatics problems!");
100
102
103 auto tmp_ids = args["volume_selection"].get<std::vector<int>>();
104 ids_ = std::set(tmp_ids.begin(), tmp_ids.end());
105 }
106
107 std::string name() const override { return "dirichlet_energy"; }
108
109 void compute_partial_gradient_step(const int time_step, const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override;
110
111 protected:
113 };
114
116 {
117 public:
118 ComplianceForm(const VariableToSimulationGroup &variable_to_simulations, std::shared_ptr<const State> state, std::shared_ptr<const DiffCache> diff_cache, const json &args)
119 : SpatialIntegralForm(variable_to_simulations, std::move(state), std::move(diff_cache), args)
120 {
122
123 auto tmp_ids = args["volume_selection"].get<std::vector<int>>();
124 ids_ = std::set(tmp_ids.begin(), tmp_ids.end());
125 }
126
127 std::string name() const override { return "compliance"; }
128
129 void compute_partial_gradient_step(const int time_step, const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override;
130
131 protected:
133 };
134
136 {
137 public:
138 PositionForm(const VariableToSimulationGroup &variable_to_simulations, std::shared_ptr<const State> state, std::shared_ptr<const DiffCache> diff_cache, const json &args)
139 : SpatialIntegralForm(variable_to_simulations, std::move(state), std::move(diff_cache), args)
140 {
142
143 auto tmp_ids = args["volume_selection"].get<std::vector<int>>();
144 ids_ = std::set(tmp_ids.begin(), tmp_ids.end());
145
146 set_dim(args["dim"]);
147 }
148
149 void set_dim(const int dim) { dim_ = dim; }
150
151 protected:
153
154 private:
155 int dim_ = 0;
156 };
157
159 {
160 public:
161 AccelerationForm(const VariableToSimulationGroup &variable_to_simulations, std::shared_ptr<const State> state, std::shared_ptr<const DiffCache> diff_cache, const json &args)
162 : SpatialIntegralForm(variable_to_simulations, std::move(state), std::move(diff_cache), args)
163 {
165
166 auto tmp_ids = args["volume_selection"].get<std::vector<int>>();
167 ids_ = std::set(tmp_ids.begin(), tmp_ids.end());
168
169 set_dim(args["dim"].get<int>());
170 }
171
172 void set_dim(const int dim) { dim_ = dim; }
173
174 protected:
176
177 private:
178 int dim_ = 0;
179 };
180
182 {
183 public:
184 KineticForm(const VariableToSimulationGroup &variable_to_simulations, std::shared_ptr<const State> state, std::shared_ptr<const DiffCache> diff_cache, const json &args)
185 : SpatialIntegralForm(variable_to_simulations, std::move(state), std::move(diff_cache), args)
186 {
188
189 auto tmp_ids = args["volume_selection"].get<std::vector<int>>();
190 ids_ = std::set(tmp_ids.begin(), tmp_ids.end());
191 }
192
193 protected:
195 };
196
198 {
199 public:
200 StressForm(const VariableToSimulationGroup &variable_to_simulations, std::shared_ptr<const State> state, std::shared_ptr<const DiffCache> diff_cache, const json &args)
201 : SpatialIntegralForm(variable_to_simulations, std::move(state), std::move(diff_cache), args)
202 {
204
205 auto tmp_ids = args["volume_selection"].get<std::vector<int>>();
206 ids_ = std::set(tmp_ids.begin(), tmp_ids.end());
207
208 dimensions_ = args["dimensions"].get<std::vector<int>>();
209 }
210
211 std::string name() const override { return "stress"; }
212
213 void compute_partial_gradient_step(const int time_step, const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override;
214
215 protected:
217
218 std::vector<int> dimensions_;
219 };
220
222 {
223 public:
224 VolumeForm(const VariableToSimulationGroup &variable_to_simulations, std::shared_ptr<const State> state, std::shared_ptr<const DiffCache> diff_cache, const json &args)
225 : SpatialIntegralForm(variable_to_simulations, std::move(state), std::move(diff_cache), args)
226 {
228
229 auto tmp_ids = args["volume_selection"].get<std::vector<int>>();
230 ids_ = std::set(tmp_ids.begin(), tmp_ids.end());
231 }
232
233 protected:
235 };
236} // namespace polyfem::solver
int x
Storage for additional data required by differntial code.
Definition DiffCache.hpp:21
main class that contains the polyfem solver and all its state
Definition State.hpp:113
AccelerationForm(const VariableToSimulationGroup &variable_to_simulations, std::shared_ptr< const State > state, std::shared_ptr< const DiffCache > diff_cache, const json &args)
IntegrableFunctional get_integral_functional() const override
IntegrableFunctional get_integral_functional() const override
ComplianceForm(const VariableToSimulationGroup &variable_to_simulations, std::shared_ptr< const State > state, std::shared_ptr< const DiffCache > diff_cache, const json &args)
std::string name() const override
void compute_partial_gradient_step(const int time_step, const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override
DirichletEnergyForm(const VariableToSimulationGroup &variable_to_simulations, std::shared_ptr< const State > state, std::shared_ptr< const DiffCache > diff_cache, const json &args)
void compute_partial_gradient_step(const int time_step, const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override
IntegrableFunctional get_integral_functional() const override
void compute_partial_gradient_step(const int time_step, const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override
ElasticEnergyForm(const VariableToSimulationGroup &variable_to_simulations, std::shared_ptr< const State > state, std::shared_ptr< const DiffCache > diff_cache, const json &args)
IntegrableFunctional get_integral_functional() const override
KineticForm(const VariableToSimulationGroup &variable_to_simulations, std::shared_ptr< const State > state, std::shared_ptr< const DiffCache > diff_cache, const json &args)
IntegrableFunctional get_integral_functional() const override
PositionForm(const VariableToSimulationGroup &variable_to_simulations, std::shared_ptr< const State > state, std::shared_ptr< const DiffCache > diff_cache, const json &args)
IntegrableFunctional get_integral_functional() const override
void set_integral_type(const SpatialIntegralType type)
std::shared_ptr< const State > state_
SpatialIntegralForm(const VariableToSimulationGroup &variable_to_simulations, std::shared_ptr< const State > state, std::shared_ptr< const DiffCache > diff_cache, const json &args)
double value_unweighted_step(const int time_step, const Eigen::VectorXd &x) const override
virtual IntegrableFunctional get_integral_functional() const =0
void compute_partial_gradient_step(const int time_step, const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override
std::shared_ptr< const DiffCache > diff_cache_
Eigen::VectorXd compute_adjoint_rhs_step(const int time_step, const Eigen::VectorXd &x, const State &state, const DiffCache &diff_cache) const override
StressForm(const VariableToSimulationGroup &variable_to_simulations, std::shared_ptr< const State > state, std::shared_ptr< const DiffCache > diff_cache, const json &args)
void compute_partial_gradient_step(const int time_step, const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override
IntegrableFunctional get_integral_functional() const override
std::string name() const override
StressNormForm(const VariableToSimulationGroup &variable_to_simulations, std::shared_ptr< const State > state, std::shared_ptr< const DiffCache > diff_cache, const json &args)
std::string name() const override
IntegrableFunctional get_integral_functional() const override
void compute_partial_gradient_step(const int time_step, const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override
A collection of VariableToSimulation.
IntegrableFunctional get_integral_functional() const override
VolumeForm(const VariableToSimulationGroup &variable_to_simulations, std::shared_ptr< const State > state, std::shared_ptr< const DiffCache > diff_cache, const json &args)
nlohmann::json json
Definition Common.hpp:9
void log_and_throw_adjoint_error(const std::string &msg)
Definition Logger.cpp:79