4#include <polysolve/nonlinear/PostStepData.hpp>
7#include <Eigen/SparseCore>
15 const Eigen::VectorXi &tiled_to_single,
17 const double avg_mass,
18 const bool use_area_weighting,
19 const bool use_improved_max_operator,
20 const bool use_physical_barrier,
21 const bool use_adaptive_barrier_stiffness,
22 const bool is_time_dependent,
23 const bool enable_shape_derivatives,
24 const ipc::BroadPhaseMethod broad_phase_method,
25 const double ccd_tolerance,
26 const int ccd_max_iterations) :
BarrierContactForm(periodic_collision_mesh, dhat, avg_mass, use_area_weighting, use_improved_max_operator, use_physical_barrier, use_adaptive_barrier_stiffness, is_time_dependent, enable_shape_derivatives, broad_phase_method, ccd_tolerance, ccd_max_iterations), tiled_to_single_(tiled_to_single), n_single_dof_(tiled_to_single_.maxCoeff() + 1)
45 std::vector<Eigen::Triplet<double>>
entries;
49 for (
int d = 0; d < dim; d++)
52 for (
int p = 0; p < dim; p++)
53 for (
int q = 0; q < dim; q++)
54 entries.emplace_back(
n_single_dof_ * dim + p * dim + q, i_full * dim + p, boundary_vertices(i, q));
68 Eigen::VectorXd tiled_x;
73 for (
int d = 0; d < dim; d++)
76 for (
int p = 0; p < dim; p++)
77 for (
int q = 0; q < dim; q++)
78 tiled_x(i_full * dim + p) +=
x(
n_single_dof_ * dim + p * dim + q) * boundary_vertices(i, q);
89 Eigen::VectorXd reduced_grad;
94 for (
int d = 0; d < dim; d++)
97 for (
int p = 0; p < dim; p++)
98 for (
int q = 0; q < dim; q++)
99 reduced_grad(
n_single_dof_ * dim + p * dim + q) += boundary_vertices(i, q) * grad(i_full * dim + p);
127 hessian =
proj * hessian_full *
proj.transpose();
159 polysolve::nonlinear::PostStepData(
std::vector< Eigen::Triplet< double > > entries
Eigen::SparseMatrix< double, Eigen::ColMajor > StiffnessMatrix