Sometimes your numerical problem is stiff, meaning you have two related timescales: one that is fast and requires a small time step to maintain stability, and the other much slower, which requires long simulation times to reach a steady state. If you are only interested in that final steady state, Local Time Stepping (LTS) can really cut down the computational costs on these types of problems. This technique is supported by many solvers in the OpenFOAM toolkit.
The idea behind this method is quite simple: the model uses different time steps for each cell of the model. Big cells or cells with small velocities use larger time steps, while small cells with high velocities use lower time steps. All this is based on the local Courant number, which is desired to remain almost constant throughout the domain. This is not achieved perfectly in practice, though, among other things, because that local time scale is smoothed over neighbouring cells.
In this video I show an example of this method on a problem involving a weir (high velocity, fast time scale) and a dam reservoir (low velocity, slow time scale).
The flow is first solved using the Euler scheme, solving the transient physically. Convergence on levels and outlet discharges is not reached even after 20000 time steps of 0.005s, which yield a maximum Courant number of around 0.9.
Then the flow is solved using the localEuler (LTS) scheme, targeting a Courant number of 0.9 in all cells. Convergence is approximately achieved after 10000 time steps (or iterations); that’s less than half the computational cost! Results can be even more extreme on other problems, specially as the fast and slow time scales are increasingly more different.
These performance improvements do come with a cost; notice, the unphysical oscillations that develop in the localEuler simulation on the low velocity zone upstream of the weir.
In case you want to take a closer look at how the models are put together, I have uploaded the case to GitHub: