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::mesh
72{
73 class Mesh2D;
74 class Mesh3D;
75} // namespace polyfem::mesh
76
77namespace polyfem::legacy
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
419 void solve_transient_linear(const int time_steps,
420 const double t0,
421 const double dt,
422 Eigen::MatrixXd &sol,
423 Eigen::MatrixXd &pressure,
424 UserPostStepCallback user_post_step = {},
425 const InitialConditionOverride *ic_override = nullptr);
426
434 void solve_transient_tensor_nonlinear(const int time_steps,
435 const double t0,
436 const double dt,
437 Eigen::MatrixXd &sol,
438 UserPostStepCallback user_post_step = {},
439 const InitialConditionOverride *ic_override = nullptr);
440
445 void init_nonlinear_tensor_solve(Eigen::MatrixXd &sol,
446 const double t = 1.0,
447 const bool init_time_integrator = true,
448 const InitialConditionOverride *ic_override = nullptr);
449
453 void init_linear_solve(Eigen::MatrixXd &sol,
454 const double t = 1.0,
455 const InitialConditionOverride *ic_override = nullptr);
456
460 void initial_solution(Eigen::MatrixXd &solution, const InitialConditionOverride *ic_override = nullptr) const;
464 void initial_velocity(Eigen::MatrixXd &velocity, const InitialConditionOverride *ic_override = nullptr) const;
468 void initial_acceleration(Eigen::MatrixXd &acceleration, const InitialConditionOverride *ic_override = nullptr) const;
474 void solve_linear(int step, Eigen::MatrixXd &sol, Eigen::MatrixXd &pressure, UserPostStepCallback user_post_step = {});
479 void solve_tensor_nonlinear(int step, Eigen::MatrixXd &sol, const bool init_lagging = true, UserPostStepCallback user_post_step = {});
480
483 std::shared_ptr<polysolve::nonlinear::Solver> make_nl_solver(bool for_al) const;
484
486 std::shared_ptr<utils::PeriodicBoundary> periodic_bc;
487 bool has_periodic_bc() const
488 {
489 return args["boundary_conditions"]["periodic_boundary"]["enabled"].get<bool>();
490 }
491
501 void solve_linear(
502 int step,
503 const std::unique_ptr<polysolve::linear::Solver> &solver,
505 Eigen::VectorXd &b,
506 const bool compute_spectrum,
507 Eigen::MatrixXd &sol, Eigen::MatrixXd &pressure, UserPostStepCallback user_post_step = {});
508
510 bool is_problem_linear() const { return assembler->is_linear() && !is_contact_enabled() && !is_pressure_enabled() && !has_constraints(); }
511
512 bool has_constraints() const
513 {
514 return has_constraints_;
515 }
516
517 private:
519
520 public:
523 void build_stiffness_mat(StiffnessMatrix &stiffness);
524
525 //---------------------------------------------------
526 //-----------------nodes flags-----------------------
527 //---------------------------------------------------
528
529 public:
531 std::unordered_map<int, std::array<bool, 3>>
532 boundary_conditions_ids(const std::string &bc_type) const;
533
535 std::vector<int> boundary_nodes;
537 std::vector<int> pressure_boundary_nodes;
539 std::vector<mesh::LocalBoundary> total_local_boundary;
541 std::vector<mesh::LocalBoundary> local_boundary;
543 std::vector<mesh::LocalBoundary> local_neumann_boundary;
545 std::vector<mesh::LocalBoundary> local_pressure_boundary;
547 std::unordered_map<int, std::vector<mesh::LocalBoundary>> local_pressure_cavity;
549 std::map<int, basis::InterfaceData> poly_edge_to_data;
551 std::vector<int> dirichlet_nodes;
552 std::vector<RowVectorNd> dirichlet_nodes_position;
554 std::vector<int> neumann_nodes;
555 std::vector<RowVectorNd> neumann_nodes_position;
556
558 Eigen::VectorXi in_node_to_node;
561
562 std::vector<int> primitive_to_node() const;
563 std::vector<int> node_to_primitive() const;
564
565 private:
567 void build_node_mapping();
568
569 //---------------------------------------------------
570 //-----------------Geometry--------------------------
571 //---------------------------------------------------
572 public:
574 std::unique_ptr<mesh::Mesh> mesh;
577
583 void load_mesh(bool non_conforming = false,
584 const std::vector<std::string> &names = std::vector<std::string>(),
585 const std::vector<Eigen::MatrixXi> &cells = std::vector<Eigen::MatrixXi>(),
586 const std::vector<Eigen::MatrixXd> &vertices = std::vector<Eigen::MatrixXd>());
587
593 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);
594
599 void load_mesh(const Eigen::MatrixXd &V, const Eigen::MatrixXi &F, bool non_conforming = false)
600 {
601 mesh = mesh::Mesh::create(V, F, non_conforming);
602 load_mesh(non_conforming);
603 }
604
606 void reset_mesh();
607
609 void build_mesh_matrices(Eigen::MatrixXd &V, Eigen::MatrixXi &F);
610
611#ifdef POLYFEM_WITH_ITR
617 bool remesh(const double time, const double dt, Eigen::MatrixXd &sol);
618#endif
619
621 void get_vertices(Eigen::MatrixXd &vertices) const
622 {
623 vertices.setZero(mesh->n_vertices(), mesh->dimension());
624
625 for (int v = 0; v < mesh->n_vertices(); v++)
626 vertices.row(v) = mesh->point(v);
627 }
628
630 void get_elements(Eigen::MatrixXi &elements) const
631 {
632 assert(mesh->is_simplicial());
633
634 auto node_to_primitive_map = node_to_primitive();
635
636 const auto &gbases = geom_bases();
637 int dim = mesh->dimension();
638 elements.setZero(gbases.size(), dim + 1);
639 for (int e = 0; e < gbases.size(); e++)
640 {
641 int i = 0;
642 for (const auto &gbs : gbases[e].bases)
643 elements(e, i++) = node_to_primitive_map[gbs.global()[0].index];
644 }
645 }
646
647 //---------------------------------------------------
648 //-----------------IPC-------------------------------
649 //---------------------------------------------------
650
652 ipc::CollisionMesh collision_mesh;
653
655 ipc::CollisionMesh periodic_collision_mesh;
658
660 static void build_collision_mesh(
661 const mesh::Mesh &mesh,
662 const int n_bases,
663 const std::vector<basis::ElementBases> &bases,
664 const std::vector<basis::ElementBases> &geom_bases,
665 const std::vector<mesh::LocalBoundary> &total_local_boundary,
667 const json &args,
668 const std::function<std::string(const std::string &)> &resolve_input_path,
669 const Eigen::VectorXi &in_node_to_node,
670 ipc::CollisionMesh &collision_mesh);
671
675
679 bool is_obstacle_vertex(const size_t vi) const
680 {
681 // The obstalce vertices are at the bottom of the collision mesh vertices
682 return vi >= collision_mesh.full_num_vertices() - obstacle.n_vertices();
683 }
684
689 {
690 return args["contact"]["enabled"];
691 }
692
697 {
698 return args["contact"]["adhesion"]["adhesion_enabled"];
699 }
700
705 {
706 return (args["boundary_conditions"]["pressure_boundary"].size() > 0)
707 || (args["boundary_conditions"]["pressure_cavity"].size() > 0);
708 }
709
711 bool has_dhat = false;
712
713 //---------------------------------------------------
714 //-----------------OUTPUT----------------------------
715 //---------------------------------------------------
716 public:
718 std::string output_dir;
728
729 std::function<void(int, int, double, double)> time_callback = nullptr;
730
734 void export_data(const Eigen::MatrixXd &sol, const Eigen::MatrixXd &pressure);
735
743 void save_timestep(const double time, const int t, const double t0, const double dt, const Eigen::MatrixXd &sol, const Eigen::MatrixXd &pressure);
744
750 void save_subsolve(const int i, const int t, const Eigen::MatrixXd &sol, const Eigen::MatrixXd &pressure);
751
755 void save_json(const Eigen::MatrixXd &sol, std::ostream &out);
756
759 void save_json(const Eigen::MatrixXd &sol);
760
762 void compute_errors(const Eigen::MatrixXd &sol);
763
766 void save_restart_json(const double t0, const double dt, const int t) const;
767
768 //-----------PATH management
771 std::string root_path() const;
772
777 std::string resolve_input_path(const std::string &path, const bool only_if_exists = false) const;
778
782 std::string resolve_output_path(const std::string &path) const;
783
784 //---------------------------------------------------
785 //-----------------differentiable--------------------
786 //---------------------------------------------------
787 public:
789
790 //---------------------------------------------------
791 //-----------------homogenization--------------------
792 //---------------------------------------------------
793 public:
795
797 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]
798 void init_homogenization_solve(const double t);
799 void solve_homogenization(const int time_steps, const double t0, const double dt, Eigen::MatrixXd &sol, UserPostStepCallback user_post_step = {});
800 bool is_homogenization() const
801 {
802 return args["boundary_conditions"]["periodic_boundary"]["linear_displacement_offset"].size() > 0;
803 }
804 };
805
806} // namespace polyfem::legacy
int V
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.
timers from polyfem.
all stats from polyfem
void compute_mesh_stats(const polyfem::mesh::Mesh &mesh)
compute stats (counts els type, mesh lenght, etc), step 1 of solve
Definition OutData.cpp:2017
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 velocity
ndof by H (history size) matrix where each col is velocity from a time step.
Definition State.hpp:99
Eigen::MatrixXd acceleration
ndof by H (history size) matrix where each col is acceleration from a time step.
Definition State.hpp:103
main class that contains the polyfem solver and all its state
Definition State.hpp:114
std::shared_ptr< assembler::Problem > problem
current problem, it contains rhs and bc
Definition State.hpp:204
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
bool iso_parametric() const
check if using iso parametric bases
Definition State.cpp:466
void reset_mesh()
Resets the mesh.
Definition StateLoad.cpp:22
StiffnessMatrix pure_mass
Definition State.hpp:240
void init(const json &args, const bool strict_validation)
initialize the polyfem solver with a json settings
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
const std::vector< basis::ElementBases > & geom_bases() const
Get a constant reference to the geometry mapping bases.
Definition State.hpp:264
ipc::CollisionMesh collision_mesh
IPC collision mesh.
Definition State.hpp:652
StiffnessMatrix mass
Mass matrix, it is computed only for time dependent problems.
Definition State.hpp:239
bool has_dhat
stores if input json contains dhat
Definition State.hpp:711
std::vector< RowVectorNd > dirichlet_nodes_position
Definition State.hpp:552
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::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.
void build_collision_mesh()
extracts the boundary mesh for collision, called in build_basis
Definition State.cpp:1330
std::vector< mesh::LocalBoundary > local_boundary
mapping from elements to nodes for dirichlet boundary conditions
Definition State.hpp:541
std::vector< mesh::LocalBoundary > local_pressure_boundary
mapping from elements to nodes for pressure boundary conditions
Definition State.hpp:545
std::vector< int > dirichlet_nodes
per node dirichlet
Definition State.hpp:551
std::shared_ptr< polyfem::mesh::MeshNodes > mesh_nodes
Mapping from input nodes to FE nodes.
Definition State.hpp:229
void compute_errors(const Eigen::MatrixXd &sol)
computes all errors
Eigen::VectorXi in_primitive_to_primitive
maps in vertices/edges/faces/cells to polyfem vertices/edges/faces/cells
Definition State.hpp:560
void solve_tensor_nonlinear(int step, Eigen::MatrixXd &sol, const bool init_lagging=true, UserPostStepCallback user_post_step={})
solves nonlinear problems
std::shared_ptr< assembler::Mass > mass_matrix_assembler
Definition State.hpp:192
std::vector< int > pressure_boundary_nodes
list of neumann boundary nodes
Definition State.hpp:537
void init_solve(Eigen::MatrixXd &sol, Eigen::MatrixXd &pressure, const InitialConditionOverride *ic_override=nullptr)
initialize solver
std::unordered_map< int, std::vector< mesh::LocalBoundary > > local_pressure_cavity
mapping from elements to nodes for pressure boundary conditions
Definition State.hpp:547
std::unique_ptr< mesh::Mesh > mesh
current mesh, it can be a Mesh2D or Mesh3D
Definition State.hpp:574
Eigen::MatrixXd rhs
System right-hand side.
Definition State.hpp:248
void build_node_mapping()
build the mapping from input nodes to polyfem nodes
Definition State.cpp:249
std::unique_ptr< polysolve::linear::Solver > static_linear_solver_cache
Linear solver instance from the most recent static linear solve.
Definition State.hpp:389
void init_linear_solve(Eigen::MatrixXd &sol, const double t=1.0, const InitialConditionOverride *ic_override=nullptr)
initialize the linear solve
void initial_acceleration(Eigen::MatrixXd &acceleration, const InitialConditionOverride *ic_override=nullptr) const
Load or compute the initial acceleration.
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.
io::OutStatsData stats
Other statistics.
Definition State.hpp:724
json args
main input arguments containing all defaults
Definition State.hpp:136
void build_polygonal_basis()
builds bases for polygons, called inside build_basis
Definition State.cpp:1033
assembler::AssemblyValsCache pure_mass_ass_vals_cache
Definition State.hpp:234
std::vector< basis::ElementBases > geom_bases_
Geometric mapping bases, if the elements are isoparametric, this list is empty.
Definition State.hpp:211
std::vector< RowVectorNd > neumann_nodes_position
Definition State.hpp:555
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
Eigen::VectorXi disc_ordersq
Definition State.hpp:226
std::map< int, Eigen::MatrixXd > polys
polygons, used since poly have no geom mapping
Definition State.hpp:221
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
void sol_to_pressure(Eigen::MatrixXd &sol, Eigen::MatrixXd &pressure)
splits the solution in solution and pressure for mixed problems
Definition State.cpp:375
void solve_homogenization(const int time_steps, const double t0, const double dt, Eigen::MatrixXd &sol, UserPostStepCallback user_post_step={})
int n_pressure_bases
number of pressure bases
Definition State.hpp:216
void set_max_threads(const int max_threads=std::numeric_limits< int >::max())
assembler::AssemblyValsCache pressure_ass_vals_cache
used to store assembly values for pressure for small problems
Definition State.hpp:236
int n_bases
number of bases
Definition State.hpp:214
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)".
void set_log_level(const spdlog::level::level_enum log_level)
change log level
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:1465
double starting_min_edge_length
Definition State.hpp:725
std::shared_ptr< polyfem::mesh::MeshNodes > geom_mesh_nodes
Definition State.hpp:229
std::string resolve_output_path(const std::string &path) const
Resolve output path relative to output_dir if the path is not absolute.
double min_boundary_edge_length
Definition State.hpp:727
io::OutRuntimeData timings
runtime statistics
Definition State.hpp:722
void build_stiffness_mat(StiffnessMatrix &stiffness)
utility that builds the stiffness matrix and collects stats, used only for linear problems
bool has_constraints() const
Definition State.hpp:512
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.
std::shared_ptr< assembler::ViscousDamping > damping_assembler
Definition State.hpp:200
std::vector< basis::ElementBases > pressure_bases
FE pressure bases for mixed elements, the size is #elements.
Definition State.hpp:209
mesh::Obstacle obstacle
Obstacles used in collisions.
Definition State.hpp:576
std::string root_path() const
Get the root path for the state (e.g., args["root_path"] or ".")
std::shared_ptr< assembler::ViscousDampingPrev > damping_prev_assembler
Definition State.hpp:201
std::shared_ptr< assembler::Assembler > pressure_assembler
Definition State.hpp:196
std::string formulation() const
return the formulation (checks if the problem is scalar or not and deals with multiphysics)
Definition State.cpp:332
Eigen::VectorXi disc_orders
vector of discretization orders, used when not all elements have the same degree, one per element
Definition State.hpp:226
assembler::AssemblyValsCache ass_vals_cache
used to store assembly values for small problems
Definition State.hpp:232
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
std::shared_ptr< utils::PeriodicBoundary > periodic_bc
periodic BC and periodic mesh utils
Definition State.hpp:486
io::OutGeometryData out_geom
visualization stuff
Definition State.hpp:720
void init_homogenization_solve(const double t)
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
assembler::AssemblyValsCache mass_ass_vals_cache
Definition State.hpp:233
QuadratureOrders n_boundary_samples() const
quadrature used for projecting boundary conditions
Definition State.hpp:304
bool use_avg_pressure
use average pressure for stokes problem to fix the additional dofs, true by default if false,...
Definition State.hpp:252
double characteristic_length
Definition State.hpp:244
void export_data(const Eigen::MatrixXd &sol, const Eigen::MatrixXd &pressure)
saves all data on the disk according to the input params
std::shared_ptr< assembler::Assembler > assembler
assemblers
Definition State.hpp:190
void build_basis()
builds the bases step 2 of solve modifies bases, pressure_bases, geom_bases_, boundary_nodes,...
Definition State.cpp:507
std::map< int, basis::InterfaceData > poly_edge_to_data
nodes on the boundary of polygonal elements, used for harmonic bases
Definition State.hpp:549
double avg_mass
average system mass, used for contact with IPC
Definition State.hpp:242
void set_materials(std::vector< std::shared_ptr< assembler::Assembler > > &assemblers) const
set the material and the problem dimension
void save_json(const Eigen::MatrixXd &sol, std::ostream &out)
saves the output statistic to a stream
std::vector< basis::ElementBases > bases
FE bases, the size is #elements.
Definition State.hpp:207
void initial_velocity(Eigen::MatrixXd &velocity, const InitialConditionOverride *ic_override=nullptr) const
Load or compute the initial velocity.
void solve_linear(int step, Eigen::MatrixXd &sol, Eigen::MatrixXd &pressure, UserPostStepCallback user_post_step={})
solves a linear problem
std::shared_ptr< assembler::PressureAssembler > elasticity_pressure_assembler
Definition State.hpp:198
void build_periodic_collision_mesh()
Definition State.cpp:1196
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:68
std::map< int, std::pair< Eigen::MatrixXd, Eigen::MatrixXi > > polys_3d
polyhedra, used since poly have no geom mapping
Definition State.hpp:223
bool is_adhesion_enabled() const
does the simulation have adhesion
Definition State.hpp:696
std::string output_dir
Directory for output files.
Definition State.hpp:718
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
bool is_pressure_enabled() const
does the simulation has pressure
Definition State.hpp:704
void get_vertices(Eigen::MatrixXd &vertices) const
Gather geometry vertices into a dense matrix.
Definition State.hpp:621
bool has_periodic_bc() const
Definition State.hpp:487
ipc::CollisionMesh periodic_collision_mesh
IPC collision mesh under periodic BC.
Definition State.hpp:655
std::vector< int > neumann_nodes
per node neumann
Definition State.hpp:554
Eigen::VectorXi periodic_collision_mesh_to_basis
index mapping from periodic 2x2 collision mesh to FE periodic mesh
Definition State.hpp:657
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:599
std::shared_ptr< polyfem::mesh::MeshNodes > pressure_mesh_nodes
Definition State.hpp:229
assembler::MacroStrainValue macro_strain_constraint
Definition State.hpp:794
std::shared_ptr< assembler::RhsAssembler > build_rhs_assembler() const
build a RhsAssembler for the problem
Definition State.hpp:289
bool is_problem_linear() const
Returns whether the system is linear. Collisions and pressure add nonlinearity to the problem.
Definition State.hpp:510
std::shared_ptr< assembler::PressureAssembler > build_pressure_assembler() const
Definition State.hpp:297
void init_time()
initialize time settings if args contains "time"
bool is_obstacle_vertex(const size_t vi) const
checks if vertex is obstacle
Definition State.hpp:679
std::vector< mesh::LocalBoundary > total_local_boundary
mapping from elements to nodes for all mesh
Definition State.hpp:539
std::shared_ptr< polysolve::nonlinear::Solver > make_nl_solver(bool for_al) const
factory to create the nl solver depending on input
int n_geom_bases
number of geometric bases
Definition State.hpp:218
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
spdlog::sink_ptr console_sink_
logger sink to stdout
Definition State.hpp:177
std::shared_ptr< assembler::HRZMass > pure_mass_matrix_assembler
Definition State.hpp:193
void initial_solution(Eigen::MatrixXd &solution, const InitialConditionOverride *ic_override=nullptr) const
Load or compute the initial solution.
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 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:1596
void solve_problem(Eigen::MatrixXd &sol, Eigen::MatrixXd &pressure, UserPostStepCallback user_post_step={}, const InitialConditionOverride *ic_override=nullptr)
solves the problems
Definition State.cpp:1668
void get_elements(Eigen::MatrixXi &elements) const
Gather geometry elements into a dense matrix.
Definition State.hpp:630
double starting_max_edge_length
Definition State.hpp:726
std::vector< mesh::LocalBoundary > local_neumann_boundary
mapping from elements to nodes for neumann boundary conditions
Definition State.hpp:543
std::vector< int > primitive_to_node() const
Definition State.cpp:232
std::vector< int > boundary_nodes
list of boundary nodes
Definition State.hpp:535
solver::SolveData solve_data
timedependent stuff cached
Definition State.hpp:382
std::vector< int > node_to_primitive() const
Definition State.cpp:239
spdlog::sink_ptr file_sink_
Definition State.hpp:178
Eigen::VectorXi in_node_to_node
Inpute nodes (including high-order) to polyfem nodes, only for isoparametric.
Definition State.hpp:558
double characteristic_force_density
Definition State.hpp:245
bool is_homogenization() const
Definition State.hpp:800
std::function< void(int, int, double, double)> time_callback
Definition State.hpp:729
bool is_contact_enabled() const
does the simulation have contact
Definition State.hpp:688
std::shared_ptr< assembler::MixedAssembler > mixed_assembler
Definition State.hpp:195
State()
Constructor.
Definition StateInit.cpp:59
Utilies related to export of geometry.
Definition OutData.hpp:37
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.
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
polyfem::legacy::State State
Definition Remesher.hpp:19
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
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