# How to solve variational problem by iteration methods

Hello everyone!
I’m a new one to use the iteration method to solve the electromagnetic variational problem, and I have no idea on how to get the needed parameters and their proper values, and preconditions by the function PETScKrylovSolver or KrylovSolver. Can anyone tell me where I can find these answers?

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
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
``````

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

1 Like

By the way, how could I check the parameters that can be set for each iteration method?

You need to look at the individual method’s documentation.
They can be set to the solver as shown in:
Bitbucket which shows how this is done for the fieldsplit pc: PCFIELDSPLIT — PETSc v3.18.2-329-ge16a4cb45b2 documentation

For instance, I want to choose the “ilu” as the preconditioner and the “cg” as the iteration method. I’ve learned the algorithm theoretically, but I still don’t have any idea on how to set these parameters when coding because I don’t know the parameter name, so where can I find the name?

What do you mean?
As you can see, you can get the “cg” iteration method by adding “cg” as an argument to the `PETScKrylovSolver`, i.e.

``````solver = PETScKrylovSolver("cg")
``````

similarly, you can add the preconditioner `"ilu"` as the second argument

``````solver = PETScKrylovSolver("cg", "ilu")
``````
1 Like

Actually, I’m trying to solve the equation in the from of “(B-rC)w=Bv” based on the ‘cg’ iteration method with the preconditioner ‘ilu’. In the equation, B is a 307724 * 307724 PETScMatrix, and the corresponding code is:

``````import dolfin as df

D = df.PETScMatrix(B.mat() - C.mat() * r[j])
solver = df.PETScKrylovSolver("cg", "ilu")
solver.parameters["absolute_tolerance"] = 1e-17
solver.parameters["maximum_iterations"] = 10000
``````

After running the code, it reminded me an error shown in the figure.

So I’m thinking whether there is some parameters are set incorrectly or some other parameters like ‘Relaxation factor’ are missed to be set. So I wonder to know all Solver.parameters that should be set in such occasion.