PolyFEM
Loading...
Searching...
No Matches
VarForm.hpp
Go to the documentation of this file.
1#pragma once
2
11
17
18#include <Eigen/Dense>
19
20#include <functional>
21#include <iosfwd>
22#include <memory>
23#include <map>
24#include <unordered_map>
25#include <vector>
26#include <string>
27
28namespace polyfem
29{
30 namespace time_integrator
31 {
32 class BDF;
33 class ImplicitTimeIntegrator;
34 } // namespace time_integrator
35
36 namespace test
37 {
38 class VarFormTestAccess;
39 }
40
41 namespace varform
42 {
43 class VarForm
44 {
46
47 public:
48 virtual ~VarForm() = default;
49
52 virtual std::string name() const = 0;
53
56 void set_args(const json &args)
57 {
58 this->args = args;
59 prepared_ = false;
61 }
62
68 virtual void init(const std::string &formulation, const Units &units, const json &args, const std::string &out_path);
69
72 void set_mesh(std::unique_ptr<mesh::Mesh> mesh, const double loading_mesh_time = 0);
73
76 void solve(Eigen::MatrixXd &sol);
77 void set_time_callback(const std::function<void(int, int, double, double)> &callback) { time_callback = callback; }
78
81 int problem_dimension() const;
84 virtual bool is_contact_enabled() const { return false; }
85
88 virtual io::OutputSpace output_space() const = 0;
94 virtual std::vector<io::OutputField> output_fields(
95 const io::OutputSample &sample,
96 const Eigen::MatrixXd &solution,
97 const io::OutputFieldOptions &options) const = 0;
98
101 const io::OutRuntimeData &output_timings() const { return timings; }
104 virtual io::OutStatsData compute_errors(const Eigen::MatrixXd &solution) = 0;
105
109 virtual void save_json(const Eigen::MatrixXd &solution, std::ostream &out) const = 0;
112 void save_json(const Eigen::MatrixXd &solution) const;
113 virtual void export_data(const Eigen::MatrixXd &solution) const = 0;
114
115 protected:
116 std::string resolve_output_path(const std::string &path) const;
117 std::string resolve_input_path(const std::string &path, const bool only_if_exists = false) const;
118
119 void set_materials(assembler::Assembler &assembler, const int size) const;
120 virtual void reset() = 0;
121
122 virtual void load_mesh(const mesh::Mesh &mesh, const json &args) = 0;
123 virtual void build_basis(mesh::Mesh &mesh, const bool iso_parametric, const json &args) = 0;
124 void assign_discr_orders(const json &space_args, const mesh::Mesh &mesh, Eigen::VectorXi &disc_orders, Eigen::VectorXi &disc_ordersq);
125 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);
126 virtual void assemble_rhs(const mesh::Mesh &mesh) = 0;
127 virtual void assemble_mass_mat(const mesh::Mesh &mesh, const json &args) = 0;
128 virtual void solve_problem(Eigen::MatrixXd &sol) = 0;
129 void prepare();
130 QuadratureOrders n_boundary_samples(const int discr_order, const int discr_orderq, const int gdiscr_order) const;
131
132 void build_fe_space(
133 mesh::Mesh &mesh,
134 const bool iso_parametric,
135 const Eigen::VectorXi &disc_orders,
136 const Eigen::VectorXi &disc_ordersq,
137 const std::string &basis_type,
138 const std::string &poly_basis_type,
139 const assembler::Assembler &space_assembler,
140 const int value_dim,
141 const int quadrature_order,
142 const int mass_quadrature_order,
143 const bool use_corner_quadrature,
144 const int n_harmonic_samples,
145 const int integral_constraints,
146 FESpace &space,
147 VarFormBoundaryState &boundary,
148 std::shared_ptr<GeometryMapping> geometry = nullptr);
149
150 private:
152 const mesh::Mesh &mesh,
153 const std::string &poly_basis_type,
154 const assembler::Assembler &space_assembler,
155 bool iso_parametric,
156 const int quadrature_order,
157 const int mass_quadrature_order,
158 const int n_harmonic_samples,
159 const int integral_constraints,
160 FESpace &space,
161 VarFormBoundaryState &boundary);
162
164 const mesh::Mesh &mesh,
165 const std::string &basis_type,
166 const FESpace &space,
167 Eigen::VectorXi &space_in_node_to_node,
168 Eigen::VectorXi &space_in_primitive_to_primitive) const;
169
170 protected:
171 virtual void build_rhs_assembler() = 0;
172
173 void save_step_state(
174 const double t0,
175 const double dt,
176 const int t,
177 const time_integrator::ImplicitTimeIntegrator *time_integrator,
178 const bool rest_mesh_written = false) const;
179
180 void ensure_output_sampler() const;
181 void save_restart_json(const double t0, const double dt, const int t, const bool rest_mesh_written) const;
182 void save_timestep(const double time, const int t, const double t0, const double dt, const Eigen::MatrixXd &solution) const;
184 const double time, const int t, const double dt,
185 const Eigen::MatrixXd &solution, paraviewo::VTMWriter &vtm,
186 const std::string &block_prefix) const;
187 void save_subsolve(const int i, const int t, const Eigen::MatrixXd &solution) const;
188 int output_file_index(const int t) const;
189 void notify_time_step(const int t, const int time_steps, const double t0, const double dt) const;
190
192 io::OutputFieldFunction output_field_function(const Eigen::MatrixXd &solution, const io::OutGeometryData::ExportOptions &opts) const;
193
195 std::shared_ptr<assembler::Problem> problem;
198
200
203
204 std::string root_path;
205 std::string output_path;
206
207 std::unique_ptr<mesh::Mesh> mesh_;
208
209 std::function<void(int, int, double, double)> time_callback;
210
212 mutable bool output_sampler_initialized_ = false;
213 bool prepared_ = false;
214
215 static bool read_initial_x_from_file(
216 const std::string &state_path,
217 const std::string &x_name,
218 const bool reorder,
219 const Eigen::VectorXi &in_node_to_node,
220 const int dim,
221 Eigen::MatrixXd &x);
222
223 static void rebuild_node_positions(
224 const std::vector<basis::ElementBases> &bases,
225 const std::vector<int> &node_ids,
226 std::vector<RowVectorNd> &positions);
227 };
228 } // namespace varform
229} // 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
virtual void solve_problem(Eigen::MatrixXd &sol)=0
int output_file_index(const int t) const
Definition VarForm.cpp:1098
void save_restart_json(const double t0, const double dt, const int t, const bool rest_mesh_written) const
Definition VarForm.cpp:1003
std::string resolve_input_path(const std::string &path, const bool only_if_exists=false) const
Definition VarForm.cpp:1103
static void rebuild_node_positions(const std::vector< basis::ElementBases > &bases, const std::vector< int > &node_ids, std::vector< RowVectorNd > &positions)
Definition VarForm.cpp:1117
std::shared_ptr< assembler::Problem > problem
current problem, it contains rhs and bc
Definition VarForm.hpp:195
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:84
void solve(Eigen::MatrixXd &sol)
Solve the variational formulation and store the solution in the given matrix.
Definition VarForm.cpp:640
const io::OutRuntimeData & output_timings() const
Get the runtime timings of the variational formulation, for output purposes.
Definition VarForm.hpp:101
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:56
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:207
void assign_discr_orders(const json &space_args, const mesh::Mesh &mesh, Eigen::VectorXi &disc_orders, Eigen::VectorXi &disc_ordersq)
Definition VarForm.cpp:743
void set_time_callback(const std::function< void(int, int, double, double)> &callback)
Definition VarForm.hpp:77
io::OutStatsData stats
Definition VarForm.hpp:199
void notify_time_step(const int t, const int time_steps, const double t0, const double dt) const
Definition VarForm.cpp:997
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:39
io::OutGeometryData::ExportOptions export_options(const io::OutputSpace &space) const
Definition VarForm.cpp:896
io::OutGeometryData output_geometry_
Definition VarForm.hpp:211
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:915
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:978
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:905
std::function< void(int, int, double, double)> time_callback
Definition VarForm.hpp:209
QuadratureOrders n_boundary_samples(const int discr_order, const int discr_orderq, const int gdiscr_order) const
Definition VarForm.cpp:256
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:484
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:320
std::string resolve_output_path(const std::string &path) const
Definition VarForm.cpp:1108
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:955
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:293
void ensure_output_sampler() const
Definition VarForm.cpp:882
void save_timestep(const double time, const int t, const double t0, const double dt, const Eigen::MatrixXd &solution) const
Definition VarForm.cpp:939
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:277
friend class polyfem::test::VarFormTestAccess
Definition VarForm.hpp:45
io::OutRuntimeData timings
runtime statistics
Definition VarForm.hpp:202
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:924
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:646
void set_materials(assembler::Assembler &assembler, const int size) const
Definition VarForm.cpp:867
virtual void reset()=0
Definition VarForm.cpp:265
std::function< std::vector< OutputField >(const OutputSample &)> OutputFieldFunction
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