void KrylovFactory(Teuchos::ParameterList &parlist) { EKrylov ekv = StringToEKrylov(parlist.get("Krylov Method","Conjugate Residuals")); Real absTol = parlist.get("Absolute Krylov Tolerance", 1.e-4); Real relTol = parlist.get("Relative Krylov Tolerance", 1.e-2); int maxit = parlist.get("Maximum Number of Krylov Iterations", 20); bool inexact = parlist.get("Use Inexact Hessian-Times-A-Vector",false); switch(ekv) { case KRYLOV_CR: krylov_ = Teuchos::rcp( new ConjugateResiduals<Real>(absTol,relTol,maxit,inexact) ); break; case KRYLOV_CG: default: krylov_ = Teuchos::rcp( new ConjugateGradients<Real>(absTol,relTol,maxit,inexact) ); break; } }
/** \brief Constructor. Standard constructor to build a LineSearchStep object. Algorithmic specifications are passed in through a Teuchos::ParameterList. @param[in] parlist is a parameter list containing algorithmic specifications */ LineSearchStep( Teuchos::ParameterList &parlist ) : Step<Real>(), secant_(Teuchos::null), krylov_(Teuchos::null), nlcg_(Teuchos::null), lineSearch_(Teuchos::null), hessian_(Teuchos::null), precond_(Teuchos::null), d_(Teuchos::null), gp_(Teuchos::null), iterKrylov_(0), flagKrylov_(0), els_(LINESEARCH_BACKTRACKING), enlcg_(NONLINEARCG_OREN_LUENBERGER), econd_(CURVATURECONDITION_WOLFE), edesc_(DESCENT_STEEPEST), esec_(SECANT_LBFGS), ekv_(KRYLOV_CG), ls_nfval_(0), ls_ngrad_(0), useSecantHessVec_(false), useSecantPrecond_(false), useProjectedGrad_(false) { Teuchos::ParameterList& Llist = parlist.sublist("Step").sublist("Line Search"); Teuchos::ParameterList& Glist = parlist.sublist("General"); // Initialize Linesearch Object edesc_ = StringToEDescent(Llist.sublist("Descent Method").get("Type","Quasi-Newton Method") ); els_ = StringToELineSearch(Llist.sublist("Line-Search Method").get("Type","Cubic Interpolation") ); econd_ = StringToECurvatureCondition(Llist.sublist("Curvature Condition").get("Type","Strong Wolfe Conditions") ); useProjectedGrad_ = Glist.get("Projected Gradient Criticality Measure", false); acceptLastAlpha_ = Llist.get("Accept Last Alpha", false); lineSearch_ = LineSearchFactory<Real>(parlist); // Inexactness Information useInexact_.clear(); useInexact_.push_back(Glist.get("Inexact Objective Function", false)); useInexact_.push_back(Glist.get("Inexact Gradient", false)); useInexact_.push_back(Glist.get("Inexact Hessian-Times-A-Vector", false)); // Initialize Krylov Object ekv_ = StringToEKrylov(Glist.sublist("Krylov").get("Type","Conjugate Gradients")); if ( edesc_ == DESCENT_NEWTONKRYLOV ) { krylov_ = KrylovFactory<Real>(parlist); } // Initialize Secant Object esec_ = StringToESecant(Glist.sublist("Secant").get("Type","Limited-Memory BFGS")); useSecantHessVec_ = Glist.sublist("Secant").get("Use as Hessian", false); useSecantHessVec_ = ((edesc_==DESCENT_SECANT) ? true : useSecantHessVec_); useSecantPrecond_ = Glist.sublist("Secant").get("Use as Preconditioner", false); if ( edesc_ == DESCENT_SECANT || (edesc_ == DESCENT_NEWTONKRYLOV && useSecantPrecond_) ) { secant_ = SecantFactory<Real>(parlist); } // Initialize Nonlinear CG Object enlcg_ = StringToENonlinearCG(Llist.sublist("Descent Method").get("Nonlinear CG Type","Oren-Luenberger")); if ( edesc_ == DESCENT_NONLINEARCG ) { nlcg_ = Teuchos::rcp( new NonlinearCG<Real>(enlcg_) ); } }
inline Teuchos::RCP<Krylov<Real> > KrylovFactory( Teuchos::ParameterList &parlist ) { Real em4(1e-4), em2(1e-2); EKrylov ekv = StringToEKrylov( parlist.sublist("General").sublist("Krylov").get("Type","Conjugate Gradients")); Real absTol = parlist.sublist("General").sublist("Krylov").get("Absolute Tolerance", em4); Real relTol = parlist.sublist("General").sublist("Krylov").get("Relative Tolerance", em2); int maxit = parlist.sublist("General").sublist("Krylov").get("Iteration Limit", 20); bool inexact = parlist.sublist("General").get("Inexact Hessian-Times-A-Vector",false); switch(ekv) { case KRYLOV_CR: return Teuchos::rcp( new ConjugateResiduals<Real>(absTol,relTol,maxit,inexact) ); case KRYLOV_CG: return Teuchos::rcp( new ConjugateGradients<Real>(absTol,relTol,maxit,inexact) ); case KRYLOV_GMRES: return Teuchos::rcp( new GMRES<Real>(parlist) ); default: return Teuchos::null; } }