1 #ifndef __KKT_BIROSGHATTAS_PRECONDITIONERS_H__     2 #define __KKT_BIROSGHATTAS_PRECONDITIONERS_H__     4 #include "ROL_SecantStep.hpp"     6 #include "ROL_Objective_SimOpt.hpp"     7 #include "ROL_Constraint_SimOpt.hpp"     8 #include "ROL_Vector_SimOpt.hpp"    10 #include "flow_constraints.hpp"    15 template<
typename Real = 
double>
    36     const ROL::Ptr<ROL::Secant<Real> > 
secant_;
    44     dealii::ConditionalOStream 
pcout; 
    50         const ROL::Ptr<ROL::Objective<Real>> objective,
    51         const ROL::Ptr<ROL::Constraint<Real>> equal_constraints,
    52         const ROL::Ptr<
const ROL::Vector<Real>> design_variables,
    53         const ROL::Ptr<
const ROL::Vector<Real>> lagrange_mult,
    54         const ROL::Ptr<ROL::Secant<Real> > secant,
    55         const bool use_approximate_preconditioner = 
false)
    57             (
ROL::makePtrFromRef<
ROL::Objective_SimOpt<Real>>(dynamic_cast<
ROL::Objective_SimOpt<Real>&>(*objective)))
    59             (
ROL::makePtrFromRef<
PHiLiP::FlowConstraints<PHILIP_DIM>>(dynamic_cast<
PHiLiP::FlowConstraints<PHILIP_DIM>&>(*equal_constraints)))
    61             (
ROL::makePtrFromRef<const 
ROL::Vector_SimOpt<Real>>(dynamic_cast<const 
ROL::Vector_SimOpt<Real>&>(*design_variables)))
    62         , lagrange_mult_(lagrange_mult)
    63         , simulation_variables_(design_variables_->get_1())
    64         , control_variables_(design_variables_->get_2())
    66         , use_approximate_preconditioner_(use_approximate_preconditioner)
    67         , mpi_rank(dealii::Utilities::MPI::this_mpi_process(MPI_COMM_WORLD))
    68         , pcout(
std::cout, mpi_rank==0)
    70         if (use_approximate_preconditioner_) {
    71             const int error_precond1 = equal_constraints_->construct_JacobianPreconditioner_1(*simulation_variables_, *control_variables_);
    72             const int error_precond2 = equal_constraints_->construct_AdjointJacobianPreconditioner_1(*simulation_variables_, *control_variables_);
    73             assert(error_precond1 == 0);
    74             assert(error_precond2 == 0);
    75             (void) error_precond1;
    76             (void) error_precond2;
    81         if (use_approximate_preconditioner_) {
    82             equal_constraints_->destroy_JacobianPreconditioner_1();
    83             equal_constraints_->destroy_AdjointJacobianPreconditioner_1();
   109 template<
typename Real = 
double>
   143         const ROL::Ptr<ROL::Objective<Real>> objective,
   144         const ROL::Ptr<ROL::Constraint<Real>> equal_constraints,
   145         const ROL::Ptr<
const ROL::Vector<Real>> design_variables,
   146         const ROL::Ptr<
const ROL::Vector<Real>> lagrange_mult,
   147         const ROL::Ptr<ROL::Secant<Real> > secant,
   148         const bool use_approximate_preconditioner = 
false)
   149         : 
BirosGhattasPreconditioner<Real>(objective, equal_constraints, design_variables, lagrange_mult, secant, use_approximate_preconditioner)
   156         static int number_of_times = 0;
   158         pcout << 
"Number of P2_KKT vmult = " << number_of_times << std::endl;
   162         ROL::Ptr<ROL::Vector<Real>> dst_rol = dst.
getVector();
   163         auto &dst_split = 
dynamic_cast<ROL::Vector_SimOpt<Real>&
>(*dst_rol);
   164         ROL::Ptr<ROL::Vector<Real>> dst_design = dst_split.get_1();
   165         auto &dst_design_split = 
dynamic_cast<ROL::Vector_SimOpt<Real>&
>(*dst_design);
   167         ROL::Ptr<ROL::Vector<Real>> dst_1 = dst_design_split.get_1();
   168         ROL::Ptr<ROL::Vector<Real>> dst_2 = dst_design_split.get_2();
   169         ROL::Ptr<ROL::Vector<Real>> dst_3 = dst_split.get_2();
   171         const ROL::Ptr<const ROL::Vector<Real>> src_rol = src.
getVector();
   172         const auto &src_split = 
dynamic_cast<const ROL::Vector_SimOpt<Real>&
>(*src_rol);
   173         const ROL::Ptr<const ROL::Vector<Real>> src_design = src_split.get_1();
   174         const auto &src_design_split = 
dynamic_cast<const ROL::Vector_SimOpt<Real>&
>(*src_design);
   176         const ROL::Ptr<const ROL::Vector<Real>> src_1 = src_design_split.get_1();
   177         const ROL::Ptr<const ROL::Vector<Real>> src_2 = src_design_split.get_2();
   178         const ROL::Ptr<const ROL::Vector<Real>> src_3 = src_split.get_2();
   180         ROL::Ptr<ROL::Vector<Real>> rhs_1 = src_1->clone();
   181         ROL::Ptr<ROL::Vector<Real>> rhs_2 = src_2->clone();
   182         ROL::Ptr<ROL::Vector<Real>> rhs_3 = src_3->clone();
   193         secant_->applyH( *dst_2, *rhs_2);
   207             dealii::deallog.depth_console(99);
   209             dealii::deallog.depth_console(0);
   220 template<
typename Real = 
double>
   254         const ROL::Ptr<ROL::Objective<Real>> objective,
   255         const ROL::Ptr<ROL::Constraint<Real>> equal_constraints,
   256         const ROL::Ptr<
const ROL::Vector<Real>> design_variables,
   257         const ROL::Ptr<
const ROL::Vector<Real>> lagrange_mult,
   258         const ROL::Ptr<ROL::Secant<Real> > secant,
   259         const bool use_approximate_preconditioner = 
false)
   260         : 
