53#include "ROL_LAPACK.hpp"
54#include "ROL_LinearAlgebra.hpp"
67 ROL::Ptr<Vector<Real> >
r_;
68 ROL::Ptr<Vector<Real> >
z_;
69 ROL::Ptr<Vector<Real> >
w_;
71 ROL::Ptr<SDMatrix>
H_;
72 ROL::Ptr<SDVector>
cs_;
73 ROL::Ptr<SDVector>
sn_;
74 ROL::Ptr<SDVector>
s_;
75 ROL::Ptr<SDVector>
y_;
78 ROL::Ptr<std::vector<Real> >
res_;
96 ROL::ParameterList &gList = parlist.sublist(
"General");
97 ROL::ParameterList &kList = gList.sublist(
"Krylov");
99 useInexact_ = gList.get(
"Inexact Hessian-Times-A-Vector",
false);
103 H_ = ROL::makePtr<SDMatrix>( maxit+1, maxit );
104 cs_ = ROL::makePtr<SDVector>( maxit );
105 sn_ = ROL::makePtr<SDVector>( maxit );
106 s_ = ROL::makePtr<SDVector>( maxit+1 );
107 y_ = ROL::makePtr<SDVector>( maxit+1 );
108 cnorm_ = ROL::makePtr<SDVector>( maxit );
109 res_ = ROL::makePtr<std::vector<Real>>(maxit+1,
zero);
122 Real
zero(0), one(1);
149 std::vector<ROL::Ptr<Vector<Real > > >
V;
150 std::vector<ROL::Ptr<Vector<Real > > > Z;
152 (*res_)[0] =
r_->norm();
155 *
outStream_ <<
"GMRES Iteration " << 0 <<
", Residual = " << (*res_)[0] <<
"\n";
159 Real rtol = std::min(absTol,relTol*(*
res_)[0]);
160 if ((*
res_)[0] <= rtol) {
168 (
V[0])->scale(one/(*
res_)[0]);
170 (*s_)(0) = (*
res_)[0];
175 itol = rtol/(maxit*(*res_)[
iter]);
178 Z.push_back(x.
clone());
187 for(
int k=0; k<=
iter; ++k ) {
188 (*H_)(k,
iter) =
w_->dot(*(
V[k]));
199 for(
int k=0; k<=
iter-1; ++k ) {
202 (*H_)(k,
iter) = temp;
212 (*sn_)(
iter) = one / std::sqrt( one + temp*temp );
217 (*cs_)(
iter) = one / std::sqrt( one + temp*temp );
230 *
outStream_ <<
"GMRES Iteration " <<
iter+1 <<
", Residual = " << (*res_)[
iter+1] <<
"\n";
234 const char uplo =
'U';
235 const char trans =
'N';
236 const char diag =
'N';
237 const char normin =
'N';
241 lapack_.LATRS(uplo, trans, diag, normin,
iter+1,
H_->values(), maxit+1,
y_->values(), &scaling,
cnorm_->values(), &info);
245 for(
int k=0; k<=
iter;++k ) {
246 z_->axpy((*
y_)(k),*(Z[k]));
Objective_SerialSimOpt(const Ptr< Obj > &obj, const V &ui) z0 zero)()
Contains definitions of custom data types in ROL.
Preconditioned GMRES solver.
ROL::LAPACK< int, Real > lapack_
ROL::Ptr< Vector< Real > > r_
ROL::Ptr< std::ostream > outStream_
ROL::Ptr< SDVector > cnorm_
LA::Vector< Real > SDVector
ROL::Ptr< Vector< Real > > w_
LA::Matrix< Real > SDMatrix
void enableOutput(std::ostream &outStream)
ROL::Ptr< std::vector< Real > > res_
GMRES(ROL::ParameterList &parlist)
Real run(Vector< Real > &x, LinearOperator< Real > &A, const Vector< Real > &b, LinearOperator< Real > &M, int &iter, int &flag)
ROL::Ptr< Vector< Real > > z_
Provides definitions for Krylov solvers.
unsigned getMaximumIteration(void) const
Real getAbsoluteTolerance(void) const
Real getRelativeTolerance(void) const
Provides the interface to apply a linear operator.
virtual void apply(Vector< Real > &Hv, const Vector< Real > &v, Real &tol) const =0
Apply linear operator.
virtual void applyInverse(Vector< Real > &Hv, const Vector< Real > &v, Real &tol) const
Apply inverse of linear operator.
Defines the linear algebra or vector space interface.
virtual void plus(const Vector &x)=0
Compute , where .
virtual void zero()
Set to zero vector.
virtual ROL::Ptr< Vector > clone() const =0
Clone to make a new (uninitialized) vector.
Real ROL_EPSILON(void)
Platform-dependent machine epsilon.