Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

TVD schemes

Total Variation Diminishing (TVD) schemes are flux limiters for the convective term that keep an advected profile bounded and non-oscillatory near a discontinuity, without the excessive numerical diffusion of first-order upwind. This notebook compares several limiters (upwind, Min-mod, Osher, CLAM, MUSCL, van Leer) on the same 1D linear advection test.

Limiter functions (NVD diagrams)

Each limiter is a function of the normalized upstream value c~C\tilde{c}_C that returns the normalized downwind-face value c~d\tilde{c}_d (plotted here as c~d−c~C\tilde{c}_d - \tilde{c}_C), for a fixed value of the local Courant-like ratio. This is the Normalized Variable Diagram (NVD) representation of a limiter, independent of any PDE; it shows how aggressively each scheme interpolates towards the downwind cell.

<Figure size 640x480 with 1 Axes>

Explicit time stepping: step advection

Pure advection at velocity vv of a step profile: a Danckwerts-type inlet at x=0x=0 fixes c=1c=1, and a zero-gradient outlet at x=Lx=L lets the profile leave without reflection. Starting from c=0c=0, each limiter is advanced with explicit (Euler-forward) time stepping and the final profile is plotted.

<Figure size 640x480 with 1 Axes>

Implicit time stepping with deferred correction

The same test, now advanced with implicit (Euler-backward) time stepping. The Jacobian is built once from the first-order upwind convection operator; the TVD limiter only enters as an explicit correction term recomputed each inner iteration (deferred correction), so the constant operators and their LU factorization are reused for every limiter and time step.

<Figure size 640x480 with 1 Axes>

Checking the result

TVD limiters are designed to be boundedness-preserving (Total Variation Diminishing): with an inlet value of 1, an initial value of 0, and no source term, the concentration must stay within [0,1][0, 1] at every cell and every time step, for every limiter. A violation of this bound would mean the limiter, or its implementation, is not actually TVD.

limiter          min(c)       max(c)  interpretation
upwind       0.0000e+00   1.0000e+00  bounded
Min-mod      0.0000e+00   1.0000e+00  bounded
Osher       -2.4449e-17   1.0000e+00  bounded
CLAM        -2.4449e-17   1.0000e+00  bounded
MUSCL       -2.3235e-17   1.0000e+00  bounded
van Leer    -8.0861e-26   1.0000e+00  bounded