37 std::vector<basis::ElementBases> &bases,
38 const std::vector<basis::ElementBases> &geom_bases,
42 const double jacobian_threshold,
46 const int n_pressure_bases,
47 const std::vector<int> &boundary_nodes,
48 const std::vector<mesh::LocalBoundary> &local_boundary,
49 const std::vector<mesh::LocalBoundary> &local_neumann_boundary,
50 const int n_boundary_samples,
51 const Eigen::MatrixXd &rhs,
52 const Eigen::MatrixXd &sol,
56 const std::vector<mesh::LocalBoundary> &local_pressure_boundary,
57 const std::unordered_map<
int, std::vector<mesh::LocalBoundary>> &local_pressure_cavity,
58 const std::shared_ptr<assembler::PressureAssembler> pressure_assembler,
61 const bool ignore_inertia,
63 const std::shared_ptr<assembler::ViscousDamping> damping_assembler,
66 const double lagged_regularization_weight,
67 const int lagged_regularization_iterations,
75 const size_t obstacle_ndof,
78 const bool contact_enabled,
79 const ipc::CollisionMesh &collision_mesh,
81 const double avg_mass,
82 const bool use_area_weighting,
83 const bool use_improved_max_operator,
84 const bool use_physical_barrier,
85 const json &barrier_stiffness,
86 const ipc::BroadPhaseMethod broad_phase,
87 const double ccd_tolerance,
88 const long ccd_max_iterations,
89 const bool enable_shape_derivatives,
92 const bool adhesion_enabled,
98 const double tangential_adhesion_coefficient,
100 const int tangential_adhesion_iterations,
106 const bool periodic_contact,
107 const Eigen::VectorXi &tiled_to_single,
108 const std::shared_ptr<utils::PeriodicBoundary> &periodic_bc,
111 const double friction_coefficient,
113 const int friction_iterations,
116 const json &rayleigh_damping)
121 const int ndof = n_bases * dim;
124 const bool is_volume = dim == 3;
126 std::vector<std::shared_ptr<Form>> forms;
130 n_bases, bases, geom_bases, assembler, ass_vals_cache,
131 t, dt, is_volume, jacobian_threshold, check_inversion);
137 ndof, n_pressure_bases, boundary_nodes, local_boundary,
138 local_neumann_boundary, n_boundary_samples, rhs, *
rhs_assembler,
149 local_pressure_boundary,
150 local_pressure_cavity,
160 if (is_time_dependent)
169 if (damping_assembler !=
nullptr)
172 n_bases, bases, geom_bases, *damping_assembler, ass_vals_cache, t, dt, is_volume);
178 if (lagged_regularization_weight > 0)
180 forms.push_back(std::make_shared<LaggedRegForm>(lagged_regularization_iterations));
181 forms.back()->set_weight(lagged_regularization_weight);
193 al_form.push_back(std::make_shared<BCLagrangianForm>(
194 ndof, boundary_nodes, local_boundary, local_neumann_boundary,
195 n_boundary_samples, mass_tmp, *
rhs_assembler, obstacle_ndof, is_time_dependent, t, periodic_bc));
196 forms.push_back(
al_form.back());
202 strain_al_lagr_form = std::make_shared<MacroStrainLagrangianForm>(macro_strain_constraint);
210 const bool use_adaptive_barrier_stiffness = !barrier_stiffness.is_number();
212 if (periodic_contact)
215 collision_mesh, tiled_to_single, dhat, avg_mass, use_area_weighting, use_improved_max_operator, use_physical_barrier,
216 use_adaptive_barrier_stiffness, is_time_dependent, enable_shape_derivatives, broad_phase, ccd_tolerance,
219 if (use_adaptive_barrier_stiffness)
226 assert(barrier_stiffness.is_number());
227 assert(barrier_stiffness.get<
double>() > 0);
235 collision_mesh, dhat, avg_mass, use_area_weighting, use_improved_max_operator, use_physical_barrier,
236 use_adaptive_barrier_stiffness, is_time_dependent, enable_shape_derivatives, broad_phase, ccd_tolerance * units.
characteristic_length(),
239 if (use_adaptive_barrier_stiffness)
246 assert(barrier_stiffness.is_number());
247 assert(barrier_stiffness.get<
double>() > 0);
258 if (friction_coefficient != 0)
267 if (adhesion_enabled)
270 collision_mesh, dhat_p, dhat_a, Y, is_time_dependent, enable_shape_derivatives,
275 if (tangential_adhesion_coefficient != 0)
278 collision_mesh,
time_integrator, epsa, tangential_adhesion_coefficient,
289 if (is_time_dependent)
292 const std::unordered_map<std::string, std::shared_ptr<Form>> possible_forms_to_damp = {
297 for (
const json ¶ms : rayleigh_damping_jsons)
300 params, possible_forms_to_damp,
304 else if (rayleigh_damping_jsons.size() > 0)
std::vector< std::shared_ptr< Form > > init_forms(const Units &units, const int dim, const double t, 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 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 int 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 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 json &barrier_stiffness, const ipc::BroadPhaseMethod broad_phase, const double ccd_tolerance, const long ccd_max_iterations, const bool enable_shape_derivatives, 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 ¯o_strain_constraint, const bool periodic_contact, const Eigen::VectorXi &tiled_to_single, const std::shared_ptr< utils::PeriodicBoundary > &periodic_bc, const double friction_coefficient, const double epsv, const int friction_iterations, const json &rayleigh_damping)
Initialize the forms and return a vector of pointers to them.