1 #ifndef __FULLSPACE_STEP_H__     2 #define __FULLSPACE_STEP_H__     4 #include "ROL_Types.hpp"     5 #include "ROL_Step.hpp"     6 #include "ROL_LineSearch.hpp"     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"    18 #include <deal.II/lac/precondition.h>    19 #include <deal.II/lac/solver_gmres.h>    20 #include <deal.II/lac/solver_control.h>    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"    27 #include "optimization/kkt_operator.hpp"    28 #include "optimization/kkt_birosghattas_preconditioners.hpp"   116         ROL::ParameterList &parlist,
   117         const ROL::Ptr<LineSearch<Real> > &lineSearch = ROL::nullPtr,
   118         const ROL::Ptr<Secant<Real> > &secant = ROL::nullPtr);
   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;
   135         Vector<Real> &lagrange_mult,
   136         const Vector<Real> &design_variables,
   137         const Vector<Real> &objective_gradient,
   138         Constraint<Real> &equal_constraints) 
const;
   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;
   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;
   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,
   179     template<
typename MatrixType, 
typename VectorType, 
typename PreconditionerType>
   182         MatrixType &matrix_A,
   183         VectorType &right_hand_side,
   184         VectorType &solution,
   185         PreconditionerType &preconditioner);
   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);
   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;
   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;
   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;
   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;
   270     std::string 
printName( 
void ) 
const override;
   279     std::string 
print( AlgorithmState<Real> & algo_state, 
bool print_header = 
false ) 
const override;
 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' / constraints size and parallel distributi...
bool acceptLastAlpha_
Whether the last line search'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'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' 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' 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' size and parallel distribution. 
ELineSearch els_
Enum determines type of line search.