Skip to content
cfd-lab:~/en/posts/2026-06-21-asymptotic-pr…● online

Translated from the author's Korean original. Read the original (한국어)

NOTE #079DAY SUN 논문리뷰DATE 2026.06.21UPDATED 2026.10.19READ 6 min read#CFD#Paper-Review#Low-Mach#Asymptotic-Preserving#IMEX

[Paper Review] Not Killing Sound at Low Mach — An AP IMEX Wave Scheme

With these parameters the step count is exactly M=128/ε, and a log-decay of 0.154/ε reproduces the explicit column.

Put a low-Mach flow in a compressible code and a faster sound speed sounds like a sharper answer. It is not. Drop the Mach number and a standard upwind scheme wipes a perfectly good wave off the grid. Arun, Das Gupta, and Samantaray (2019) pin that collapse on the linear wave system and build an asymptotic-preserving (AP) scheme with IMEX-RK, stable without reference to the Mach number. The reason the acoustic operator has to be implicit is sitting in the numbers below.

Slide ε\varepsilon to the left and the red upwind curve climbs with slope −1-1, while the cyan AP curve stays flat.

0.010.111010010000.0010.010.11Mach number ε (log scale)effective diffusion (log)explicit upwind ∝ 1/εAP / implicit (flat)
D_explicit ≈ 0.078
D_AP ≈ 7.8e-3
ratio ≈ 10.0×

At ε=10−3\varepsilon=10^{-3} the ratio of the two curves reaches the hundreds. What grows as Mach falls is not the wave. It is the upwind numerical viscosity.

When ε goes to zero, the grid eats the wave#

The scaled isentropic Euler equations carry one small parameter, the Mach number ε\varepsilon. The pressure term enters the momentum equation as ∇p/ε2\nabla p / \varepsilon^2.

∂tρ+∇⋅(ρu)=0,∂t(ρu)+∇⋅(ρu⊗u)+∇pε2=0\partial_t \rho + \nabla\cdot(\rho \mathbf{u}) = 0, \qquad \partial_t (\rho\mathbf{u}) + \nabla\cdot(\rho\mathbf{u}\otimes\mathbf{u}) + \frac{\nabla p}{\varepsilon^2} = 0

ρ\rho is density, u\mathbf{u} is velocity, and p=ργp=\rho^\gamma is pressure. ε\varepsilon is reference velocity over reference sound speed.

As ε→0\varepsilon \to 0 the solution goes to the incompressible limit. That is a singular perturbation. The authors cut the analysis down to the linear wave system.

∂tϱ+(u⋅∇)ϱ+aε∇⋅u=0,∂tu+(u⋅∇)u+aε∇ϱ=0\partial_t \varrho + (\mathbf{u}\cdot\nabla)\varrho + \frac{a}{\varepsilon}\nabla\cdot\mathbf{u} = 0, \qquad \partial_t \mathbf{u} + (\mathbf{u}\cdot\nabla)\mathbf{u} + \frac{a}{\varepsilon}\nabla\varrho = 0

ϱ\varrho is the linearized density perturbation and aa is the sound speed of that state. The effective sound speed is c=a/εc=a/\varepsilon. Shrink the Mach number and that acoustic speed blows up.

The well-prepared space — the solutions that must survive#

In the limit ε→0\varepsilon\to 0 the solution does not wander. It collects in the well-prepared space: constant density, divergence-free velocity.

ϱ(0)=const,∇⋅u(0)=0\varrho^{(0)} = \text{const}, \qquad \nabla\cdot\mathbf{u}^{(0)} = 0

That space is the kernel of the acoustic operator L(U)=(a∇⋅u, a∇ϱ)L(U)=(a\nabla\cdot\mathbf{u},\,a\nabla\varrho). The discrete solution has to land there too. Dellacherie (2010) showed that a scheme which breaks the invariance loses accuracy at low Mach. Keep the kernel and the scheme is asymptotically accurate (AA). Keep the stability limit independent of ε\varepsilon and it is asymptotic preserving (AP).

Upwind viscosity grows in proportion to the sound speed#

The culprit is upwind numerical viscosity. Diagonalize the wave system into characteristic variables and it splits into two scalar advections at speeds ±c\pm c. A Rusanov upwind step on each mode has this amplification.

