funny stopping criteria for Krylov solvers

Asked by Nico Schlömer on 2013-03-19

I just got the following output from a Krylov solve in Dolfin

*** Error: Unable to solve linear system using PETSc Krylov solver.
*** Reason: Solution failed to converge in 1000 iterations (PETSc reason DIVERGED_ITS, norm 1.165166e-18).
*** Where: This error was encountered inside PETScKrylovSolver.cpp.

This was with

    solve(a2 == L2, p,
          solver_parameters={'linear_solver': 'iterative',
                             'symmetric': False,
                             'preconditioner': 'ilu',
                             'krylov_solver': {'relative_tolerance': 1.0e-8,
                                               'absolute_tolerance': 0.0,
                                               'maximum_iterations': 1000,
                                               'monitor_convergence': verbose}

I suppose we're dealing with an inconsistency in scaling here.
Can someone point me to where the stopping criteria are set?

Question information

English Edit question
DOLFIN Edit question
No assignee Edit question
Solved by:
Nico Schlömer
Last query:
Last reply:

Your absolute tolerance 0.0 would likely never be reached. Try a large number if you want to ignore the absolute tolerance.

Nico Schlömer (nschloe) said : #2

According to <>, the default stopping criterion is

 rnorm < MAX (rtol * rnorm_0, abstol),

meaning that setting abstol to 0.0 will effectively remove it.

Jan Blechta (blechta) said : #3

DIVERGED_ITS means (required more than its to reach convergence). Try increasing maximum_iterations or improve preconditiong.

> Can someone point me to where the stopping criteria are set?

Nico Schlömer (nschloe) said : #4

The issue is not that I wouldn't get the solver to converge when increasing max_iter, it's that it says it hasn't converged when the residual norm really reached a whooping 1.165166e-18.

Nico Schlömer (nschloe) said : #5

Okay, I think I see now what the issue is:

What the error message spits out is ||r||, the stopping criterion is ||r||/||b||. I'll suggest improving the message in a bug.