2#include <ipc/potentials/barrier_potential.hpp>
9#include <ipc/barrier/adaptive_stiffness.hpp>
10#include <ipc/utils/world_bbox_diagonal_length.hpp>
16 const double avg_mass,
17 const bool use_area_weighting,
18 const bool use_improved_max_operator,
19 const bool use_physical_barrier,
20 const bool use_adaptive_barrier_stiffness,
21 const bool is_time_dependent,
22 const bool enable_shape_derivatives,
23 const ipc::BroadPhaseMethod broad_phase_method,
24 const double ccd_tolerance,
25 const int ccd_max_iterations):
ContactForm(collision_mesh, dhat, avg_mass, use_adaptive_barrier_stiffness, is_time_dependent, enable_shape_derivatives, broad_phase_method, ccd_tolerance, ccd_max_iterations), barrier_potential_(dhat, use_physical_barrier)
52 ipc::NormalCollisions nonconvergent_constraints;
54 nonconvergent_constraints.set_use_area_weighting(
false);
55 nonconvergent_constraints.set_use_improved_max_approximator(
false);
56 nonconvergent_constraints.build(
68 double scaling_factor = 0;
69 if (!nonconvergent_constraints.empty())
78 scaling_factor = nonconvergent_potential / convergent_potential;
95 "Setting adaptive barrier stiffness to {} (max barrier stiffness: {})",
102 static Eigen::MatrixXd cached_displaced_surface;
103 if (cached_displaced_surface.size() == displaced_surface.size() && cached_displaced_surface == displaced_surface)
112 cached_displaced_surface = displaced_surface;
135 auto storage = utils::create_thread_storage<Eigen::VectorXd>(Eigen::VectorXd::Zero(num_vertices));
138 Eigen::VectorXd &local_storage = utils::get_local_thread_storage(storage, thread_id);
140 for (size_t i = start; i < end; i++)
143 const double potential = barrier_potential_(collision_set_[i], collision_set_[i].dof(V, E, F));
145 const int n_v = collision_set_[i].num_vertices();
146 const auto vis = collision_set_[i].vertex_ids(E, F);
147 for (int j = 0; j < n_v; j++)
149 assert(0 <= vis[j] && vis[j] < num_vertices);
150 local_storage[vis[j]] += potential / n_v;
155 Eigen::VectorXd out = Eigen::VectorXd::Zero(num_vertices);
156 for (
const auto &local_potential : storage)
158 out += local_potential;
161 Eigen::VectorXd out_full = Eigen::VectorXd::Zero(collision_mesh_.full_num_vertices());
162 for (
int i = 0; i < out.size(); i++)
163 out_full[collision_mesh_.to_full_vertex_id(i)] = out[i];
165 assert(std::abs(value_unweighted(
x) - out_full.sum()) < std::max(1e-10 * out_full.sum(), 1e-10));
180 ipc::PSDProjectionMethod psd_projection_method;
183 psd_projection_method = ipc::PSDProjectionMethod::CLAMP;
185 psd_projection_method = ipc::PSDProjectionMethod::NONE;
197 if (!std::isinf(curr_distance))
199 const double ratio = sqrt(curr_distance) /
dhat();
200 const auto log_level = (ratio < 1e-6) ? spdlog::level::err : ((ratio < 1e-4) ? spdlog::level::warn : spdlog::level::debug);
201 polyfem::logger().log(log_level,
"Minimum distance during solve: {}, dhat: {}", sqrt(curr_distance),
dhat());
204 if (data.iter_num == 0)
220 "updated barrier stiffness from {:g} to {:g} (max barrier stiffness: )",
#define POLYFEM_SCOPED_TIMER(...)
void maybe_parallel_for(int size, const std::function< void(int, int, int)> &partial_for)
spdlog::logger & logger()
Retrieves the current logger.
Eigen::SparseMatrix< double, Eigen::ColMajor > StiffnessMatrix