PolyFEM
Loading...
Searching...
No Matches
SmoothContactForceDerivative.cpp
Go to the documentation of this file.
2
3#include <Eigen/Core>
6#include <ipc/smooth_contact/smooth_collisions.hpp>
7#include <ipc/potentials/potential.hpp>
8
9namespace polyfem::solver
10{
12 const SmoothContactForm &form,
13 const ipc::SmoothCollisions &collision_set,
14 const Eigen::MatrixXd &solution,
15 const Eigen::VectorXd &adjoint_sol,
16 Eigen::VectorXd &term)
17 {
18 StiffnessMatrix hessian = form.barrier_potential_.hessian(collision_set, form.collision_mesh_, form.compute_displaced_surface(solution), ipc::PSDProjectionMethod::NONE);
19 term = form.barrier_stiffness() * form.collision_mesh_.to_full_dof(hessian) * adjoint_sol;
20 }
21} // namespace polyfem::solver
Eigen::MatrixXd compute_displaced_surface(const Eigen::VectorXd &x) const
Compute the displaced positions of the surface nodes.
double barrier_stiffness() const
Get the current barrier stiffness.
const ipc::CollisionMesh & collision_mesh_
Collision mesh.
static void force_shape_derivative(const SmoothContactForm &form, const ipc::SmoothCollisions &collision_set, const Eigen::MatrixXd &solution, const Eigen::VectorXd &adjoint_sol, Eigen::VectorXd &term)
ipc::SmoothContactPotential barrier_potential_
Contact potential.
Eigen::SparseMatrix< double, Eigen::ColMajor > StiffnessMatrix
Definition Types.hpp:24