PolyFEM
Loading...
Searching...
No Matches
State.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <polyfem/Common.hpp>
4
5#include <polyfem/Units.hpp>
6
9
18
19#include <polyfem/mesh/Mesh.hpp>
23
25
33
34#include <polysolve/linear/Solver.hpp>
35
36#include <Eigen/Dense>
37#include <Eigen/Sparse>
38
39#include <spdlog/sinks/basic_file_sink.h>
40
41#include <ipc/collision_mesh.hpp>
42#include <ipc/utils/logger.hpp>
43
44#include <memory>
45#include <string>
46#include <unordered_map>
47#include <functional>
48#include <cassert>
49#include <map>
50#include <utility>
51#include <vector>
52#include <sstream>
53#include <utility>
54#include <algorithm>
55#include <cstddef>
56
57// Forward declaration
59{
60 class Solver;
61}
62
63namespace polyfem::assembler
64{
65 class Mass;
66 class HRZMass;
67 class ViscousDamping;
68 class ViscousDampingPrev;
69} // namespace polyfem::assembler
70
71namespace polyfem
72{
73 namespace mesh
74 {
75 class Mesh2D;
76 class Mesh3D;
77 } // namespace mesh
78
79 class State;
80
87 using UserPostStepCallback = std::function<void(int step, State &state, const Eigen::MatrixXd &sol, const Eigen::MatrixXd *disp_grad, const Eigen::MatrixXd *pressure)>;
88
91 {
92 public:
95 Eigen::MatrixXd solution;
96
99 Eigen::MatrixXd velocity;
100
103 Eigen::MatrixXd acceleration;
104
106 bool is_empty() const
107 {
108 return solution.size() == 0 && velocity.size() == 0 && acceleration.size() == 0;
109 }
110 };
111
113 class State
114 {
115 public:
116 //---------------------------------------------------
117 //-----------------initialization--------------------
118 //---------------------------------------------------
119
120 ~State() = default;
122 State();
123
125 void set_max_threads(const int max_threads = std::numeric_limits<int>::max());
126
130 void init(const json &args, const bool strict_validation);
131
133 void init_time();
134
137
138 //---------------------------------------------------
139 //-----------------logger----------------------------
140 //---------------------------------------------------
141
147 void init_logger(
148 const std::string &log_file,
149 const spdlog::level::level_enum log_level,
150 const spdlog::level::level_enum file_log_level,
151 const bool is_quiet);
152
156 void init_logger(std::ostream &os, const spdlog::level::level_enum log_level);
157
160 void set_log_level(const spdlog::level::level_enum log_level);
161
165 std::string get_log(const Eigen::MatrixXd &sol)
166 {
167 std::stringstream ss;
168 save_json(sol, ss);
169 return ss.str();
170 }
171
172 private:
174 void init_logger(const std::vector<spdlog::sink_ptr> &sinks, const spdlog::level::level_enum log_level);
175
177 spdlog::sink_ptr console_sink_ = nullptr;
178 spdlog::sink_ptr file_sink_ = nullptr;
179
180 public:
181 //---------------------------------------------------
182 //-----------------assembly--------------------------
183 //---------------------------------------------------
184
186
188
190 std::shared_ptr<assembler::Assembler> assembler = nullptr;
191
192 std::shared_ptr<assembler::Mass> mass_matrix_assembler = nullptr;
193 std::shared_ptr<assembler::HRZMass> pure_mass_matrix_assembler = nullptr;
194
195 std::shared_ptr<assembler::MixedAssembler> mixed_assembler = nullptr;
196 std::shared_ptr<assembler::Assembler> pressure_assembler = nullptr;
197
198 std::shared_ptr<assembler::PressureAssembler> elasticity_pressure_assembler = nullptr;
199
200 std::shared_ptr<assembler::ViscousDamping> damping_assembler = nullptr;
201 std::shared_ptr<assembler::ViscousDampingPrev> damping_prev_assembler = nullptr;
202
204 std::shared_ptr<assembler::Problem> problem;
205
207 std::vector<basis::ElementBases> bases;
209 std::vector<basis::ElementBases> pressure_bases;
211 std::vector<basis::ElementBases> geom_bases_;
212
219
221 std::map<int, Eigen::MatrixXd> polys;
223 std::map<int, std::pair<Eigen::MatrixXd, Eigen::MatrixXi>> polys_3d;
224
226 Eigen::VectorXi disc_orders, disc_ordersq;
227
229 std::shared_ptr<polyfem::mesh::MeshNodes> mesh_nodes, geom_mesh_nodes, pressure_mesh_nodes;
230
237
242 double avg_mass;
243
246
248 Eigen::MatrixXd rhs;
249
253
256 std::string formulation() const;
257
260 bool iso_parametric() const;
261
264 const std::vector<basis::ElementBases> &geom_bases() const
265 {
266 return iso_parametric() ? bases : geom_bases_;
267 }
268
273 void build_basis();
277 void assemble_rhs();
281 void assemble_mass_mat();
282
284 std::shared_ptr<assembler::RhsAssembler> build_rhs_assembler(
285 const int n_bases,
286 const std::vector<basis::ElementBases> &bases,
289 std::shared_ptr<assembler::RhsAssembler> build_rhs_assembler() const
290 {
292 }
293
294 std::shared_ptr<assembler::PressureAssembler> build_pressure_assembler(
295 const int n_bases_,
296 const std::vector<basis::ElementBases> &bases_) const;
297 std::shared_ptr<assembler::PressureAssembler> build_pressure_assembler() const
298 {
300 }
301
305 {
307 const int n_b_samples_j = args["space"]["advanced"]["n_boundary_samples"];
308 const int gdiscr_order = mesh->orders().size() <= 0 ? 1 : mesh->orders().maxCoeff();
309 const int discr_order = std::max(disc_orders.maxCoeff(), gdiscr_order);
310
311 const int n_b_samples = std::max(n_b_samples_j, AssemblerUtils::quadrature_order("Mass", discr_order, AssemblerUtils::BasisType::POLY, mesh->dimension()));
312 // todo prism
313 return {{n_b_samples, n_b_samples}};
314 }
315
316 int ndof() const
317 {
318 const int actual_dim = problem->is_scalar() ? 1 : mesh->dimension();
319 if (mixed_assembler == nullptr)
320 return actual_dim * n_bases;
321 else
322 return actual_dim * n_bases + n_pressure_bases;
323 }
324
325 private:
329 void sol_to_pressure(Eigen::MatrixXd &sol, Eigen::MatrixXd &pressure);
332
333 public:
336 void set_materials(std::vector<std::shared_ptr<assembler::Assembler>> &assemblers) const;
340
341 //---------------------------------------------------
342 //-----------------solver----------------------------
343 //---------------------------------------------------
344
345 public:
351 void solve_problem(Eigen::MatrixXd &sol,
352 Eigen::MatrixXd &pressure,
353 UserPostStepCallback user_post_step = {},
354 const InitialConditionOverride *ic_override = nullptr);
355
361 void solve(Eigen::MatrixXd &sol,
362 Eigen::MatrixXd &pressure,
363 UserPostStepCallback user_post_step = {},
364 const InitialConditionOverride *ic_override = nullptr)
365 {
366 if (!mesh)
367 {
368 logger().error("Load the mesh first!");
369 return;
370 }
372
373 build_basis();
374
375 assemble_rhs();
377
378 solve_problem(sol, pressure, user_post_step, ic_override);
379 }
380
383
389 std::unique_ptr<polysolve::linear::Solver> static_linear_solver_cache;
390
395 void init_solve(Eigen::MatrixXd &sol,
396 Eigen::MatrixXd &pressure,
397 const InitialConditionOverride *ic_override = nullptr);
398
405 void solve_transient_navier_stokes_split(const int time_steps,
406 const double dt,
407 Eigen::MatrixXd &sol,
408 Eigen::MatrixXd &pressure,
409 UserPostStepCallback user_post_step = {});
410
418 void solve_transient_navier_stokes(const int time_steps,
419 const double t0,
420 const double dt,
421 Eigen::MatrixXd &sol,
422 Eigen::MatrixXd &pressure,
423 UserPostStepCallback user_post_step = {});
424
433 void solve_transient_linear(const int time_steps,
434 const double t0,
435 const double dt,
436 Eigen::MatrixXd &sol,
437 Eigen::MatrixXd &pressure,
438 UserPostStepCallback user_post_step = {},
439 const InitialConditionOverride *ic_override = nullptr);
440
448 void solve_transient_tensor_nonlinear(const int time_steps,
449 const double t0,
450 const double dt,
451 Eigen::MatrixXd &sol,
452 UserPostStepCallback user_post_step = {},
453 const InitialConditionOverride *ic_override = nullptr);
454
459 void init_nonlinear_tensor_solve(Eigen::MatrixXd &sol,
460 const double t = 1.0,
461 const bool init_time_integrator = true,
462 const InitialConditionOverride *ic_override = nullptr);
463
467 void init_linear_solve(Eigen::MatrixXd &sol,
468 const double t = 1.0,
469 const InitialConditionOverride *ic_override = nullptr);
470
474 void initial_solution(Eigen::MatrixXd &solution, const InitialConditionOverride *ic_override = nullptr) const;
478 void initial_velocity(Eigen::MatrixXd &velocity, const InitialConditionOverride *ic_override = nullptr) const;
482 void initial_acceleration(Eigen::MatrixXd &acceleration, const InitialConditionOverride *ic_override = nullptr) const;
488 void solve_linear(int step, Eigen::MatrixXd &sol, Eigen::MatrixXd &pressure, UserPostStepCallback user_post_step = {});
494 void solve_navier_stokes(int step, Eigen::MatrixXd &sol, Eigen::MatrixXd &pressure, UserPostStepCallback user_post_step = {});
499 void solve_tensor_nonlinear(int step, Eigen::MatrixXd &sol, const bool init_lagging = true, UserPostStepCallback user_post_step = {});
500
503 std::shared_ptr<polysolve::nonlinear::Solver> make_nl_solver(bool for_al) const;
504
506 std::shared_ptr<utils::PeriodicBoundary> periodic_bc;
507 bool has_periodic_bc() const
508 {
509 return args["boundary_conditions"]["periodic_boundary"]["enabled"].get<bool>();
510 }
511
521 void solve_linear(
522 int step,
523 const std::unique_ptr<polysolve::linear::Solver> &solver,
525 Eigen::VectorXd &b,
526 const bool compute_spectrum,
527 Eigen::MatrixXd &sol, Eigen::MatrixXd &pressure, UserPostStepCallback user_post_step = {});
528
530 bool is_problem_linear() const { return assembler->is_linear() && !is_contact_enabled() && !is_pressure_enabled() && !has_constraints(); }
531
532 bool has_constraints() const
533 {
534 return has_constraints_;
535 }
536
537 private:
539
540 public:
543 void build_stiffness_mat(StiffnessMatrix &stiffness);
544
545 //---------------------------------------------------
546 //-----------------nodes flags-----------------------
547 //---------------------------------------------------
548
549 public:
551 std::unordered_map<int, std::array<bool, 3>>
552 boundary_conditions_ids(const std::string &bc_type) const;
553
555 std::vector<int> boundary_nodes;
557 std::vector<int> pressure_boundary_nodes;
559 std::vector<mesh::LocalBoundary> total_local_boundary;
561 std::vector<mesh::LocalBoundary> local_boundary;
563 std::vector<mesh::LocalBoundary> local_neumann_boundary;
565 std::vector<mesh::LocalBoundary> local_pressure_boundary;
567 std::unordered_map<int, std::vector<mesh::LocalBoundary>> local_pressure_cavity;
569 std::map<int, basis::InterfaceData> poly_edge_to_data;
571 std::vector<int> dirichlet_nodes;
572 std::vector<RowVectorNd> dirichlet_nodes_position;
574 std::vector<int> neumann_nodes;
575 std::vector<RowVectorNd> neumann_nodes_position;
576
578 Eigen::VectorXi in_node_to_node;
581
582 std::vector<int> primitive_to_node() const;
583 std::vector<int> node_to_primitive() const;
584
585 private:
587 void build_node_mapping();
588
589 //---------------------------------------------------
590 //-----------------Geometry--------------------------
591 //---------------------------------------------------
592 public:
594 std::unique_ptr<mesh::Mesh> mesh;
597
603 void load_mesh(bool non_conforming = false,
604 const std::vector<std::string> &names = std::vector<std::string>(),
605 const std::vector<Eigen::MatrixXi> &cells = std::vector<Eigen::MatrixXi>(),
606 const std::vector<Eigen::MatrixXd> &vertices = std::vector<Eigen::MatrixXd>());
607
613 void load_mesh(GEO::Mesh &meshin, const std::function<int(const size_t, const std::vector<int> &, const RowVectorNd &, bool)> &boundary_marker, bool non_conforming = false, bool skip_boundary_sideset = false);
614
619 void load_mesh(const Eigen::MatrixXd &V, const Eigen::MatrixXi &F, bool non_conforming = false)
620 {
621 mesh = mesh::Mesh::create(V, F, non_conforming);
622 load_mesh(non_conforming);
623 }
624
626 void reset_mesh();
627
629 void build_mesh_matrices(Eigen::MatrixXd &V, Eigen::MatrixXi &F);
630
631#ifdef POLYFEM_WITH_ITR
637 bool remesh(const double time, const double dt, Eigen::MatrixXd &sol);
638#endif
639
641 void get_vertices(Eigen::MatrixXd &vertices) const
642 {
643 vertices.setZero(mesh->n_vertices(), mesh->dimension());
644
645 for (int v = 0; v < mesh->n_vertices(); v++)
646 vertices.row(v) = mesh->point(v);
647 }
648
650 void get_elements(Eigen::MatrixXi &elements) const
651 {
652 assert(mesh->is_simplicial());
653
654 auto node_to_primitive_map = node_to_primitive();
655
656 const auto &gbases = geom_bases();
657 int dim = mesh->dimension();
658 elements.setZero(gbases.size(), dim + 1);
659 for (int e = 0; e < gbases.size(); e++)
660 {
661 int i = 0;
662 for (const auto &gbs : gbases[e].bases)
663 elements(e, i++) = node_to_primitive_map[gbs.global()[0].index];
664 }
665 }
666
667 //---------------------------------------------------
668 //-----------------IPC-------------------------------
669 //---------------------------------------------------
670
672 ipc::CollisionMesh collision_mesh;
673
675 ipc::CollisionMesh periodic_collision_mesh;
678
680 static void build_collision_mesh(
681 const mesh::Mesh &mesh,
682 const int n_bases,
683 const std::vector<basis::ElementBases> &bases,
684 const std::vector<basis::ElementBases> &geom_bases,
685 const std::vector<mesh::LocalBoundary> &total_local_boundary,
687 const json &args,
688 const std::function<std::string(const std::string &)> &resolve_input_path,
689 const Eigen::VectorXi &in_node_to_node,
690 ipc::CollisionMesh &collision_mesh);
691
695
699 bool is_obstacle_vertex(const size_t vi) const
700 {
701 // The obstalce vertices are at the bottom of the collision mesh vertices
702 return vi >= collision_mesh.full_num_vertices() - obstacle.n_vertices();
703 }
704
709 {
710 return args["contact"]["enabled"];
711 }
712
717 {
718 return args["contact"]["adhesion"]["adhesion_enabled"];
719 }
720
725 {
726 return (args["boundary_conditions"]["pressure_boundary"].size() > 0)
727 || (args["boundary_conditions"]["pressure_cavity"].size() > 0);
728 }
729
731 bool has_dhat = false;
732
733 //---------------------------------------------------
734 //-----------------OUTPUT----------------------------
735 //---------------------------------------------------
736 public:
738 std::string output_dir;
748
749 std::function<void(int, int, double, double)> time_callback = nullptr;
750
754 void export_data(const Eigen::MatrixXd &sol, const Eigen::MatrixXd &pressure);
755
763 void save_timestep(const double time, const int t, const double t0, const double dt, const Eigen::MatrixXd &sol, const Eigen::MatrixXd &pressure);
764
770 void save_subsolve(const int i, const int t, const Eigen::MatrixXd &sol, const Eigen::MatrixXd &pressure);
771
775 void save_json(const Eigen::MatrixXd &sol, std::ostream &out);
776
779 void save_json(const Eigen::MatrixXd &sol);
780
782 void compute_errors(const Eigen::MatrixXd &sol);
783
786 void save_restart_json(const double t0, const double dt, const int t) const;
787
788 //-----------PATH management
791 std::string root_path() const;
792
797 std::string resolve_input_path(const std::string &path, const bool only_if_exists = false) const;
798
802 std::string resolve_output_path(const std::string &path) const;
803
804 //---------------------------------------------------
805 //-----------------differentiable--------------------
806 //---------------------------------------------------
807 public:
809
810 //---------------------------------------------------
811 //-----------------homogenization--------------------
812 //---------------------------------------------------
813 public:
815
817 void solve_homogenization_step(int step, Eigen::MatrixXd &sol, bool adaptive_initial_weight = false, UserPostStepCallback user_post_step = {}); // sol is the extended solution, i.e. [periodic fluctuation, macro strain]
818 void init_homogenization_solve(const double t);
819 void solve_homogenization(const int time_steps, const double t0, const double dt, Eigen::MatrixXd &sol, UserPostStepCallback user_post_step = {});
820 bool is_homogenization() const
821 {
822 return args["boundary_conditions"]["periodic_boundary"]["linear_displacement_offset"].size() > 0;
823 }
824 };
825
826} // namespace polyfem
int V
Runtime override for initial-condition histories.
Definition State.hpp:91
Eigen::MatrixXd solution
ndof by H (history size) matrix where each col is solution from a time step.
Definition State.hpp:95
bool is_empty() const
Returns true when no quantity is overridden.
Definition State.hpp:106
Eigen::MatrixXd acceleration
ndof by H (history size) matrix where each col is acceleration from a time step.
Definition State.hpp:103
Eigen::MatrixXd velocity
ndof by H (history size) matrix where each col is velocity from a time step.
Definition State.hpp:99
main class that contains the polyfem solver and all its state
Definition State.hpp:114
void get_vertices(Eigen::MatrixXd &vertices) const
Gather geometry vertices into a dense matrix.
Definition State.hpp:641
io::OutRuntimeData timings
runtime statistics
Definition State.hpp:742
void solve_navier_stokes(int step, Eigen::MatrixXd &sol, Eigen::MatrixXd &pressure, UserPostStepCallback user_post_step={})
solves a navier stokes
assembler::MacroStrainValue macro_strain_constraint
Definition State.hpp:814
std::shared_ptr< utils::PeriodicBoundary > periodic_bc
periodic BC and periodic mesh utils
Definition State.hpp:506
int n_bases
number of bases
Definition State.hpp:214
int n_pressure_bases
number of pressure bases
Definition State.hpp:216
std::string formulation() const
return the formulation (checks if the problem is scalar or not and deals with multiphysics)
Definition State.cpp:332
assembler::AssemblyValsCache ass_vals_cache
used to store assembly values for small problems
Definition State.hpp:232
bool is_adhesion_enabled() const
does the simulation have adhesion
Definition State.hpp:716
const std::vector< basis::ElementBases > & geom_bases() const
Get a constant reference to the geometry mapping bases.
Definition State.hpp:264
double starting_max_edge_length
Definition State.hpp:746
std::vector< mesh::LocalBoundary > local_pressure_boundary
mapping from elements to nodes for pressure boundary conditions
Definition State.hpp:565
void sol_to_pressure(Eigen::MatrixXd &sol, Eigen::MatrixXd &pressure)
splits the solution in solution and pressure for mixed problems
Definition State.cpp:375
std::shared_ptr< assembler::ViscousDamping > damping_assembler
Definition State.hpp:200
void init(const json &args, const bool strict_validation)
initialize the polyfem solver with a json settings
std::string root_path() const
Get the root path for the state (e.g., args["root_path"] or ".")
StiffnessMatrix pure_mass
Definition State.hpp:240
bool is_pressure_enabled() const
does the simulation has pressure
Definition State.hpp:724
void assemble_mass_mat()
assemble mass, step 4 of solve build mass matrix based on defined basis modifies mass (and maybe more...
Definition State.cpp:1462
double characteristic_length
Definition State.hpp:244
Eigen::VectorXi in_node_to_node
Inpute nodes (including high-order) to polyfem nodes, only for isoparametric.
Definition State.hpp:578
void solve_linear(int step, Eigen::MatrixXd &sol, Eigen::MatrixXd &pressure, UserPostStepCallback user_post_step={})
solves a linear problem
void build_polygonal_basis()
builds bases for polygons, called inside build_basis
Definition State.cpp:1030
mesh::Obstacle obstacle
Obstacles used in collisions.
Definition State.hpp:596
std::shared_ptr< assembler::Assembler > assembler
assemblers
Definition State.hpp:190
void compute_errors(const Eigen::MatrixXd &sol)
computes all errors
void initial_velocity(Eigen::MatrixXd &velocity, const InitialConditionOverride *ic_override=nullptr) const
Load or compute the initial velocity.
ipc::CollisionMesh periodic_collision_mesh
IPC collision mesh under periodic BC.
Definition State.hpp:675
void build_periodic_collision_mesh()
Definition State.cpp:1193
void save_subsolve(const int i, const int t, const Eigen::MatrixXd &sol, const Eigen::MatrixXd &pressure)
saves a subsolve when save_solve_sequence_debug is true
io::OutGeometryData out_geom
visualization stuff
Definition State.hpp:740
bool use_avg_pressure
use average pressure for stokes problem to fix the additional dofs, true by default if false,...
Definition State.hpp:252
std::string resolve_output_path(const std::string &path) const
Resolve output path relative to output_dir if the path is not absolute.
std::vector< int > neumann_nodes
per node neumann
Definition State.hpp:574
ipc::CollisionMesh collision_mesh
IPC collision mesh.
Definition State.hpp:672
std::string output_dir
Directory for output files.
Definition State.hpp:738
void load_mesh(bool non_conforming=false, const std::vector< std::string > &names=std::vector< std::string >(), const std::vector< Eigen::MatrixXi > &cells=std::vector< Eigen::MatrixXi >(), const std::vector< Eigen::MatrixXd > &vertices=std::vector< Eigen::MatrixXd >())
loads the mesh from the json arguments
Definition StateLoad.cpp:91
std::vector< basis::ElementBases > geom_bases_
Geometric mapping bases, if the elements are isoparametric, this list is empty.
Definition State.hpp:211
Eigen::VectorXi in_primitive_to_primitive
maps in vertices/edges/faces/cells to polyfem vertices/edges/faces/cells
Definition State.hpp:580
void set_materials(std::vector< std::shared_ptr< assembler::Assembler > > &assemblers) const
set the material and the problem dimension
std::string get_log(const Eigen::MatrixXd &sol)
gets the output log as json this is not what gets printed but more informative information,...
Definition State.hpp:165
std::map< int, basis::InterfaceData > poly_edge_to_data
nodes on the boundary of polygonal elements, used for harmonic bases
Definition State.hpp:569
std::vector< int > pressure_boundary_nodes
list of neumann boundary nodes
Definition State.hpp:557
void set_max_threads(const int max_threads=std::numeric_limits< int >::max())
void save_timestep(const double time, const int t, const double t0, const double dt, const Eigen::MatrixXd &sol, const Eigen::MatrixXd &pressure)
saves a timestep
std::vector< basis::ElementBases > pressure_bases
FE pressure bases for mixed elements, the size is #elements.
Definition State.hpp:209
void save_json(const Eigen::MatrixXd &sol, std::ostream &out)
saves the output statistic to a stream
bool is_homogenization() const
Definition State.hpp:820
void load_mesh(const Eigen::MatrixXd &V, const Eigen::MatrixXi &F, bool non_conforming=false)
loads the mesh from V and F,
Definition State.hpp:619
void solve_homogenization_step(int step, Eigen::MatrixXd &sol, bool adaptive_initial_weight=false, UserPostStepCallback user_post_step={})
In Elasticity PDE, solve for "min W(disp_grad + \grad u)" instead of "min W(\grad u)".
bool has_constraints() const
Definition State.hpp:532
std::shared_ptr< assembler::Assembler > pressure_assembler
Definition State.hpp:196
std::shared_ptr< polysolve::nonlinear::Solver > make_nl_solver(bool for_al) const
factory to create the nl solver depending on input
double starting_min_edge_length
Definition State.hpp:745
void solve_transient_tensor_nonlinear(const int time_steps, const double t0, const double dt, Eigen::MatrixXd &sol, UserPostStepCallback user_post_step={}, const InitialConditionOverride *ic_override=nullptr)
solves transient tensor nonlinear problem
std::shared_ptr< assembler::Mass > mass_matrix_assembler
Definition State.hpp:192
void build_node_mapping()
build the mapping from input nodes to polyfem nodes
Definition State.cpp:249
std::vector< int > primitive_to_node() const
Definition State.cpp:232
bool has_dhat
stores if input json contains dhat
Definition State.hpp:731
void solve_tensor_nonlinear(int step, Eigen::MatrixXd &sol, const bool init_lagging=true, UserPostStepCallback user_post_step={})
solves nonlinear problems
std::shared_ptr< polyfem::mesh::MeshNodes > pressure_mesh_nodes
Definition State.hpp:229
std::unique_ptr< mesh::Mesh > mesh
current mesh, it can be a Mesh2D or Mesh3D
Definition State.hpp:594
void reset_mesh()
Resets the mesh.
Definition StateLoad.cpp:22
std::unordered_map< int, std::array< bool, 3 > > boundary_conditions_ids(const std::string &bc_type) const
Construct a vector of boundary conditions ids with their dimension flags.
std::shared_ptr< polyfem::mesh::MeshNodes > mesh_nodes
Mapping from input nodes to FE nodes.
Definition State.hpp:229
StiffnessMatrix mass
Mass matrix, it is computed only for time dependent problems.
Definition State.hpp:239
void solve(Eigen::MatrixXd &sol, Eigen::MatrixXd &pressure, UserPostStepCallback user_post_step={}, const InitialConditionOverride *ic_override=nullptr)
solves the problem, call other methods
Definition State.hpp:361
std::vector< int > dirichlet_nodes
per node dirichlet
Definition State.hpp:571
std::shared_ptr< assembler::HRZMass > pure_mass_matrix_assembler
Definition State.hpp:193
bool has_periodic_bc() const
Definition State.hpp:507
void build_basis()
builds the bases step 2 of solve modifies bases, pressure_bases, geom_bases_, boundary_nodes,...
Definition State.cpp:507
std::shared_ptr< assembler::Problem > problem
current problem, it contains rhs and bc
Definition State.hpp:204
bool has_constraints_
Definition State.hpp:538
std::vector< RowVectorNd > dirichlet_nodes_position
Definition State.hpp:572
spdlog::sink_ptr file_sink_
Definition State.hpp:178
spdlog::sink_ptr console_sink_
logger sink to stdout
Definition State.hpp:177
State()
Constructor.
Definition StateInit.cpp:58
std::map< int, std::pair< Eigen::MatrixXd, Eigen::MatrixXi > > polys_3d
polyhedra, used since poly have no geom mapping
Definition State.hpp:223
std::vector< int > node_to_primitive() const
Definition State.cpp:239
~State()=default
json args
main input arguments containing all defaults
Definition State.hpp:136
void set_log_level(const spdlog::level::level_enum log_level)
change log level
void save_restart_json(const double t0, const double dt, const int t) const
Save a JSON sim file for restarting the simulation at time t.
void initial_acceleration(Eigen::MatrixXd &acceleration, const InitialConditionOverride *ic_override=nullptr) const
Load or compute the initial acceleration.
io::OutStatsData stats
Other statistics.
Definition State.hpp:744
std::vector< RowVectorNd > neumann_nodes_position
Definition State.hpp:575
void assemble_rhs()
compute rhs, step 3 of solve build rhs vector based on defined basis and given rhs of the problem mod...
Definition State.cpp:1593
double min_boundary_edge_length
Definition State.hpp:747
std::unique_ptr< polysolve::linear::Solver > static_linear_solver_cache
Linear solver instance from the most recent static linear solve.
Definition State.hpp:389
Eigen::VectorXi periodic_collision_mesh_to_basis
index mapping from periodic 2x2 collision mesh to FE periodic mesh
Definition State.hpp:677
void init_time()
initialize time settings if args contains "time"
std::vector< basis::ElementBases > bases
FE bases, the size is #elements.
Definition State.hpp:207
void initial_solution(Eigen::MatrixXd &solution, const InitialConditionOverride *ic_override=nullptr) const
Load or compute the initial solution.
Eigen::VectorXi disc_ordersq
Definition State.hpp:226
void get_elements(Eigen::MatrixXi &elements) const
Gather geometry elements into a dense matrix.
Definition State.hpp:650
void solve_transient_navier_stokes_split(const int time_steps, const double dt, Eigen::MatrixXd &sol, Eigen::MatrixXd &pressure, UserPostStepCallback user_post_step={})
solves transient navier stokes with operator splitting
int n_geom_bases
number of geometric bases
Definition State.hpp:218
void solve_problem(Eigen::MatrixXd &sol, Eigen::MatrixXd &pressure, UserPostStepCallback user_post_step={}, const InitialConditionOverride *ic_override=nullptr)
solves the problems
Definition State.cpp:1665
assembler::AssemblyValsCache pressure_ass_vals_cache
used to store assembly values for pressure for small problems
Definition State.hpp:236
void init_solve(Eigen::MatrixXd &sol, Eigen::MatrixXd &pressure, const InitialConditionOverride *ic_override=nullptr)
initialize solver
void solve_transient_linear(const int time_steps, const double t0, const double dt, Eigen::MatrixXd &sol, Eigen::MatrixXd &pressure, UserPostStepCallback user_post_step={}, const InitialConditionOverride *ic_override=nullptr)
solves transient linear problem
void build_stiffness_mat(StiffnessMatrix &stiffness)
utility that builds the stiffness matrix and collects stats, used only for linear problems
std::vector< mesh::LocalBoundary > local_boundary
mapping from elements to nodes for dirichlet boundary conditions
Definition State.hpp:561
double avg_mass
average system mass, used for contact with IPC
Definition State.hpp:242
bool optimization_enabled
Definition State.hpp:808
std::function< void(int, int, double, double)> time_callback
Definition State.hpp:749
bool iso_parametric() const
check if using iso parametric bases
Definition State.cpp:466
std::shared_ptr< assembler::RhsAssembler > build_rhs_assembler() const
build a RhsAssembler for the problem
Definition State.hpp:289
std::vector< mesh::LocalBoundary > total_local_boundary
mapping from elements to nodes for all mesh
Definition State.hpp:559
QuadratureOrders n_boundary_samples() const
quadrature used for projecting boundary conditions
Definition State.hpp:304
int ndof() const
Definition State.hpp:316
void export_data(const Eigen::MatrixXd &sol, const Eigen::MatrixXd &pressure)
saves all data on the disk according to the input params
assembler::AssemblyValsCache mass_ass_vals_cache
Definition State.hpp:233
bool is_obstacle_vertex(const size_t vi) const
checks if vertex is obstacle
Definition State.hpp:699
std::string resolve_input_path(const std::string &path, const bool only_if_exists=false) const
Resolve input path relative to root_path() if the path is not absolute.
std::vector< int > boundary_nodes
list of boundary nodes
Definition State.hpp:555
solver::SolveData solve_data
timedependent stuff cached
Definition State.hpp:382
void init_nonlinear_tensor_solve(Eigen::MatrixXd &sol, const double t=1.0, const bool init_time_integrator=true, const InitialConditionOverride *ic_override=nullptr)
initialize the nonlinear solver
void solve_transient_navier_stokes(const int time_steps, const double t0, const double dt, Eigen::MatrixXd &sol, Eigen::MatrixXd &pressure, UserPostStepCallback user_post_step={})
solves transient navier stokes with FEM
std::shared_ptr< polyfem::mesh::MeshNodes > geom_mesh_nodes
Definition State.hpp:229
void init_logger(const std::string &log_file, const spdlog::level::level_enum log_level, const spdlog::level::level_enum file_log_level, const bool is_quiet)
initializing the logger
Definition StateInit.cpp:67
std::shared_ptr< assembler::ViscousDampingPrev > damping_prev_assembler
Definition State.hpp:201
bool is_contact_enabled() const
does the simulation have contact
Definition State.hpp:708
void build_collision_mesh()
extracts the boundary mesh for collision, called in build_basis
Definition State.cpp:1327
Eigen::VectorXi disc_orders
vector of discretization orders, used when not all elements have the same degree, one per element
Definition State.hpp:226
std::vector< mesh::LocalBoundary > local_neumann_boundary
mapping from elements to nodes for neumann boundary conditions
Definition State.hpp:563
double characteristic_force_density
Definition State.hpp:245
std::shared_ptr< assembler::PressureAssembler > build_pressure_assembler() const
Definition State.hpp:297
void solve_homogenization(const int time_steps, const double t0, const double dt, Eigen::MatrixXd &sol, UserPostStepCallback user_post_step={})
void init_linear_solve(Eigen::MatrixXd &sol, const double t=1.0, const InitialConditionOverride *ic_override=nullptr)
initialize the linear solve
std::shared_ptr< assembler::PressureAssembler > elasticity_pressure_assembler
Definition State.hpp:198
void build_mesh_matrices(Eigen::MatrixXd &V, Eigen::MatrixXi &F)
Build the mesh matrices (vertices and elements) from the mesh using the bases node ordering.
bool is_problem_linear() const
Returns whether the system is linear. Collisions and pressure add nonlinearity to the problem.
Definition State.hpp:530
std::shared_ptr< assembler::MixedAssembler > mixed_assembler
Definition State.hpp:195
std::map< int, Eigen::MatrixXd > polys
polygons, used since poly have no geom mapping
Definition State.hpp:221
assembler::AssemblyValsCache pure_mass_ass_vals_cache
Definition State.hpp:234
Eigen::MatrixXd rhs
System right-hand side.
Definition State.hpp:248
std::unordered_map< int, std::vector< mesh::LocalBoundary > > local_pressure_cavity
mapping from elements to nodes for pressure boundary conditions
Definition State.hpp:567
void init_homogenization_solve(const double t)
static int quadrature_order(const std::string &assembler, const int basis_degree, const BasisType &b_type, const int dim)
utility for retrieving the needed quadrature order to precisely integrate the given form on the given...
Caches basis evaluation and geometric mapping at every element.
Utilies related to export of geometry.
Definition OutData.hpp:33
stores all runtime data
Definition OutData.hpp:348
all stats from polyfem
Definition OutData.hpp:375
void compute_mesh_stats(const polyfem::mesh::Mesh &mesh)
compute stats (counts els type, mesh lenght, etc), step 1 of solve
Definition OutData.cpp:3172
Abstract mesh class to capture 2d/3d conforming and non-conforming meshes.
Definition Mesh.hpp:41
static std::unique_ptr< Mesh > create(const std::string &path, const bool non_conforming=false)
factory to build the proper mesh
Definition Mesh.cpp:173
class to store time stepping data
Definition SolveData.hpp:59
Used for test only.
spdlog::logger & logger()
Retrieves the current logger.
Definition Logger.cpp:44
std::array< int, 2 > QuadratureOrders
Definition Types.hpp:19
nlohmann::json json
Definition Common.hpp:9
std::function< void(int step, State &state, const Eigen::MatrixXd &sol, const Eigen::MatrixXd *disp_grad, const Eigen::MatrixXd *pressure)> UserPostStepCallback
User callback at the end of every solver step.
Definition State.hpp:87
Eigen::Matrix< double, 1, Eigen::Dynamic, Eigen::RowMajor, 1, 3 > RowVectorNd
Definition Types.hpp:13
Eigen::SparseMatrix< double, Eigen::ColMajor > StiffnessMatrix
Definition Types.hpp:24