[petsc-users] Suggestion for KSPRichardson

Gaetan Kenway kenway at utias.utoronto.ca
Wed Jan 2 15:57:46 CST 2013


Hi Everyone

I have a small suggestion for the KSPRichardson implementation.  I often
use a KSPRichardson object to perform a small number (2-4) applications of
a preconditioner (Additive Schwartz for example). Since I'm using a fixed
number of iterations, the object uses KSP_NORM_NONE to save the vecNorm.

Near the end of the function KSPSolve_Richardson, (line 138 according to
the current docs, link below), the new residual is evaluated. However, for
the last iteration, when using KSP_NORM_NONE, the last matMult and VecAYPX
is not necessary. This results in additional unnecessary matMults(). In one
system I'm solving, this adds approximately 20% to the computation cost.
 (30 secs -> 36 secs)

I think the following code should work:
 if (ksp->its < maxit  || ksp->normtype != KSP_NORM_NONE){
        ierr = KSP_MatMult(ksp,Amat,x,r);CHKERRQ(ierr);      /*   r  <- b -
Ax      */
        ierr = VecAYPX(r,-1.0,b);CHKERRQ(ierr);
      }

Also, it makes the degenerate case of 1 iteration have same cost as if the
KSPRichardson wasn't there.

Hopefully this is useful.

Gaetan Kenway

Link to source code:
http://www.mcs.anl.gov/petsc/petsc-current/src/ksp/ksp/impls/rich/rich.c.html#KSPRICHARDSON
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20130102/fd0ca9c1/attachment.html>


More information about the petsc-users mailing list