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;
   }
 }
Ejemplo n.º 2
0
  /** \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_) );
    }
  }
Ejemplo n.º 3
0
 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;
   }
 }