PolyFEM
Loading...
Searching...
No Matches
FrictionForceDerivative.cpp
Go to the documentation of this file.
2
3#include <Eigen/Core>
8#include <ipc/collisions/tangential/tangential_collisions.hpp>
9#include <ipc/potentials/friction_potential.hpp>
10
11namespace polyfem::solver
12{
14 FrictionForm &form,
15 const Eigen::MatrixXd &prev_solution,
16 const Eigen::MatrixXd &solution,
17 const Eigen::MatrixXd &adjoint,
18 const ipc::TangentialCollisions &friction_constraints_set,
19 Eigen::VectorXd &term)
20 {
21 Eigen::MatrixXd U = form.collision_mesh_.vertices(utils::unflatten(solution, form.collision_mesh_.dim()));
22 Eigen::MatrixXd U_prev = form.collision_mesh_.vertices(utils::unflatten(prev_solution, form.collision_mesh_.dim()));
23
24 // TODO: use the time integration to compute the velocity
25 const Eigen::MatrixXd velocities = (U - U_prev) / form.time_integrator_->dt();
26
27 StiffnessMatrix hess;
28 if (const auto barrier_contact = dynamic_cast<const BarrierContactForm *>(&form.contact_form_))
29 {
30 hess = -form.friction_potential_.force_jacobian(
31 friction_constraints_set,
32 form.collision_mesh_, form.collision_mesh_.rest_positions(),
33 /*lagged_displacements=*/U_prev, velocities,
34 barrier_contact->barrier_potential(),
35 barrier_contact->barrier_stiffness(),
36 ipc::FrictionPotential::DiffWRT::REST_POSITIONS);
37 }
38
39 term = form.collision_mesh_.to_full_dof(hess).transpose() * adjoint;
40 }
41} // namespace polyfem::solver
static void force_shape_derivative(FrictionForm &form, const Eigen::MatrixXd &prev_solution, const Eigen::MatrixXd &solution, const Eigen::MatrixXd &adjoint, const ipc::TangentialCollisions &friction_constraints_set, Eigen::VectorXd &term)
Form of the lagged friction disapative potential and forces.
const ipc::CollisionMesh & collision_mesh_
Reference to the collision mesh.
const std::shared_ptr< time_integrator::ImplicitTimeIntegrator > time_integrator_
Pointer to the time integrator.
const ipc::FrictionPotential friction_potential_
const ContactForm & contact_form_
necessary to have the barrier stiffnes, maybe clean me
Eigen::MatrixXd unflatten(const Eigen::VectorXd &x, int dim)
Unflatten rowwises, so every dim elements in x become a row.
Eigen::SparseMatrix< double, Eigen::ColMajor > StiffnessMatrix
Definition Types.hpp:24