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
32
33#include <polysolve/linear/Solver.hpp>
34
35#include <Eigen/Dense>
36#include <Eigen/Sparse>
37
38#include <spdlog/sinks/basic_file_sink.h>
39
40#include <ipc/collision_mesh.hpp>
41#include <ipc/utils/logger.hpp>
42
43#include <memory>
44#include <string>
45#include <unordered_map>
46#include <functional>
47#include <cassert>
48#include <map>
49#include <utility>
50#include <vector>
51#include <sstream>
52#include <utility>
53#include <algorithm>
54#include <cstddef>
55
56// Forward declaration
58{
59 class Solver;
60}
61
62namespace polyfem::assembler
63{
64 class Mass;
65 class HRZMass;
66 class ViscousDamping;
67 class ViscousDampingPrev;
68} // namespace polyfem::assembler
69
70namespace polyfem::mesh
71{
72 class Mesh2D;
73 class Mesh3D;
74} // namespace polyfem::mesh
75
76namespace polyfem::legacy
77{
78 class State;
79
86 using UserPostStepCallback = std::function<void(int step, State &state, const Eigen::MatrixXd &sol, const Eigen::MatrixXd *disp_grad, const Eigen::MatrixXd *pressure)>;
87
90 {
91 public:
94 Eigen::MatrixXd solution;
95
98 Eigen::MatrixXd velocity;
99
102 Eigen::MatrixXd acceleration;
103
105 bool is_empty() const
106 {
107 return solution.size() == 0 && velocity.size() == 0 && acceleration.size() == 0;
108 }
109 };
110
112 class State
113 {
114 public:
115 //---------------------------------------------------
116 //-----------------initialization--------------------
117 //---------------------------------------------------
118
119 ~State() = default;
121 State();
122
124 void set_max_threads(const int max_threads = std::numeric_limits<int>::max());
125
129 void init(const json &args, const bool strict_validation);
130
132 void init_time();
133
136
137 //---------------------------------------------------
138 //-----------------logger----------------------------
139 //---------------------------------------------------
140
146 void init_logger(
147 const std::string &log_file,
148 const spdlog::level::level_enum log_level,
149 const spdlog::level::level_enum file_log_level,
150 const bool is_quiet);
151
155 void init_logger(std::ostream &os, const spdlog::level::level_enum log_level);
156
159 void set_log_level(const spdlog::level::level_enum log_level);
160
164 std::string get_log(const Eigen::MatrixXd &sol)
165 {
166 std::stringstream ss;
167 save_json(sol, ss);
168 return ss.str();
169 }
170
171 private:
173 void init_logger(const std::vector<spdlog::sink_ptr> &sinks, const spdlog::level::level_enum log_level);
174
176 spdlog::sink_ptr console_sink_ = nullptr;
177 spdlog::sink_ptr file_sink_ = nullptr;
178
179 public:
180 //---------------------------------------------------
181 //-----------------assembly--------------------------
182 //---------------------------------------------------
183
185
187
189 std::shared_ptr<assembler::Assembler> assembler = nullptr;
190
191 std::shared_ptr<assembler::Mass> mass_matrix_assembler = nullptr;
192 std::shared_ptr<assembler::HRZMass> pure_mass_matrix_assembler = nullptr;
193
194 std::shared_ptr<assembler::MixedAssembler> mixed_assembler = nullptr;
195 std::shared_ptr<assembler::Assembler> pressure_assembler = nullptr;
196
197 std::shared_ptr<assembler::PressureAssembler> elasticity_pressure_assembler = nullptr;
198
199 std::shared_ptr<assembler::ViscousDamping> damping_assembler = nullptr;
200 std::shared_ptr<assembler::ViscousDampingPrev> damping_prev_assembler = nullptr;
201
203 std::shared_ptr<assembler::Problem> problem;
204
206 std::vector<basis::ElementBases> bases;
208 std::vector<basis::ElementBases> pressure_bases;
210 std::vector<basis::ElementBases> geom_bases_;
211
218
220 std::map<int, Eigen::MatrixXd> polys;
222 std::map<int, std::pair<Eigen::MatrixXd, Eigen::MatrixXi>> polys_3d;
223
225 Eigen::VectorXi disc_orders, disc_ordersq;
226
228 std::shared_ptr<polyfem::mesh::MeshNodes> mesh_nodes, geom_mesh_nodes, pressure_mesh_nodes;
229
236
241 double avg_mass;
242
245
247 Eigen::MatrixXd rhs;
248
252
255 std::string formulation() const;
256
259 bool iso_parametric() const;
260
263 const std::vector<basis::ElementBases> &geom_bases() const
264 {
265 return iso_parametric() ? bases : geom_bases_;
266 }
267
272 void build_basis();
276 void assemble_rhs();
280 void assemble_mass_mat();
281
283 std::shared_ptr<assembler::RhsAssembler> build_rhs_assembler(
284 const int n_bases,
285 const std::vector<basis::ElementBases> &bases,
288 std::shared_ptr<assembler::RhsAssembler> build_rhs_assembler() const
289 {
291 }
292
293 std::shared_ptr<assembler::PressureAssembler> build_pressure_assembler(
294 const int n_bases_,
295 const std::vector<basis::ElementBases> &bases_) const;
296 std::shared_ptr<assembler::PressureAssembler> build_pressure_assembler() const
297 {
299 }
300
304 {
306 const int n_b_samples_j = args["space"]["advanced"]["n_boundary_samples"];
307 const int gdiscr_order = mesh->orders().size() <= 0 ? 1 : mesh->orders().maxCoeff();
308 const int discr_order = std::max({disc_orders.maxCoeff(), disc_ordersq.maxCoeff(), gdiscr_order});
309
310 const int n_b_samples = std::max(n_b_samples_j, AssemblerUtils::quadrature_order("Mass", discr_order, AssemblerUtils::BasisType::POLY, mesh->dimension()));
311 return {{n_b_samples, n_b_samples}};
312 }
313
314 int ndof() const
315 {
316 const int actual_dim = problem->is_scalar() ? 1 : mesh->dimension();
317 if (mixed_assembler == nullptr)
318 return actual_dim * n_bases;
319 else
320 return actual_dim * n_bases + n_pressure_bases;
321 }
322
323 private:
327 void sol_to_pressure(Eigen::MatrixXd &sol, Eigen::MatrixXd &pressure);
330
331 public:
334 void set_materials(std::vector<std::shared_ptr<assembler::Assembler>> &assemblers) const;
338
339 //---------------------------------------------------
340 //-----------------solver----------------------------
341 //---------------------------------------------------
342
343 public:
349 void solve_problem(Eigen::MatrixXd &sol,
350 Eigen::MatrixXd &pressure,
351 UserPostStepCallback user_post_step = {},
352 const InitialConditionOverride *ic_override = nullptr);
353
359 void solve(Eigen::MatrixXd &sol,
360 Eigen::MatrixXd &pressure,
361 UserPostStepCallback user_post_step = {},
362 const InitialConditionOverride *ic_override = nullptr)
363 {
364 if (!mesh)
365 {
366 logger().error("Load the mesh first!");
367 return;
368 }
370
371 build_basis();
372
373 assemble_rhs();
375
376 solve_problem(sol, pressure, user_post_step, ic_override);
377 }
378
381
387 std::unique_ptr<polysolve::linear::Solver> static_linear_solver_cache;
388
393 void init_solve(Eigen::MatrixXd &sol,
394 Eigen::MatrixXd &pressure,
395 const InitialConditionOverride *ic_override = nullptr);
396
403 void solve_transient_navier_stokes_split(const int time_steps,
404 const double dt,
405 Eigen::MatrixXd &sol,
406 Eigen::MatrixXd &pressure,
407 UserPostStepCallback user_post_step = {});
408
417 void solve_transient_linear(const int time_steps,
418 const double t0,
419 const double dt,
420 Eigen::MatrixXd &sol,
421 Eigen::MatrixXd &pressure,
422 UserPostStepCallback user_post_step = {},
423 const InitialConditionOverride *ic_override = nullptr);
424
432 void solve_transient_tensor_nonlinear(const int time_steps,
433 const double t0,
434 const double dt,
435 Eigen::MatrixXd &sol,
436 UserPostStepCallback user_post_step = {},
437 const InitialConditionOverride *ic_override = nullptr);
438
443 void init_nonlinear_tensor_solve(Eigen::MatrixXd &sol,
444 const double t = 1.0,
445 const bool init_time_integrator = true,
446 const InitialConditionOverride *ic_override = nullptr);
447
451 void init_linear_solve(Eigen::MatrixXd &sol,
452 const double t = 1.0,
453 const InitialConditionOverride *ic_override = nullptr);
454
458 void initial_solution(Eigen::MatrixXd &solution, const InitialConditionOverride *ic_override = nullptr) const;
462 void initial_velocity(Eigen::MatrixXd &velocity, const InitialConditionOverride *ic_override = nullptr) const;
466 void initial_acceleration(Eigen::MatrixXd &acceleration, const InitialConditionOverride *ic_override = nullptr) const;
472 void solve_linear(int step, Eigen::MatrixXd &sol, Eigen::MatrixXd &pressure, UserPostStepCallback user_post_step = {});
477 void solve_tensor_nonlinear(int step, Eigen::MatrixXd &sol, const bool init_lagging = true, UserPostStepCallback user_post_step = {});
478
481 std::shared_ptr<polysolve::nonlinear::Solver> make_nl_solver(bool for_al) const;
482
484 Eigen::VectorXi periodic_dof_mask;
485 Eigen::MatrixXd periodic_tile_offsets;
486 bool has_periodic_bc() const
487 {
488 return !args["boundary_conditions"]["periodic"].empty();
489 }
490
500 void solve_linear(
501 int step,
502 const std::unique_ptr<polysolve::linear::Solver> &solver,
504 Eigen::VectorXd &b,
505 const bool compute_spectrum,
506 Eigen::MatrixXd &sol, Eigen::MatrixXd &pressure, UserPostStepCallback user_post_step = {});
507
509 bool is_problem_linear() const { return assembler->is_linear() && !is_contact_enabled() && !is_pressure_enabled() && !has_constraints(); }
510
511 bool has_constraints() const
512 {
513 return has_constraints_;
514 }
515
516 private:
518
519 public:
522 void build_stiffness_mat(StiffnessMatrix &stiffness);
523
524 //---------------------------------------------------
525 //-----------------nodes flags-----------------------
526 //---------------------------------------------------
527
528 public:
530 std::unordered_map<int, std::array<bool, 3>>
531 boundary_conditions_ids(const std::string &bc_type) const;
532
534 std::vector<int> boundary_nodes;
536 std::vector<int> pressure_boundary_nodes;
538 std::vector<mesh::LocalBoundary> total_local_boundary;
540 std::vector<mesh::LocalBoundary> local_boundary;
542 std::vector<mesh::LocalBoundary> local_neumann_boundary;
544 std::vector<mesh::LocalBoundary> local_pressure_boundary;
546 std::unordered_map<int, std::vector<mesh::LocalBoundary>> local_pressure_cavity;
548 std::map<int, basis::InterfaceData> poly_edge_to_data;
550 std::vector<int> dirichlet_nodes;
551 std::vector<RowVectorNd> dirichlet_nodes_position;
553 std::vector<int> neumann_nodes;
554 std::vector<RowVectorNd> neumann_nodes_position;
555
557 Eigen::VectorXi in_node_to_node;
560
561 std::vector<int> primitive_to_node() const;
562 std::vector<int> node_to_primitive() const;
563
564 private:
566 void build_node_mapping();
567
568 //---------------------------------------------------
569 //-----------------Geometry--------------------------
570 //---------------------------------------------------
571 public:
573 std::unique_ptr<mesh::Mesh> mesh;
576
582 void load_mesh(bool non_conforming = false,
583 const std::vector<std::string> &names = std::vector<std::string>(),
584 const std::vector<Eigen::MatrixXi> &cells = std::vector<Eigen::MatrixXi>(),
585 const std::vector<Eigen::MatrixXd> &vertices = std::vector<Eigen::MatrixXd>());
586
592 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);
593
598 void load_mesh(const Eigen::MatrixXd &V, const Eigen::MatrixXi &F, bool non_conforming = false)
599 {
600 mesh = mesh::Mesh::create(V, F, non_conforming);
601 load_mesh(non_conforming);
602 }
603
605 void reset_mesh();
606
608 void build_mesh_matrices(Eigen::MatrixXd &V, Eigen::MatrixXi &F);
609
610#ifdef POLYFEM_WITH_ITR
616 bool remesh(const double time, const double dt, Eigen::MatrixXd &sol);
617#endif
618
620 void get_vertices(Eigen::MatrixXd &vertices) const
621 {
622 vertices.setZero(mesh->n_vertices(), mesh->dimension());
623
624 for (int v = 0; v < mesh->n_vertices(); v++)
625 vertices.row(v) = mesh->point(v);
626 }
627
629 void get_elements(Eigen::MatrixXi &elements) const
630 {
631 assert(mesh->is_simplicial());
632
633 auto node_to_primitive_map = node_to_primitive();
634
635 const auto &gbases = geom_bases();
636 int dim = mesh->dimension();
637 elements.setZero(gbases.size(), dim + 1);
638 for (int e = 0; e < gbases.size(); e++)
639 {
640 int i = 0;
641 for (const auto &gbs : gbases[e].bases)
642 elements(e, i++) = node_to_primitive_map[gbs.global()[0].index];
643 }
644 }
645
646 //---------------------------------------------------
647 //-----------------IPC-------------------------------
648 //---------------------------------------------------
649
651 ipc::CollisionMesh collision_mesh;
652
654 ipc::CollisionMesh periodic_collision_mesh;
657
659 static void build_collision_mesh(
660 const mesh::Mesh &mesh,
661 const int n_bases,
662 const std::vector<basis::ElementBases> &bases,
663 const std::vector<basis::ElementBases> &geom_bases,
664 const std::vector<mesh::LocalBoundary> &total_local_boundary,
666 const json &args,
667 const std::function<std::string(const std::string &)> &resolve_input_path,
668 const Eigen::VectorXi &in_node_to_node,
669 ipc::CollisionMesh &collision_mesh);
670
674
678 bool is_obstacle_vertex(const size_t vi) const
679 {
680 // The obstalce vertices are at the bottom of the collision mesh vertices
681 return vi >= collision_mesh.full_num_vertices() - obstacle.n_vertices();
682 }
683
688 {
689 return args["contact"]["enabled"];
690 }
691
696 {
697 return args["contact"]["adhesion"]["adhesion_enabled"];
698 }
699
704 {
705 return (args["boundary_conditions"]["pressure_boundary"].size() > 0)
706 || (args["boundary_conditions"]["pressure_cavity"].size() > 0);
707 }
708
710 bool has_dhat = false;
711
712 //---------------------------------------------------
713 //-----------------OUTPUT----------------------------
714 //---------------------------------------------------
715 public:
717 std::string output_dir;
727
728 std::function<void(int, int, double, double)> time_callback = nullptr;
729
733 void export_data(const Eigen::MatrixXd &sol, const Eigen::MatrixXd &pressure);
734
742 void save_timestep(const double time, const int t, const double t0, const double dt, const Eigen::MatrixXd &sol, const Eigen::MatrixXd &pressure);
743
749 void save_subsolve(const int i, const int t, const Eigen::MatrixXd &sol, const Eigen::MatrixXd &pressure);
750
754 void save_json(const Eigen::MatrixXd &sol, std::ostream &out);
755
758 void save_json(const Eigen::MatrixXd &sol);
759
761 void compute_errors(const Eigen::MatrixXd &sol);
762
765 void save_restart_json(const double t0, const double dt, const int t) const;
766
767 //-----------PATH management
770 std::string root_path() const;
771
776 std::string resolve_input_path(const std::string &path, const bool only_if_exists = false) const;
777
781 std::string resolve_output_path(const std::string &path) const;
782
783 //---------------------------------------------------
784 //-----------------differentiable--------------------
785 //---------------------------------------------------
786 public:
788
789 //---------------------------------------------------
790 //-----------------homogenization--------------------
791 //---------------------------------------------------
792 public:
794
796 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]
797 void init_homogenization_solve(const double t);
798 void solve_homogenization(const int time_steps, const double t0, const double dt, Eigen::MatrixXd &sol, UserPostStepCallback user_post_step = {});
799 bool is_homogenization() const
800 {
802 }
803 };
804
805} // 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:2991
Runtime override for initial-condition histories.
Definition State.hpp:90
Eigen::MatrixXd solution
ndof by H (history size) matrix where each col is solution from a time step.
Definition State.hpp:94
bool is_empty() const
Returns true when no quantity is overridden.
Definition State.hpp:105
Eigen::MatrixXd velocity
ndof by H (history size) matrix where each col is velocity from a time step.
Definition State.hpp:98
Eigen::MatrixXd acceleration
ndof by H (history size) matrix where each col is acceleration from a time step.
Definition State.hpp:102
main class that contains the polyfem solver and all its state
Definition State.hpp:113
std::shared_ptr< assembler::Problem > problem
current problem, it contains rhs and bc
Definition State.hpp:203
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:470
void reset_mesh()
Resets the mesh.
Definition StateLoad.cpp:22
StiffnessMatrix pure_mass
Definition State.hpp:239
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:484
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:263
ipc::CollisionMesh collision_mesh
IPC collision mesh.
Definition State.hpp:651
StiffnessMatrix mass
Mass matrix, it is computed only for time dependent problems.
Definition State.hpp:238
bool has_dhat
stores if input json contains dhat
Definition State.hpp:710
std::vector< RowVectorNd > dirichlet_nodes_position
Definition State.hpp:551
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:1313
std::vector< mesh::LocalBoundary > local_boundary
mapping from elements to nodes for dirichlet boundary conditions
Definition State.hpp:540
std::vector< mesh::LocalBoundary > local_pressure_boundary
mapping from elements to nodes for pressure boundary conditions
Definition State.hpp:544
std::vector< int > dirichlet_nodes
per node dirichlet
Definition State.hpp:550
std::shared_ptr< polyfem::mesh::MeshNodes > mesh_nodes
Mapping from input nodes to FE nodes.
Definition State.hpp:228
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:559
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:191
std::vector< int > pressure_boundary_nodes
list of neumann boundary nodes
Definition State.hpp:536
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:546
std::unique_ptr< mesh::Mesh > mesh
current mesh, it can be a Mesh2D or Mesh3D
Definition State.hpp:573
Eigen::MatrixXd rhs
System right-hand side.
Definition State.hpp:247
void build_node_mapping()
build the mapping from input nodes to polyfem nodes
Definition State.cpp:253
std::unique_ptr< polysolve::linear::Solver > static_linear_solver_cache
Linear solver instance from the most recent static linear solve.
Definition State.hpp:387
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:723
json args
main input arguments containing all defaults
Definition State.hpp:135
void build_polygonal_basis()
builds bases for polygons, called inside build_basis
Definition State.cpp:1010
assembler::AssemblyValsCache pure_mass_ass_vals_cache
Definition State.hpp:233
std::vector< basis::ElementBases > geom_bases_
Geometric mapping bases, if the elements are isoparametric, this list is empty.
Definition State.hpp:210
std::vector< RowVectorNd > neumann_nodes_position
Definition State.hpp:554
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:225
std::map< int, Eigen::MatrixXd > polys
polygons, used since poly have no geom mapping
Definition State.hpp:220
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:379
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:215
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:235
int n_bases
number of bases
Definition State.hpp:213
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:1456
double starting_min_edge_length
Definition State.hpp:724
std::shared_ptr< polyfem::mesh::MeshNodes > geom_mesh_nodes
Definition State.hpp:228
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:726
io::OutRuntimeData timings
runtime statistics
Definition State.hpp:721
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:511
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:199
std::vector< basis::ElementBases > pressure_bases
FE pressure bases for mixed elements, the size is #elements.
Definition State.hpp:208
mesh::Obstacle obstacle
Obstacles used in collisions.
Definition State.hpp:575
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:200
std::shared_ptr< assembler::Assembler > pressure_assembler
Definition State.hpp:195
std::string formulation() const
return the formulation (checks if the problem is scalar or not and deals with multiphysics)
Definition State.cpp:336
Eigen::VectorXi disc_orders
vector of discretization orders, used when not all elements have the same degree, one per element
Definition State.hpp:225
assembler::AssemblyValsCache ass_vals_cache
used to store assembly values for small problems
Definition State.hpp:231
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:719
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:164
assembler::AssemblyValsCache mass_ass_vals_cache
Definition State.hpp:232
QuadratureOrders n_boundary_samples() const
quadrature used for projecting boundary conditions
Definition State.hpp:303
bool use_avg_pressure
use average pressure for stokes problem to fix the additional dofs, true by default if false,...
Definition State.hpp:251
double characteristic_length
Definition State.hpp:243
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:189
void build_basis()
builds the bases step 2 of solve modifies bases, pressure_bases, geom_bases_, boundary_nodes,...
Definition State.cpp:508
std::map< int, basis::InterfaceData > poly_edge_to_data
nodes on the boundary of polygonal elements, used for harmonic bases
Definition State.hpp:548
double avg_mass
average system mass, used for contact with IPC
Definition State.hpp:241
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:206
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:197
Eigen::MatrixXd periodic_tile_offsets
Definition State.hpp:485
void build_periodic_collision_mesh()
Definition State.cpp:1173
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:222
bool is_adhesion_enabled() const
does the simulation have adhesion
Definition State.hpp:695
std::string output_dir
Directory for output files.
Definition State.hpp:717
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:359
bool is_pressure_enabled() const
does the simulation has pressure
Definition State.hpp:703
void get_vertices(Eigen::MatrixXd &vertices) const
Gather geometry vertices into a dense matrix.
Definition State.hpp:620
bool has_periodic_bc() const
Definition State.hpp:486
ipc::CollisionMesh periodic_collision_mesh
IPC collision mesh under periodic BC.
Definition State.hpp:654
std::vector< int > neumann_nodes
per node neumann
Definition State.hpp:553
Eigen::VectorXi periodic_collision_mesh_to_basis
index mapping from periodic 2x2 collision mesh to FE periodic mesh
Definition State.hpp:656
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:598
std::shared_ptr< polyfem::mesh::MeshNodes > pressure_mesh_nodes
Definition State.hpp:228
assembler::MacroStrainValue macro_strain_constraint
Definition State.hpp:793
std::shared_ptr< assembler::RhsAssembler > build_rhs_assembler() const
build a RhsAssembler for the problem
Definition State.hpp:288
bool is_problem_linear() const
Returns whether the system is linear. Collisions and pressure add nonlinearity to the problem.
Definition State.hpp:509
std::shared_ptr< assembler::PressureAssembler > build_pressure_assembler() const
Definition State.hpp:296
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:678
std::vector< mesh::LocalBoundary > total_local_boundary
mapping from elements to nodes for all mesh
Definition State.hpp:538
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:217
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:176
std::shared_ptr< assembler::HRZMass > pure_mass_matrix_assembler
Definition State.hpp:192
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:1587
void solve_problem(Eigen::MatrixXd &sol, Eigen::MatrixXd &pressure, UserPostStepCallback user_post_step={}, const InitialConditionOverride *ic_override=nullptr)
solves the problems
Definition State.cpp:1659
void get_elements(Eigen::MatrixXi &elements) const
Gather geometry elements into a dense matrix.
Definition State.hpp:629
double starting_max_edge_length
Definition State.hpp:725
std::vector< mesh::LocalBoundary > local_neumann_boundary
mapping from elements to nodes for neumann boundary conditions
Definition State.hpp:542
std::vector< int > primitive_to_node() const
Definition State.cpp:236
std::vector< int > boundary_nodes
list of boundary nodes
Definition State.hpp:534
solver::SolveData solve_data
timedependent stuff cached
Definition State.hpp:380
std::vector< int > node_to_primitive() const
Definition State.cpp:243
spdlog::sink_ptr file_sink_
Definition State.hpp:177
Eigen::VectorXi in_node_to_node
Inpute nodes (including high-order) to polyfem nodes, only for isoparametric.
Definition State.hpp:557
double characteristic_force_density
Definition State.hpp:244
bool is_homogenization() const
Definition State.hpp:799
std::function< void(int, int, double, double)> time_callback
Definition State.hpp:728
bool is_contact_enabled() const
does the simulation have contact
Definition State.hpp:687
std::shared_ptr< assembler::MixedAssembler > mixed_assembler
Definition State.hpp:194
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:49
static std::unique_ptr< Mesh > create(const std::string &path, const bool non_conforming=false)
factory to build the proper mesh
Definition Mesh.cpp:228
class to store time stepping data
Definition SolveData.hpp:55
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:86
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