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 virtual void assemble_rhs(const mesh::Mesh &mesh) = 0;
126 virtual void assemble_mass_mat(const mesh::Mesh &mesh, const json &args) = 0;
127 virtual void solve_problem(Eigen::MatrixXd &sol) = 0;
128 void prepare();
129 QuadratureOrders n_boundary_samples(const int discr_order, const int gdiscr_order) const;
130
131 void build_fe_space(
132 mesh::Mesh &mesh,
133 const bool iso_parametric,
134 const Eigen::VectorXi &disc_orders,
135 const std::string &basis_type,
136 const std::string &poly_basis_type,
137 const assembler::Assembler &space_assembler,
138 const int value_dim,
139 const int quadrature_order,
140 const int mass_quadrature_order,
141 const bool use_corner_quadrature,
142 const int n_harmonic_samples,
143 const int integral_constraints,
144 FESpace &space,
145 VarFormBoundaryState &boundary,
146 std::shared_ptr<GeometryMapping> geometry = nullptr);
147
148 private:
150 const mesh::Mesh &mesh,
151 const std::string &poly_basis_type,
152 const assembler::Assembler &space_assembler,
153 bool iso_parametric,
154 const int quadrature_order,
155 const int mass_quadrature_order,
156 const int n_harmonic_samples,
157 const int integral_constraints,
158 FESpace &space,
159 VarFormBoundaryState &boundary);
160
162 const mesh::Mesh &mesh,
163 const std::string &basis_type,
164 const FESpace &space,
165 Eigen::VectorXi &space_in_node_to_node,
166 Eigen::VectorXi &space_in_primitive_to_primitive) const;
167
168 protected:
169 virtual void build_rhs_assembler() = 0;
170
171 std::shared_ptr<time_integrator::BDF> make_bdf_time_integrator() const;
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;
183 void save_subsolve(const int i, const int t, const Eigen::MatrixXd &solution) const;
184 int output_file_index(const int t) const;
185 void notify_time_step(const int t, const int time_steps, const double t0, const double dt) const;
186
188 io::OutputFieldFunction output_field_function(const Eigen::MatrixXd &solution, const io::OutGeometryData::ExportOptions &opts) const;
189
191 std::shared_ptr<assembler::Problem> problem;
194
196
199
200 std::string root_path;
201 std::string output_path;
202
203 std::unique_ptr<mesh::Mesh> mesh_;
204
205 std::function<void(int, int, double, double)> time_callback;
206
208 mutable bool output_sampler_initialized_ = false;
209 bool prepared_ = false;
210
211 static bool read_initial_x_from_file(
212 const std::string &state_path,
213 const std::string &x_name,
214 const bool reorder,
215 const Eigen::VectorXi &in_node_to_node,
216 const int dim,
217 Eigen::MatrixXd &x);
218
219 static void rebuild_node_positions(
220 const std::vector<basis::ElementBases> &bases,
221 const std::vector<int> &node_ids,
222 std::vector<RowVectorNd> &positions);
223 };
224 } // namespace varform
225} // 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:1052
void save_restart_json(const double t0, const double dt, const int t, const bool rest_mesh_written) const
Definition VarForm.cpp:957
std::string resolve_input_path(const std::string &path, const bool only_if_exists=false) const
Definition VarForm.cpp:1057
static void rebuild_node_positions(const std::vector< basis::ElementBases > &bases, const std::vector< int > &node_ids, std::vector< RowVectorNd > &positions)
Definition VarForm.cpp:1071
std::shared_ptr< assembler::Problem > problem
current problem, it contains rhs and bc
Definition VarForm.hpp:191
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:642
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:203
void set_time_callback(const std::function< void(int, int, double, double)> &callback)
Definition VarForm.hpp:77
io::OutStatsData stats
Definition VarForm.hpp:195
void notify_time_step(const int t, const int time_steps, const double t0, const double dt) const
Definition VarForm.cpp:951
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:846
io::OutGeometryData output_geometry_
Definition VarForm.hpp:207
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:865
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:932
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:855
std::function< void(int, int, double, double)> time_callback
Definition VarForm.hpp:205
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:486
std::string resolve_output_path(const std::string &path) const
Definition VarForm.cpp:1062
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:296
void ensure_output_sampler() const
Definition VarForm.cpp:832
std::shared_ptr< time_integrator::BDF > make_bdf_time_integrator() const
Definition VarForm.cpp:874
void save_timestep(const double time, const int t, const double t0, const double dt, const Eigen::MatrixXd &solution) const
Definition VarForm.cpp:907
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:280
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:323
friend class polyfem::test::VarFormTestAccess
Definition VarForm.hpp:45
io::OutRuntimeData timings
runtime statistics
Definition VarForm.hpp:198
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:892
QuadratureOrders n_boundary_samples(const int discr_order, const int gdiscr_order) const
Definition VarForm.cpp:259
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:817
virtual void reset()=0
Definition VarForm.cpp:268
void assign_discr_orders(const json &discr_order, const mesh::Mesh &mesh, Eigen::VectorXi &disc_orders)
Definition VarForm.cpp:745
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