PolyFEM
Loading...
Searching...
No Matches
SolveData.hpp
Go to the documentation of this file.
1#pragma once
2
12
13#include <ipc/collision_mesh.hpp>
15
16#include <Eigen/Core>
17
18#include <memory>
19#include <string>
20#include <unordered_map>
21
23
25{
27} // namespace polyfem::time_integrator
28
29namespace polyfem::assembler
30{
31 class ViscousDamping;
32 class MacroStrainValue;
34} // namespace polyfem::assembler
35
36namespace polyfem::solver
37{
38 class NLProblem;
39 class Form;
40 class ContactForm;
41 class PeriodicContactForm;
42 class MacroStrainALForm;
43 class FrictionForm;
44 class BodyForm;
45 class AugmentedLagrangianForm;
46 class MacroStrainLagrangianForm;
47 class MacroStrainALForm;
48 class InertiaForm;
49 class ElasticForm;
50 class PressureForm;
51 class NormalAdhesionForm;
52 class TangentialAdhesionForm;
53
56 {
57 public:
60 std::vector<std::shared_ptr<Form>> init_forms(
61 // General
62 const Units &units,
63 const io::ResourceIO &resources,
64 const int dim,
65 const double t,
66 const Eigen::VectorXi &in_node_to_node,
67
68 // Elastic form
69 const int n_bases,
70 std::vector<basis::ElementBases> &bases,
71 const std::vector<basis::ElementBases> &geom_bases,
72 const assembler::Assembler &assembler,
73 assembler::AssemblyValsCache &ass_vals_cache,
74 const assembler::AssemblyValsCache &mass_ass_vals_cache,
75 const double jacobian_threshold,
76 const solver::ElementInversionCheck check_inversion,
77 const unsigned conservative_max_iter,
78
79 // Body form
80 const int n_pressure_bases,
81 const std::vector<int> &boundary_nodes,
82 const std::vector<mesh::LocalBoundary> &local_boundary,
83 const std::vector<mesh::LocalBoundary> &local_neumann_boundary,
84 const QuadratureOrders &n_boundary_samples,
85 const Eigen::MatrixXd &rhs,
86 const Eigen::MatrixXd &sol,
87 const assembler::Density &density,
88
89 // Pressure form
90 const std::vector<mesh::LocalBoundary> &local_pressure_boundary,
91 const std::unordered_map<int, std::vector<mesh::LocalBoundary>> &local_pressure_cavity,
92 const std::shared_ptr<assembler::PressureAssembler> pressure_assembler,
93
94 // Inertia form
95 const bool ignore_inertia,
96 const StiffnessMatrix &mass,
97 const std::shared_ptr<assembler::ViscousDamping> damping_assembler,
98
99 // Lagged regularization form
100 const double lagged_regularization_weight,
101 const int lagged_regularization_iterations,
102
103 // Constraint forms
104 const size_t obstacle_ndof,
105 const std::vector<std::string> &hard_constraint_files,
106 const std::vector<json> &soft_constraint_files,
107 const json &zero_mean,
108
109 // Contact form
110 const bool contact_enabled,
111 const ipc::CollisionMesh &collision_mesh,
112 const double dhat,
113 const double avg_mass,
114 const bool use_area_weighting,
115 const bool use_improved_max_operator,
116 const bool use_physical_barrier,
117 const std::string &collision_set_type,
118 const bool skip_obstacles,
119 const std::string &barrier,
120 const json &barrier_stiffness,
121 const double initial_barrier_stiffness,
122 const double dhat_epsilon_scale,
123 const ipc::BroadPhaseMethod broad_phase,
124 const double ccd_tolerance,
125 const long ccd_max_iterations,
126 const bool enable_shape_derivatives,
127
128 // Smooth Contact Form
129 const bool use_gcp_formulation,
130 const double alpha_t,
131 const double alpha_n,
132 const bool use_adaptive_dhat,
133 const double min_distance_ratio,
134
135 // ESP contact form
136 const bool use_esp_formulation,
137 json esp_params,
138
139 // Normal Adhesion Form
140 const bool adhesion_enabled,
141 const double dhat_p,
142 const double dhat_a,
143 const double Y,
144
145 // Tangential Adhesion Form
146 const double tangential_adhesion_coefficient,
147 const double epsa,
148 const int tangential_adhesion_iterations,
149
150 // Homogenization
151 const assembler::MacroStrainValue &macro_strain_constraint,
152
153 // Periodic contact
154 const bool periodic_contact,
155 const Eigen::VectorXi &tiled_to_single,
156
157 // Friction form
158 const double friction_coefficient,
159 const double epsv,
160 const int friction_iterations,
161
162 // Rayleigh damping form
163 const json &rayleigh_damping,
164
165 // BC augmented-Lagrangian mass-metric lumping
166 const BCLumpingMode al_lumping = BCLumpingMode::ROW_SUM,
167
168 // Boundary-ID periodic constraints
169 const mesh::Mesh *periodic_mesh = nullptr,
170 const std::vector<mesh::LocalBoundary> *periodic_local_boundary = nullptr,
171 const json &periodic_conditions = json::array(),
172 const int fe_space_id = -1);
173
176 void update_barrier_stiffness(const Eigen::VectorXd &x);
177
179 void update_dt();
180
181 std::vector<std::pair<std::string, std::shared_ptr<solver::Form>>> named_forms() const;
182
183 public:
184 std::shared_ptr<assembler::RhsAssembler> rhs_assembler;
185 std::shared_ptr<assembler::PressureAssembler> pressure_assembler;
186 std::shared_ptr<solver::NLProblem> nl_problem;
187
188 std::vector<std::shared_ptr<solver::AugmentedLagrangianForm>> al_form;
189 std::shared_ptr<solver::MacroStrainLagrangianForm> strain_al_lagr_form;
190 std::shared_ptr<solver::BodyForm> body_form;
191 std::shared_ptr<solver::ContactForm> contact_form;
192 std::shared_ptr<solver::ElasticForm> damping_form;
193 std::shared_ptr<solver::ElasticForm> elastic_form;
194 std::shared_ptr<solver::FrictionForm> friction_form;
195 std::shared_ptr<solver::InertiaForm> inertia_form;
196 std::shared_ptr<solver::PressureForm> pressure_form;
197 std::shared_ptr<solver::NormalAdhesionForm> normal_adhesion_form;
198 std::shared_ptr<solver::TangentialAdhesionForm> tangential_adhesion_form;
199
200 std::shared_ptr<solver::PeriodicContactForm> periodic_contact_form;
201
202 std::shared_ptr<time_integrator::ImplicitTimeIntegrator> time_integrator;
203 };
204} // namespace polyfem::solver
int x
Caches basis evaluation and geometric mapping at every element.
Read-only interface to a hierarchical collection of simulation resources.
Abstract mesh class to capture 2d/3d conforming and non-conforming meshes.
Definition Mesh.hpp:50
class to store time stepping data
Definition SolveData.hpp:56
std::shared_ptr< solver::FrictionForm > friction_form
std::shared_ptr< solver::InertiaForm > inertia_form
std::shared_ptr< solver::PeriodicContactForm > periodic_contact_form
void update_dt()
updates the dt inside the different forms
std::shared_ptr< solver::PressureForm > pressure_form
std::shared_ptr< solver::BodyForm > body_form
std::shared_ptr< solver::NLProblem > nl_problem
std::shared_ptr< solver::MacroStrainLagrangianForm > strain_al_lagr_form
std::shared_ptr< solver::NormalAdhesionForm > normal_adhesion_form
std::shared_ptr< solver::ContactForm > contact_form
std::vector< std::pair< std::string, std::shared_ptr< solver::Form > > > named_forms() const
std::shared_ptr< solver::ElasticForm > damping_form
std::shared_ptr< solver::ElasticForm > elastic_form
std::vector< std::shared_ptr< solver::AugmentedLagrangianForm > > al_form
std::shared_ptr< time_integrator::ImplicitTimeIntegrator > time_integrator
void update_barrier_stiffness(const Eigen::VectorXd &x)
update the barrier stiffness for the forms
std::shared_ptr< solver::TangentialAdhesionForm > tangential_adhesion_form
std::vector< std::shared_ptr< Form > > init_forms(const Units &units, const io::ResourceIO &resources, const int dim, const double t, const Eigen::VectorXi &in_node_to_node, const int n_bases, std::vector< basis::ElementBases > &bases, const std::vector< basis::ElementBases > &geom_bases, const assembler::Assembler &assembler, assembler::AssemblyValsCache &ass_vals_cache, const assembler::AssemblyValsCache &mass_ass_vals_cache, const double jacobian_threshold, const solver::ElementInversionCheck check_inversion, const unsigned conservative_max_iter, const int n_pressure_bases, const std::vector< int > &boundary_nodes, const std::vector< mesh::LocalBoundary > &local_boundary, const std::vector< mesh::LocalBoundary > &local_neumann_boundary, const QuadratureOrders &n_boundary_samples, const Eigen::MatrixXd &rhs, const Eigen::MatrixXd &sol, const assembler::Density &density, const std::vector< mesh::LocalBoundary > &local_pressure_boundary, const std::unordered_map< int, std::vector< mesh::LocalBoundary > > &local_pressure_cavity, const std::shared_ptr< assembler::PressureAssembler > pressure_assembler, const bool ignore_inertia, const StiffnessMatrix &mass, const std::shared_ptr< assembler::ViscousDamping > damping_assembler, const double lagged_regularization_weight, const int lagged_regularization_iterations, const size_t obstacle_ndof, const std::vector< std::string > &hard_constraint_files, const std::vector< json > &soft_constraint_files, const json &zero_mean, const bool contact_enabled, const ipc::CollisionMesh &collision_mesh, const double dhat, const double avg_mass, const bool use_area_weighting, const bool use_improved_max_operator, const bool use_physical_barrier, const std::string &collision_set_type, const bool skip_obstacles, const std::string &barrier, const json &barrier_stiffness, const double initial_barrier_stiffness, const double dhat_epsilon_scale, const ipc::BroadPhaseMethod broad_phase, const double ccd_tolerance, const long ccd_max_iterations, const bool enable_shape_derivatives, const bool use_gcp_formulation, const double alpha_t, const double alpha_n, const bool use_adaptive_dhat, const double min_distance_ratio, const bool use_esp_formulation, json esp_params, const bool adhesion_enabled, const double dhat_p, const double dhat_a, const double Y, const double tangential_adhesion_coefficient, const double epsa, const int tangential_adhesion_iterations, const assembler::MacroStrainValue &macro_strain_constraint, const bool periodic_contact, const Eigen::VectorXi &tiled_to_single, const double friction_coefficient, const double epsv, const int friction_iterations, const json &rayleigh_damping, const BCLumpingMode al_lumping=BCLumpingMode::ROW_SUM, const mesh::Mesh *periodic_mesh=nullptr, const std::vector< mesh::LocalBoundary > *periodic_local_boundary=nullptr, const json &periodic_conditions=json::array(), const int fe_space_id=-1)
Initialize the forms and return a vector of pointers to them.
Definition SolveData.cpp:87
std::shared_ptr< assembler::PressureAssembler > pressure_assembler
std::shared_ptr< assembler::RhsAssembler > rhs_assembler
Implicit time integrator of a second order ODE (equivently a system of coupled first order ODEs).
Used for test only.
BCLumpingMode
Lumping mode for the mass metric of the BC penalty.
@ ROW_SUM
Row-sum lumping (falls back to HRZ if ill-conditioned)
std::array< int, 2 > QuadratureOrders
Definition Types.hpp:19
nlohmann::json json
Definition Common.hpp:9
Eigen::SparseMatrix< double, Eigen::ColMajor > StiffnessMatrix
Definition Types.hpp:24