PolyFEM
Loading...
Searching...
No Matches
BarrierContactForceDerivative.cpp
Go to the documentation of this file.
2
3#include <Eigen/Core>
6#include <ipc/collisions/normal/normal_collisions.hpp>
7
8namespace polyfem::solver
9{
11 const BarrierContactForm &form,
12 const ipc::NormalCollisions &collision_set,
13 const Eigen::MatrixXd &solution,
14 const Eigen::VectorXd &adjoint_sol,
15 Eigen::VectorXd &term)
16 {
17 // Eigen::MatrixXd U = collision_mesh_.vertices(utils::unflatten(solution, collision_mesh_.dim()));
18 // Eigen::MatrixXd X = collision_mesh_.vertices(boundary_nodes_pos_);
19 const Eigen::MatrixXd displaced_surface = form.compute_displaced_surface(solution);
20
21 StiffnessMatrix dq_h = form.collision_mesh_.to_full_dof(form.barrier_potential_.shape_derivative(collision_set, form.collision_mesh_, displaced_surface));
22 term = form.barrier_stiffness() * dq_h.transpose() * adjoint_sol;
23 }
24} // namespace polyfem::solver
static void force_shape_derivative(const BarrierContactForm &form, const ipc::NormalCollisions &collision_set, const Eigen::MatrixXd &solution, const Eigen::VectorXd &adjoint_sol, Eigen::VectorXd &term)
const ipc::BarrierPotential barrier_potential_
Contact potential.
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.
Eigen::SparseMatrix< double, Eigen::ColMajor > StiffnessMatrix
Definition Types.hpp:24