Actual source code: svddefault.c
slepc-3.10.1 2018-10-23
Report Typos and Errors

      1: /*
      2:    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      3:    SLEPc - Scalable Library for Eigenvalue Problem Computations
      4:    Copyright (c) 2002-2018, Universitat Politecnica de Valencia, Spain

      6:    This file is part of SLEPc.
      7:    SLEPc is distributed under a 2-clause BSD license (see LICENSE).
      8:    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      9: */
     10: /*
     11:    Simple default routines for common SVD operations
     12: */

     14: #include <slepc/private/svdimpl.h>      /*I "slepcsvd.h" I*/

     16: /*
     17:   SVDConvergedRelative - Checks convergence relative to the eigenvalue.
     18: */
     19: PetscErrorCode SVDConvergedRelative(SVD svd,PetscReal sigma,PetscReal res,PetscReal *errest,void *ctx)
     20: {
     22:   *errest = res/sigma;
     23:   return(0);
     24: }

     26: /*
     27:   SVDConvergedAbsolute - Checks convergence absolutely.
     28: */
     29: PetscErrorCode SVDConvergedAbsolute(SVD svd,PetscReal sigma,PetscReal res,PetscReal *errest,void *ctx)
     30: {
     32:   *errest = res;
     33:   return(0);
     34: }

     36: /*@C
     37:    SVDStoppingBasic - Default routine to determine whether the outer singular value
     38:    solver iteration must be stopped.

     40:    Collective on SVD

     42:    Input Parameters:
     43: +  svd    - singular value solver context obtained from SVDCreate()
     44: .  its    - current number of iterations
     45: .  max_it - maximum number of iterations
     46: .  nconv  - number of currently converged singular triplets
     47: .  nsv    - number of requested singular triplets
     48: -  ctx    - context (not used here)

     50:    Output Parameter:
     51: .  reason - result of the stopping test

     53:    Notes:
     54:    A positive value of reason indicates that the iteration has finished successfully
     55:    (converged), and a negative value indicates an error condition (diverged). If
     56:    the iteration needs to be continued, reason must be set to SVD_CONVERGED_ITERATING
     57:    (zero).

     59:    SVDStoppingBasic() will stop if all requested singular values are converged, or if
     60:    the maximum number of iterations has been reached.

     62:    Use SVDSetStoppingTest() to provide your own test instead of using this one.

     64:    Level: advanced

     66: .seealso: SVDSetStoppingTest(), SVDConvergedReason, SVDGetConvergedReason()
     67: @*/
     68: PetscErrorCode SVDStoppingBasic(SVD svd,PetscInt its,PetscInt max_it,PetscInt nconv,PetscInt nsv,SVDConvergedReason *reason,void *ctx)
     69: {

     73:   *reason = SVD_CONVERGED_ITERATING;
     74:   if (nconv >= nsv) {
     75:     PetscInfo2(svd,"Singular value solver finished successfully: %D singular triplets converged at iteration %D\n",nconv,its);
     76:     *reason = SVD_CONVERGED_TOL;
     77:   } else if (its >= max_it) {
     78:     *reason = SVD_DIVERGED_ITS;
     79:     PetscInfo1(svd,"Singular value solver iteration reached maximum number of iterations (%D)\n",its);
     80:   }
     81:   return(0);
     82: }