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 &discr_order, const mesh::Mesh &mesh, Eigen::VectorXi &disc_orders);
125 void assign_discr_orders(const json &discr_order, const int fe_space_id, const mesh::Mesh &mesh, Eigen::VectorXi &disc_orders);
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 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 std::string &basis_type,
137 const std::string &poly_basis_type,
138 const assembler::Assembler &space_assembler,
139 const int value_dim,
140 const int quadrature_order,
141 const int mass_quadrature_order,
142 const bool use_corner_quadrature,
143 const int n_harmonic_samples,
144 const int integral_constraints,
145 FESpace &space,
146 VarFormBoundaryState &boundary,
147 std::shared_ptr<GeometryMapping> geometry = nullptr);
148
149 private:
151 const mesh::Mesh &mesh,
152 const std::string &poly_basis_type,
153 const assembler::Assembler &space_assembler,
154 bool iso_parametric,
155 const int quadrature_order,
156 const int mass_quadrature_order,
157 const int n_harmonic_samples,
158 const int integral_constraints,
159 FESpace &space,
160 VarFormBoundaryState &boundary);
161
163 const mesh::Mesh &mesh,
164 const std::string &basis_type,
165 const FESpace &space,
166 Eigen::VectorXi &space_in_node_to_node,
167 Eigen::VectorXi &space_in_primitive_to_primitive) const;
168
169 protected:
170 virtual void build_rhs_assembler() = 0;
171
172 void save_step_state(
173 const double t0,
174 const double dt,
175 const int t,
176 const time_integrator::ImplicitTimeIntegrator *time_integrator,
177 const bool rest_mesh_written = false) const;
178
179 void ensure_output_sampler() const;
180 void save_restart_json(const double t0, const double dt, const int t, const bool rest_mesh_written) const;
181 void save_timestep(const double time, const int t, const double t0, const double dt, const Eigen::MatrixXd &solution) const;
182 void save_subsolve(const int i, const int t, const Eigen::MatrixXd &solution) const;
183 int output_file_index(const int t) const;
184 void notify_time_step(const int t, const int time_steps, const double t0, const double dt) const;
185
187 io::OutputFieldFunction output_field_function(const Eigen::MatrixXd &solution, const io::OutGeometryData::ExportOptions &opts) const;
188
190 std::shared_ptr<assembler::Problem> problem;
193
195
198
199 std::string root_path;
200 std::string output_path;
201
202 std::unique_ptr<mesh::Mesh> mesh_;
203
204 std::function<void(int, int, double, double)> time_callback;
205
207 mutable bool output_sampler_initialized_ = false;
208 bool prepared_ = false;
209
210 static bool read_initial_x_from_file(
211 const std::string &state_path,
212 const std::string &x_name,
213 const bool reorder,
214 const Eigen::VectorXi &in_node_to_node,
215 const int dim,
216 Eigen::MatrixXd &x);
217
218 static void rebuild_node_positions(
219 const std::vector<basis::ElementBases> &bases,
220 const std::vector<int> &node_ids,
221 std::vector<RowVectorNd> &positions);
222 };
223 } // namespace varform
224} // namespace polyfem
int x
Utilies related to export of geometry.
Definition OutData.hpp:24
timers from polyfem.
all stats from polyfem
Abstract mesh class to capture 2d/3d conforming and non-conforming meshes.
Definition Mesh.hpp:41
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:1047
void save_restart_json(const double t0, const double dt, const int t, const bool rest_mesh_written) const
Definition VarForm.cpp:952
std::string resolve_input_path(const std::string &path, const bool only_if_exists=false) const
Definition VarForm.cpp:1052
static void rebuild_node_positions(const std::vector< basis::ElementBases > &bases, const std::vector< int > &node_ids, std::vector< RowVectorNd > &positions)
Definition VarForm.cpp:1066
std::shared_ptr< assembler::Problem > problem
current problem, it contains rhs and bc
Definition VarForm.hpp:190
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:641
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:202
void set_time_callback(const std::function< void(int, int, double, double)> &callback)
Definition VarForm.hpp:77
io::OutStatsData stats
Definition VarForm.hpp:194
void notify_time_step(const int t, const int time_steps, const double t0, const double dt) const
Definition VarForm.cpp:946
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:859
io::OutGeometryData output_geometry_
Definition VarForm.hpp:206
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:878
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:927
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:868
std::function< void(int, int, double, double)> time_callback
Definition VarForm.hpp:204
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:485
std::string resolve_output_path(const std::string &path) const
Definition VarForm.cpp:1057
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:295
void ensure_output_sampler() const
Definition VarForm.cpp:845
void save_timestep(const double time, const int t, const double t0, const double dt, const Eigen::MatrixXd &solution) const
Definition VarForm.cpp:902
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:279
void build_fe_space(mesh::Mesh &mesh, const bool iso_parametric, const Eigen::VectorXi &disc_orders, 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:322
friend class polyfem::test::VarFormTestAccess
Definition VarForm.hpp:45
io::OutRuntimeData timings
runtime statistics
Definition VarForm.hpp:197
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:887
QuadratureOrders n_boundary_samples(const int discr_order, const int gdiscr_order) const
Definition VarForm.cpp:258
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:647
void set_materials(assembler::Assembler &assembler, const int size) const
Definition VarForm.cpp:830
virtual void reset()=0
Definition VarForm.cpp:267
void assign_discr_orders(const json &discr_order, const mesh::Mesh &mesh, Eigen::VectorXi &disc_orders)
Definition VarForm.cpp:744
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