Many iterative solvers have the option to provide left and right preconditioners (Pl and Pr resp.) in order to speed up convergence or prevent stagnation. They transform a problem $Ax = b$ into a better conditioned system $(P_l^{-1}AP_r^{-1})y = P_l^{-1}b$, where $x = P_r^{-1}y$.

These preconditioners should support the operations

  • ldiv!(y, P, x) computes P \ x in-place of y;
  • ldiv!(P, x) computes P \ x in-place of x;
  • and P \ x.

If no preconditioners are passed to the solver, the method will default to

Pl = Pr = IterativeSolvers.Identity()

Available preconditioners

IterativeSolvers.jl itself does not provide any other preconditioners besides Identity(), but recommends the following external packages:

  • ILU.jl for incomplete LU decompositions (using drop tolerance);
  • IncompleteSelectedInversion.jl for incomplete LDLt decompositions.
  • AMG.jl for some algebraic multigrid (AMG) preconditioners.
  • Preconditioners.jl which wraps a bunch of preconditioners from other packages. If you are a beginner or want to try different ones quickly, this is good starting place.