Troubleshooting Failed Solves
If your solve does not converge, i.e. you exceed the maximum number of nonlinear iterations (
max_nl_its), the time step gets cut. If this occurs, you will eventually reach the minimum time step and the solve will fail:
Time Step 1, time = 125 dt = 2e-8 0 Nonlinear |R| = 6.202666e+03 1 Nonlinear |R| = 9.602686e+02 2 Nonlinear |R| = 7.814158e+02 3 Nonlinear |R| = 5.736782e+02 4 Nonlinear |R| = 4.872949e+02 5 Nonlinear |R| = 4.420177e+02 6 Nonlinear |R| = 4.024829e+02 7 Nonlinear |R| = 3.664817e+02 8 Nonlinear |R| = 3.341195e+02 9 Nonlinear |R| = 3.052765e+02 10 Nonlinear |R| = 2.795248e+02 Solve Did NOT Converge! Time Step 1, time = 100 dt = 1e-8 0 Nonlinear |R| = 6.202666e+03 1 Nonlinear |R| = 9.600767e+02 2 Nonlinear |R| = 7.746469e+02 3 Nonlinear |R| = 5.609970e+02 4 Nonlinear |R| = 4.766359e+02 5 Nonlinear |R| = 4.323344e+02 6 Nonlinear |R| = 3.935847e+02 7 Nonlinear |R| = 3.584233e+02 8 Nonlinear |R| = 3.267590e+02 9 Nonlinear |R| = 2.985230e+02 10 Nonlinear |R| = 2.733081e+02 Solve Did NOT Converge! *** ERROR *** Solve failed and timestep already at or below dtmin, cannot continue!
Your solve may be failing for various reasons:
Small initial tolerance
If you are running a simulation in which for a specific time step the initial tolerance begins very small (>1e-6), your solve fails simply because the
nl_rel_tol would force te residual too small to reach.
Initial residual before setting preset BCs: 4.84302e-09 0 Nonlinear |R| = 4.843024e-09 1 Nonlinear |R| = 1.273033e-13 2 Nonlinear |R| = 5.226870e-17 3 Nonlinear |R| = 2.580131e-17 4 Nonlinear |R| = 2.522566e-17 5 Nonlinear |R| = 2.522556e-17 Solve Did NOT Converge!
You may be in a close to steady-state regime such that the previous solution is very close to the current solution. In this case, setting a
nl_abs_tol will fix your problem.
Bad linear convergence
If for a specific time step your linear iterations are not dropping such that it takes many linear iterations to reach
l_tol or you may never reach
l_tol because you hit the
l_max_hit, your preconditioner is not working for the problem.
Initial residual before setting preset BCs: 65444.1 0 Nonlinear |R| = 6.544408e+04 0 Linear |R| = 6.544408e+04 1 Linear |R| = 5.381557e+04 2 Linear |R| = 5.381315e+04 3 Linear |R| = 5.381315e+04 4 Linear |R| = 5.381315e+04 5 Linear |R| = 5.381315e+04 6 Linear |R| = 5.381315e+04 7 Linear |R| = 5.381315e+04 8 Linear |R| = 5.381315e+04 9 Linear |R| = 5.381315e+04 10 Linear |R| = 5.381315e+04 11 Linear |R| = 5.381315e+04 12 Linear |R| = 5.381315e+04 13 Linear |R| = 5.381315e+04 14 Linear |R| = 5.381315e+04 15 Linear |R| = 5.381315e+04 1 Nonlinear |R| = 5.510740e+04 0 Linear |R| = 5.510740e+04 1 Linear |R| = 5.510740e+04 2 Linear |R| = 5.510738e+04 3 Linear |R| = 5.510737e+04 4 Linear |R| = 5.510735e+04 5 Linear |R| = 5.510734e+04 6 Linear |R| = 5.510732e+04 7 Linear |R| = 5.510730e+04 8 Linear |R| = 5.510729e+04 9 Linear |R| = 5.510727e+04 10 Linear |R| = 5.510726e+04 11 Linear |R| = 5.510724e+04 12 Linear |R| = 5.510722e+04 13 Linear |R| = 5.510721e+04 14 Linear |R| = 5.510719e+04 15 Linear |R| = 5.510718e+04 Solve Did NOT Converge!
In this case you are likely to require many nonlinear iterations as well, but the reason is that your linear iterations don't drop. This could be due to missing terms or errors in your Jacobian or because the way you are applying your preconditioner in PETSc is not good for the problem. Make sure your Jacobian is correct and add off-diagonal terms for multivariable problems.
Bad nonlinear convergence
If your linear iterations are dropping fine but it takes lots of nonlinear iterations, then your problem is very nonlinear and it is just hard to solve. In this case, you should decrease the time step. However, if you have a multivariable problem, the two residuals may have very different magnitudes, which will make the system hard to solve. Print the nonlinear residuals using the debug block to check their relative magnitudes at the end of a solve. If they are more than an order of magnitude off, then use the
scaling parameter in the variables block to scale the smaller variable up.