13 const Eigen::VectorXi &tiled_to_single,
15 const double avg_mass,
16 const bool use_area_weighting,
17 const bool use_improved_max_operator,
18 const bool use_physical_barrier,
19 const bool use_adaptive_barrier_stiffness,
20 const bool is_time_dependent,
21 const bool enable_shape_derivatives,
22 const ipc::BroadPhaseMethod broad_phase_method,
23 const double ccd_tolerance,
24 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)
43 std::vector<Eigen::Triplet<double>>
entries;
47 for (
int d = 0; d < dim; d++)
50 for (
int p = 0; p < dim; p++)
51 for (
int q = 0; q < dim; q++)
52 entries.emplace_back(
n_single_dof_ * dim + p * dim + q, i_full * dim + p, boundary_vertices(i, q));
66 Eigen::VectorXd tiled_x;
71 for (
int d = 0; d < dim; d++)
74 for (
int p = 0; p < dim; p++)
75 for (
int q = 0; q < dim; q++)
76 tiled_x(i_full * dim + p) +=
x(
n_single_dof_ * dim + p * dim + q) * boundary_vertices(i, q);
87 Eigen::VectorXd reduced_grad;
92 for (
int d = 0; d < dim; d++)
95 for (
int p = 0; p < dim; p++)
96 for (
int q = 0; q < dim; q++)
97 reduced_grad(
n_single_dof_ * dim + p * dim + q) += boundary_vertices(i, q) * grad(i_full * dim + p);
125 hessian =
proj * hessian_full *
proj.transpose();
157 polysolve::nonlinear::PostStepData(
176 Eigen::VectorXd tiled_term;
184 Eigen::VectorXd force;
187 Eigen::MatrixXd adjoint_affine =
utils::unflatten(adjoint_sol.tail(dim * dim), dim);
191 tiled_term.segment(k_full * dim, dim) += adjoint_affine.transpose() * force.segment(k_full * dim, dim);
198 Eigen::VectorXd tmp =
single_to_tiled(adjoint_sol).transpose() * hessian_full;
199 Eigen::MatrixXd sol_affine =
utils::unflatten(solution.tail(dim * dim), dim);
203 tiled_term.segment(k_full * dim, dim) += sol_affine.transpose() * tmp.segment(k_full * dim, dim);
208 Eigen::VectorXd unit_term;
209 Eigen::MatrixXd affine_term;
210 affine_term.setZero(dim, dim);
211 unit_term.setZero(tiled_term.size());
212 Eigen::MatrixXd affine =
utils::unflatten(periodic_mesh_representation.tail(dim * dim), dim).transpose();
216 affine_term += tiled_term.segment(k_full * dim, dim) *
collision_mesh_.rest_positions().row(k);
217 unit_term.segment(k_full * dim, dim) += affine.transpose() * tiled_term.segment(k_full * dim, dim);
223 term.setZero(periodic_mesh_representation.size());
225 term.segment(periodic_mesh_map.
full_to_periodic(i) * dim, dim).array() += single_term.segment(i * dim, dim).array();
226 term.tail(dim * dim) = Eigen::Map<Eigen::VectorXd>(affine_term.data(), dim * dim, 1);
std::vector< Eigen::Triplet< double > > entries
main class that contains the polyfem solver and all its state
std::vector< int > primitive_to_node() const
int n_geom_bases
number of geometric bases
StiffnessMatrix basis_nodes_to_gbasis_nodes
int full_to_periodic(int i) const
Eigen::MatrixXd unflatten(const Eigen::VectorXd &x, int dim)
Unflatten rowwises, so every dim elements in x become a row.
Eigen::VectorXd flatten(const Eigen::MatrixXd &X)
Flatten rowwises.
Eigen::SparseMatrix< double, Eigen::ColMajor > StiffnessMatrix