Loading [MathJax]/extensions/tex2jax.js
PolyFEM
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
SpatialIntegralForms.hpp
Go to the documentation of this file.
1#pragma once
2
3#include "AdjointForm.hpp"
4
6#include <polyfem/State.hpp>
7
8namespace polyfem::solver
9{
11 {
12 public:
13 SpatialIntegralForm(const VariableToSimulationGroup &variable_to_simulations, const State &state, const json &args) : StaticForm(variable_to_simulations), state_(state)
14 {
15 }
16
17 std::string name() const override { return "spatial_integral"; }
18
19 const State &get_state() { return state_; }
20
22
23 Eigen::VectorXd compute_adjoint_rhs_step(const int time_step, const Eigen::VectorXd &x, const State &state) const override;
24 double value_unweighted_step(const int time_step, const Eigen::VectorXd &x) const override;
25 void compute_partial_gradient_step(const int time_step, const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override;
26
27 protected:
29
30 const State &state_;
32 std::set<int> ids_;
33 };
34
36 {
37 public:
38 ElasticEnergyForm(const VariableToSimulationGroup &variable_to_simulations, const State &state, const json &args) : SpatialIntegralForm(variable_to_simulations, state, args)
39 {
41
42 auto tmp_ids = args["volume_selection"].get<std::vector<int>>();
43 ids_ = std::set(tmp_ids.begin(), tmp_ids.end());
44 }
45
46 std::string name() const override { return "elastic_energy"; }
47
48 void compute_partial_gradient_step(const int time_step, const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override;
49
50 protected:
52 };
53
55 {
56 public:
57 StressNormForm(const VariableToSimulationGroup &variable_to_simulations, const State &state, const json &args) : SpatialIntegralForm(variable_to_simulations, state, args)
58 {
60
61 auto tmp_ids = args["volume_selection"].get<std::vector<int>>();
62 ids_ = std::set(tmp_ids.begin(), tmp_ids.end());
63
64 if (args["power"] > 0)
65 in_power_ = args["power"];
66 }
67
68 std::string name() const override { return "stress_norm"; }
69
70 void compute_partial_gradient_step(const int time_step, const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override;
71
72 protected:
74
75 private:
76 int in_power_ = 2;
77 };
78
80 {
81 public:
82 DirichletEnergyForm(const VariableToSimulationGroup &variable_to_simulations, const State &state, const json &args) : SpatialIntegralForm(variable_to_simulations, state, args)
83
84 {
85 std::string formulation = state.formulation();
86 if (!(formulation == "Laplacian" || formulation == "Electrostatics"))
87 log_and_throw_adjoint_error("DirichletEnergyForm can only be used with Laplacian or Electrostatics problems!");
88
90
91 auto tmp_ids = args["volume_selection"].get<std::vector<int>>();
92 ids_ = std::set(tmp_ids.begin(), tmp_ids.end());
93 }
94
95 std::string name() const override { return "dirichlet_energy"; }
96
97 void compute_partial_gradient_step(const int time_step, const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override;
98
99 protected:
101 };
102
104 {
105 public:
106 ComplianceForm(const VariableToSimulationGroup &variable_to_simulations, const State &state, const json &args) : SpatialIntegralForm(variable_to_simulations, state, args)
107 {
109
110 auto tmp_ids = args["volume_selection"].get<std::vector<int>>();
111 ids_ = std::set(tmp_ids.begin(), tmp_ids.end());
112 }
113
114 std::string name() const override { return "compliance"; }
115
116 void compute_partial_gradient_step(const int time_step, const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override;
117
118 protected:
120 };
121
123 {
124 public:
125 PositionForm(const VariableToSimulationGroup &variable_to_simulations, const State &state, const json &args) : SpatialIntegralForm(variable_to_simulations, state, args)
126 {
128
129 auto tmp_ids = args["volume_selection"].get<std::vector<int>>();
130 ids_ = std::set(tmp_ids.begin(), tmp_ids.end());
131
132 set_dim(args["dim"]);
133 }
134
135 void set_dim(const int dim) { dim_ = dim; }
136
137 protected:
139
140 private:
141 int dim_ = 0;
142 };
143
145 {
146 public:
147 AccelerationForm(const VariableToSimulationGroup &variable_to_simulations, const State &state, const json &args) : SpatialIntegralForm(variable_to_simulations, state, args)
148 {
150
151 auto tmp_ids = args["volume_selection"].get<std::vector<int>>();
152 ids_ = std::set(tmp_ids.begin(), tmp_ids.end());
153
154 set_dim(args["dim"].get<int>());
155 }
156
157 void set_dim(const int dim) { dim_ = dim; }
158
159 protected:
161
162 private:
163 int dim_ = 0;
164 };
165
167 {
168 public:
169 KineticForm(const VariableToSimulationGroup &variable_to_simulations, const State &state, const json &args) : SpatialIntegralForm(variable_to_simulations, state, args)
170 {
172
173 auto tmp_ids = args["volume_selection"].get<std::vector<int>>();
174 ids_ = std::set(tmp_ids.begin(), tmp_ids.end());
175 }
176
177 protected:
179 };
180
182 {
183 public:
184 StressForm(const VariableToSimulationGroup &variable_to_simulations, const State &state, const json &args) : SpatialIntegralForm(variable_to_simulations, state, args)
185 {
187
188 auto tmp_ids = args["volume_selection"].get<std::vector<int>>();
189 ids_ = std::set(tmp_ids.begin(), tmp_ids.end());
190
191 dimensions_ = args["dimensions"].get<std::vector<int>>();
192 }
193
194 std::string name() const override { return "stress"; }
195
196 void compute_partial_gradient_step(const int time_step, const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override;
197
198 protected:
200
201 std::vector<int> dimensions_;
202 };
203
205 {
206 public:
207 VolumeForm(const VariableToSimulationGroup &variable_to_simulations, const State &state, const json &args) : SpatialIntegralForm(variable_to_simulations, state, args)
208 {
210
211 auto tmp_ids = args["volume_selection"].get<std::vector<int>>();
212 ids_ = std::set(tmp_ids.begin(), tmp_ids.end());
213 }
214
215 protected:
217 };
218} // namespace polyfem::solver
int x
main class that contains the polyfem solver and all its state
Definition State.hpp:79
std::string formulation() const
return the formulation (checks if the problem is scalar or not and deals with multiphysics)
Definition State.cpp:328
AccelerationForm(const VariableToSimulationGroup &variable_to_simulations, const State &state, const json &args)
IntegrableFunctional get_integral_functional() const override
IntegrableFunctional get_integral_functional() const override
ComplianceForm(const VariableToSimulationGroup &variable_to_simulations, const State &state, 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, const State &state, 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
IntegrableFunctional get_integral_functional() const override
ElasticEnergyForm(const VariableToSimulationGroup &variable_to_simulations, const State &state, const json &args)
KineticForm(const VariableToSimulationGroup &variable_to_simulations, const State &state, const json &args)
IntegrableFunctional get_integral_functional() const override
PositionForm(const VariableToSimulationGroup &variable_to_simulations, const State &state, const json &args)
IntegrableFunctional get_integral_functional() const override
void set_integral_type(const SpatialIntegralType type)
Eigen::VectorXd compute_adjoint_rhs_step(const int time_step, const Eigen::VectorXd &x, const State &state) 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
SpatialIntegralForm(const VariableToSimulationGroup &variable_to_simulations, const State &state, 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
StressForm(const VariableToSimulationGroup &variable_to_simulations, const State &state, const json &args)
StressNormForm(const VariableToSimulationGroup &variable_to_simulations, const State &state, 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, const State &state, const json &args)
nlohmann::json json
Definition Common.hpp:9
void log_and_throw_adjoint_error(const std::string &msg)
Definition Logger.cpp:79