9#include <ipc/utils/eigen_ext.hpp>
10#include <ipc/barrier/adaptive_stiffness.hpp>
11#include <ipc/utils/world_bbox_diagonal_length.hpp>
12#include <ipc/barrier/barrier.hpp>
18 ipc::FaceQuadRule build_quad_rule(
const int order)
23 ipc::FaceQuadRule rule;
24 rule.reserve(quad.
size());
25 for (
int i = 0; i < quad.
size(); i++)
27 const double x = quad.
points(i, 0);
28 const double y = quad.
points(i, 1);
31 const double w = quad.
weights(i) * 2.0;
32 rule.push_back({{{1.0 -
x -
y,
x,
y}}, w});
40 bool is_vertex_point(
const ipc::FaceQuadPoint &qp,
int vertex,
double tol = 1e-12)
42 for (
int i = 0; i < 3; i++)
44 if (std::abs(qp.lambda[i] - (i == vertex ? 1.0 : 0.0)) > tol)
53 for (
int v = 0; v < 3; v++)
56 for (
const auto &qp : rule)
65 throw std::runtime_error(
"Face quadrature rule is missing triangle vertex " + std::to_string(v) +
"; choose a quadrature scheme that includes corner points");
69 ipc::ESPParameters
init_params(
const double dhat,
const json &esp_params,
const bool skip_obstacles, std::shared_ptr<ipc::Barrier> barrier,
const int dim)
71 const int quadrature_order = esp_params[
"quadrature_order"];
72 const double dbar_factor = esp_params[
"dbar_factor"];
73 const bool area_weights = esp_params[
"area_weights"];
74 const ipc::ESPParameters::IntegrationType itype = skip_obstacles ? ipc::ESPParameters::IntegrationType::NO_OBST : ipc::ESPParameters::IntegrationType::NORMAL;
75 ipc::ESPParameters params(dhat, dbar_factor, quadrature_order, area_weights, itype);
76 params.barrier = barrier ? barrier : (dim == 3 ? std::make_shared<ipc::InversePowerBarrier<>>(2.0) : std::make_shared<ipc::InversePowerBarrier<>>(1.0));
77 if (quadrature_order > 0)
79 params.set_quad_rule(build_quad_rule(quadrature_order));
87 const double avg_mass,
88 const json esp_params,
89 const bool skip_obstacles,
90 std::shared_ptr<ipc::Barrier> barrier,
91 const bool use_adaptive_dhat,
92 const bool use_adaptive_barrier_stiffness,
93 const bool is_time_dependent,
94 const bool enable_shape_derivatives,
95 const ipc::BroadPhaseMethod broad_phase_method,
96 const double ccd_tolerance,
97 const int ccd_max_iterations,
98 const double dhat_epsilon_scale) :
ContactForm(collision_mesh, dhat, avg_mass, use_adaptive_barrier_stiffness, is_time_dependent, enable_shape_derivatives, broad_phase_method, ccd_tolerance, ccd_max_iterations, dhat_epsilon_scale), params(
init_params(dhat, esp_params, skip_obstacles, barrier, static_cast<int>(collision_mesh.dim()))),
99 barrier_potential_(params, esp_params[
"normalize_weights"])
101 if (use_adaptive_dhat)
144 gradv.setZero(
x.size());
166 if (!std::isinf(curr_distance))
168 const double ratio = sqrt(curr_distance) /
dhat();
169 const auto log_level = (ratio < 1e-6) ? spdlog::level::err : ((ratio < 1e-4) ? spdlog::level::warn : spdlog::level::debug);
170 polyfem::logger().log(log_level,
"Minimum distance during solve: {}, dhat: {}", sqrt(curr_distance),
dhat());
173 if (data.iter_num == 0)
190 "updated barrier stiffness from {:g} to {:g}",
#define POLYFEM_SCOPED_TIMER(...)
void get_quadrature(const int order, Quadrature &quad)
bool is_vertex_point(const ipc::FaceQuadPoint &qp, int vertex, double tol=1e-12)
Check if a quadrature point is at a triangle vertex (one barycentric coordinate ≈ 1,...
ipc::ESPParameters init_params(const double dhat, const json &esp_params, const bool skip_obstacles, std::shared_ptr< ipc::Barrier > barrier, const int dim)
void verify_vertices_in_quad_rule(const ipc::FaceQuadRule &rule)
Verify the quadrature rule contains the 3 triangle vertices.
spdlog::logger & logger()
Retrieves the current logger.
void log_and_throw_error(const std::string &msg)
Eigen::SparseMatrix< double, Eigen::ColMajor > StiffnessMatrix