BirosGhattasPreconditioner<Real>(objective, equal_constraints, design_variables, lagrange_mult, secant, use_approximate_preconditioner)
   267         static int number_of_times = 0;
   269         pcout << 
"Number of P4_KKT vmult = " << number_of_times << std::endl;
   273         ROL::Ptr<ROL::Vector<Real>> dst_rol = dst.
getVector();
   274         auto &dst_split = 
dynamic_cast<ROL::Vector_SimOpt<Real>&
>(*dst_rol);
   275         ROL::Ptr<ROL::Vector<Real>> dst_design = dst_split.get_1();
   276         auto &dst_design_split = 
dynamic_cast<ROL::Vector_SimOpt<Real>&
>(*dst_design);
   278         ROL::Ptr<ROL::Vector<Real>> dst_1 = dst_design_split.get_1();
   279         ROL::Ptr<ROL::Vector<Real>> dst_2 = dst_design_split.get_2();
   280         ROL::Ptr<ROL::Vector<Real>> dst_3 = dst_split.get_2();
   282         const ROL::Ptr<const ROL::Vector<Real>> src_rol = src.
getVector();
   283         const auto &src_split = 
dynamic_cast<const ROL::Vector_SimOpt<Real>&
>(*src_rol);
   284         const ROL::Ptr<const ROL::Vector<Real>> src_design = src_split.get_1();
   285         const auto &src_design_split = 
dynamic_cast<const ROL::Vector_SimOpt<Real>&
>(*src_design);
   287         const ROL::Ptr<const ROL::Vector<Real>> src_1 = src_design_split.get_1();
   288         const ROL::Ptr<const ROL::Vector<Real>> src_2 = src_design_split.get_2();
   289         const ROL::Ptr<const ROL::Vector<Real>> src_3 = src_split.get_2();
   291         ROL::Ptr<ROL::Vector<Real>> rhs_1 = src_1->clone();
   292         ROL::Ptr<ROL::Vector<Real>> rhs_2 = src_2->clone();
   293         ROL::Ptr<ROL::Vector<Real>> rhs_3 = src_3->clone();
   295         ROL::Ptr<ROL::Vector<Real>> y_1 = src_3->clone();
   296         ROL::Ptr<ROL::Vector<Real>> y_2 = src_2->clone();
   297         ROL::Ptr<ROL::Vector<Real>> y_3 = src_3->clone();
   301         auto Asinv_y_1 = y_1->clone();
   302         auto temp_1 = y_1->clone();
   311         y_3->axpy(-1.0, *temp_1);
   313         y_3->axpy(-1.0, *temp_1);
   315         auto AsTinv_y_3 = y_3->clone();
   325         auto temp_2 = y_2->clone();
   327         y_2->axpy(-1.0,*temp_2);
   329         y_2->axpy(-1.0,*temp_2);
   331         secant_->applyH( *dst_2, *y_2);
   334         auto Asinv_Ad_dst_2 = y_1->clone();
   342         dst_1->set(*Asinv_y_1);
   343         dst_1->axpy(-1.0, *Asinv_Ad_dst_2);
   345         auto dst_3_rhs = y_3->clone();
   347         dst_3_rhs->axpy(1.0, *temp_1);
   349         dst_3_rhs->axpy(1.0, *temp_1);
   352         dst_3_rhs->axpy(-1.0, *temp_1);
   354         dst_3_rhs->axpy(-1.0, *temp_1);
   363             dealii::deallog.depth_console(99);
   365             dealii::deallog.depth_console(0);
   373 template<
