v2026.11.16174
Guide / Choosing… / Choosing a limiter

Choosing a limiter

Which slope limiter should bound the second-order reconstruction of the compressible solver?

What a limiter does

At second order the solver builds each face state from the cell value plus an increment taken from the cell gradient; see Reconstruction. In smooth flow this increment is accurate. Across a shock or a contact the gradient is large. The extrapolated face value can then overshoot the values in the neighbouring cells. The overshoot creates a new maximum or minimum. This grows into oscillations on either side of the discontinuity and can drive density or pressure negative.

A slope limiter prevents this. It multiplies the increment by a factor between 0 and 1. The factor is chosen so that the face value creates no new maximum or minimum. In smooth regions the factor stays at or near 1, so the reconstruction keeps its second-order accuracy. At a discontinuity it falls towards 0, and the face takes the cell value, as at first order.

The limiter has two costs. It also acts at smooth extrema, such as the peak of a vortex or the suction peak on an aerofoil. It clips them, which lowers the accuracy there. Where its factor switches between iterations, the residual can stall at a noise floor instead of converging.

The limiters

The limiters fall into two families. A one-dimensional limiter works face by face. It compares the jump across the face with a backward difference taken from the cell gradient. A cell-based limiter bounds every face value of a cell by the range of values over all of its neighbours. This is the stricter guarantee.

limiterFamilyBehaviour
van albada (the default)one-dimensionalsmooth; the most diffusive of the three in the shock-tube comparison below
van leerone-dimensionalsmooth; slightly more compressive than van Albada
symmetric ratioone-dimensionalno limiting over a wide range of difference ratios; the least dissipative of the three
none—no limiting: second order everywhere, with overshoots at discontinuities
barth jespersencell-basedbounded by the neighbours; limits wherever the bound is active, and can stall the residual
michalak goochcell-basedbounded by the neighbours; smooth; switches off in smooth flow
venkatakrishnancell-basedbounded by the neighbours; switches off in smooth flow; its shape has one kink

Which to use

Keep the default, van albada, for general work. Where the reconstructed face values must stay within the range of the neighbouring cells, as they must across a strong shock, use michalak gooch: it is bound preserving, smooth enough not to stall the residual, and switches itself off in smooth flow so that second-order accuracy survives mesh refinement. Use none only for smooth flow with no shocks or strong gradients.

The choice is made with limiter in numerical_scheme:

{ "numerical_scheme": { "order": "second", "limiter": "michalak gooch" } }

The limiter acts on the second-order reconstruction only. It has no effect when order is "first", nor during the cycles covered by first_order_cycles; see Choosing a spatial scheme. It belongs to the compressible solver; the incompressible solver limits its gradients through gradient_limiter_type and gradient_limiter in equations instead.

Demonstration: what limiter does From the shocktube case
Density across the contact and the shock of a shock tube for five limiters, against the analytic solution

Every run is second-order Roe with implicit dual time stepping on the same mesh; only the limiter changes.

setting limitervalues van albada, van leer, symmetric ratio, barth jespersen, michalak goochcase shocktube

One-dimensional limiters

van albada, van leer and symmetric ratio are functions ψ(a,b)\psi(a, b) of two directional differences: aa is the jump across the face and bb a backward difference reconstructed from the cell gradient. Each is applied independently to every reconstructed variable and to each side of every face, and ψ\psi scales the whole reconstruction increment on that side.

They are regularised by a threshold

ε=0.001⋅12(uL+uR)+10−8\varepsilon = 0.001 \cdot \tfrac{1}{2}(u_L + u_R) + 10^{-8}

which is proportional to the magnitude of the variable itself; symmetric ratio uses its absolute value. For a variable that changes sign, a velocity component for example, ε\varepsilon becomes small where the variable passes through zero, and the limiter then acts on correspondingly smaller variations.

The symmetric-ratio plateau

Writing r=b/ar = b/a for the ratio of the two differences, symmetric ratio is

ψ=min⁡(1,4min⁡(a,b)a+b)\psi = \min\left(1, \frac{4\min(a, b)}{a + b}\right)

It is zero for r≤0r \leq 0, rises as 4r/(1+r)4r/(1 + r), is exactly 1 across the whole plateau r∈[1/3,3]r \in [1/3, 3], and then decays as 4/(1+r)4/(1 + r). It satisfies ψ(1/r)=ψ(r)\psi(1/r) = \psi(r). The wide plateau is why it is the least dissipative of the one-dimensional limiters: van albada and van leer reach ψ=1\psi = 1 only at r=1r = 1 exactly.

rrsymmetric ratiovan albadavan leer
0.10.3640.1980.331
1/31.0000.6000.750
11.0001.0001.000
31.0000.6000.750
100.3640.1980.331

Cell-based limiters

barth jespersen, michalak gooch and venkatakrishnan are multidimensional. They bound the reconstructed face value by the range of values over the cell's whole set of face neighbours, which the one-dimensional limiters do not. They are evaluated per cell, in a pass of their own, and the reconstruction then reads the result.

For cell ii, take umax⁡u_{\max} and umin⁡u_{\min} over its face neighbours, and write

Δf=∇ui⋅(xf−xi)\Delta_f = \nabla u_i \cdot (\mathbf{x}_f - \mathbf{x}_i)

for the unlimited extrapolation to face ff. Define

yf={(umax⁡−ui)/ΔfΔf>0(umin⁡−ui)/ΔfΔf<0y_f = \begin{cases} (u_{\max} - u_i)/\Delta_f & \Delta_f > 0 \\ (u_{\min} - u_i)/\Delta_f & \Delta_f < 0 \end{cases}

Then ϕi=min⁡fP(yf)\phi_i = \min_f P(y_f), where the shape P(y)P(y) distinguishes the three limiters:

limiterP(y)P(y)Continuity
barth jespersenmin⁡(1,y)\min(1, y)C0C^0: a kink at y=1y = 1
michalak goochy−427y3y - \tfrac{4}{27}y^3 for y<3/2y < 3/2, otherwise 1C1C^1, and never above min⁡(1,y)\min(1, y)
venkatakrishnanmin⁡(1,(y2+2y)/(y2+y+2))\min\left(1, (y^2 + 2y)/(y^2 + y + 2)\right)C0C^0: the clip adds a kink at y=2y = 2

A kink makes the limiter value flicker between cycles, which can hold the residual at a noise floor. That is the case against barth jespersen, and the reason michalak gooch is preferred.

Switching off in smooth flow

michalak gooch and venkatakrishnan blend ϕ\phi towards 1 wherever the flow is smooth. A cell counts as smooth when the range umax⁡−umin⁡u_{\max} - u_{\min} over its neighbours, normalised by the reference state, is small against the threshold

ε2=(KhLref)3\varepsilon^2 = \left(\frac{K h}{L_{ref}}\right)^3

where KK is limiter_coefficient, hh the cell length scale and LrefL_{ref} the reference_length of the reference condition named by reference in initialisation. KK defaults to 5.0. A larger value treats more of the flow as smooth, and so limits less. The cube falls faster than the O(h2)O(h^2) reconstruction error, so under refinement the limiter switches itself off in smooth regions and formal order is kept. barth jespersen has no such switch and limits wherever the bound binds; the one-dimensional limiters ignore limiter_coefficient.

Freezing the limiter

If a few cells whose limiter switches between iterations hold the residual at a noise floor, freeze the limiter with freeze_limiter_cycle. With a cell-based limiter the values are held per cell rather than per face. See Limiter switching for when the freeze applies under each kind of time marching.

Reference entries