PolyFEM
Loading...
Searching...
No Matches
TangentialAdhesionForceDerivative.cpp
Go to the documentation of this file.
2
3#include <Eigen/Core>
7#include <ipc/collisions/tangential/tangential_collisions.hpp>
8#include <ipc/potentials/tangential_adhesion_potential.hpp>
9
10namespace polyfem::solver
11{
14 const Eigen::MatrixXd &prev_solution,
15 const Eigen::MatrixXd &solution,
16 const Eigen::MatrixXd &adjoint,
17 const ipc::TangentialCollisions &tangential_constraints_set,
18 Eigen::VectorXd &term)
19 {
20 Eigen::MatrixXd U = form.collision_mesh_.vertices(utils::unflatten(solution, form.collision_mesh_.dim()));
21 Eigen::MatrixXd U_prev = form.collision_mesh_.vertices(utils::unflatten(prev_solution, form.collision_mesh_.dim()));
22
23 // TODO: use the time integration to compute the velocity
24 const Eigen::MatrixXd velocities = (U - U_prev) / form.time_integrator_->dt();
25
26 StiffnessMatrix hess = -form.tangential_adhesion_potential_.force_jacobian(
27 tangential_constraints_set,
28 form.collision_mesh_, form.collision_mesh_.rest_positions(),
29 /*lagged_displacements=*/U_prev, velocities,
31 1,
32 ipc::TangentialPotential::DiffWRT::REST_POSITIONS);
33
34 term = form.collision_mesh_.to_full_dof(hess).transpose() * adjoint;
35 }
36} // namespace polyfem::solver
const ipc::NormalAdhesionPotential & normal_adhesion_potential() const
static void force_shape_derivative(TangentialAdhesionForm &form, const Eigen::MatrixXd &prev_solution, const Eigen::MatrixXd &solution, const Eigen::MatrixXd &adjoint, const ipc::TangentialCollisions &tangential_constraints_set, Eigen::VectorXd &term)
Form of the lagged tangential adhesion disapative potential and forces.
const ipc::CollisionMesh & collision_mesh_
Reference to the collision mesh.
const NormalAdhesionForm & normal_adhesion_form_
necessary to have the barrier stiffnes, maybe clean me
const std::shared_ptr< time_integrator::ImplicitTimeIntegrator > time_integrator_
Pointer to the time integrator.
const ipc::TangentialAdhesionPotential tangential_adhesion_potential_
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