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 SmoothingEnergy2D : 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
52 SmoothingEnergy2D(const std::array<Vector2d, 3>& pts, const double& M, const Vector3d& L_w);
53
54 TVector initial_position() const;
55
56 double value(const TVector& x) override;
57 void gradient(const TVector& x, TVector& gradv) override;
58 void hessian(const TVector& x, THessian& hessian) override
59 {
60 log_and_throw_error("Sparse functions do not exist, use dense solver");
61 }
62 void hessian(const TVector& x, MatrixXd& hessian) override;
63
64 void solution_changed(const TVector& new_x) override {}
65
66 static void
67 local_mass_and_stiffness(const std::array<Vector2d, 3>& pts, double& M, Vector3d& L_w);
68
69 static void
70 uniform_mass_and_stiffness(const std::array<Vector2d, 3>& pts, double& M, Vector3d& L_w);
71
72private:
77 std::array<Vector2d, 3> m_pts;
87 Vector3d m_L_w_row;
88 double m_M; // the mass of the optimized vertex
89 double m_M_inv; // the inverse mass, 1 / M
90
99 Vector3d m_LTML_row;
100};
101
102} // namespace wmtk::optimization
Definition DirichletEnergy.hpp:9
Definition DirichletEnergy.hpp:41
Vector3d m_LTML_row
Definition DirichletEnergy.hpp:99
std::array< Vector2d, 3 > m_pts
Definition DirichletEnergy.hpp:77
Vector3d m_L_w_row
Definition DirichletEnergy.hpp:87