typename Real = 
double>
   379         const ROL::Ptr<ROL::Objective<Real>> objective,
   380         const ROL::Ptr<ROL::Constraint<Real>> equal_constraints,
   381         const ROL::Ptr<
const ROL::Vector<Real>> design_variables,
   382         const ROL::Ptr<
const ROL::Vector<Real>> lagrange_mult,
   383         const ROL::Ptr<ROL::Secant<Real> > secant,
   384         const bool use_approximate_preconditioner = 
false)
   385         : 
BirosGhattasPreconditioner<Real>(objective, equal_constraints, design_variables, lagrange_mult, secant, use_approximate_preconditioner)
   398 template<
typename Real = 
double>
   403     static std::shared_ptr< BirosGhattasPreconditioner<Real> >
   405                                    ROL::Objective<Real> &objective,
   406                                    ROL::Constraint<Real> &equal_constraints,
   407                                    const ROL::Vector<Real> &design_variables,
   408                                    const ROL::Vector<Real> &lagrange_mult,
   409                                    const ROL::Ptr< ROL::Secant<Real> > 
secant_)
   411         const std::string preconditioner_name_ = parlist.sublist(
"Full Space").get(
"Preconditioner",
"Identity"); 
   412         const bool use_approximate_full_space_preconditioner_ = (preconditioner_name_ == 
"P2A" || preconditioner_name_ == 
"P4A");
   414         if (preconditioner_name_ == 
"P2" || preconditioner_name_ == 
"P2A") {
   415             return std::make_shared<KKT_P2_Preconditioner<Real>> (
   416                 ROL::makePtrFromRef<ROL::Objective<Real>>(objective),
   417                 ROL::makePtrFromRef<ROL::Constraint<Real>>(equal_constraints),
   418                 ROL::makePtrFromRef<const ROL::Vector<Real>>(design_variables),
   419                 ROL::makePtrFromRef<
const ROL::Vector<Real>>(lagrange_mult),
   421                 use_approximate_full_space_preconditioner_);
   422         } 
