Skip to content

[BUG]: NewtonSolver residual0 is always setup as the norm of the increment #3736

Open
@LudovicDrtt

Description

@LudovicDrtt

Summarize the issue

I recently read the code of the newton solver provided by dolfinx (nls::petsc::NewtonSolver), to have more insight on how convergence criterions are implemented, and I noted that regardless of the value of convergence_criterion, the value of residual0 (which is used to compute the relative residual) is always set as the norm of the increment after the first iteration. See cpp/dolfinx/nls/NewtonSolver.cpp lines 219 to 225.

This seems wrong when the convergence criterion is set to "residual" because the residual and the increment may be of different units or order of magnitude (See cpp/dolfinx/nls/NewtonSolver.cpp line 33).

It feels more logical to set residual0 to:

  • The norm of the increment when convergence_criterion == "incremental".
  • The norm of the residual when convergence_criterion == "residual".

How to reproduce the bug

Note that this does'nt cause scripts to fail because you can adapt the value of the attributes of NewtonSolver rtol and atol to make the simulation converge, but the meaning of rtol is then unclear.

Otherwise, any script using the newton solver from dolfinx.nls.petsc set up with newton.convergence_criterion = "residual" will reproduce the error. One may for example use the code provided here by J.S. Dokken that implement the resolution of a non linear Poisson equation and change the value of solver.convergence_criterion.

The values of the relative and absolute residual can be accessed by setting the log level of dolfinx to 2 dolfinx.log.set_log_level(2).

Minimal Example (Python)

Output (Python)

Version

main branch

DOLFINx git commit

I read the C++ code on github, on the lastest commit of the main branch.

Installation

No response

Additional information

Edit: I saw that this issue was already addressed in PR #3611 just after posting, may this PR be merged in the future ?

Edit 2: I forgot to mentioned that I implemented the Newton solver in Python to change this behavior on my side. I can provide this code if this can be helpful to anyone.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions