Skip to content

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

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
LudovicDrtt opened this issue May 20, 2025 · 0 comments

Comments

@LudovicDrtt
Copy link

LudovicDrtt commented May 20, 2025

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant