[P]arallel [Hi]gh-order [Li]brary for [P]DEs  Latest
Parallel High-Order Library for PDEs through hp-adaptive Discontinuous Galerkin methods
full_space_step.hpp
1 #ifndef __FULLSPACE_STEP_H__
2 #define __FULLSPACE_STEP_H__
3 
4 #include "ROL_Types.hpp"
5 #include "ROL_Step.hpp"
6 #include "ROL_LineSearch.hpp"
7 
8 // Unconstrained Methods
9 #include "ROL_GradientStep.hpp"
10 #include "ROL_NonlinearCGStep.hpp"
11 #include "ROL_SecantStep.hpp"
12 #include "ROL_NewtonStep.hpp"
13 #include "ROL_NewtonKrylovStep.hpp"
14 
15 #include <sstream>
16 #include <iomanip>
17 
18 #include <deal.II/lac/precondition.h>
19 #include <deal.II/lac/solver_gmres.h>
20 #include <deal.II/lac/solver_control.h>
21 
22 #include "optimization/rol_to_dealii_vector.hpp"
23 #include "optimization/dealii_solver_rol_vector.hpp"
24 #include "optimization/flow_constraints.hpp"
25 #include "optimization/rol_objective.hpp"
26 
27 #include "optimization/kkt_operator.hpp"
28 #include "optimization/kkt_birosghattas_preconditioners.hpp"
29 
30 namespace ROL {
31 
34 
36 template <class Real>
37 class FullSpace_BirosGhattas : public Step<Real> {
38 private:
39 
41  ROL::Ptr<Vector<Real> > design_variable_cloner_;
43  ROL::Ptr<Vector<Real> > lagrange_variable_cloner_;
44 
46 
47  ROL::Ptr<Objective<Real>> merit_function_;
50 
52  ROL::Ptr<Vector<Real>> lagrange_mult_search_direction_;
53 
55  ROL::Ptr<Vector<Real>> previous_reduced_gradient_;
56 
58  ROL::Ptr<Secant<Real> > secant_;
59 
61  ROL::Ptr<LineSearch<Real> > lineSearch_;
62 
64  ESecant esec_;
66  ELineSearch els_;
68  ECurvatureCondition econd_;
69 
71 
74 
76 
78  ROL::ParameterList parlist_;
79 
81  std::string lineSearchName_;
83  std::string secantName_;
84 
88 
89  std::string preconditioner_name_;
90 
97 
100 public:
101 
102  using Step<Real>::initialize;
103  using Step<Real>::compute;
104  using Step<Real>::update;
105 
116  ROL::ParameterList &parlist,
117  const ROL::Ptr<LineSearch<Real> > &lineSearch = ROL::nullPtr,
118  const ROL::Ptr<Secant<Real> > &secant = ROL::nullPtr);
119 
123  Vector<Real> &lagrangian_gradient,
124  const Vector<Real> &design_variables,
125  const Vector<Real> &lagrange_mult,
126  const Vector<Real> &objective_gradient,
127  Constraint<Real> &equal_constraints) const;
128 
135  Vector<Real> &lagrange_mult,
136  const Vector<Real> &design_variables,
137  const Vector<Real> &objective_gradient,
138  Constraint<Real> &equal_constraints) const;
139 
140 
142 
144  virtual void initialize(
145  Vector<Real> &design_variables,
146  const Vector<Real> &gradient,
147  Vector<Real> &lagrange_mult,
148  const Vector<Real> &equal_constraints_values,
149  Objective<Real> &objective,
150  Constraint<Real> &equal_constraints,
151  AlgorithmState<Real> &algo_state ) override;
152 
154 
157  void initialize(
158  Vector<Real> &design_variables,
159  const Vector<Real> &gradient,
160  Vector<Real> &lagrange_mult,
161  const Vector<Real> &equal_constraints_values,
162  Objective<Real> &objective,
163  Constraint<Real> &equal_constraints,
164  BoundConstraint<Real> &bound_constraints,
165  AlgorithmState<Real> &algo_state ) override;
166 
169  const Vector<Real> &search_direction,
170  const Vector<Real> &lagrange_mult_search_direction,
171  const Vector<Real> &design_variables,
172  const Vector<Real> &objective_gradient,
173  const Vector<Real> &equal_constraints_values,
174  const Vector<Real> &adjoint_jacobian_lagrange,
175  Constraint<Real> &equal_constraints,
176  const Real offset);
177 
179  template<typename MatrixType, typename VectorType, typename PreconditionerType>
180  std::vector<double>
181  solve_linear (
182  MatrixType &matrix_A,
183  VectorType &right_hand_side,
184  VectorType &solution,
185  PreconditionerType &preconditioner);
186  //const PHiLiP::Parameters::LinearSolverParam & param = );
187 
189  std::vector<Real> solve_KKT_system(
190  Vector<Real> &search_direction,
191  Vector<Real> &lag_search_direction,
192  const Vector<Real> &design_variables,
193  const Vector<Real> &lagrange_mult,
194  Objective<Real> &objective,
195  Constraint<Real> &equal_constraints);
196 
198 
200  void compute(
201  Vector<Real> &search_direction,
202  const Vector<Real> &design_variables,
203  const Vector<Real> &lagrange_mult,
204  Objective<Real> &objective,
205  Constraint<Real> &equal_constraints,
206  AlgorithmState<Real> &algo_state ) override;
207 
209  void compute(
210  Vector<Real> &search_direction,
211  const Vector<Real> &design_variables,
212  const Vector<Real> &lagrange_mult,
213  Objective<Real> &objective,
214  Constraint<Real> &equal_constraints,
215  BoundConstraint<Real> &bound_constraints,
216  AlgorithmState<Real> &algo_state ) override;
217 
230  void update(
231  Vector<Real> &design_variables,
232  Vector<Real> &lagrange_mult,
233  const Vector<Real> &search_direction,
234  Objective<Real> &objective,
235  Constraint<Real> &equal_constraints,
236  AlgorithmState<Real> &algo_state ) override;
237 
251  void update (
252  Vector<Real> &design_variables,
253  Vector<Real> &lagrange_mult,
254  const Vector<Real> &search_direction,
255  Objective<Real> &objective,
256  Constraint<Real> &equal_constraints,
257  BoundConstraint< Real > &bound_constraints,
258  AlgorithmState<Real> &algo_state ) override;
259 
264  std::string printHeader( void ) const override;
265 
270  std::string printName( void ) const override;
271 
279  std::string print( AlgorithmState<Real> & algo_state, bool print_header = false ) const override;
280 
281 private:
282  dealii::ConditionalOStream pcout;
283 
284 }; // class FullSpace_BirosGhattas
285 
286 } // namespace ROL
287 #endif
Real penalty_value_
Penalty value of the augmented Lagrangian.
std::string print(AlgorithmState< Real > &algo_state, bool print_header=false) const override
Print iterate status.
virtual void initialize(Vector< Real > &design_variables, const Vector< Real > &gradient, Vector< Real > &lagrange_mult, const Vector< Real > &equal_constraints_values, Objective< Real > &objective, Constraint< Real > &equal_constraints, AlgorithmState< Real > &algo_state) override
Initialize with objective and equality constraints.
ROL::Ptr< Secant< Real > > secant_
Secant object (used for quasi-Newton preconditioner).
ROL::Ptr< LineSearch< Real > > lineSearch_
Line-search object for globalization.
std::string preconditioner_name_
Preconditioner name.
ROL::Ptr< Vector< Real > > lagrange_mult_search_direction_
Lagrange multipliers search direction.
double search_adj_norm
Norm of the adjoint search direction.
ROL::Ptr< Vector< Real > > lagrange_variable_cloner_
Vector used to clone a vector like the Lagrange variables&#39; / constraints size and parallel distributi...
bool acceptLastAlpha_
Whether the last line search&#39;s step length is accepted when the maximum iterations is reached...
ROL::Ptr< Objective< Real > > merit_function_
Merit function used within the line search.
int verbosity_
Print verbosity.
std::string printHeader(void) const override
Print iterate header.
std::string secantName_
Name of secant used as a reduced-Hessian preconditioner.
std::vector< double > solve_linear(MatrixType &matrix_A, VectorType &right_hand_side, VectorType &solution, PreconditionerType &preconditioner)
Solve a linear system using deal.II&#39;s F/GMRES solver.
std::string lineSearchName_
Line search name.
void compute(Vector< Real > &search_direction, const Vector< Real > &design_variables, const Vector< Real > &lagrange_mult, Objective< Real > &objective, Constraint< Real > &equal_constraints, AlgorithmState< Real > &algo_state) override
Computes the search directions.
ROL::ParameterList parlist_
Parameter list.
ESecant esec_
Enum determines type of secant to use as reduced Hessian preconditioner.
dealii::ConditionalOStream pcout
Parallel std::cout that only outputs on mpi_rank==0.
FullSpace_BirosGhattas(ROL::ParameterList &parlist, const ROL::Ptr< LineSearch< Real > > &lineSearch=ROL::nullPtr, const ROL::Ptr< Secant< Real > > &secant=ROL::nullPtr)
< See base class.
int n_linesearches
Number of line searches used in the last design cycle.
bool use_approximate_full_space_preconditioner_
Use the Tilde{P} version of Biros and Ghattas&#39; preconditioner.
ROL::Ptr< Vector< Real > > previous_reduced_gradient_
Store previous gradient for secant method.
ECurvatureCondition econd_
Enum determines type of curvature condition.
std::vector< Real > solve_KKT_system(Vector< Real > &search_direction, Vector< Real > &lag_search_direction, const Vector< Real > &design_variables, const Vector< Real > &lagrange_mult, Objective< Real > &objective, Constraint< Real > &equal_constraints)
Setup and solve the large KKT system.
Real computeAugmentedLagrangianPenalty(const Vector< Real > &search_direction, const Vector< Real > &lagrange_mult_search_direction, const Vector< Real > &design_variables, const Vector< Real > &objective_gradient, const Vector< Real > &equal_constraints_values, const Vector< Real > &adjoint_jacobian_lagrange, Constraint< Real > &equal_constraints, const Real offset)
Evaluates the penalty of the augmented Lagrangian function using Biros and Ghattas&#39; lower bound...
void computeInitialLagrangeMultiplier(Vector< Real > &lagrange_mult, const Vector< Real > &design_variables, const Vector< Real > &objective_gradient, Constraint< Real > &equal_constraints) const
void computeLagrangianGradient(Vector< Real > &lagrangian_gradient, const Vector< Real > &design_variables, const Vector< Real > &lagrange_mult, const Vector< Real > &objective_gradient, Constraint< Real > &equal_constraints) const
double search_ctl_norm
Norm of the control search direction.
double search_sim_norm
Norm of the simulation search direction.
std::string printName(void) const override
Print step name.
void update(Vector< Real > &design_variables, Vector< Real > &lagrange_mult, const Vector< Real > &search_direction, Objective< Real > &objective, Constraint< Real > &equal_constraints, AlgorithmState< Real > &algo_state) override
Update step, if successful.
ROL::Ptr< Vector< Real > > design_variable_cloner_
Vector used to clone a vector like the design variables&#39; size and parallel distribution.
ELineSearch els_
Enum determines type of line search.