Hello everyone,
solving a time-dependent, nonlinear problem with fenicsx v0.7.3, at some time step I’m facing that the solver at converges with 0 iterations, since the relative residual was below tolerance already at Newton iteration 0. I’m wondering how this can be, since at Newton iteration 0, I would expect r (rel) = inf.
Looking at the source code at dolfinx/NewtonSolver.cpp at main · FEniCS/dolfinx · GitHub as proposed by @dokken in this post, I find the absolute residual is initialized to 0, thus the 0th relative residual is inf. But apparently, this is only the case for the first time step and not any further.
This behavior can be reproduced with @dokken 's hyperelasticity tutorial. Setting solver.convergence_criterion = "residual" one gets the following output for the first two time steps:
2024-07-10 11:42:07.983 ( 3.574s) [main ] NewtonSolver.cpp:36 INFO| Newton iteration 0: r (abs) = 0.163333 (tol = 1e-08) r (rel) = inf(tol = 1e-08)
2024-07-10 11:42:08.123 ( 3.714s) [main ] petsc.cpp:698 INFO| PETSc Krylov solver starting to solve system.
2024-07-10 11:42:08.453 ( 4.044s) [main ] NewtonSolver.cpp:36 INFO| Newton iteration 1: r (abs) = 1330.75 (tol = 1e-08) r (rel) = 8.03268(tol = 1e-08)
2024-07-10 11:42:08.617 ( 4.208s) [main ] petsc.cpp:698 INFO| PETSc Krylov solver starting to solve system.
2024-07-10 11:42:08.865 ( 4.456s) [main ] NewtonSolver.cpp:36 INFO| Newton iteration 2: r (abs) = 73.9037 (tol = 1e-08) r (rel) = 0.446096(tol = 1e-08)
2024-07-10 11:42:09.016 ( 4.606s) [main ] petsc.cpp:698 INFO| PETSc Krylov solver starting to solve system.
2024-07-10 11:42:09.259 ( 4.850s) [main ] NewtonSolver.cpp:36 INFO| Newton iteration 3: r (abs) = 0.471433 (tol = 1e-08) r (rel) = 0.00284566(tol = 1e-08)
2024-07-10 11:42:09.411 ( 5.002s) [main ] petsc.cpp:698 INFO| PETSc Krylov solver starting to solve system.
2024-07-10 11:42:09.665 ( 5.256s) [main ] NewtonSolver.cpp:36 INFO| Newton iteration 4: r (abs) = 0.904561 (tol = 1e-08) r (rel) = 0.0054601(tol = 1e-08)
2024-07-10 11:42:09.824 ( 5.414s) [main ] petsc.cpp:698 INFO| PETSc Krylov solver starting to solve system.
2024-07-10 11:42:10.071 ( 5.662s) [main ] NewtonSolver.cpp:36 INFO| Newton iteration 5: r (abs) = 0.0010116 (tol = 1e-08) r (rel) = 6.10621e-06(tol = 1e-08)
2024-07-10 11:42:10.223 ( 5.814s) [main ] petsc.cpp:698 INFO| PETSc Krylov solver starting to solve system.
2024-07-10 11:42:10.469 ( 6.060s) [main ] NewtonSolver.cpp:36 INFO| Newton iteration 6: r (abs) = 2.32809e-05 (tol = 1e-08) r (rel) = 1.40528e-07(tol = 1e-08)
2024-07-10 11:42:10.625 ( 6.216s) [main ] petsc.cpp:698 INFO| PETSc Krylov solver starting to solve system.
2024-07-10 11:42:10.876 ( 6.467s) [main ] NewtonSolver.cpp:36 INFO| Newton iteration 7: r (abs) = 1.95203e-10 (tol = 1e-08) r (rel) = 1.17828e-12(tol = 1e-08)
2024-07-10 11:42:10.876 ( 6.467s) [main ] NewtonSolver.cpp:255 INFO| Newton solver finished in 7 iterations and 7 linear solver iterations.
Time step 1, Number of iterations 7, Load [ 0. 0. -1.5]
2024-07-10 11:42:11.103 ( 6.694s) [main ] NewtonSolver.cpp:36 INFO| Newton iteration 0: r (abs) = 0.163333 (tol = 1e-08) r (rel) = 0.000985911(tol = 1e-08)
2024-07-10 11:42:11.254 ( 6.845s) [main ] petsc.cpp:698 INFO| PETSc Krylov solver starting to solve system.
2024-07-10 11:42:11.508 ( 7.099s) [main ] NewtonSolver.cpp:36 INFO| Newton iteration 1: r (abs) = 1053.16 (tol = 1e-08) r (rel) = 7.16324(tol = 1e-08)
2024-07-10 11:42:11.661 ( 7.252s) [main ] petsc.cpp:698 INFO| PETSc Krylov solver starting to solve system.
2024-07-10 11:42:11.913 ( 7.504s) [main ] NewtonSolver.cpp:36 INFO| Newton iteration 2: r (abs) = 44.9774 (tol = 1e-08) r (rel) = 0.305922(tol = 1e-08)
2024-07-10 11:42:12.068 ( 7.659s) [main ] petsc.cpp:698 INFO| PETSc Krylov solver starting to solve system.
2024-07-10 11:42:12.326 ( 7.917s) [main ] NewtonSolver.cpp:36 INFO| Newton iteration 3: r (abs) = 1.59719 (tol = 1e-08) r (rel) = 0.0108636(tol = 1e-08)
2024-07-10 11:42:12.485 ( 8.076s) [main ] petsc.cpp:698 INFO| PETSc Krylov solver starting to solve system.
2024-07-10 11:42:12.760 ( 8.351s) [main ] NewtonSolver.cpp:36 INFO| Newton iteration 4: r (abs) = 10.0883 (tol = 1e-08) r (rel) = 0.0686175(tol = 1e-08)
2024-07-10 11:42:12.915 ( 8.506s) [main ] petsc.cpp:698 INFO| PETSc Krylov solver starting to solve system.
2024-07-10 11:42:13.169 ( 8.760s) [main ] NewtonSolver.cpp:36 INFO| Newton iteration 5: r (abs) = 0.0336323 (tol = 1e-08) r (rel) = 0.000228757(tol = 1e-08)
2024-07-10 11:42:13.324 ( 8.915s) [main ] petsc.cpp:698 INFO| PETSc Krylov solver starting to solve system.
2024-07-10 11:42:13.575 ( 9.166s) [main ] NewtonSolver.cpp:36 INFO| Newton iteration 6: r (abs) = 0.116157 (tol = 1e-08) r (rel) = 0.000790063(tol = 1e-08)
2024-07-10 11:42:13.730 ( 9.321s) [main ] petsc.cpp:698 INFO| PETSc Krylov solver starting to solve system.
2024-07-10 11:42:13.985 ( 9.576s) [main ] NewtonSolver.cpp:36 INFO| Newton iteration 7: r (abs) = 4.33836e-06 (tol = 1e-08) r (rel) = 2.95082e-08(tol = 1e-08)
2024-07-10 11:42:14.146 ( 9.737s) [main ] petsc.cpp:698 INFO| PETSc Krylov solver starting to solve system.
2024-07-10 11:42:14.402 ( 9.993s) [main ] NewtonSolver.cpp:36 INFO| Newton iteration 8: r (abs) = 2.48803e-09 (tol = 1e-08) r (rel) = 1.69228e-11(tol = 1e-08)
2024-07-10 11:42:14.402 ( 9.993s) [main ] NewtonSolver.cpp:255 INFO| Newton solver finished in 8 iterations and 8 linear solver iterations.
Time step 2, Number of iterations 8, Load [ 0. 0. -3.]
Apparently, Newton iteration 0 of the second time steps does not yield an infinite relative residual.
- Is this behavior expected?
- What formula is used to compute the relative residuals?
Any help is much appreciated.
Best regards.