Translated from the author's Korean original. Read the original (한국어)
Letting Sound and Matter Flow Separately — Acoustic-Convective Splitting (Lagrange-Projection)
Drop the R_j feedback on the convective projection and mass, momentum, and energy stop matching.
Letting Sound and Matter Flow Separately — Acoustic-Convective Splitting (Lagrange-Projection)#
Sound still runs at 340 m/s next to someone walking at 5 km/h. A compressible solver stuffs both speeds into one step. The ratio is the nuisance. In a slow flow the acoustic waves outrun the matter by hundreds. A direct Godunov step is chained to the fast waves. The slow convection you wanted gets smeared.
Drop the Mach slider and both the split of the pressure pulse and the stall of the entropy blob change together.
At 0.02 the amber pulse peels into two waves that race outward. The teal blob barely moves. The three triangles sit at , , and . Lower the Mach number and only the middle marker stops. The outer gap stays .
ten Eikelder et al. (2017) pull the two apart. Acoustic part, convective part, each with its own scheme, one after the other. The notes below put that Lagrange-Projection split on the single-phase Euler equations and check it on an acoustic pulse in a slow stream.
Paper: M.F.P. ten Eikelder, F. Daude, B. Koren, A.S. Tijsseling, "An acoustic-convective splitting-based approach for the Kapila two-phase flow model", Journal of Computational Physics 331 (2017) 188–208. DOI: 10.1016/j.jcp.2016.11.031
The Jacobian Splits in Two#
Write the 1D Euler equations in primitive variables and they take a quasi-linear form.
Here is density, is velocity, is pressure. The coefficient matrix splits cleanly into two pieces.
holds every pressure term — the acoustic part. simply carries matter along — the convective part. The split really amounts to peeling the term out of the Lagrangian derivative .
The Additive Split of the Eigenvalues#
Why this split is powerful becomes clear once you look at the eigenvalues. The wave speeds of the full system are . They add up exactly from an acoustic and a convective contribution.
is the speed of sound. The acoustic speeds are , independent of the flow velocity. The convective speed is across the board. In the low-Mach limit , the acoustic band keeps its width while the convective speed shrinks to zero. That gap is the stiffness. The triangle spacing in the figure above is this same addition. As , only vanishes. stays.
Acoustic Step — HLLC in Lagrangian Coordinates#
The acoustic part is the expansion and compression that pressure drives. The paper moves it into mass (Lagrangian) coordinates and solves it with an HLLC-type Riemann solver. The starred state at face comes down to two formulas.
is the acoustic impedance (density times sound speed). Those starred velocities and pressures alone drive the update of the Eulerian variables. Each cell's expansion rate compresses into a single coefficient.
tells you how much the acoustic step stretched or squeezed the cell volume. Density follows immediately as .
The background in the run is , , , so . The pressure pulse has amplitude . The density anomaly has amplitude . Their centers sit at and , so they do not overlap at . The density peak therefore starts on the entropy blob, near . If is above 1 the cell expands and density drops. Below 1, it compresses. Because multiplies the jump in face , a CFL of 0.8 still keeps close to 1. With 400 cells on a domain of length 1, .
Convective Step — Upwind Projection#
Now the starred velocity from the acoustic step carries the matter. Update the conserved quantities with a plain upwind scheme.
is when , else . The from the previous step comes back here, and mass, momentum, and energy are conserved exactly. Walk through the two steps in order and one time step is done.
Positive takes the face value from the left cell. Negative takes it from the right. undoes the volume change first. The face flux moves the matter after that. Swap the order and the sums of mass, , and drift apart. Periodic faces do not leak. With the feedback in place, the momentum sum keeps only roundoff. How wide a plain Roe flux spreads at low Mach is measured separately in the three artificial-diffusion scalings of Hope–Collins.
Python — Acoustic Pulse in a Slow-Moving Flow#
Here is the whole pipeline in numpy: periodic boundaries, an ideal gas, three conserved quantities per cell. The initial condition lays a small pressure pulse and a density anomaly on top of a background flow .
import numpy as np
GAMMA = 1.4 # ideal-gas heat capacity ratio
def primitives(rho, mom, Ene):
"""Conserved -> primitive variables (velocity, pressure, sound speed)."""
u = mom / rho
e = Ene / rho - 0.5 * u * u # specific internal energy
p = (GAMMA - 1.0) * rho * e
c = np.sqrt(GAMMA * p / rho)
return u, p, c
def acoustic_faces(rho, u, p, c):
"""HLLC acoustic state u*, p* at face j+1/2 (paper eq. 34)."""
rp, up, pp, cp = (np.roll(a, -1) for a in (rho, u, p, c))
a = np.maximum(rho * c, rp * cp) # acoustic impedance a = max(rho*c) (eq. 32)
ustar = 0.5 * (u + up) + (p - pp) / (2 * a)
pstar = 0.5 * (p + pp) + 0.5 * a * (u - up)
return ustar, pstar
def lagrange_projection_step(rho, mom, Ene, dx, dt):
"""Acoustic step -> convective step (paper eq. 38, 40)."""
u, p, c = primitives(rho, mom, Ene)
uf, pf = acoustic_faces(rho, u, p, c) # j+1/2
uf_m, pf_m = np.roll(uf, 1), np.roll(pf, 1) # j-1/2
lam = dt / dx
# 1) acoustic step: expansion/compression driven by pressure
R = 1.0 + lam * (uf - uf_m) # eq. (39)
rho1 = rho / R
mom1 = (mom - lam * (pf - pf_m)) / R
Ene1 = (Ene - lam * (pf * uf - pf_m * uf_m)) / R
# 2) convective step: carry matter at u* (upwind projection)
def project(phi1):
phi_f = np.where(uf >= 0, phi1, np.roll(phi1, -1))
phi_f_m = np.roll(phi_f, 1)
return R * phi1 - lam * (uf * phi_f - uf_m * phi_f_m)
return project(rho1), project(mom1), project(Ene1)
def run_acoustic_pulse(mach, n=400, cfl=0.8, tmax=0.25):
x = (np.arange(n) + 0.5) / n
dx = 1.0 / n
c0, rho0 = 1.0, 1.0
p0 = rho0 * c0**2 / GAMMA
u0 = mach * c0
dp = 1e-3 * np.exp(-((x - 0.5) / 0.03)**2) # acoustic pressure pulse
ds = 5e-2 * np.exp(-((x - 0.25) / 0.03)**2) # entropy (density) anomaly -> contact wave
rho = rho0 + dp / c0**2 + ds
u = np.full(n, u0)
p = p0 + dp
mom = rho * u
Ene = p / (GAMMA - 1) + 0.5 * rho * u * u
t, m0 = 0.0, mom.sum()
while t < tmax:
_, _, c = primitives(rho, mom, Ene)
dt = min(cfl * dx / np.max(np.abs(mom / rho) + c), tmax - t)
rho, mom, Ene = lagrange_projection_step(rho, mom, Ene, dx, dt)
t += dt
return rho, mom, m0, mom.sum()
for M in (0.02, 0.2):
rho, mom, m0, m1 = run_acoustic_pulse(M)
print(f"M={M}: momentum error={abs(m1-m0)/abs(m0):.1e}, rho_max={rho.max():.4f}")
# M=0.02: momentum error=2.2e-16, rho_max=1.0497
# M=0.2: momentum error=0.0e+00, rho_max=1.0452Momentum is conserved to machine precision. Pressure stays bounded and density stays positive. Splitting does not break conservation because the convective step feeds the back in.
The printed is 1.0497 at and 1.0452 at . The initial crest near 1.05 barely erodes. The pressure pulse adds only to density, so the peak belongs to the contact. Momentum errors of and 0 say the split itself is not what breaks conservation. The step is still limited by , so raising from 0.02 to 0.2 barely changes the step count. With , is 1.02 versus 1.2. Convection can speed up by ten and acoustics still own most of the step.
What Actually Diverges at Low Mach#
The split earns its keep at low Mach. A direct scheme's stable step stays chained to , even when the physics of interest lives on .
Move the Mach slider and the amber band stays locked at width while the teal speed shrinks.
The acoustic width does not depend on . Only converges to zero. At and , and , so . The split can advance convection on a different step from acoustics. Slow physics stops getting dragged by the fast waves. The same split also dodges the extra numerical diffusion a direct Godunov scheme picks up at low Mach.
A Critical Look#
Three snags. The split here is first order in time. Second order means a Strang wrap — acoustic, convective, acoustic — and another pass on the bill. The paper's real stage is the Kapila five-equation two-phase model. The non-conservative term in the volume-fraction equation, and the positivity proof, are the actual hurdles. This single-phase cut skips them. The impedance is robust and also diffusive. On a strong shock that diffusion can smear the contact. The paper therefore times accuracy and cost against the direct scheme on their own.
In a code base this split is not exotic. OpenFOAM's pressure-based rhoPimpleFoam and the all-Mach family already treat acoustics and convection implicitly and explicitly from the same root. Lagrange-Projection is the version written in Riemann-solver language.
Drop R_j and conservation dies first#
Leave the acoustic out of the convective projection and the updates for mass, momentum, and energy stop agreeing. The run above reaches only with that feedback in place. A Strang wrap can raise the order. The sequence grows to acoustic–convective–acoustic, and one extra pass comes with it.
Step up to the Kapila five-equation model and in the volume fraction is still there. The single-phase cut never touches that non-conservative term. Setting survives shocks and thickens contacts. Another way to lift acoustics out of the time integrator is Peluchon's acoustic-transport IMEX. At , . Whether that factor of 21 sits in the acoustic solver or stays on the convective CFL is the implementation fork.
Related
Share if you found it helpful.