Translated from the author's Korean original. Read the original (한국어)
Fewer Equations, and It Stopped Blowing Up — The Four-Equation Model and the Interface Equilibrium Condition
Uniform pressure survives only if Γ itself is upwinded; dividing a conserved ρΓ by ρ is what bends it.
Delete one equation and the code stops crashing. Compressible multiphase flow is usually taught the other way: a seven-equation model, with its own pressure, velocity, and temperature per phase, is the safe one, and fewer equations means more risk. Collis (2025) flips that order. The shortest model, four equations, is the one that holds. The hinge is interface equilibrium.
Turn the Naive toggle on and push right-gas γ to 1.66 or 1.09: the red pressure line at the interface rises, and the green line stays flat.
Uniform velocity, uniform pressure, only γ jumps across the shaded interface. The naive scheme grows a pressure spike at the interface; the consistent one keeps P flat to machine precision.
The red peak grows with the γ jump. Whether the green line is still on the floor at step 900 is whether the equilibrium condition is alive.
The Ladder of Equilibria — 7, 6, 5, 4 Equations#
A diffuse-interface method needs a rule for the two phases inside a smeared cell. That rule is what counts as equilibrium.
- Seven equations (Baer–Nunziato): each phase has its own velocity, pressure, and temperature. Most general, most expensive.
- Six equations: one velocity. Pressures stay separate and meet by relaxation.
- Five equations: shared velocity and pressure. Temperature stays separate.
- Four equations: velocity, pressure, and temperature all shared. Shortest.
A physical interface is nanometers thick. The numerical one is that sheet inflated across a few cells. Inside that band, thermal and mechanical equilibrium is effectively immediate. Near the interface, four equations are the closer physics.
Superscripts are the two phases. The four-equation model enforces all three equalities inside the cell.
Why Fewer Equations Are More Robust#
Five equations and up usually add an extra transport equation, for volume fraction or for something like . At the PDE level those equations repeat information. Once discretized they drift apart. The same quantity, two paths, two values.
Four equations drop the extra. Only mass, momentum, and energy are conserved. Pressure closes through a mixture equation of state. Fewer equations, fewer places to drift. Cheaper, too.
One problem remains. The slack those extra equations used to provide is gone, and a conservative discretization then pulls the pressure off at the interface.
The Moment the Interface Equilibrium Condition Breaks#
The interface equilibrium condition (IEC) is plain. If pressure, temperature, and velocity start uniform, the interface passing through must not break that uniformity.
A scheme that breaks it grows a pressure oscillation that was not there. The oscillation grows in time. At a large density ratio, negative density or negative internal energy shows up and the run stops.
Why a conservative scheme does this. For an ideal-gas mixture, set . Total energy is
is total energy, pressure, density, velocity. jumps at the interface because the fluids differ.
Push one cell with first-order upwind under uniform and . is the CFL number. The conservative energy update cancels the piece and leaves
Substitute the energy definition and the right-hand side splits.
For the new pressure to stay , has to update exactly like that bracket. That is a non-conservative upwind. The conservative path advects as a whole and divides by again. The two answers split at the interface. A uniform pressure that still shakes when the non-conservative path is inconsistent is the spot Abgrall's criterion marks. The split is the pressure oscillation.
The red line that grew when γ moved is this split. Switch to IEC-consistent and the green line is still flat at step 900.
Python — The Oscillation and Its Cure#
Same calculation. Uniform and , only jumps, first-order upwind. Only the scheme differs.
import numpy as np
def advect_interface(scheme, gamma_R=1.66, nu=0.6, steps=300, N=200):
x = np.linspace(0.0, 1.0, N, endpoint=False)
ramp = np.clip((x - 0.28) / 0.06, 0.0, 1.0) # interface smeared over a few cells
gamma = 1.4 + (gamma_R - 1.4) * ramp # air (1.4) -> chosen gas
rho = 1.0 + (0.2 - 1.0) * ramp # density jumps too
u0, P0 = 1.0, 1.0
Gam = 1.0 / (gamma - 1.0) # mixture stiffness 1/(gamma-1)
mom = rho * u0
E = P0 * Gam + 0.5 * rho * u0**2 # E = P*Gamma + 0.5*rho*u^2
for _ in range(steps):
rhoG = rho * Gam # rho*Gamma before the update
r_up, m_up, e_up = np.roll(rho, 1), np.roll(mom, 1), np.roll(E, 1)
rho = rho - nu * (rho - r_up) # mass: conservative upwind
mom = mom - nu * (mom - m_up) # momentum: conservative
E = E - nu * (E - e_up) # energy: conservative
if scheme == "naive":
rhoG = rhoG - nu * (rhoG - np.roll(rhoG, 1)) # advect rho*Gamma conservatively
Gam = rhoG / rho # then divide by rho again
else: # consistent
Gam = Gam - nu * (Gam - np.roll(Gam, 1)) # advect Gamma directly (non-conservative)
P = (E - 0.5 * mom**2 / rho) / Gam # recover pressure
return float(np.max(np.abs(P - P0)))
for s in ("naive", "consistent"):
print(f"{s:11s} max|P-P0| = {advect_interface(s):.3e}")The printout splits by thirteen digits, not two.
naive max|P-P0| = 3.83e-02
consistent max|P-P0| = 4.44e-15Naive pressure is off by about 4% at the interface. Consistent is flat down to floating-point roundoff. One line did it. Recover by dividing by rho, or advect itself.
Put numbers on . Air at has . Helium at has . SF6 at has . Air to helium is a jump of about 0.985. Air to SF6 is about 8.61. The SF6 jump is about 8.74 times the helium jump. That factor is why the red line grows when γ goes to 1.09.
One step of the listing's on a sharp cell. The right cell is , ; the upwind neighbor is air, , . Advect conservatively and divide by , and . Advect directly and . Invert the energy relation above and , so one step gives . The same sharp cell with SF6 gives . The printed is not that sharp cell. The ramp width is 12 cells at , and over 300 steps the interface travels . A smeared interface run that long keeps the maximum under the one-step jump, at . The sharp-step over that is about . Spread across 12 cells, the error is still a few percent. The consistent is roundoff left behind once the two paths agree.
What the Paper Actually Did#
The toy above only pushes one ideal-gas . Collis (2025) is wider.
- A NASG equation of state (Noble–Abel stiffened gas, an EOS that reaches liquids) closes water, air, helium, and SF6 together. Mixture pressure is a closed quadratic from Amagat's law.
- High-order ENO reconstruction (WENO/TENO) replaces first-order upwind. The reconstruction is tied to the four-equation equilibrium assumption, so the IEC holds to machine precision.
- A positivity-preserving limiter extended to four equations covers a strong shock hitting a large density-ratio interface. Density and the square of the sound speed are kept from going negative.
- None of this adds a volume-fraction or specific-heat equation, and it does not drop conservation or a scalar filter.
Limits remain. The liquid is a single component and the gas is ideal-gas components. More components means an iterative solver for pressure and temperature equilibrium. The paper is still a preprint.
Recovering Γ by dividing by ρ bends a flat pressure in one step#
On one sharp cell, helium already has . SF6 has . The 300-step printout is that jump shared across a 12-cell ramp. Leave the one line that advects and divides by , and a uniform bends at the interface immediately. Trading the extra equations for that non-conservative line is the whole of the four-equation choice.
Five equations share velocity and pressure and still keep one extra equation. If that extra piece is what collapses the interface sound speed, it is open whether deleting it to save the IEC also deletes the disease, or only hides it in the mixture EOS. Whether the five-equation wood speed that collapses when water and air are mixed half and half is still inside the four-equation closure is the next cut.
Related
Share if you found it helpful.