17 const Eigen::VectorXd &periodic_mesh_representation,
18 const ipc::NormalCollisions &contact_set,
19 const Eigen::VectorXd &solution,
20 const Eigen::VectorXd &adjoint_sol,
21 Eigen::VectorXd &term)
26 Eigen::VectorXd tiled_term;
34 Eigen::VectorXd force;
37 Eigen::MatrixXd adjoint_affine =
utils::unflatten(adjoint_sol.tail(dim * dim), dim);
41 tiled_term.segment(k_full * dim, dim) += adjoint_affine.transpose() * force.segment(k_full * dim, dim);
47 form.BarrierContactForm::second_derivative_unweighted(form.
single_to_tiled(solution), hessian_full);
48 Eigen::VectorXd tmp = form.
single_to_tiled(adjoint_sol).transpose() * hessian_full;
49 Eigen::MatrixXd sol_affine =
utils::unflatten(solution.tail(dim * dim), dim);
53 tiled_term.segment(k_full * dim, dim) += sol_affine.transpose() * tmp.segment(k_full * dim, dim);
58 Eigen::VectorXd unit_term;
59 Eigen::MatrixXd affine_term;
60 affine_term.setZero(dim, dim);
61 unit_term.setZero(tiled_term.size());
62 Eigen::MatrixXd affine =
utils::unflatten(periodic_mesh_representation.tail(dim * dim), dim).transpose();
66 affine_term += tiled_term.segment(k_full * dim, dim) * form.
collision_mesh_.rest_positions().row(k);
67 unit_term.segment(k_full * dim, dim) += affine.transpose() * tiled_term.segment(k_full * dim, dim);
73 term.setZero(periodic_mesh_representation.size());
75 term.segment(periodic_mesh_map.
full_to_periodic(i) * dim, dim).array() += single_term.segment(i * dim, dim).array();
76 term.tail(dim * dim) = Eigen::Map<Eigen::VectorXd>(affine_term.data(), dim * dim, 1);