13#include <ipc/barrier/adaptive_stiffness.hpp>
14#include <ipc/utils/world_bbox_diagonal_length.hpp>
16#include <igl/writePLY.h>
22 const double avg_mass,
23 const bool use_area_weighting,
24 const bool use_improved_max_operator,
25 const bool use_physical_barrier,
26 const bool use_adaptive_barrier_stiffness,
27 const bool is_time_dependent,
28 const bool enable_shape_derivatives,
29 const ipc::BroadPhaseMethod broad_phase_method,
30 const double ccd_tolerance,
31 const int ccd_max_iterations)
32 : collision_mesh_(collision_mesh),
34 use_adaptive_barrier_stiffness_(use_adaptive_barrier_stiffness),
36 is_time_dependent_(is_time_dependent),
37 enable_shape_derivatives_(enable_shape_derivatives),
38 broad_phase_method_(broad_phase_method),
39 tight_inclusion_ccd_(ccd_tolerance, ccd_max_iterations),
40 barrier_potential_(dhat, use_physical_barrier)
43 assert(ccd_tolerance > 0);
87 ipc::NormalCollisions nonconvergent_constraints;
89 nonconvergent_constraints.set_use_area_weighting(
false);
90 nonconvergent_constraints.set_use_improved_max_approximator(
false);
91 nonconvergent_constraints.build(
103 double scaling_factor = 0;
104 if (!nonconvergent_constraints.empty())
113 scaling_factor = nonconvergent_potential / convergent_potential;
130 "Setting adaptive barrier stiffness to {} (max barrier stiffness: {})",
137 static Eigen::MatrixXd cached_displaced_surface;
138 if (cached_displaced_surface.size() == displaced_surface.size() && cached_displaced_surface == displaced_surface)
147 cached_displaced_surface = displaced_surface;
170 auto storage = utils::create_thread_storage<Eigen::VectorXd>(Eigen::VectorXd::Zero(num_vertices));
173 Eigen::VectorXd &local_storage = utils::get_local_thread_storage(storage, thread_id);
175 for (size_t i = start; i < end; i++)
178 const double potential = barrier_potential_(collision_set_[i], collision_set_[i].dof(V, E, F));
180 const int n_v = collision_set_[i].num_vertices();
181 const std::array<long, 4> vis = collision_set_[i].vertex_ids(E, F);
182 for (int j = 0; j < n_v; j++)
184 assert(0 <= vis[j] && vis[j] < num_vertices);
185 local_storage[vis[j]] += potential / n_v;
190 Eigen::VectorXd out = Eigen::VectorXd::Zero(num_vertices);
191 for (
const auto &local_potential : storage)
193 out += local_potential;
196 Eigen::VectorXd out_full = Eigen::VectorXd::Zero(collision_mesh_.full_num_vertices());
197 for (
int i = 0; i < out.size(); i++)
198 out_full[collision_mesh_.to_full_vertex_id(i)] = out[i];
200 assert(std::abs(value_unweighted(
x) - out_full.sum()) < std::max(1e-10 * out_full.sum(), 1e-10));
215 ipc::PSDProjectionMethod psd_projection_method;
218 psd_projection_method = ipc::PSDProjectionMethod::CLAMP;
220 psd_projection_method = ipc::PSDProjectionMethod::NONE;
248 max_step =
candidates_.compute_collision_free_stepsize(
251 max_step = ipc::compute_collision_free_stepsize(
261 Eigen::MatrixXd V_toi = (
V1 -
V0) * max_step +
V0;
265 logger().error(
"Taking max_step results in intersections (max_step={:g})", max_step);
268 const double Linf = (V_toi -
V0).lpNorm<Eigen::Infinity>();
269 if (max_step <= 0 || Linf == 0)
270 log_and_throw_error(
"Unable to find an intersection free step size (max_step={:g} L∞={:g})", max_step, Linf);
272 V_toi = (
V1 -
V0) * max_step +
V0;
299 if (data.iter_num == 0)
319 "updated barrier stiffness from {:g} to {:g} (max barrier stiffness: )",
339 if ((displaced1 - displaced0).lpNorm<Eigen::Infinity>() == 0.0)
351 is_valid = ipc::is_step_collision_free(
#define POLYFEM_SCOPED_TIMER(...)
std::tuple< bool, int, Tree > is_valid(const int dim, const std::vector< basis::ElementBases > &bases, const std::vector< basis::ElementBases > &gbases, const Eigen::VectorXd &u, const double threshold)
Eigen::MatrixXd unflatten(const Eigen::VectorXd &x, int dim)
Unflatten rowwises, so every dim elements in x become a row.
void maybe_parallel_for(int size, const std::function< void(int, int, int)> &partial_for)
spdlog::logger & logger()
Retrieves the current logger.
void log_and_throw_error(const std::string &msg)
Eigen::SparseMatrix< double, Eigen::ColMajor > StiffnessMatrix