# 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.