∣g∣2=(1−ν(1−cos⁡θ))2+ν2sin⁡2θ,ν=c ΔtΔx,  θ=kΔx|g|^2 = \big(1 - \nu(1-\cos\theta)\big)^2 + \nu^2\sin^2\theta, \qquad \nu = \frac{c\,\Delta t}{\Delta x},\ \ \theta = k\Delta x

ν\nu is the acoustic CFL, θ\theta is the phase per cell, and kk is the wavenumber.

One step barely hurts. The stack is the problem. Reaching a fixed physical time TT takes M=T/Δt=Tc/(νΔx)M = T/\Delta t = T c /(\nu\Delta x) acoustic steps. For small θ\theta the decay per step is 12ν(1−ν)θ2\tfrac{1}{2}\nu(1-\nu)\theta^2, and MM of them produce this log-decay.

M⋅12ν(1−ν)θ2  =  12 T c (1−ν) k2Δx  ∝  c  ∝  1εM\cdot\tfrac{1}{2}\nu(1-\nu)\theta^2 \;=\; \tfrac{1}{2}\,T\,c\,(1-\nu)\,k^2\Delta x \;\propto\; c \;\propto\; \frac{1}{\varepsilon}

Drop the Mach number by a decade and the effective viscosity climbs a decade. The slope −1-1 on the red curve above is that proportion.

Operator splitting — convection explicit, acoustics implicit#

Split the equations by time scale and two operators show up.

∂tU+H(U)+1εL(U)=0\partial_t U + H(U) + \frac{1}{\varepsilon}L(U) = 0

HH is convection, time scale O(1)O(1). L/εL/\varepsilon is acoustics, time scale O(ε)O(\varepsilon). All of the stiffness sits in L/εL/\varepsilon. Integrate that part implicitly. Leave convection explicit. The mix is IMEX (Implicit-Explicit). Whether the same split still holds a time step all the way to Mach 0 is the question in an IMEX TVD reproduction.

Implicit acoustics make central differences stable. The upwind viscosity drops out. Δt\Delta t is set by slow convection, not by fast sound. Inside this model, a smaller ε\varepsilon is not a reason to shrink the step.

IMEX-RK absorbs the stiffness#

Time integration is IMEX Runge-Kutta (IMEX-RK). The explicit tableau (A~,b~)(\tilde A,\tilde b) carries HH. The implicit tableau (A,b)(A,b) carries L/εL/\varepsilon. At each stage the acoustics condense into an elliptic equation for density, a pressure-Poisson lookalike.

ϱ−β2Δt2 a2∇2ϱ=(explicit terms)\varrho - \beta^2 \Delta t^2\, a^2 \nabla^2 \varrho = (\text{explicit terms})

β\beta is the diagonal coefficient of the IMEX tableau and ∇2\nabla^2 is the Laplacian. Invertibility of that elliptic problem comes from saddle-point theory. On the grid, circulant matrices give the same conclusion. A unique solution, uniform stability independent of ε\varepsilon, and invariance of the well-prepared space.

Python — reproducing the amplitude decay of one mode#

The code below computes the upwind amplification of one Fourier mode and prints the amplitude left after physical time TT, one Mach number at a time. The implicit scheme keeps the mode, so its amplitude stays at 1.

import numpy as np
 
a  = 1.0        # linearization sound speed
k  = 2 * np.pi  # single Fourier mode on [0,1]
T  = 1.0        # fixed physical end time
nu = 0.5        # acoustic CFL number
 
def upwind_amp_factor(eps, N):
    """|g| of one characteristic mode under Rusanov on the wave system."""
    c  = a / eps              # acoustic speed c = a/ε
    dx = 1.0 / N
    th = k * dx               # phase per cell θ = kΔx
    re = 1.0 - nu * (1.0 - np.cos(th))
    im = nu * np.sin(th)
    return np.hypot(re, im)   # |g| <= 1
 
def retained_amplitude(eps, N):
    """Mode amplitude after physical time T (upwind vs implicit)."""
    c  = a / eps
    dx = 1.0 / N
    dt = nu * dx / c          # acoustic CFL step
    M  = T / dt               # number of explicit steps
    explicit = upwind_amp_factor(eps, N) ** M
    implicit = 1.0            # central-implicit preserves the mode
    return M, explicit, implicit
 
