1 #ifndef __KKT_OPERATOR_H__     2 #define __KKT_OPERATOR_H__     4 #include "ROL_Types.hpp"     5 #include "ROL_Objective.hpp"     6 #include "ROL_Constraint.hpp"     7 #include "ROL_Vector_SimOpt.hpp"    10 template<
typename Real = 
double>
    34         const ROL::Ptr<ROL::Objective<Real>> objective,
    35         const ROL::Ptr<ROL::Constraint<Real>> equal_constraints,
    36         const ROL::Ptr<
const ROL::Vector<Real>> design_variables,
    37         const ROL::Ptr<
const ROL::Vector<Real>> lagrange_mult)
    38         : objective_(objective)
    39         , equal_constraints_(equal_constraints)
    40         , design_variables_(design_variables)
    41         , lagrange_mult_(lagrange_mult)
    42         , temp_design_variables_size_vector_(design_variables->clone())
    48         return (design_variables_->dimension() + lagrange_mult_->dimension());
    57         static int number_of_times = 0;
    59         std::cout << 
"Number of KKT vmult = " << number_of_times << std::endl;
    63         ROL::Ptr<ROL::Vector<Real>> dst_rol = dst.
getVector();
    64         const ROL::Ptr<const ROL::Vector<Real>> src_rol = src.
getVector();
    66         auto &dst_split = 
dynamic_cast<ROL::Vector_SimOpt<Real>&
>(*dst_rol);
    67         const auto &src_split = 
dynamic_cast<const ROL::Vector_SimOpt<Real>&
>(*src_rol);
    69         ROL::Ptr<ROL::Vector<Real>> dst_design = dst_split.get_1();
    70         ROL::Ptr<ROL::Vector<Real>> dst_constraints = dst_split.get_2();
    72         dst_constraints->zero();
    74         const ROL::Ptr<const ROL::Vector<Real>> src_design = src_split.get_1();
    75         const ROL::Ptr<const ROL::Vector<Real>> src_constraints = src_split.get_2();
    79             objective_->hessVec(*dst_design, *src_design, *design_variables_, tol);
    80             equal_constraints_->applyAdjointHessian(*temp_design_variables_size_vector_, *lagrange_mult_, *src_design, *design_variables_, tol);
    81             dst_design->axpy(one, *temp_design_variables_size_vector_);
    90         equal_constraints_->applyAdjointJacobian(*temp_design_variables_size_vector_, *src_constraints, *design_variables_, tol);
    91         dst_design->axpy(one, *temp_design_variables_size_vector_);
    94         equal_constraints_->applyJacobian(*dst_constraints, *src_design, *design_variables_, tol);
    98         dealii::deallog.depth_console(99);
   116        const int do_full_matrix = (1 == dealii::Utilities::MPI::n_mpi_processes(MPI_COMM_WORLD));
   117        std::cout << 
"do_full_matrix: " << do_full_matrix << std::endl;
   118        if (do_full_matrix) {
   120            column_of_kkt_operator.
reinit(vector_format);
   121            dealii::FullMatrix<double> fullA(vector_format.
size());
   122            for (
int i = 0; i < vector_format.
size(); ++i) {
   123                std::cout << 
"COLUMN NUMBER: " << i+1 << 
" OUT OF " << vector_format.
size() << std::endl;
   124                auto basis = vector_format.
basis(i);
   125                MPI_Barrier(MPI_COMM_WORLD);
   126                this->
vmult(column_of_kkt_operator,*basis);
   127                if (do_full_matrix) {
   128                    for (
int j = 0; j < vector_format.
size(); ++j) {
   129                        fullA[i][j] = column_of_kkt_operator[j];
   133            std::cout<<
"Dense matrix:"<<std::endl;
   134            fullA.print_formatted(std::cout, 14, 
true, 10, 
"0", 1., 0.);
 KKT_Operator(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)
Constructor. 
void Tvmult(dealiiSolverVectorWrappingROL< Real > &dst, const dealiiSolverVectorWrappingROL< Real > &src) const
Application of transposed KKT matrix on vector src outputted into dst. 
const ROL::Ptr< const ROL::Vector< Real > > design_variables_
Design variables. 
void reinit(const dealiiSolverVectorWrappingROL &model_vector, const bool leave_elements_uninitialized=false)
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
Application of KKT matrix on vector src outputted into dst. 
void print(const dealiiSolverVectorWrappingROL< Real > &vector_format)
Print the KKT system if the program is run with 1 MPI process. 
ROL::Ptr< ROL::Vector< Real > > getVector()
Accessor. 
const ROL::Ptr< ROL::Objective< Real > > objective_
Objective function. 
const ROL::Ptr< ROL::Vector< Real > > temp_design_variables_size_vector_
Used to perform the Lagrangian Hessian in two steps. 
unsigned int size()
Returns the size of the KKT system. 
const ROL::Ptr< const ROL::Vector< Real > > lagrange_mult_
Lagrange multipliers. 
KKT_Operator to be used with dealii::SolverBase class. 
const ROL::Ptr< ROL::Constraint< Real > > equal_constraints_
Equality constraints. 
int size() const
Obtain vector size. 
Teuchos::RCP< dealiiSolverVectorWrappingROL > basis(int i) const
Returns a vector of the same size with zero entries except for the ith entry being one...