else if (preconditioner_name_ == 
"P4" || preconditioner_name_ == 
"P4A") {
   423             return std::make_shared<KKT_P4_Preconditioner<Real>> (
   424                 ROL::makePtrFromRef<ROL::Objective<Real>>(objective),
   425                 ROL::makePtrFromRef<ROL::Constraint<Real>>(equal_constraints),
   426                 ROL::makePtrFromRef<const ROL::Vector<Real>>(design_variables),
   427                 ROL::makePtrFromRef<
const ROL::Vector<Real>>(lagrange_mult),
   429                 use_approximate_full_space_preconditioner_);
   431             return std::make_shared<KKT_Identity_Preconditioner<Real>> (
   432                 ROL::makePtrFromRef<ROL::Objective<Real>>(objective),
   433                 ROL::makePtrFromRef<ROL::Constraint<Real>>(equal_constraints),
   434                 ROL::makePtrFromRef<const ROL::Vector<Real>>(design_variables),
   435                 ROL::makePtrFromRef<
const ROL::Vector<Real>>(lagrange_mult),
 void vmult(dealiiSolverVectorWrappingROL< Real > &dst, const dealiiSolverVectorWrappingROL< Real > &src) const override
Application of KKT preconditionner on vector src outputted into dst. 
const ROL::Ptr< ROL::Secant< Real > > secant_
Secant method used to precondition the reduced Hessian. 
void vmult(dealiiSolverVectorWrappingROL< Real > &dst, const dealiiSolverVectorWrappingROL< Real > &src) const override
Application of KKT preconditionner on vector src outputted into dst. 
P4 preconditioner from Biros & Ghattas 2005. 
const ROL::Ptr< const ROL::Vector_SimOpt< Real > > design_variables_
Design variables. 
Files for the baseline physics. 
virtual void vmult(dealiiSolverVectorWrappingROL< Real > &dst, const dealiiSolverVectorWrappingROL< Real > &src) const
Application of KKT preconditionner on vector src outputted into dst. 
Wrap the ROL vector into a vector that can be used by deal.II's solver. 
void vmult(dealiiSolverVectorWrappingROL< Real > &dst, const dealiiSolverVectorWrappingROL< Real > &src) const override
Application of KKT preconditionner on vector src outputted into dst. 
const ROL::Ptr< const ROL::Vector< Real > > control_variables_
Control design variables. 
KKT_Identity_Preconditioner(const ROL::Ptr< ROL::Objective< Real >> objective, const ROL::Ptr< ROL::Constraint< Real >> equal_constraints, const ROL::Ptr< const ROL::Vector< Real >> design_variables, const ROL::Ptr< const ROL::Vector< Real >> lagrange_mult, const ROL::Ptr< ROL::Secant< Real > > secant, const bool use_approximate_preconditioner=false)
Constructor. 
const ROL::Ptr< const ROL::Vector< Real > > lagrange_mult_
Lagrange multipliers. 
Full-space system preconditioner based on the reduced-space. 
const unsigned int mpi_rank
MPI rank used to reset the deallog depth. 
void equ(const Real a, const dealiiSolverVectorWrappingROL &x)
Scaled assignment of a vector. 
static std::shared_ptr< BirosGhattasPreconditioner< Real > > create_KKT_preconditioner(ROL::ParameterList &parlist, ROL::Objective< Real > &objective, ROL::Constraint< Real > &equal_constraints, const ROL::Vector< Real > &design_variables, const ROL::Vector< Real > &lagrange_mult, const ROL::Ptr< ROL::Secant< Real > > secant_)
Creates a derived preconditioner object, but returns it as BirosGhattasPreconditioner. 
const ROL::Ptr< ROL::Objective_SimOpt< Real > > objective_
Objective function. 
ROL::Ptr< ROL::Vector< Real > > getVector()
Accessor. 
KKT_P2_Preconditioner(const ROL::Ptr< ROL::Objective< Real >> objective, const ROL::Ptr< ROL::Constraint< Real >> equal_constraints, const ROL::Ptr< const ROL::Vector< Real >> design_variables, const ROL::Ptr< const ROL::Vector< Real >> lagrange_mult, const ROL::Ptr< ROL::Secant< Real > > secant, const bool use_approximate_preconditioner=false)
< Parallel std::cout that only outputs on mpi_rank==0 
KKT_P4_Preconditioner(const ROL::Ptr< ROL::Objective< Real >> objective, const ROL::Ptr< ROL::Constraint< Real >> equal_constraints, const ROL::Ptr< const ROL::Vector< Real >> design_variables, const ROL::Ptr< const ROL::Vector< Real >> lagrange_mult, const ROL::Ptr< ROL::Secant< Real > > secant, const bool use_approximate_preconditioner=false)
< Parallel std::cout that only outputs on mpi_rank==0 
P2 preconditioner from Biros & Ghattas 2005. 
const ROL::Ptr< const ROL::Vector< Real > > simulation_variables_
Simulation design variables. 
virtual void Tvmult(dealiiSolverVectorWrappingROL< Real > &dst, const dealiiSolverVectorWrappingROL< Real > &src) const
Application of transposed KKT preconditioner on vector src outputted into dst. 
const bool use_approximate_preconditioner_
BirosGhattasPreconditioner(const ROL::Ptr< ROL::Objective< Real >> objective, const ROL::Ptr< ROL::Constraint< Real >> equal_constraints, const ROL::Ptr< const ROL::Vector< Real >> design_variables, const ROL::Ptr< const ROL::Vector< Real >> lagrange_mult, const ROL::Ptr< ROL::Secant< Real > > secant, const bool use_approximate_preconditioner=false)
Constructor. 
dealii::ConditionalOStream pcout
Parallel std::cout that only outputs on mpi_rank==0. 
Full-space preconditioner from factory. 
const ROL::Ptr< PHiLiP::FlowConstraints< PHILIP_DIM > > equal_constraints_
Equality constraints.