if __name__ == "__main__":
    N = 64
    print(f"{'eps':>8} {'steps M':>10} {'explicit':>12} {'AP':>6}")
    for eps in [0.4, 0.2, 0.1, 0.05, 0.02, 0.01]:
        M, ex, ap = retained_amplitude(eps, N)
        print(f"{eps:8.3f} {M:10.0f} {ex:12.3e} {ap:6.2f}")

The output looks like this.

     eps    steps M     explicit     AP
   0.400        320    6.804e-01   1.00
   0.200        640    4.629e-01   1.00
   0.100       1280    2.143e-01   1.00
   0.050       2560    4.591e-02   1.00
   0.020       6400    4.430e-04   1.00
   0.010      12800    1.980e-07   1.00

Drop the Mach ε\varepsilon slider and the red amplitude hits the floor before physical time T=1T=1 is over. Push CFL ν\nu toward 1 and ν(1−ν)\nu(1-\nu) shrinks, so the decay eases for a moment. Drop ε\varepsilon further and that gain disappears under the 1/ε1/\varepsilon stack. Raising NN only partly helps: θ2∝N−2\theta^2\propto N^{-2} and Δx∝N−1\Delta x\propto N^{-1} do not cancel.

Plug the code's numbers into the step-count formula and it closes. With a=1a=1, T=1T=1, ν=0.5\nu=0.5, and N=64N=64, Δx=1/64\Delta x=1/64 and c=1/εc=1/\varepsilon. Then Δt=νΔx/c\Delta t=\nu\Delta x/c, so M=T/Δt=128/εM=T/\Delta t=128/\varepsilon. The printed steps 320, 640, 1280, 2560, 6400, and 12800 are that formula at ε=0.4,0.2,0.1,0.05,0.02,0.01\varepsilon=0.4,0.2,0.1,0.05,0.02,0.01. Halve ε\varepsilon and MM doubles. Cut ε\varepsilon by ten and MM grows by ten.

The log-decay 12Tc(1−ν)k2Δx\tfrac12 T c(1-\nu)k^2\Delta x with the same numbers is the exponent 0.154/ε0.154/\varepsilon. The coefficient comes from k=2πk=2\pi. At ε=0.4\varepsilon=0.4 the exponent is 0.386 and e−0.386=0.680\mathrm{e}^{-0.386}=0.680, matching the printed 6.804×10−16.804\times 10^{-1} to three digits. At ε=0.1\varepsilon=0.1, e−1.542=0.214\mathrm{e}^{-1.542}=0.214 against the printed 2.143×10−12.143\times 10^{-1}. At ε=0.01\varepsilon=0.01 the exponent is 15.4. e−15.4\mathrm{e}^{-15.4} sits near 2.0×10−72.0\times 10^{-7}, and the table prints 1.980×10−71.980\times 10^{-7}. The phase θ=kΔx=2π/64≈0.098\theta=k\Delta x=2\pi/64\approx 0.098 is not tiny, so the small-angle step is a little kind at the bottom of the table. And ν=0.5\nu=0.5 maximizes ν(1−ν)\nu(1-\nu) at 0.25. This column is the decay at the CFL where one step hurts most.

AP versus AA#

They are not the same question. AP asks whether the ε→0\varepsilon\to 0 limit of the discrete scheme is a valid discretization of the limit equation, with a stability restriction independent of ε\varepsilon. AA asks something narrower. On a finite grid, with ε\varepsilon small but not zero, does the solution stay near the well-prepared space? Upwind fails both. IMEX implicit passes both. The fork is the time discretization, not the spatial order.

Even at the worst ν, the AP column stays 1.00#

Every AP entry in the table is 1.00. The implicit step removes the upwind viscosity, so the exponent 0.154/ε0.154/\varepsilon never multiplies the amplitude. ν=0.5\nu=0.5 is the CFL where one step decays the most, and after M=128/εM=128/\varepsilon steps the AP value is still 1.00. For this linear wave system, treating only L/εL/\varepsilon implicitly is the right call.

That call does not travel to every low-Mach system. There are equations where the acoustics are already implicit and the time step shrinks again anyway. The place a second 1/M21/M^2 hides in the relative velocity is the stiffness left in the enthalpy.

Share if you found it helpful.