Wildmeshing Toolkit
Loading...
Searching...
No Matches
DirichletEnergy.hpp
1#pragma once
2
3#include <polysolve/nonlinear/Problem.hpp>
4#include <wmtk/Types.hpp>
5
6namespace wmtk::optimization {
7
8class DirichletEnergy2D : public polysolve::nonlinear::Problem
9{
10public:
11 using typename polysolve::nonlinear::Problem::Scalar;
12 using typename polysolve::nonlinear::Problem::THessian;
13 using typename polysolve::nonlinear::Problem::TVector;
14
22 DirichletEnergy2D(std::vector<std::array<double, 4>>& cells);
23
24 TVector initial_position() const;
25
26 double value(const TVector& x) override;
27 void gradient(const TVector& x, TVector& gradv) override;
28 void hessian(const TVector& x, THessian& hessian) override
29 {
30 log_and_throw_error("Sparse functions do not exist, use dense solver");
31 }
32 void hessian(const TVector& x, MatrixXd& hessian) override;
33
34 void solution_changed(const TVector& new_x) override {}
35
36private:
37 std::vector<std::array<double, 4>> m_cells;
38};
39
40class BiharmonicEnergy2D : public polysolve::nonlinear::Problem
41{
42public:
43 using typename polysolve::nonlinear::Problem::Scalar;
44 using typename polysolve::nonlinear::Problem::THessian;
45 using typename polysolve::nonlinear::Problem::TVector;
46
59 const std::array<Vector2d, 3>& pts,
60 const double& M,
61 const Vector3d& L_w,
62 const double weight = 1);
63
64 TVector initial_position() const;
65
66 double value(const TVector& x) override;
67 void gradient(const TVector& x, TVector& gradv) override;
68 void hessian(const TVector& x, THessian& hessian) override
69 {
70 log_and_throw_error("Sparse functions do not exist, use dense solver");
71 }
72 void hessian(const TVector& x, MatrixXd& hessian) override;
73
74 void solution_changed(const TVector& new_x) override {}
75
76 static void
77 local_mass_and_stiffness(const std::array<Vector2d, 3>& pts, double& M, Vector3d& L_w);
78
79 static void
80 uniform_mass_and_stiffness(const std::array<Vector2d, 3>& pts, double& M, Vector3d& L_w);
81
82private:
87 std::array<Vector2d, 3> m_pts;
97 Vector3d m_L_w_row;
98 double m_M; // the mass of the optimized vertex
99 double m_M_inv; // the inverse mass, 1 / M
100
109 Vector3d m_LTML_row;
110
111 double m_weight;
112};
113
114class BiharmonicEnergy3D : public polysolve::nonlinear::Problem
115{
116public:
117 using typename polysolve::nonlinear::Problem::Scalar;
118 using typename polysolve::nonlinear::Problem::THessian;
119 using typename polysolve::nonlinear::Problem::TVector;
120
133 const MatrixXd& pts,
134 const double& M,
135 const VectorXd& L_w,
136 const double weight = 1);
137
138 TVector initial_position() const;
139
140 double value(const TVector& x) override;
141 void gradient(const TVector& x, TVector& gradv) override;
142 void hessian(const TVector& x, THessian& hessian) override
143 {
144 log_and_throw_error("Sparse functions do not exist, use dense solver");
145 }
146 void hessian(const TVector& x, MatrixXd& hessian) override;
147
148 void solution_changed(const TVector& new_x) override {}
149
153 static void global_mass_and_stiffness(
154 const MatrixXd& pts,
155 const MatrixXi& tris,
156 Eigen::SparseMatrix<double>& M,
157 Eigen::SparseMatrix<double>& L_w);
158
173 const size_t vid,
174 const Eigen::SparseMatrix<double>& M_glob,
175 const Eigen::SparseMatrix<double>& L_w_glob,
176 double& M_loc,
177 VectorXd& L_w_loc);
178
184 static void adjacency_from_stiffness(
185 const size_t vid,
186 const Eigen::SparseMatrix<double>& L_w_glob,
187 std::vector<size_t>& adj);
188
189 static void uniform_mass_and_stiffness(const MatrixXd& pts, double& M, VectorXd& L_w);
190
191private:
196 MatrixXd m_pts;
205 VectorXd m_L_w_row;
206 double m_M; // the mass of the optimized vertex
207 double m_M_inv; // the inverse mass, 1 / M
208
217 VectorXd m_LTML_row;
218
219 double m_weight;
220};
221
222} // namespace wmtk::optimization
Definition DirichletEnergy.hpp:41
Vector3d m_LTML_row
Definition DirichletEnergy.hpp:109
Vector3d m_L_w_row
Definition DirichletEnergy.hpp:97
std::array< Vector2d, 3 > m_pts
Definition DirichletEnergy.hpp:87
Definition DirichletEnergy.hpp:115
static void adjacency_from_stiffness(const size_t vid, const Eigen::SparseMatrix< double > &L_w_glob, std::vector< size_t > &adj)
Get the adjacency for vid from the global stiffness matrix.
Definition DirichletEnergy.cpp:235
VectorXd m_LTML_row
Definition DirichletEnergy.hpp:217
static void extract_local_mass_and_stiffness(const size_t vid, const Eigen::SparseMatrix< double > &M_glob, const Eigen::SparseMatrix< double > &L_w_glob, double &M_loc, VectorXd &L_w_loc)
Extract the mass and stiffness for local optimization from the global mass and stiffness matrices.
Definition DirichletEnergy.cpp:202
VectorXd m_L_w_row
Definition DirichletEnergy.hpp:205
MatrixXd m_pts
Definition DirichletEnergy.hpp:196
static void global_mass_and_stiffness(const MatrixXd &pts, const MatrixXi &tris, Eigen::SparseMatrix< double > &M, Eigen::SparseMatrix< double > &L_w)
Construct mass and stiffness for all vertices using IGL.
Definition DirichletEnergy.cpp:192
Definition DirichletEnergy.hpp:9