13#include <ipc/barrier/adaptive_stiffness.hpp>
14#include <ipc/utils/world_bbox_diagonal_length.hpp>
16#include <igl/writePLY.h>
24 const bool is_time_dependent,
25 const bool enable_shape_derivatives,
26 const ipc::BroadPhaseMethod broad_phase_method,
27 const double ccd_tolerance,
28 const int ccd_max_iterations)
29 : collision_mesh_(collision_mesh),
33 is_time_dependent_(is_time_dependent),
34 enable_shape_derivatives_(enable_shape_derivatives),
35 broad_phase_method_(broad_phase_method),
36 tight_inclusion_ccd_(ccd_tolerance, ccd_max_iterations),
37 normal_adhesion_potential_(dhat_p, dhat_a, Y, 1)
41 assert(ccd_tolerance > 0);
59 term = dq_h.transpose() * adjoint_sol;
75 static Eigen::MatrixXd cached_displaced_surface;
76 if (cached_displaced_surface.size() == displaced_surface.size() && cached_displaced_surface == displaced_surface)
85 cached_displaced_surface = displaced_surface;
108 auto storage = utils::create_thread_storage<Eigen::VectorXd>(Eigen::VectorXd::Zero(num_vertices));
111 Eigen::VectorXd &local_storage = utils::get_local_thread_storage(storage, thread_id);
113 for (size_t i = start; i < end; i++)
116 const double potential = normal_adhesion_potential_(collision_set_[i], collision_set_[i].dof(V, E, F));
118 const int n_v = collision_set_[i].num_vertices();
119 const std::array<long, 4> vis = collision_set_[i].vertex_ids(E, F);
120 for (int j = 0; j < n_v; j++)
122 assert(0 <= vis[j] && vis[j] < num_vertices);
123 local_storage[vis[j]] += potential / n_v;
128 Eigen::VectorXd out = Eigen::VectorXd::Zero(num_vertices);
129 for (
const auto &local_potential : storage)
131 out += local_potential;
134 Eigen::VectorXd out_full = Eigen::VectorXd::Zero(collision_mesh_.full_num_vertices());
135 for (
int i = 0; i < out.size(); i++)
136 out_full[collision_mesh_.to_full_vertex_id(i)] = out[i];
138 assert(std::abs(value_unweighted(
x) - out_full.sum()) < std::max(1e-10 * out_full.sum(), 1e-10));
153 ipc::PSDProjectionMethod psd_projection_method;
156 psd_projection_method = ipc::PSDProjectionMethod::CLAMP;
158 psd_projection_method = ipc::PSDProjectionMethod::NONE;
190 if (data.iter_num == 0)
#define POLYFEM_SCOPED_TIMER(...)
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)
Eigen::SparseMatrix< double, Eigen::ColMajor > StiffnessMatrix