PolyFEM
Loading...
Searching...
No Matches
BarrierContactForm.hpp
Go to the documentation of this file.
1#pragma once
2
3#include "ContactForm.hpp"
4
6#include <polysolve/nonlinear/PostStepData.hpp>
7
8#include <ipc/collisions/normal/normal_collisions.hpp>
9#include <ipc/potentials/barrier_potential.hpp>
10#include <ipc/collisions/normal/normal_collisions.hpp>
11#include <ipc/barrier/barrier.hpp>
12
13namespace polyfem::solver
14{
16 {
18
19 public:
20 BarrierContactForm(const ipc::CollisionMesh &collision_mesh,
21 const double dhat,
22 const double avg_mass,
23 const bool use_area_weighting,
25 const bool use_physical_barrier,
27 const bool is_time_dependent,
28 const bool enable_shape_derivatives,
29 const ipc::BroadPhaseMethod broad_phase_method,
30 const double ccd_tolerance,
31 const int ccd_max_iterations,
32 const double dhat_epsilon_scale,
33 const ipc::NormalCollisions::CollisionSetType collision_set_type = ipc::NormalCollisions::CollisionSetType::IPC,
34 const bool skip_obstacles = false,
35 std::shared_ptr<ipc::Barrier> barrier = nullptr);
36
37 virtual std::string name() const override { return "barrier-contact"; }
38
39 virtual void update_barrier_stiffness(const Eigen::VectorXd &x, const Eigen::MatrixXd &grad_energy) override;
40
44 void post_step(const polysolve::nonlinear::PostStepData &data) override;
45
47
49 bool use_area_weighting() const { return collision_set().use_area_weighting(); }
50
52 bool use_improved_max_operator() const { return collision_set().use_improved_max_approximator(); }
53
55 bool use_physical_barrier() const { return barrier_potential_.use_physical_barrier(); }
56
57 const ipc::NormalCollisions &collision_set() const { return collision_set_; }
58 const ipc::BarrierPotential &barrier_potential() const { return barrier_potential_; }
59
60 protected:
64 virtual double value_unweighted(const Eigen::VectorXd &x) const override;
65
69 Eigen::VectorXd value_per_element_unweighted(const Eigen::VectorXd &x) const override;
70
74 virtual void first_derivative_unweighted(const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override;
75
79 virtual void second_derivative_unweighted(const Eigen::VectorXd &x, StiffnessMatrix &hessian) const override;
80
81 void update_collision_set(const Eigen::MatrixXd &displaced_surface) override;
82
84 ipc::NormalCollisions collision_set_;
85
87 const ipc::BarrierPotential barrier_potential_;
88
89 private:
92 };
93} // namespace polyfem::solver
int x
virtual void first_derivative_unweighted(const Eigen::VectorXd &x, Eigen::VectorXd &gradv) const override
Compute the first derivative of the value wrt x.
bool use_improved_max_operator() const
Get use_improved_max_operator.
virtual void second_derivative_unweighted(const Eigen::VectorXd &x, StiffnessMatrix &hessian) const override
Compute the second derivative of the value wrt x.
const ipc::BarrierPotential & barrier_potential() const
bool use_convergent_formulation() const override
Get use_convergent_formulation.
bool use_area_weighting() const
Get use_area_weighting.
virtual double value_unweighted(const Eigen::VectorXd &x) const override
Compute the contact barrier potential value.
virtual std::string name() const override
Eigen::MatrixXd cached_displaced_surface_
Per-form cache: identical positions in another state do not imply that this collision set is built.
Eigen::VectorXd value_per_element_unweighted(const Eigen::VectorXd &x) const override
Compute the value of the form multiplied per element.
const ipc::NormalCollisions & collision_set() const
virtual void update_barrier_stiffness(const Eigen::VectorXd &x, const Eigen::MatrixXd &grad_energy) override
Update the barrier stiffness based on the current elasticity energy.
void update_collision_set(const Eigen::MatrixXd &displaced_surface) override
Update the cached candidate set for the current solution.
const ipc::BarrierPotential barrier_potential_
Contact potential.
ipc::NormalCollisions collision_set_
Cached constraint set for the current solution.
void post_step(const polysolve::nonlinear::PostStepData &data) override
Update fields after a step in the optimization.
bool use_physical_barrier() const
Get use_physical_barrier.
Form representing the contact potential and forces.
bool use_adaptive_barrier_stiffness() const
Get use_adaptive_barrier_stiffness.
double dhat_epsilon_scale() const
Get the dhat_epsilon_scale passed to ipc::update_barrier_stiffness.
Eigen::SparseMatrix< double, Eigen::ColMajor > StiffnessMatrix
Definition Types.hpp:24