PolyFEM
Loading...
Searching...
No Matches
NLProblem.hpp
Go to the documentation of this file.
1#pragma once
2
6
8
10{
11 class Solver;
12}
13
14namespace polyfem::solver
15{
16 class NLProblem : public FullNLProblem
17 {
18 public:
19 using typename FullNLProblem::Scalar;
20 using typename FullNLProblem::THessian;
21 using typename FullNLProblem::TVector;
22
23 protected:
25 const int full_size,
26 const std::vector<std::shared_ptr<Form>> &forms,
27 const std::vector<std::shared_ptr<AugmentedLagrangianForm>> &penalty_forms,
28 const std::shared_ptr<polysolve::linear::Solver> &solver,
29 const bool is_residual = false);
30
31 public:
32 NLProblem(const int full_size,
33 const std::shared_ptr<utils::PeriodicBoundary> &periodic_bc,
34 const double t,
35 const std::vector<std::shared_ptr<Form>> &forms,
36 const std::vector<std::shared_ptr<AugmentedLagrangianForm>> &penalty_forms,
37 const std::shared_ptr<polysolve::linear::Solver> &solver,
38 const double char_length,
39 const double char_force,
40 StiffnessMatrix lumped_mass,
41 const int dimension,
42 const bool is_residual = false);
43 virtual ~NLProblem() = default;
44
45 virtual double value(const TVector &x) override;
46 virtual void gradient(const TVector &x, TVector &gradv) override;
47 virtual void hessian(const TVector &x, THessian &hessian) override;
48
49 virtual bool is_step_valid(const TVector &x0, const TVector &x1) override;
50 virtual bool is_step_collision_free(const TVector &x0, const TVector &x1) override;
51 virtual double max_step_size(const TVector &x0, const TVector &x1) override;
52 void line_search_begin(const TVector &x0, const TVector &x1) override;
53 virtual void post_step(const polysolve::nonlinear::PostStepData &data) override;
54
55 void solution_changed(const TVector &new_x) override;
56
57 void init_lagging(const TVector &x) override;
58 void update_lagging(const TVector &x, const int iter_num) override;
59
60 // --------------------------------------------------------------------
61
62 virtual void update_quantities(const double t, const TVector &x);
63
64 int full_size() const { return full_size_; }
65 int reduced_size() const { return reduced_size_; }
66
69
70 TVector full_to_reduced(const TVector &full) const;
71 virtual TVector full_to_reduced_grad(const TVector &full) const;
72 virtual TVector full_to_reduced_diag(const TVector &full_diag) const;
73 TVector reduced_to_full(const TVector &reduced) const;
74
76
77 double normalize_forms() override;
78
79 virtual double grad_norm_rescaling(const polysolve::nonlinear::NormType norm_type) const override;
80 virtual double step_norm_rescaling(const polysolve::nonlinear::NormType norm_type) const override;
81 virtual double energy_norm_rescaling(const polysolve::nonlinear::NormType norm_type) const override;
82 virtual double grad_norm(const TVector &grad, const polysolve::nonlinear::NormType norm_type) const override;
83 virtual double step_norm(const TVector &x, const polysolve::nonlinear::NormType norm_type) const override;
84
85 protected:
86 const int full_size_;
88
89 enum class CurrentSize
90 {
93 };
95 int current_size() const
96 {
98 }
99
100 Eigen::DiagonalMatrix<double, Eigen::Dynamic> current_lumped_mass() const
101 {
102 return full_to_reduced_diag(lumped_mass_.diagonal()).asDiagonal();
103 }
104
105 double t_;
106 double F0;
107 double L;
108 int dim;
109 Eigen::DiagonalMatrix<double, Eigen::Dynamic> lumped_mass_;
110
111 protected:
112 std::vector<std::shared_ptr<AugmentedLagrangianForm>> penalty_forms_;
113 // The decomposion comes from sec 1.3 of https://www.cs.cornell.edu/courses/cs6241/2021sp/meetings/nb-2021-03-11.pdf
118 Eigen::PermutationMatrix<Eigen::Dynamic, Eigen::Dynamic> P_;
119 TVector Q1R1iTb_;
120 std::shared_ptr<polysolve::linear::Solver> solver_;
121
122 std::shared_ptr<FullNLProblem> penalty_problem_;
124
125 void setup_constraints();
127 };
128} // namespace polyfem::solver
int x
std::vector< std::shared_ptr< Form > > & forms()
bool is_residual() const override
const int full_size_
Size of the full problem.
Definition NLProblem.hpp:86
virtual double grad_norm_rescaling(const polysolve::nonlinear::NormType norm_type) const override
StiffnessMatrix R1_
R1 block of the QR decomposition of the constraints matrix.
void line_search_begin(const TVector &x0, const TVector &x1) override
Eigen::PermutationMatrix< Eigen::Dynamic, Eigen::Dynamic > P_
Permutation matrix of the QR decomposition of the constraints matrix.
virtual double energy_norm_rescaling(const polysolve::nonlinear::NormType norm_type) const override
double normalize_forms() override
StiffnessMatrix Q2_
Q2 block of the QR decomposition of the constraints matrix.
virtual bool is_step_valid(const TVector &x0, const TVector &x1) override
int reduced_size_
Size of the reduced problem.
Definition NLProblem.hpp:87
virtual double step_norm_rescaling(const polysolve::nonlinear::NormType norm_type) const override
virtual void post_step(const polysolve::nonlinear::PostStepData &data) override
virtual TVector full_to_reduced_grad(const TVector &full) const
virtual TVector full_to_reduced_diag(const TVector &full_diag) const
virtual double step_norm(const TVector &x, const polysolve::nonlinear::NormType norm_type) const override
StiffnessMatrix Q2t_
Q2 transpose.
TVector full_to_reduced(const TVector &full) const
virtual void update_quantities(const double t, const TVector &x)
virtual void gradient(const TVector &x, TVector &gradv) override
void init_lagging(const TVector &x) override
Eigen::DiagonalMatrix< double, Eigen::Dynamic > lumped_mass_
virtual bool is_step_collision_free(const TVector &x0, const TVector &x1) override
TVector reduced_to_full(const TVector &reduced) const
void update_lagging(const TVector &x, const int iter_num) override
std::vector< std::shared_ptr< AugmentedLagrangianForm > > penalty_forms_
Eigen::DiagonalMatrix< double, Eigen::Dynamic > current_lumped_mass() const
virtual double value(const TVector &x) override
StiffnessMatrix Q1_
Q1 block of the QR decomposition of the constraints matrix.
virtual double max_step_size(const TVector &x0, const TVector &x1) override
virtual ~NLProblem()=default
virtual void hessian(const TVector &x, THessian &hessian) override
std::shared_ptr< polysolve::linear::Solver > solver_
void solution_changed(const TVector &new_x) override
virtual double grad_norm(const TVector &grad, const polysolve::nonlinear::NormType norm_type) const override
std::shared_ptr< FullNLProblem > penalty_problem_
CurrentSize current_size_
Current size of the problem (either full or reduced size)
Definition NLProblem.hpp:94
TVector Q1R1iTb_
Q1_ * (R1_.transpose().triangularView<Eigen::Upper>().solve(constraint_values_))
void full_hessian_to_reduced_hessian(StiffnessMatrix &hessian) const
Eigen::SparseMatrix< double, Eigen::ColMajor > StiffnessMatrix
Definition Types.hpp:24