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.