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
30 public:
31 NLProblem(const int full_size,
32 const std::shared_ptr<utils::PeriodicBoundary> &periodic_bc,
33 const double t,
34 const std::vector<std::shared_ptr<Form>> &forms,
35 const std::vector<std::shared_ptr<AugmentedLagrangianForm>> &penalty_forms,
36 const std::shared_ptr<polysolve::linear::Solver> &solver,
37 const double char_length,
38 const double char_force,
39 StiffnessMatrix lumped_mass,
40 const int dimension);
41 virtual ~NLProblem() = default;
42
43 virtual double value(const TVector &x) override;
44 virtual void gradient(const TVector &x, TVector &gradv) override;
45 virtual void hessian(const TVector &x, THessian &hessian) override;
46
47 virtual bool is_step_valid(const TVector &x0, const TVector &x1) override;
48 virtual bool is_step_collision_free(const TVector &x0, const TVector &x1) override;
49 virtual double max_step_size(const TVector &x0, const TVector &x1) override;
50 void line_search_begin(const TVector &x0, const TVector &x1) override;
51 virtual void post_step(const polysolve::nonlinear::PostStepData &data) override;
52
53 void solution_changed(const TVector &new_x) override;
54
55 void init_lagging(const TVector &x) override;
56 void update_lagging(const TVector &x, const int iter_num) override;
57
58 // --------------------------------------------------------------------
59
60 virtual void update_quantities(const double t, const TVector &x);
61
62 int full_size() const { return full_size_; }
63 int reduced_size() const { return reduced_size_; }
64
67
68 TVector full_to_reduced(const TVector &full) const;
69 virtual TVector full_to_reduced_grad(const TVector &full) const;
70 virtual TVector full_to_reduced_diag(const TVector &full_diag) const;
71 TVector reduced_to_full(const TVector &reduced) const;
72
74
75 double normalize_forms() override;
76
77 virtual double grad_norm_rescaling(const polysolve::nonlinear::NormType norm_type) const override;
78 virtual double step_norm_rescaling(const polysolve::nonlinear::NormType norm_type) const override;
79 virtual double energy_norm_rescaling(const polysolve::nonlinear::NormType norm_type) const override;
80 virtual double grad_norm(const TVector &grad, const polysolve::nonlinear::NormType norm_type) const override;
81 virtual double step_norm(const TVector &x, const polysolve::nonlinear::NormType norm_type) const override;
82
83 protected:
84 const int full_size_;
86
87 enum class CurrentSize
88 {
91 };
93 int current_size() const
94 {
96 }
97
98 Eigen::DiagonalMatrix<double, Eigen::Dynamic> current_lumped_mass() const
99 {
100 return full_to_reduced_diag(lumped_mass_.diagonal()).asDiagonal();
101 }
102
103 double t_;
104 double F0;
105 double L;
106 int dim;
107 Eigen::DiagonalMatrix<double, Eigen::Dynamic> lumped_mass_;
108
109 protected:
110 std::vector<std::shared_ptr<AugmentedLagrangianForm>> penalty_forms_;
111 // The decomposion comes from sec 1.3 of https://www.cs.cornell.edu/courses/cs6241/2021sp/meetings/nb-2021-03-11.pdf
116 Eigen::PermutationMatrix<Eigen::Dynamic, Eigen::Dynamic> P_;
117 TVector Q1R1iTb_;
118 std::shared_ptr<polysolve::linear::Solver> solver_;
119
120 std::shared_ptr<FullNLProblem> penalty_problem_;
122
123 void setup_constraints();
125 };
126} // namespace polyfem::solver
int x
std::vector< std::shared_ptr< Form > > & forms()
const int full_size_
Size of the full problem.
Definition NLProblem.hpp:84
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:85
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
Definition NLProblem.hpp:98
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:92
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