PolyFEM
Loading...
Searching...
No Matches
SpatialIntegralForms.hpp
Go to the documentation of this file.
1#pragma once
2
4#include <polyfem/Common.hpp>
9
10#include <Eigen/Core>
11
12#include <set>
13#include <string>
14#include <vector>
15#include <memory>
16#include <utility>
17
18namespace polyfem::solver
19{
21 {
22 public:
23 SpatialIntegralForm(const VariableToSimulationGroup &variable_to_simulations, std::shared_ptr<const legacy::State> state, std::shared_ptr<const DiffCache> diff_cache, const json &args)
24 : StaticForm(variable_to_simulations), state_(std::move(state)), diff_cache_(std::move(diff_cache))
25 {
26 }
27
28 std::string name() const override { return "spatial_integral"; }
29
30 Eigen::VectorXd compute_adjoint_rhs_step(const int time_step, const Eigen::VectorXd &x, const legacy::State &state, const DiffCache &diff_cache) const override;
31 double value_unweighted_step(const int time_step, const Eigen::VectorXd &x) const override;
32 void compute_partial_gradient_step(const int time_step, const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override;
33
34 protected:
36
38
39 std::shared_ptr<const legacy::State> state_;
40 std::shared_ptr<const DiffCache> diff_cache_;
42 std::set<int> ids_;
43 };
44
46 {
47 public:
48 ElasticEnergyForm(const VariableToSimulationGroup &variable_to_simulations, std::shared_ptr<const legacy::State> state, std::shared_ptr<const DiffCache> diff_cache, const json &args)
49 : SpatialIntegralForm(variable_to_simulations, std::move(state), std::move(diff_cache), args)
50 {
52
53 auto tmp_ids = args["volume_selection"].get<std::vector<int>>();
54 ids_ = std::set(tmp_ids.begin(), tmp_ids.end());
55 }
56
57 std::string name() const override { return "elastic_energy"; }
58
59 void compute_partial_gradient_step(const int time_step, const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override;
60
61 protected:
63 };
64
66 {
67 public:
68 StressNormForm(const VariableToSimulationGroup &variable_to_simulations, std::shared_ptr<const legacy::State> state, std::shared_ptr<const DiffCache> diff_cache, const json &args)
69 : SpatialIntegralForm(variable_to_simulations, std::move(state), std::move(diff_cache), args)
70 {
72
73 auto tmp_ids = args["volume_selection"].get<std::vector<int>>();
74 ids_ = std::set(tmp_ids.begin(), tmp_ids.end());
75
76 if (args["power"] > 0)
77 in_power_ = args["power"];
78 }
79
80 std::string name() const override { return "stress_norm"; }
81
82 void compute_partial_gradient_step(const int time_step, const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override;
83
84 protected:
86
87 private:
88 int in_power_ = 2;
89 };
90
92 {
93 public:
94 DirichletEnergyForm(const VariableToSimulationGroup &variable_to_simulations, std::shared_ptr<const legacy::State> state, std::shared_ptr<const DiffCache> diff_cache, const json &args)
95 : SpatialIntegralForm(variable_to_simulations, std::move(state), std::move(diff_cache), args)
96
97 {
98 std::string formulation = state_->formulation();
99 if (!(formulation == "Laplacian" || formulation == "Electrostatics"))
100 log_and_throw_adjoint_error("DirichletEnergyForm can only be used with Laplacian or Electrostatics problems!");
101
103
104 auto tmp_ids = args["volume_selection"].get<std::vector<int>>();
105 ids_ = std::set(tmp_ids.begin(), tmp_ids.end());
106 }
107
108 std::string name() const override { return "dirichlet_energy"; }
109
110 void compute_partial_gradient_step(const int time_step, const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override;
111
112 protected:
114 };
115
117 {
118 public:
119 ComplianceForm(const VariableToSimulationGroup &variable_to_simulations, std::shared_ptr<const legacy::State> state, std::shared_ptr<const DiffCache> diff_cache, const json &args)
120 : SpatialIntegralForm(variable_to_simulations, std::move(state), std::move(diff_cache), args)
121 {
123
124 auto tmp_ids = args["volume_selection"].get<std::vector<int>>();
125 ids_ = std::set(tmp_ids.begin(), tmp_ids.end());
126 }
127
128 std::string name() const override { return "compliance"; }
129
130 void compute_partial_gradient_step(const int time_step, const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override;
131
132 protected:
134 };
135
137 {
138 public:
139 PositionForm(const VariableToSimulationGroup &variable_to_simulations, std::shared_ptr<const legacy::State> state, std::shared_ptr<const DiffCache> diff_cache, const json &args)
140 : SpatialIntegralForm(variable_to_simulations, std::move(state), std::move(diff_cache), args)
141 {
143
144 auto tmp_ids = args["volume_selection"].get<std::vector<int>>();
145 ids_ = std::set(tmp_ids.begin(), tmp_ids.end());
146
147 set_dim(args["dim"]);
148 }
149
150 void set_dim(const int dim) { dim_ = dim; }
151
152 protected:
154
155 private:
156 int dim_ = 0;
157 };
158
160 {
161 public:
162 AccelerationForm(const VariableToSimulationGroup &variable_to_simulations, std::shared_ptr<const legacy::State> state, std::shared_ptr<const DiffCache> diff_cache, const json &args)
163 : SpatialIntegralForm(variable_to_simulations, std::move(state), std::move(diff_cache), args)
164 {
166
167 auto tmp_ids = args["volume_selection"].get<std::vector<int>>();
168 ids_ = std::set(tmp_ids.begin(), tmp_ids.end());
169
170 set_dim(args["dim"].get<int>());
171 }
172
173 void set_dim(const int dim) { dim_ = dim; }
174
175 protected:
177
178 private:
179 int dim_ = 0;
180 };
181
183 {
184 public:
185 KineticForm(const VariableToSimulationGroup &variable_to_simulations, std::shared_ptr<const legacy::State> state, std::shared_ptr<const DiffCache> diff_cache, const json &args)
186 : SpatialIntegralForm(variable_to_simulations, std::move(state), std::move(diff_cache), args)
187 {
189
190 auto tmp_ids = args["volume_selection"].get<std::vector<int>>();
191 ids_ = std::set(tmp_ids.begin(), tmp_ids.end());
192 }
193
194 protected:
196 };
197
199 {
200 public:
201 StressForm(const VariableToSimulationGroup &variable_to_simulations, std::shared_ptr<const legacy::State> state, std::shared_ptr<const DiffCache> diff_cache, const json &args)
202 : SpatialIntegralForm(variable_to_simulations, std::move(state), std::move(diff_cache), args)
203 {
205
206 auto tmp_ids = args["volume_selection"].get<std::vector<int>>();
207 ids_ = std::set(tmp_ids.begin(), tmp_ids.end());
208
209 dimensions_ = args["dimensions"].get<std::vector<int>>();
210 }
211
212 std::string name() const override { return "stress"; }
213
214 void compute_partial_gradient_step(const int time_step, const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override;
215
216 protected:
218
219 std::vector<int> dimensions_;
220 };
221
223 {
224 public:
225 VolumeForm(const VariableToSimulationGroup &variable_to_simulations, std::shared_ptr<const legacy::State> state, std::shared_ptr<const DiffCache> diff_cache, const json &args)
226 : SpatialIntegralForm(variable_to_simulations, std::move(state), std::move(diff_cache), args)
227 {
229
230 auto tmp_ids = args["volume_selection"].get<std::vector<int>>();
231 ids_ = std::set(tmp_ids.begin(), tmp_ids.end());
232 }
233
234 protected:
236 };
237} // 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:114
AccelerationForm(const VariableToSimulationGroup &variable_to_simulations, std::shared_ptr< const legacy::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 legacy::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 legacy::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 legacy::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 legacy::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 legacy::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 legacy::State > state_
SpatialIntegralForm(const VariableToSimulationGroup &variable_to_simulations, std::shared_ptr< const legacy::State > state, std::shared_ptr< const DiffCache > diff_cache, const json &args)
Eigen::VectorXd compute_adjoint_rhs_step(const int time_step, const Eigen::VectorXd &x, const legacy::State &state, const DiffCache &diff_cache) const override
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_
void compute_partial_gradient_step(const int time_step, const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override
StressForm(const VariableToSimulationGroup &variable_to_simulations, std::shared_ptr< const legacy::State > state, std::shared_ptr< const DiffCache > diff_cache, const json &args)
IntegrableFunctional get_integral_functional() const override
std::string name() const override
StressNormForm(const VariableToSimulationGroup &variable_to_simulations, std::shared_ptr< const legacy::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
VolumeForm(const VariableToSimulationGroup &variable_to_simulations, std::shared_ptr< const legacy::State > state, std::shared_ptr< const DiffCache > diff_cache, const json &args)
IntegrableFunctional get_integral_functional() const override
nlohmann::json json
Definition Common.hpp:9
void log_and_throw_adjoint_error(const std::string &msg)
Definition Logger.cpp:79