PolyFEM
Loading...
Searching...
No Matches
VarForm.hpp
Go to the documentation of this file.
1#pragma once
2
15
16#include <Eigen/Dense>
17
18#include <functional>
19#include <cassert>
20#include <iosfwd>
21#include <memory>
22#include <map>
23#include <vector>
24#include <string>
25
26namespace polyfem
27{
28 namespace time_integrator
29 {
30 class BDF;
31 class ImplicitTimeIntegrator;
32 } // namespace time_integrator
33
34 namespace test
35 {
36 class VarFormTestAccess;
37 }
38
39 namespace varform
40 {
42 {
43 Eigen::MatrixXd solution;
44 Eigen::MatrixXd velocity;
45 Eigen::MatrixXd acceleration;
46 };
47
48 // Called after each completed forward-simulation step.
49 using ForwardStepCallback = std::function<void(int step, const Eigen::MatrixXd &solution)>;
50
51 class VarForm
52 {
54
55 public:
56 virtual ~VarForm() = default;
57
60 virtual std::string name() const = 0;
61
64 void set_args(const json &args)
65 {
66 this->args = args;
67 prepared_ = false;
69 }
70
76 virtual void init(const std::string &formulation, const Units &units, const json &args, const std::string &out_path);
77
80 void set_mesh(std::unique_ptr<mesh::Mesh> mesh, const double loading_mesh_time = 0);
81
86 void solve(
87 Eigen::MatrixXd &sol,
88 const InitialConditionOverride *initial_condition_override = nullptr,
89 const ForwardStepCallback &post_step = {});
90
91 void set_time_callback(const std::function<void(int, int, double, double)> &callback) { time_callback = callback; }
92
95 int problem_dimension() const;
98 virtual bool is_contact_enabled() const { return false; }
99
102 virtual io::OutputSpace output_space() const = 0;
108 virtual std::vector<io::OutputField> output_fields(
109 const io::OutputSample &sample,
110 const Eigen::MatrixXd &solution,
111 const io::OutputFieldOptions &options) const = 0;
112
115 const io::OutRuntimeData &output_timings() const { return timings; }
118 virtual io::OutStatsData compute_errors(const Eigen::MatrixXd &solution) = 0;
119
123 virtual void save_json(const Eigen::MatrixXd &solution, std::ostream &out) const = 0;
126 void save_json(const Eigen::MatrixXd &solution) const;
127 virtual void export_data(const Eigen::MatrixXd &solution) const = 0;
128
129 protected:
131 void prepare();
132
133 std::string resolve_output_path(const std::string &path) const;
134 std::string resolve_input_path(const std::string &path, const bool only_if_exists = false) const;
135
136 void set_materials(assembler::Assembler &assembler, const int size) const;
137 virtual void reset() = 0;
138
139 virtual void load_mesh(const mesh::Mesh &mesh, const json &args) = 0;
140 virtual void build_basis(mesh::Mesh &mesh, const bool iso_parametric, const json &args) = 0;
141 void assign_discr_orders(const json &space_args, const mesh::Mesh &mesh, Eigen::VectorXi &disc_orders, Eigen::VectorXi &disc_ordersq);
142 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);
143 virtual void assemble_rhs(const mesh::Mesh &mesh) = 0;
144 virtual void assemble_mass_mat(const mesh::Mesh &mesh, const json &args) = 0;
145 virtual void solve_problem(
146 Eigen::MatrixXd &sol,
147 const InitialConditionOverride *initial_condition_override,
148 const ForwardStepCallback &post_step) = 0;
149 QuadratureOrders n_boundary_samples(const int discr_order, const int discr_orderq, const int gdiscr_order) const;
150
151 void build_fe_space(
152 mesh::Mesh &mesh,
153 const bool iso_parametric,
154 const Eigen::VectorXi &disc_orders,
155 const Eigen::VectorXi &disc_ordersq,
156 const std::string &basis_type,
157 const std::string &poly_basis_type,
158 const assembler::Assembler &space_assembler,
159 const int value_dim,
160 const int quadrature_order,
161 const int mass_quadrature_order,
162 const bool use_corner_quadrature,
163 const int n_harmonic_samples,
164 const int integral_constraints,
165 FESpace &space,
166 VarFormBoundaryState &boundary,
167 std::shared_ptr<GeometryMapping> geometry = nullptr);
168
169 private:
171 const mesh::Mesh &mesh,
172 const std::string &poly_basis_type,
173 const assembler::Assembler &space_assembler,
174 bool iso_parametric,
175 const int quadrature_order,
176 const int mass_quadrature_order,
177 const int n_harmonic_samples,
178 const int integral_constraints,
179 FESpace &space,
180 VarFormBoundaryState &boundary);
181
183 const mesh::Mesh &mesh,
184 const std::string &basis_type,
185 const FESpace &space,
186 Eigen::VectorXi &space_in_node_to_node,
187 Eigen::VectorXi &space_in_primitive_to_primitive) const;
188
189 protected:
190 virtual void build_rhs_assembler() = 0;
191
192 void save_step_state(
193 const double t0,
194 const double dt,
195 const int t,
196 const time_integrator::ImplicitTimeIntegrator *time_integrator,
197 const bool rest_mesh_written = false) const;
198
199 void ensure_output_sampler() const;
200 void save_restart_json(const double t0, const double dt, const int t, const bool rest_mesh_written) const;
201 void save_timestep(const double time, const int t, const double t0, const double dt, const Eigen::MatrixXd &solution) const;
203 const double time, const int t, const double dt,
204 const Eigen::MatrixXd &solution, paraviewo::VTMWriter &vtm,
205 const std::string &block_prefix) const;
206 void save_subsolve(const int i, const int t, const Eigen::MatrixXd &solution) const;
207 int output_file_index(const int t) const;
208 void notify_time_step(const int t, const int time_steps, const double t0, const double dt) const;
209
211 io::OutputFieldFunction output_field_function(const Eigen::MatrixXd &solution, const io::OutGeometryData::ExportOptions &opts) const;
212
214 std::shared_ptr<assembler::Problem> problem;
217
219
222
223 std::string root_path;
224 std::string output_path;
225
226 std::unique_ptr<mesh::Mesh> mesh_;
227
228 std::function<void(int, int, double, double)> time_callback;
229
231 mutable bool output_sampler_initialized_ = false;
232 bool prepared_ = false;
233
234 static bool read_initial_x_from_file(
235 const std::string &state_path,
236 const std::string &x_name,
237 const bool reorder,
238 const Eigen::VectorXi &in_node_to_node,
239 const int dim,
240 Eigen::MatrixXd &x);
241
242 static void rebuild_node_positions(
243 const std::vector<basis::ElementBases> &bases,
244 const std::vector<int> &node_ids,
245 std::vector<RowVectorNd> &positions);
246 };
247 } // namespace varform
248} // namespace polyfem
int x
Utilies related to export of geometry.
Definition OutData.hpp:29
timers from polyfem.
all stats from polyfem
Abstract mesh class to capture 2d/3d conforming and non-conforming meshes.
Definition Mesh.hpp:49
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
int output_file_index(const int t) const
Definition VarForm.cpp:1100
void save_restart_json(const double t0, const double dt, const int t, const bool rest_mesh_written) const
Definition VarForm.cpp:1005
std::string resolve_input_path(const std::string &path, const bool only_if_exists=false) const
Definition VarForm.cpp:1105
void prepare()
Prepare all discretization and assembly data without running a solve.
Definition VarForm.cpp:304
static void rebuild_node_positions(const std::vector< basis::ElementBases > &bases, const std::vector< int > &node_ids, std::vector< RowVectorNd > &positions)
Definition VarForm.cpp:1119
std::shared_ptr< assembler::Problem > problem
current problem, it contains rhs and bc
Definition VarForm.hpp:214
virtual std::string name() const =0
Get the name of the variational formulation.
virtual bool is_contact_enabled() const
Check if contact is enabled for the variational formulation, for output purposes.
Definition VarForm.hpp:98
const io::OutRuntimeData & output_timings() const
Get the runtime timings of the variational formulation, for output purposes.
Definition VarForm.hpp:115
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:639
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:64
virtual io::OutStatsData compute_errors(const Eigen::MatrixXd &solution)=0
Get the error statistics of the variational formulation, for output purposes.
virtual void build_rhs_assembler()=0
std::unique_ptr< mesh::Mesh > mesh_
Definition VarForm.hpp:226
void assign_discr_orders(const json &space_args, const mesh::Mesh &mesh, Eigen::VectorXi &disc_orders, Eigen::VectorXi &disc_ordersq)
Definition VarForm.cpp:745
void set_time_callback(const std::function< void(int, int, double, double)> &callback)
Definition VarForm.hpp:91
io::OutStatsData stats
Definition VarForm.hpp:218
void notify_time_step(const int t, const int time_steps, const double t0, const double dt) const
Definition VarForm.cpp:999
static bool read_initial_x_from_file(const std::string &state_path, const std::string &x_name, const bool reorder, const Eigen::VectorXi &in_node_to_node, const int dim, Eigen::MatrixXd &x)
Definition VarForm.cpp:38
io::OutGeometryData::ExportOptions export_options(const io::OutputSpace &space) const
Definition VarForm.cpp:898
io::OutGeometryData output_geometry_
Definition VarForm.hpp:230
virtual void load_mesh(const mesh::Mesh &mesh, const json &args)=0
int problem_dimension() const
Get the problem dimension of the variational formulation, for output purposes.
Definition VarForm.cpp:917
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:980
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:907
std::function< void(int, int, double, double)> time_callback
Definition VarForm.hpp:228
QuadratureOrders n_boundary_samples(const int discr_order, const int discr_orderq, const int gdiscr_order) const
Definition VarForm.cpp:255
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:483
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:319
std::string resolve_output_path(const std::string &path) const
Definition VarForm.cpp:1110
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:957
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:292
void ensure_output_sampler() const
Definition VarForm.cpp:884
void save_timestep(const double time, const int t, const double t0, const double dt, const Eigen::MatrixXd &solution) const
Definition VarForm.cpp:941
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:276
friend class polyfem::test::VarFormTestAccess
Definition VarForm.hpp:53
io::OutRuntimeData timings
runtime statistics
Definition VarForm.hpp:221
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.
void save_step_state(const double t0, const double dt, const int t, const time_integrator::ImplicitTimeIntegrator *time_integrator, const bool rest_mesh_written=false) const
Definition VarForm.cpp:926
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:648
void set_materials(assembler::Assembler &assembler, const int size) const
Definition VarForm.cpp:869
virtual void reset()=0
Definition VarForm.cpp:264
std::function< std::vector< OutputField >(const OutputSample &)> OutputFieldFunction
std::function< void(int step, const Eigen::MatrixXd &solution)> ForwardStepCallback
Definition VarForm.hpp:49
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