I would start by listing what you have available.
For instance, by using IPython I can list the available methods and preconditioners
In [1]: from dolfin import *
In [2]: list_krylov_solver_methods()
Krylov method | Description
--------------------------------------------------------------
bicgstab | Biconjugate gradient stabilized method
cg | Conjugate gradient method
default | default Krylov method
gmres | Generalized minimal residual method
minres | Minimal residual method
richardson | Richardson method
tfqmr | Transpose-free quasi-minimal residual method
In [3]: list_krylov_solver_preconditioners()
Preconditioner | Description
--------------------------------------------------------------
amg | Algebraic multigrid
default | default preconditioner
hypre_amg | Hypre algebraic multigrid (BoomerAMG)
hypre_euclid | Hypre parallel incomplete LU factorization
hypre_parasails | Hypre parallel sparse approximate inverse
icc | Incomplete Cholesky factorization
ilu | Incomplete LU factorization
jacobi | Jacobi iteration
none | No preconditioner
petsc_amg | PETSc algebraic multigrid
sor | Successive over-relaxation
You can read about these methods at:
KSP: Linear System Solvers — PETSc 3.14.1 documentation and their corresponding references.
For instance, checking out “CG” preconditioner: KSPCG — PETSc 3.18.2 documentation