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>
7
10
19
20#include <polyfem/mesh/Mesh.hpp>
24
26
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 private:
116 // Own the reader borrowed by RHS assemblers, outliving the solver state.
118
119 public:
120 //---------------------------------------------------
121 //-----------------initialization--------------------
122 //---------------------------------------------------
123
124 ~State() = default;
126 State();
127
129 void set_max_threads(const int max_threads = std::numeric_limits<int>::max());
130
134 void init(const json &args, const bool strict_validation);
135
137 void init_time();
138
141
142 //---------------------------------------------------
143 //-----------------logger----------------------------
144 //---------------------------------------------------
145
151 void init_logger(
152 const std::string &log_file,
153 const spdlog::level::level_enum log_level,
154 const spdlog::level::level_enum file_log_level,
155 const bool is_quiet);
156
160 void init_logger(std::ostream &os, const spdlog::level::level_enum log_level);
161
164 void set_log_level(const spdlog::level::level_enum log_level);
165
169 std::string get_log(const Eigen::MatrixXd &sol)
170 {
171 std::stringstream ss;
172 save_json(sol, ss);
173 return ss.str();
174 }
175
176 private:
178 void init_logger(const std::vector<spdlog::sink_ptr> &sinks, const spdlog::level::level_enum log_level);
179
181 spdlog::sink_ptr console_sink_ = nullptr;
182 spdlog::sink_ptr file_sink_ = nullptr;
183
184 public:
185 //---------------------------------------------------
186 //-----------------assembly--------------------------
187 //---------------------------------------------------
188
190
192
194 std::shared_ptr<assembler::Assembler> assembler = nullptr;
195
196 std::shared_ptr<assembler::Mass> mass_matrix_assembler = nullptr;
197 std::shared_ptr<assembler::HRZMass> pure_mass_matrix_assembler = nullptr;
198
199 std::shared_ptr<assembler::MixedAssembler> mixed_assembler = nullptr;
200 std::shared_ptr<assembler::Assembler> pressure_assembler = nullptr;
201
202 std::shared_ptr<assembler::PressureAssembler> elasticity_pressure_assembler = nullptr;
203
204 std::shared_ptr<assembler::ViscousDamping> damping_assembler = nullptr;
205 std::shared_ptr<assembler::ViscousDampingPrev> damping_prev_assembler = nullptr;
206
208 std::shared_ptr<assembler::Problem> problem;
209
211 std::vector<basis::ElementBases> bases;
213 std::vector<basis::ElementBases> pressure_bases;
215 std::vector<basis::ElementBases> geom_bases_;
216
223
225 std::map<int, Eigen::MatrixXd> polys;
227 std::map<int, std::pair<Eigen::MatrixXd, Eigen::MatrixXi>> polys_3d;
228
230 Eigen::VectorXi disc_orders, disc_ordersq;
231
233 std::shared_ptr<polyfem::mesh::MeshNodes> mesh_nodes, geom_mesh_nodes, pressure_mesh_nodes;
234
241
246 double avg_mass;
247
250
252 Eigen::MatrixXd rhs;
253
257
260 std::string formulation() const;
261
264 bool iso_parametric() const;
265
268 const std::vector<basis::ElementBases> &geom_bases() const
269 {
270 return iso_parametric() ? bases : geom_bases_;
271 }
272
277 void build_basis();
281 void assemble_rhs();
285 void assemble_mass_mat();
286
288 std::shared_ptr<assembler::RhsAssembler> build_rhs_assembler(
289 const int n_bases,
290 const std::vector<basis::ElementBases> &bases,
293 std::shared_ptr<assembler::RhsAssembler> build_rhs_assembler() const
294 {
296 }
297
298 std::shared_ptr<assembler::PressureAssembler> build_pressure_assembler(
299 const int n_bases_,
300 const std::vector<basis::ElementBases> &bases_) const;
301 std::shared_ptr<assembler::PressureAssembler> build_pressure_assembler() const
302 {
304 }
305
309 {
311 const int n_b_samples_j = args["space"]["advanced"]["n_boundary_samples"];
312 const int gdiscr_order = mesh->orders().size() <= 0 ? 1 : mesh->orders().maxCoeff();
313 const int discr_order = std::max({disc_orders.maxCoeff(), disc_ordersq.maxCoeff(), gdiscr_order});
314
315 const int n_b_samples = std::max(n_b_samples_j, AssemblerUtils::quadrature_order("Mass", discr_order, AssemblerUtils::BasisType::POLY, mesh->dimension()));
316 return {{n_b_samples, n_b_samples}};
317 }
318
319 int ndof() const
320 {
321 const int actual_dim = problem->is_scalar() ? 1 : mesh->dimension();
322 if (mixed_assembler == nullptr)
323 return actual_dim * n_bases;
324 else
325 return actual_dim * n_bases + n_pressure_bases;
326 }
327
328 private:
332 void sol_to_pressure(Eigen::MatrixXd &sol, Eigen::MatrixXd &pressure);
335
336 public:
339 void set_materials(std::vector<std::shared_ptr<assembler::Assembler>> &assemblers) const;
343
344 //---------------------------------------------------
345 //-----------------solver----------------------------
346 //---------------------------------------------------
347
348 public:
354 void solve_problem(Eigen::MatrixXd &sol,
355 Eigen::MatrixXd &pressure,
356 UserPostStepCallback user_post_step = {},
357 const InitialConditionOverride *ic_override = nullptr);
358
364 void solve(Eigen::MatrixXd &sol,
365 Eigen::MatrixXd &pressure,
366 UserPostStepCallback user_post_step = {},
367 const InitialConditionOverride *ic_override = nullptr)
368 {
369 if (!mesh)
370 {
371 logger().error("Load the mesh first!");
372 return;
373 }
375
376 build_basis();
377
378 assemble_rhs();
380
381 solve_problem(sol, pressure, user_post_step, ic_override);
382 }
383
386
392 std::unique_ptr<polysolve::linear::Solver> static_linear_solver_cache;
393
398 void init_solve(Eigen::MatrixXd &sol,
399 Eigen::MatrixXd &pressure,
400 const InitialConditionOverride *ic_override = nullptr);
401
408 void solve_transient_navier_stokes_split(const int time_steps,
409 const double dt,
410 Eigen::MatrixXd &sol,
411 Eigen::MatrixXd &pressure,
412 UserPostStepCallback user_post_step = {});
413
422 void solve_transient_linear(const int time_steps,
423 const double t0,
424 const double dt,
425 Eigen::MatrixXd &sol,
426 Eigen::MatrixXd &pressure,
427 UserPostStepCallback user_post_step = {},
428 const InitialConditionOverride *ic_override = nullptr);
429
437 void solve_transient_tensor_nonlinear(const int time_steps,
438 const double t0,
439 const double dt,
440 Eigen::MatrixXd &sol,
441 UserPostStepCallback user_post_step = {},
442 const InitialConditionOverride *ic_override = nullptr);
443
448 void init_nonlinear_tensor_solve(Eigen::MatrixXd &sol,
449 const double t = 1.0,
450 const bool init_time_integrator = true,
451 const InitialConditionOverride *ic_override = nullptr);
452
456 void init_linear_solve(Eigen::MatrixXd &sol,
457 const double t = 1.0,
458 const InitialConditionOverride *ic_override = nullptr);
459
463 void initial_solution(Eigen::MatrixXd &solution, const InitialConditionOverride *ic_override = nullptr) const;
467 void initial_velocity(Eigen::MatrixXd &velocity, const InitialConditionOverride *ic_override = nullptr) const;
471 void initial_acceleration(Eigen::MatrixXd &acceleration, const InitialConditionOverride *ic_override = nullptr) const;
477 void solve_linear(int step, Eigen::MatrixXd &sol, Eigen::MatrixXd &pressure, UserPostStepCallback user_post_step = {});
482 void solve_tensor_nonlinear(int step, Eigen::MatrixXd &sol, const bool init_lagging = true, UserPostStepCallback user_post_step = {});
483
486 std::shared_ptr<polysolve::nonlinear::Solver> make_nl_solver(bool for_al) const;
487
489 Eigen::VectorXi periodic_dof_mask;
490 Eigen::MatrixXd periodic_tile_offsets;
491 bool has_periodic_bc() const
492 {
493 return !args["boundary_conditions"]["periodic"].empty();
494 }
495
505 void solve_linear(
506 int step,
507 const std::unique_ptr<polysolve::linear::Solver> &solver,
509 Eigen::VectorXd &b,
510 const bool compute_spectrum,
511 Eigen::MatrixXd &sol, Eigen::MatrixXd &pressure, UserPostStepCallback user_post_step = {});
512
514 bool is_problem_linear() const { return assembler->is_linear() && !is_contact_enabled() && !is_pressure_enabled() && !has_constraints(); }
515
516 bool has_constraints() const
517 {
518 return has_constraints_;
519 }
520
521 private:
523
524 public:
527 void build_stiffness_mat(StiffnessMatrix &stiffness);
528
529 //---------------------------------------------------
530 //-----------------nodes flags-----------------------
531 //---------------------------------------------------
532
533 public:
535 std::unordered_map<int, std::array<bool, 3>>
536 boundary_conditions_ids(const std::string &bc_type) const;
537
539 std::vector<int> boundary_nodes;
541 std::vector<int> pressure_boundary_nodes;
543 std::vector<mesh::LocalBoundary> total_local_boundary;
545 std::vector<mesh::LocalBoundary> local_boundary;
547 std::vector<mesh::LocalBoundary> local_neumann_boundary;
549 std::vector<mesh::LocalBoundary> local_pressure_boundary;
551 std::unordered_map<int, std::vector<mesh::LocalBoundary>> local_pressure_cavity;
553 std::map<int, basis::InterfaceData> poly_edge_to_data;
555 std::vector<int> dirichlet_nodes;
556 std::vector<RowVectorNd> dirichlet_nodes_position;
558 std::vector<int> neumann_nodes;
559 std::vector<RowVectorNd> neumann_nodes_position;
560
562 Eigen::VectorXi in_node_to_node;
565
566 std::vector<int> primitive_to_node() const;
567 std::vector<int> node_to_primitive() const;
568
569 private:
571 void build_node_mapping();
572
573 //---------------------------------------------------
574 //-----------------Geometry--------------------------
575 //---------------------------------------------------
576 public:
578 std::unique_ptr<mesh::Mesh> mesh;
581
587 void load_mesh(bool non_conforming = false,
588 const std::vector<std::string> &names = std::vector<std::string>(),
589 const std::vector<Eigen::MatrixXi> &cells = std::vector<Eigen::MatrixXi>(),
590 const std::vector<Eigen::MatrixXd> &vertices = std::vector<Eigen::MatrixXd>());
591
597 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);
598
603 void load_mesh(const Eigen::MatrixXd &V, const Eigen::MatrixXi &F, bool non_conforming = false)
604 {
605 mesh = mesh::Mesh::create(mesh::MeshData(V, F), non_conforming);
606 load_mesh(non_conforming);
607 }
608
610 void reset_mesh();
611
613 void build_mesh_matrices(Eigen::MatrixXd &V, Eigen::MatrixXi &F);
614
615#ifdef POLYFEM_WITH_ITR
621 bool remesh(const double time, const double dt, Eigen::MatrixXd &sol);
622#endif
623
625 void get_vertices(Eigen::MatrixXd &vertices) const
626 {
627 vertices.setZero(mesh->n_vertices(), mesh->dimension());
628
629 for (int v = 0; v < mesh->n_vertices(); v++)
630 vertices.row(v) = mesh->point(v);
631 }
632
634 void get_elements(Eigen::MatrixXi &elements) const
635 {
636 assert(mesh->is_simplicial());
637
638 auto node_to_primitive_map = node_to_primitive();
639
640 const auto &gbases = geom_bases();
641 int dim = mesh->dimension();
642 elements.setZero(gbases.size(), dim + 1);
643 for (int e = 0; e < gbases.size(); e++)
644 {
645 int i = 0;
646 for (const auto &gbs : gbases[e].bases)
647 elements(e, i++) = node_to_primitive_map[gbs.global()[0].index];
648 }
649 }
650
651 //---------------------------------------------------
652 //-----------------IPC-------------------------------
653 //---------------------------------------------------
654
656 ipc::CollisionMesh collision_mesh;
657
659 ipc::CollisionMesh periodic_collision_mesh;
662
664 static void build_collision_mesh(
665 const mesh::Mesh &mesh,
666 const int n_bases,
667 const std::vector<basis::ElementBases> &bases,
668 const std::vector<basis::ElementBases> &geom_bases,
669 const std::vector<mesh::LocalBoundary> &total_local_boundary,
671 const json &args,
672 const std::function<std::string(const std::string &)> &resolve_input_path,
673 const Eigen::VectorXi &in_node_to_node,
674 ipc::CollisionMesh &collision_mesh);
675
679
683 bool is_obstacle_vertex(const size_t vi) const
684 {
685 // The obstalce vertices are at the bottom of the collision mesh vertices
686 return vi >= collision_mesh.full_num_vertices() - obstacle.n_vertices();
687 }
688
693 {
694 return args["contact"]["enabled"];
695 }
696
701 {
702 return args["contact"]["adhesion"]["adhesion_enabled"];
703 }
704
709 {
710 return (args["boundary_conditions"]["pressure_boundary"].size() > 0)
711 || (args["boundary_conditions"]["pressure_cavity"].size() > 0);
712 }
713
715 bool has_dhat = false;
716
717 //---------------------------------------------------
718 //-----------------OUTPUT----------------------------
719 //---------------------------------------------------
720 public:
722 std::string output_dir;
732
733 std::function<void(int, int, double, double)> time_callback = nullptr;
734
738 void export_data(const Eigen::MatrixXd &sol, const Eigen::MatrixXd &pressure);
739
747 void save_timestep(const double time, const int t, const double t0, const double dt, const Eigen::MatrixXd &sol, const Eigen::MatrixXd &pressure);
748
754 void save_subsolve(const int i, const int t, const Eigen::MatrixXd &sol, const Eigen::MatrixXd &pressure);
755
759 void save_json(const Eigen::MatrixXd &sol, std::ostream &out);
760
763 void save_json(const Eigen::MatrixXd &sol);
764
766 void compute_errors(const Eigen::MatrixXd &sol);
767
770 void save_restart_json(const double t0, const double dt, const int t) const;
771
772 //-----------PATH management
775 std::string root_path() const;
776
781 std::string resolve_input_path(const std::string &path, const bool only_if_exists = false) const;
782
786 std::string resolve_output_path(const std::string &path) const;
787
788 //---------------------------------------------------
789 //-----------------differentiable--------------------
790 //---------------------------------------------------
791 public:
793
794 //---------------------------------------------------
795 //-----------------homogenization--------------------
796 //---------------------------------------------------
797 public:
799
801 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]
802 void init_homogenization_solve(const double t);
803 void solve_homogenization(const int time_steps, const double t0, const double dt, Eigen::MatrixXd &sol, UserPostStepCallback user_post_step = {});
804 bool is_homogenization() const
805 {
807 }
808 };
809
810} // 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:3021
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:208
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:471
void reset_mesh()
Resets the mesh.
Definition StateLoad.cpp:24
StiffnessMatrix pure_mass
Definition State.hpp:244
void init(const json &args, const bool strict_validation)
initialize the polyfem solver with a json settings
Eigen::VectorXi periodic_dof_mask
Explicit periodic boundary-pair data used by periodic contact.
Definition State.hpp:489
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:268
ipc::CollisionMesh collision_mesh
IPC collision mesh.
Definition State.hpp:656
StiffnessMatrix mass
Mass matrix, it is computed only for time dependent problems.
Definition State.hpp:243
bool has_dhat
stores if input json contains dhat
Definition State.hpp:715
std::vector< RowVectorNd > dirichlet_nodes_position
Definition State.hpp:556
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:1317
std::vector< mesh::LocalBoundary > local_boundary
mapping from elements to nodes for dirichlet boundary conditions
Definition State.hpp:545
std::vector< mesh::LocalBoundary > local_pressure_boundary
mapping from elements to nodes for pressure boundary conditions
Definition State.hpp:549
std::vector< int > dirichlet_nodes
per node dirichlet
Definition State.hpp:555
std::shared_ptr< polyfem::mesh::MeshNodes > mesh_nodes
Mapping from input nodes to FE nodes.
Definition State.hpp:233
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:564
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:196
std::vector< int > pressure_boundary_nodes
list of neumann boundary nodes
Definition State.hpp:541
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:551
std::unique_ptr< mesh::Mesh > mesh
current mesh, it can be a Mesh2D or Mesh3D
Definition State.hpp:578
Eigen::MatrixXd rhs
System right-hand side.
Definition State.hpp:252
void build_node_mapping()
build the mapping from input nodes to polyfem nodes
Definition State.cpp:254
std::unique_ptr< polysolve::linear::Solver > static_linear_solver_cache
Linear solver instance from the most recent static linear solve.
Definition State.hpp:392
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:728
json args
main input arguments containing all defaults
Definition State.hpp:140
void build_polygonal_basis()
builds bases for polygons, called inside build_basis
Definition State.cpp:1014
assembler::AssemblyValsCache pure_mass_ass_vals_cache
Definition State.hpp:238
std::vector< basis::ElementBases > geom_bases_
Geometric mapping bases, if the elements are isoparametric, this list is empty.
Definition State.hpp:215
std::vector< RowVectorNd > neumann_nodes_position
Definition State.hpp:559
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:94
Eigen::VectorXi disc_ordersq
Definition State.hpp:230
std::map< int, Eigen::MatrixXd > polys
polygons, used since poly have no geom mapping
Definition State.hpp:225
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:380
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:220
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:240
int n_bases
number of bases
Definition State.hpp:218
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:1462
double starting_min_edge_length
Definition State.hpp:729
std::shared_ptr< polyfem::mesh::MeshNodes > geom_mesh_nodes
Definition State.hpp:233
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:731
io::OutRuntimeData timings
runtime statistics
Definition State.hpp:726
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:516
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:204
std::vector< basis::ElementBases > pressure_bases
FE pressure bases for mixed elements, the size is #elements.
Definition State.hpp:213
mesh::Obstacle obstacle
Obstacles used in collisions.
Definition State.hpp:580
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:205
std::shared_ptr< assembler::Assembler > pressure_assembler
Definition State.hpp:200
std::string formulation() const
return the formulation (checks if the problem is scalar or not and deals with multiphysics)
Definition State.cpp:337
Eigen::VectorXi disc_orders
vector of discretization orders, used when not all elements have the same degree, one per element
Definition State.hpp:230
assembler::AssemblyValsCache ass_vals_cache
used to store assembly values for small problems
Definition State.hpp:236
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
io::OutGeometryData out_geom
visualization stuff
Definition State.hpp:724
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:169
assembler::AssemblyValsCache mass_ass_vals_cache
Definition State.hpp:237
QuadratureOrders n_boundary_samples() const
quadrature used for projecting boundary conditions
Definition State.hpp:308
bool use_avg_pressure
use average pressure for stokes problem to fix the additional dofs, true by default if false,...
Definition State.hpp:256
double characteristic_length
Definition State.hpp:248
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:194
void build_basis()
builds the bases step 2 of solve modifies bases, pressure_bases, geom_bases_, boundary_nodes,...
Definition State.cpp:509
std::map< int, basis::InterfaceData > poly_edge_to_data
nodes on the boundary of polygonal elements, used for harmonic bases
Definition State.hpp:553
double avg_mass
average system mass, used for contact with IPC
Definition State.hpp:246
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:211
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:202
Eigen::MatrixXd periodic_tile_offsets
Definition State.hpp:490
polyfem::io::FileSystemIO rhs_resources_
Definition State.hpp:117
void build_periodic_collision_mesh()
Definition State.cpp:1177
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:227
bool is_adhesion_enabled() const
does the simulation have adhesion
Definition State.hpp:700
std::string output_dir
Directory for output files.
Definition State.hpp:722
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:364
bool is_pressure_enabled() const
does the simulation has pressure
Definition State.hpp:708
void get_vertices(Eigen::MatrixXd &vertices) const
Gather geometry vertices into a dense matrix.
Definition State.hpp:625
bool has_periodic_bc() const
Definition State.hpp:491
ipc::CollisionMesh periodic_collision_mesh
IPC collision mesh under periodic BC.
Definition State.hpp:659
std::vector< int > neumann_nodes
per node neumann
Definition State.hpp:558
Eigen::VectorXi periodic_collision_mesh_to_basis
index mapping from periodic 2x2 collision mesh to FE periodic mesh
Definition State.hpp:661
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:603
std::shared_ptr< polyfem::mesh::MeshNodes > pressure_mesh_nodes
Definition State.hpp:233
assembler::MacroStrainValue macro_strain_constraint
Definition State.hpp:798
std::shared_ptr< assembler::RhsAssembler > build_rhs_assembler() const
build a RhsAssembler for the problem
Definition State.hpp:293
bool is_problem_linear() const
Returns whether the system is linear. Collisions and pressure add nonlinearity to the problem.
Definition State.hpp:514
std::shared_ptr< assembler::PressureAssembler > build_pressure_assembler() const
Definition State.hpp:301
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:683
std::vector< mesh::LocalBoundary > total_local_boundary
mapping from elements to nodes for all mesh
Definition State.hpp:543
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:222
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:181
std::shared_ptr< assembler::HRZMass > pure_mass_matrix_assembler
Definition State.hpp:197
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:1593
void solve_problem(Eigen::MatrixXd &sol, Eigen::MatrixXd &pressure, UserPostStepCallback user_post_step={}, const InitialConditionOverride *ic_override=nullptr)
solves the problems
Definition State.cpp:1666
void get_elements(Eigen::MatrixXi &elements) const
Gather geometry elements into a dense matrix.
Definition State.hpp:634
double starting_max_edge_length
Definition State.hpp:730
std::vector< mesh::LocalBoundary > local_neumann_boundary
mapping from elements to nodes for neumann boundary conditions
Definition State.hpp:547
std::vector< int > primitive_to_node() const
Definition State.cpp:237
std::vector< int > boundary_nodes
list of boundary nodes
Definition State.hpp:539
solver::SolveData solve_data
timedependent stuff cached
Definition State.hpp:385
std::vector< int > node_to_primitive() const
Definition State.cpp:244
spdlog::sink_ptr file_sink_
Definition State.hpp:182
Eigen::VectorXi in_node_to_node
Inpute nodes (including high-order) to polyfem nodes, only for isoparametric.
Definition State.hpp:562
double characteristic_force_density
Definition State.hpp:249
bool is_homogenization() const
Definition State.hpp:804
std::function< void(int, int, double, double)> time_callback
Definition State.hpp:733
bool is_contact_enabled() const
does the simulation have contact
Definition State.hpp:692
std::shared_ptr< assembler::MixedAssembler > mixed_assembler
Definition State.hpp:199
State()
Constructor.
Definition StateInit.cpp:59
Utilies related to export of geometry.
Definition OutData.hpp:37
Format-independent input used to construct a runtime Mesh.
Definition MeshData.hpp:12
Abstract mesh class to capture 2d/3d conforming and non-conforming meshes.
Definition Mesh.hpp:50
static std::unique_ptr< Mesh > create(MeshData data, bool non_conforming=false)
Construct a runtime mesh from format-independent decoded data.
Definition Mesh.cpp:80
class to store time stepping data
Definition SolveData.hpp:56
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