Wildmeshing Toolkit
Loading...
Searching...
No Matches
BarrierEnergy.hpp
1#pragma once
2
3// #define WMTK_SMOOTH_BARRIER
4
5#include <ipc/collisions/normal/normal_collisions.hpp>
6#include <ipc/ipc.hpp>
7#include <ipc/potentials/barrier_potential.hpp>
8#ifdef WMTK_SMOOTH_BARRIER
9#include <ipc/smooth_contact/smooth_contact_potential.hpp>
10#endif
11#include <polysolve/nonlinear/Problem.hpp>
12#include <wmtk/Types.hpp>
13
14
15namespace wmtk::optimization {
16
17class BarrierEnergy2D : public polysolve::nonlinear::Problem
18{
19public:
20 using typename polysolve::nonlinear::Problem::Scalar;
21 using typename polysolve::nonlinear::Problem::THessian;
22 using typename polysolve::nonlinear::Problem::TVector;
23
32 const MatrixXd& V,
33 const MatrixXi& E,
34 const size_t vid,
35 const double dhat,
36 const double weight = 1);
37
38 TVector initial_position() const;
39
40 void replace_vid(const size_t vid);
41
42 MatrixXd& V() { return m_V; }
43
44 double value(const TVector& x) override;
45 void gradient(const TVector& x, TVector& gradv) override;
46 void hessian(const TVector& x, THessian& hessian) override
47 {
48 log_and_throw_error("Sparse functions do not exist, use dense solver");
49 }
50 void hessian(const TVector& x, MatrixXd& hessian) override;
51
52 void solution_changed(const TVector& new_x) override {}
53
54 bool is_step_valid(const TVector& x0, const TVector& x1) override { return true; }
55
56 void update_collisions(const TVector& x);
57
58private:
59 ipc::CollisionMesh m_collision_mesh;
60 MatrixXd m_V;
61#ifdef WMTK_SMOOTH_BARRIER
62 ipc::SmoothContactParameters m_params;
63 ipc::SmoothCollisions m_smooth_collisions;
64 ipc::SmoothContactPotential m_smooth_B;
65#else
66 ipc::NormalCollisions m_collisions;
67 ipc::BarrierPotential m_B;
68#endif
69
70
71 Vector2d m_x0;
72 size_t m_vid;
73
74 double m_weight;
75};
76
77class BarrierEnergy3D : public polysolve::nonlinear::Problem
78{
79public:
80 using typename polysolve::nonlinear::Problem::Scalar;
81 using typename polysolve::nonlinear::Problem::THessian;
82 using typename polysolve::nonlinear::Problem::TVector;
83
92 const MatrixXd& V,
93 const MatrixXi& E,
94 const MatrixXi& F,
95 const size_t vid,
96 const double dhat,
97 const double weight = 1);
98
99 TVector initial_position() const;
100
101 void replace_vid(const size_t vid);
102
103 MatrixXd& V() { return m_V; }
104
105 double value(const TVector& x) override;
106 void gradient(const TVector& x, TVector& gradv) override;
107 void hessian(const TVector& x, THessian& hessian) override
108 {
109 log_and_throw_error("Sparse functions do not exist, use dense solver");
110 }
111 void hessian(const TVector& x, MatrixXd& hessian) override;
112
113 void solution_changed(const TVector& new_x) override {}
114
115 bool is_step_valid(const TVector& x0, const TVector& x1) override { return true; }
116
117 void update_collisions(const TVector& x);
118
119private:
120 ipc::CollisionMesh m_collision_mesh;
121 MatrixXd m_V;
122 ipc::NormalCollisions m_collisions;
123 ipc::BarrierPotential m_B;
124
125 Vector3d m_x0;
126 size_t m_vid;
127
128 double m_weight;
129};
130
131} // namespace wmtk::optimization
Definition BarrierEnergy.hpp:18
Definition BarrierEnergy.hpp:78