PolyFEM
Loading...
Searching...
No Matches
VarForm.hpp
Go to the documentation of this file.
1#pragma once
2
18
19#include <Eigen/Dense>
20
21#include <functional>
22#include <cassert>
23#include <iosfwd>
24#include <memory>
25#include <optional>
26#include <map>
27#include <vector>
28#include <string>
29
30namespace polyfem
31{
32 namespace time_integrator
33 {
34 class BDF;
35 class ImplicitTimeIntegrator;
36 } // namespace time_integrator
37
38 namespace test
39 {
40 class VarFormTestAccess;
41 }
42
43 namespace varform
44 {
46 {
47 Eigen::MatrixXd solution;
48 Eigen::MatrixXd velocity;
49 Eigen::MatrixXd acceleration;
50 };
51
52 // Called after each completed forward-simulation step.
53 using ForwardStepCallback = std::function<void(int step, const Eigen::MatrixXd &solution)>;
54
55 class VarForm
56 {
58
59 public:
60 explicit VarForm(const io::ResourceIO &resources)
61 : resources_(resources) {}
62 virtual ~VarForm() = default;
63
66 virtual std::string name() const = 0;
67
70 void set_args(const json &args)
71 {
72 this->args = args;
73 prepared_ = false;
75 }
76
82 virtual void init(
83 const std::string &formulation,
84 const Units &units,
85 const json &args,
86 const std::string &out_path);
87
88 void set_checkpoint_reader(const io::CheckpointReader &reader) { checkpoint_reader_ = std::cref(reader); }
89
92 void set_mesh(std::unique_ptr<mesh::Mesh> mesh, const double loading_mesh_time = 0);
93 void set_geometry(mesh::LoadedGeometry geometry, double loading_mesh_time = 0);
94
99 void solve(
100 Eigen::MatrixXd &sol,
101 const InitialConditionOverride *initial_condition_override = nullptr,
102 const ForwardStepCallback &post_step = {});
103
104 void set_time_callback(const std::function<void(int, int, double, double)> &callback) { time_callback = callback; }
105
108 int problem_dimension() const;
111 virtual bool is_contact_enabled() const { return false; }
112
115 virtual io::OutputSpace output_space() const = 0;
121 virtual std::vector<io::OutputField> output_fields(
122 const io::OutputSample &sample,
123 const Eigen::MatrixXd &solution,
124 const io::OutputFieldOptions &options) const = 0;
125
128 const io::OutRuntimeData &output_timings() const { return timings; }
131 virtual io::OutStatsData compute_errors(const Eigen::MatrixXd &solution) = 0;
132
136 virtual void save_json(const Eigen::MatrixXd &solution, std::ostream &out) const = 0;
139 void save_json(const Eigen::MatrixXd &solution) const;
140 virtual void export_data(const Eigen::MatrixXd &solution) const = 0;
141
142 virtual void serialize_checkpoint(
143 io::CheckpointWriter &writer,
144 const Eigen::MatrixXd &solution,
145 const io::CheckpointMetadata &metadata) const;
146 virtual void deserialize_checkpoint(
147 const io::CheckpointReader &reader,
148 Eigen::MatrixXd &solution);
149
150 protected:
152 void prepare();
153
154 std::string resolve_output_path(const std::string &path) const;
155
156 void set_materials(assembler::Assembler &assembler, const int size) const;
158 const std::shared_ptr<time_integrator::ImplicitTimeIntegrator> &integrator,
159 const std::string &group,
160 double dt,
161 const std::string &ordering,
162 const FESpace &space,
163 int block_size) const;
165 io::CheckpointWriter &writer,
166 const std::string &name,
167 const FESpace &space) const;
169 const io::CheckpointReader &reader,
170 const std::string &name,
171 const FESpace &space,
172 int block_size,
173 int row_offset,
174 Eigen::MatrixXd &value) const;
175 Eigen::VectorXi checkpoint_ordering(const FESpace &space) const;
176 void validate_checkpoint_solution(const Eigen::MatrixXd &solution, int expected_rows) const;
177 bool checkpoint_reorder_enabled() const;
178 virtual void reset() = 0;
179
180 virtual void load_mesh(const mesh::Mesh &mesh, const json &args) = 0;
181 virtual void build_basis(mesh::Mesh &mesh, const bool iso_parametric, const json &args) = 0;
182 void assign_discr_orders(const json &space_args, const mesh::Mesh &mesh, Eigen::VectorXi &disc_orders, Eigen::VectorXi &disc_ordersq);
183 void assign_discr_orders(const json &space_args, const int fe_space_id, const mesh::Mesh &mesh, Eigen::VectorXi &disc_orders, Eigen::VectorXi &disc_ordersq);
184 virtual void assemble_rhs(const mesh::Mesh &mesh) = 0;
185 virtual void assemble_mass_mat(const mesh::Mesh &mesh, const json &args) = 0;
186 virtual void solve_problem(
187 Eigen::MatrixXd &sol,
188 const InitialConditionOverride *initial_condition_override,
189 const ForwardStepCallback &post_step) = 0;
190 QuadratureOrders n_boundary_samples(const int discr_order, const int discr_orderq, const int gdiscr_order) const;
191
192 void build_fe_space(
193 mesh::Mesh &mesh,
194 const bool iso_parametric,
195 const Eigen::VectorXi &disc_orders,
196 const Eigen::VectorXi &disc_ordersq,
197 const std::string &basis_type,
198 const std::string &poly_basis_type,
199 const assembler::Assembler &space_assembler,
200 const int value_dim,
201 const int quadrature_order,
202 const int mass_quadrature_order,
203 const bool use_corner_quadrature,
204 const int n_harmonic_samples,
205 const int integral_constraints,
206 FESpace &space,
207 VarFormBoundaryState &boundary,
208 std::shared_ptr<GeometryMapping> geometry = nullptr);
209
210 private:
212 const mesh::Mesh &mesh,
213 const std::string &poly_basis_type,
214 const assembler::Assembler &space_assembler,
215 bool iso_parametric,
216 const int quadrature_order,
217 const int mass_quadrature_order,
218 const int n_harmonic_samples,
219 const int integral_constraints,
220 FESpace &space,
221 VarFormBoundaryState &boundary);
222
224 const mesh::Mesh &mesh,
225 const std::string &basis_type,
226 const FESpace &space,
227 Eigen::VectorXi &space_in_node_to_node,
228 Eigen::VectorXi &space_in_primitive_to_primitive) const;
229
230 protected:
231 virtual void build_rhs_assembler() = 0;
232 virtual void set_obstacle(mesh::Obstacle &&obstacle);
233
234 void save_step_state(
235 const double t0,
236 const double dt,
237 const int t,
238 const Eigen::MatrixXd &solution,
239 const time_integrator::ImplicitTimeIntegrator *time_integrator) const;
240
241 void ensure_output_sampler() const;
242 void save_timestep(const double time, const int t, const double t0, const double dt, const Eigen::MatrixXd &solution) const;
244 const double time, const int t, const double dt,
245 const Eigen::MatrixXd &solution, paraviewo::VTMWriter &vtm,
246 const std::string &block_prefix) const;
247 void save_subsolve(const int i, const int t, const Eigen::MatrixXd &solution) const;
248 int output_file_index(const int t) const;
249 void notify_time_step(const int t, const int time_steps, const double t0, const double dt) const;
251 VarForm &child,
252 const std::string &formulation,
253 const Units &units,
254 const json &args,
255 const std::string &out_path) const;
256
258 io::OutputFieldFunction output_field_function(const Eigen::MatrixXd &solution, const io::OutGeometryData::ExportOptions &opts) const;
259
261 std::shared_ptr<assembler::Problem> problem;
264
266
269
270 std::string output_path;
271 std::optional<std::reference_wrapper<const io::CheckpointReader>> checkpoint_reader_;
272
273 std::unique_ptr<mesh::Mesh> mesh_;
274
275 std::function<void(int, int, double, double)> time_callback;
276
278 mutable bool output_sampler_initialized_ = false;
279 bool prepared_ = false;
281
282 protected:
284
285 static void rebuild_node_positions(
286 const std::vector<basis::ElementBases> &bases,
287 const std::vector<int> &node_ids,
288 std::vector<RowVectorNd> &positions);
289 };
290 } // namespace varform
291} // namespace polyfem
Utilies related to export of geometry.
Definition OutData.hpp:29
timers from polyfem.
all stats from polyfem
Read-only interface to a hierarchical collection of simulation resources.
Abstract mesh class to capture 2d/3d conforming and non-conforming meshes.
Definition Mesh.hpp:50
Implicit time integrator of a second order ODE (equivently a system of coupled first order ODEs).
A finite-element space for one scalar- or vector-valued field.
Definition FESpace.hpp:59
void reorder_checkpoint_block(const io::CheckpointReader &reader, const std::string &name, const FESpace &space, int block_size, int row_offset, Eigen::MatrixXd &value) const
Definition VarForm.cpp:981
int output_file_index(const int t) const
Definition VarForm.cpp:1111
void prepare()
Prepare all discretization and assembly data without running a solve.
Definition VarForm.cpp:259
static void rebuild_node_positions(const std::vector< basis::ElementBases > &bases, const std::vector< int > &node_ids, std::vector< RowVectorNd > &positions)
Definition VarForm.cpp:1125
std::shared_ptr< assembler::Problem > problem
current problem, it contains rhs and bc
Definition VarForm.hpp:261
virtual std::string name() const =0
Get the name of the variational formulation.
void save_step_state(const double t0, const double dt, const int t, const Eigen::MatrixXd &solution, const time_integrator::ImplicitTimeIntegrator *time_integrator) const
Definition VarForm.cpp:863
virtual bool is_contact_enabled() const
Check if contact is enabled for the variational formulation, for output purposes.
Definition VarForm.hpp:111
const io::OutRuntimeData & output_timings() const
Get the runtime timings of the variational formulation, for output purposes.
Definition VarForm.hpp:128
void write_checkpoint_ordering(io::CheckpointWriter &writer, const std::string &name, const FESpace &space) const
Definition VarForm.cpp:938
void solve(Eigen::MatrixXd &sol, const InitialConditionOverride *initial_condition_override=nullptr, const ForwardStepCallback &post_step={})
Solve the variational formulation and store the solution in the given matrix.
Definition VarForm.cpp:594
virtual io::OutputSpace output_space() const =0
Get the output space of the variational formulation, for output purposes.
virtual void export_data(const Eigen::MatrixXd &solution) const =0
virtual ~VarForm()=default
void set_args(const json &args)
Reset the internal state of the variational formulation, e.g.
Definition VarForm.hpp:70
virtual void set_obstacle(mesh::Obstacle &&obstacle)
Definition VarForm.cpp:247
virtual io::OutStatsData compute_errors(const Eigen::MatrixXd &solution)=0
Get the error statistics of the variational formulation, for output purposes.
virtual void deserialize_checkpoint(const io::CheckpointReader &reader, Eigen::MatrixXd &solution)
Definition VarForm.cpp:905
virtual void build_rhs_assembler()=0
std::unique_ptr< mesh::Mesh > mesh_
Definition VarForm.hpp:273
void assign_discr_orders(const json &space_args, const mesh::Mesh &mesh, Eigen::VectorXi &disc_orders, Eigen::VectorXi &disc_ordersq)
Definition VarForm.cpp:684
void set_time_callback(const std::function< void(int, int, double, double)> &callback)
Definition VarForm.hpp:104
Eigen::VectorXi checkpoint_ordering(const FESpace &space) const
Definition VarForm.cpp:951
io::OutStatsData stats
Definition VarForm.hpp:265
void notify_time_step(const int t, const int time_steps, const double t0, const double dt) const
Definition VarForm.cpp:1105
io::OutGeometryData::ExportOptions export_options(const io::OutputSpace &space) const
Definition VarForm.cpp:835
void set_geometry(mesh::LoadedGeometry geometry, double loading_mesh_time=0)
Definition VarForm.cpp:236
io::OutGeometryData output_geometry_
Definition VarForm.hpp:277
virtual void load_mesh(const mesh::Mesh &mesh, const json &args)=0
void init_child_varform(VarForm &child, const std::string &formulation, const Units &units, const json &args, const std::string &out_path) const
Definition VarForm.cpp:249
int problem_dimension() const
Get the problem dimension of the variational formulation, for output purposes.
Definition VarForm.cpp:854
virtual void assemble_mass_mat(const mesh::Mesh &mesh, const json &args)=0
void save_subsolve(const int i, const int t, const Eigen::MatrixXd &solution) const
Definition VarForm.cpp:1086
virtual void build_basis(mesh::Mesh &mesh, const bool iso_parametric, const json &args)=0
io::OutputFieldFunction output_field_function(const Eigen::MatrixXd &solution, const io::OutGeometryData::ExportOptions &opts) const
Definition VarForm.cpp:844
void restore_checkpoint_integrator(const std::shared_ptr< time_integrator::ImplicitTimeIntegrator > &integrator, const std::string &group, double dt, const std::string &ordering, const FESpace &space, int block_size) const
Definition VarForm.cpp:917
virtual void serialize_checkpoint(io::CheckpointWriter &writer, const Eigen::MatrixXd &solution, const io::CheckpointMetadata &metadata) const
Definition VarForm.cpp:897
std::function< void(int, int, double, double)> time_callback
Definition VarForm.hpp:275
QuadratureOrders n_boundary_samples(const int discr_order, const int discr_orderq, const int gdiscr_order) const
Definition VarForm.cpp:185
void set_checkpoint_reader(const io::CheckpointReader &reader)
Definition VarForm.hpp:88
std::optional< std::reference_wrapper< const io::CheckpointReader > > checkpoint_reader_
Definition VarForm.hpp:271
virtual void solve_problem(Eigen::MatrixXd &sol, const InitialConditionOverride *initial_condition_override, const ForwardStepCallback &post_step)=0
void build_polygonal_basis(const mesh::Mesh &mesh, const std::string &poly_basis_type, const assembler::Assembler &space_assembler, bool iso_parametric, const int quadrature_order, const int mass_quadrature_order, const int n_harmonic_samples, const int integral_constraints, FESpace &space, VarFormBoundaryState &boundary)
Definition VarForm.cpp:438
void build_fe_space(mesh::Mesh &mesh, const bool iso_parametric, const Eigen::VectorXi &disc_orders, const Eigen::VectorXi &disc_ordersq, const std::string &basis_type, const std::string &poly_basis_type, const assembler::Assembler &space_assembler, const int value_dim, const int quadrature_order, const int mass_quadrature_order, const bool use_corner_quadrature, const int n_harmonic_samples, const int integral_constraints, FESpace &space, VarFormBoundaryState &boundary, std::shared_ptr< GeometryMapping > geometry=nullptr)
Definition VarForm.cpp:274
std::string resolve_output_path(const std::string &path) const
Definition VarForm.cpp:1116
bool save_timestep_to_vtm(const double time, const int t, const double dt, const Eigen::MatrixXd &solution, paraviewo::VTMWriter &vtm, const std::string &block_prefix) const
Definition VarForm.cpp:1063
void set_mesh(std::unique_ptr< mesh::Mesh > mesh, const double loading_mesh_time=0)
Set the mesh for the variational formulation.
Definition VarForm.cpp:223
void ensure_output_sampler() const
Definition VarForm.cpp:821
void save_timestep(const double time, const int t, const double t0, const double dt, const Eigen::MatrixXd &solution) const
Definition VarForm.cpp:1047
virtual void assemble_rhs(const mesh::Mesh &mesh)=0
virtual void init(const std::string &formulation, const Units &units, const json &args, const std::string &out_path)
Initialize the variational formulation with the given parameters.
Definition VarForm.cpp:208
void validate_checkpoint_solution(const Eigen::MatrixXd &solution, int expected_rows) const
Definition VarForm.cpp:1037
VarForm(const io::ResourceIO &resources)
Definition VarForm.hpp:60
friend class polyfem::test::VarFormTestAccess
Definition VarForm.hpp:57
io::OutRuntimeData timings
runtime statistics
Definition VarForm.hpp:268
bool checkpoint_reorder_enabled() const
Definition VarForm.cpp:974
virtual std::vector< io::OutputField > output_fields(const io::OutputSample &sample, const Eigen::MatrixXd &solution, const io::OutputFieldOptions &options) const =0
Get the output fields of the variational formulation, for output purposes.
const io::ResourceIO & resources_
Definition VarForm.hpp:283
virtual void save_json(const Eigen::MatrixXd &solution, std::ostream &out) const =0
Save the solution to a JSON file, for output purposes.
void build_node_mapping(const mesh::Mesh &mesh, const std::string &basis_type, const FESpace &space, Eigen::VectorXi &space_in_node_to_node, Eigen::VectorXi &space_in_primitive_to_primitive) const
Definition VarForm.cpp:605
void set_materials(assembler::Assembler &assembler, const int size) const
Definition VarForm.cpp:806
virtual void reset()=0
Definition VarForm.cpp:194
std::function< std::vector< OutputField >(const OutputSample &)> OutputFieldFunction
std::function< void(int step, const Eigen::MatrixXd &solution)> ForwardStepCallback
Definition VarForm.hpp:53
std::array< int, 2 > QuadratureOrders
Definition Types.hpp:19
nlohmann::json json
Definition Common.hpp:9
Temporary compatibility wrapper for boundary data belonging to one FE space.
Definition FESpace.hpp:152