Skip to content
cfd-lab:~/en/posts/2026-05-31-gpe-mstacs-it…● online

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

NOTE #058DAY SUN 논문리뷰DATE 2026.05.31UPDATED 2026.10.19READ 8 min read#Paper-Review#Weakly-Compressible#GPE#VOF#MSTACS#Multiphase

[Paper Review] Two-Phase Flow Without a Poisson Solver — Coupling the General Pressure Equation with MSTACS

The E_G ratio is about 1.25e4. On the 1000:1 broken dam the front stays inside 5%.

LBM, ACM, EDAC, GPE — four branching routes that simulate incompressible flow without ever solving a pressure Poisson equation. Bodhanwalla, Raghunathan, and Sudhakar (2025) picked the last one and pushed it into the two-phase regime. They also paired it with a sharper algebraic VOF named MSTACS inside an operator-split framework, producing a fully explicit solver that calls zero linear-algebra routines. It survives 1000:1 density ratios, and the trick is keeping the pressure equation hyperbolic by injecting an artificial sound speed.

Raise csc_s or pressure diffusion ν\nu and both the split speed of the central Gaussian and the crest height change.

Acoustic Δt = 0.4·Δx/cs ≈ 0.00050 | sim t = 0.000

From cs=5c_s=5 to 20 the waves cross four times faster and the allowed Δt\Delta t drops by four. At ν=0.05\nu=0.05 the crests shave off. At ν=0\nu=0 the pulse keeps looping the periodic box.

Paper details#

  • Authors: H. Bodhanwalla, D. Raghunathan, Y. Sudhakar
  • Affiliation: IIT Goa, School of Mechanical Sciences
  • Journal: Computers & Fluids (2025)
  • Title: A general pressure equation based method for incompressible two-phase flows
  • Keywords: general pressure equation, VOF, MSTACS, operator-split, weakly compressible

A comparison matrix of "skip-the-Poisson" methods#

MethodPressure-equation natureTwo-phase statusMemoryParallel efficiency
LBMSum of kinetic distributionsUnstable at large density ratiosHeavy (Q19/Q27)Excellent
ACMArtificial hyperbolic (∂tp+β∇⋅u=0\partial_t p + \beta \nabla \cdot \mathbf{u} = 0)Needs dual time-steppingModerateModerate
EDACParabolic with acoustic dampingInterface switch parameter requiredModerateExcellent
GPEThermodynamically derived hyperbolic + diffusionFirst direct application hereModerateExcellent

The three older approaches drift from similar starting points; GPE stands out because it comes from a thermodynamic assumption (γ=Pr\gamma = \mathrm{Pr}) rather than an artificial coupling. The equation is what the low-Mach limit hands you, not what you bolt on.

GPE — lending the pressure equation a sound speed#

The momentum equation is the usual incompressible Navier–Stokes. What changes is the pressure equation.

ρ(∂u∂t+u⋅∇u)=−∇p+∇⋅[μ(∇u+∇u⊤)]+F\rho \left(\frac{\partial \mathbf{u}}{\partial t} + \mathbf{u} \cdot \nabla \mathbf{u}\right) = -\nabla p + \nabla \cdot \left[\mu(\nabla\mathbf{u} + \nabla\mathbf{u}^\top)\right] + \mathbf{F} ∂p∂t+ρcs2(∇⋅u)=1ρ∇⋅(μ∇p)\frac{\partial p}{\partial t} + \rho c_s^2 (\nabla \cdot \mathbf{u}) = \frac{1}{\rho}\nabla \cdot (\mu \nabla p)

Here csc_s is the artificial sound speed, ρ\rho is the mixture density (ρ=Cρ1+(1−C)ρ2\rho = C\rho_1 + (1-C)\rho_2 with volume fraction CC), and μ\mu is the mixture viscosity. The pressure-diffusion term on the right is not bolted in — it falls out of the GPE derivation naturally, unlike EDAC's hand-added damping.

In non-dimensional form, the artificial compressibility is measured by the Mach number Ma=U/cs\mathrm{Ma} = U/c_s.

∂p∂t+ρ∗Ma2(∇⋅u)=1ρ∗Re∇⋅(μ∗∇p)\frac{\partial p}{\partial t} + \frac{\rho^*}{\mathrm{Ma}^2}(\nabla \cdot \mathbf{u}) = \frac{1}{\rho^*\mathrm{Re}}\nabla \cdot (\mu^* \nabla p)

A smaller Ma\mathrm{Ma} means pressure propagates faster — closer to the incompressible limit — but stability shrinks the step to Δt≤Δx/cs\Delta t \le \Delta x / c_s. That is the price of borrowing a sound speed.

Table 5 of the paper shows ΔtGPE≈Ma ΔtINS\Delta t_{\mathrm{GPE}} \approx \mathrm{Ma}\,\Delta t_{\mathrm{INS}}. On a single core the GPE solver loses to a Poisson-based solver, but with no global linear solve the HPC scalability is supposed to flip the verdict, as the authors argue.

MSTACS — wrapping a cos⁴θ blend around donor–acceptor#

The volume-fraction transport becomes ∂tC+∇⋅(uC)=C(∇⋅u)\partial_t C + \nabla \cdot (\mathbf{u} C) = C(\nabla \cdot \mathbf{u}). Notice the compressibility correction C(∇⋅u)C(\nabla \cdot \mathbf{u}) on the right — a quiet handoff between the weakly compressible framework and the VOF.

The interesting question is how to compute the face value CfaceC_{\text{face}}. In donor–acceptor form,

Cface=(1−β)CD+βCAC_{\text{face}} = (1 - \beta) C_D + \beta C_A

with β\beta derived from the normalised donor value C~D=(CD−CU)/(CA−CU)\widetilde{C}_D = (C_D - C_U)/(C_A - C_U). MSTACS sets the normalised face value to a blend of two schemes.

C~face=γ C~faceCDS+(1−γ) C~faceHR\widetilde{C}_{\text{face}} = \gamma \, \widetilde{C}_{\text{face}}^{\mathrm{CDS}} + (1 - \gamma) \, \widetilde{C}_{\text{face}}^{\mathrm{HR}}
  • CDS (compressive): packs the interface into one cell, but wrinkles on non-aligned faces.
  • HR (high resolution): safe and smooth, but it puffs the interface up.
  • Blend γ=cos⁡4θ\gamma = \cos^4\theta: θ\theta is the angle between the interface normal n^\hat{\mathbf{n}} and the donor–acceptor direction d^\hat{\mathbf{d}}. Interface normal to the face → θ=0\theta=0, γ=1\gamma=1 → pure CDS. Interface parallel to the face → θ=π/2\theta=\pi/2, γ=0\gamma=0 → pure HR.

It is a self-tuning gate: the algorithm uses sharp CDS only where the geometry is safe, and slides into the cushioned HR elsewhere. The CFL left on interface advection is the question in the VOF advection limit.

Operator-split + SSP-RK3#

The paper's full algorithm in five lines:

  1. C(n+1)C^{(n+1)} = OS-MSTACS(C(n),u(n)C^{(n)}, \mathbf{u}^{(n)}). Sweep x→y→zx \to y \to z, then permute the order each step.
  2. ρ(n+1),μ(n+1)\rho^{(n+1)}, \mu^{(n+1)} from the mixture rule.
  3. κ(n+1)\kappa^{(n+1)} from the height-function curvature.
  4. Three SSP-RK3 stages of momentum → GPE, in that order.

SSP-RK3 is

Ψ(1)=Ψ(n)+ΔtL(Ψ(n))\Psi^{(1)} = \Psi^{(n)} + \Delta t L(\Psi^{(n)}) Ψ(2)=34Ψ(n)+14Ψ(1)+14ΔtL(Ψ(1))\Psi^{(2)} = \tfrac{3}{4}\Psi^{(n)} + \tfrac{1}{4}\Psi^{(1)} + \tfrac{1}{4}\Delta t L(\Psi^{(1)}) Ψ(n+1)=13Ψ(n)+23Ψ(2)+23ΔtL(Ψ(2))\Psi^{(n+1)} = \tfrac{1}{3}\Psi^{(n)} + \tfrac{2}{3}\Psi^{(2)} + \tfrac{2}{3}\Delta t L(\Psi^{(2)})

No linear solver is called anywhere. That makes the algorithm easy to port to a GPU, and MPI only needs to exchange stencil halos.

Direct reproduction — a 1D acoustic pulse#

The smallest possible code that demonstrates GPE behaviour is a 1D linear acoustic system. Drop the viscosity term and you keep the essence.

import numpy as np
 
def gpe_step_1d(p, u, cs, nu, dx, dt):
    """1D linear acoustics + GPE pressure diffusion, periodic BC.
    p: pressure fluctuation, u: velocity, cs: artificial sound speed, nu: GPE diffusion
    """
    # periodic padding
    pL = np.roll(p, 1); pR = np.roll(p, -1)
    uL = np.roll(u, 1); uR = np.roll(u, -1)
    # Rusanov flux for the linear system (eigenvalues = ±cs)
    fp = 0.5*cs*cs*(uL + u) - 0.5*cs*(p - pL)
    fu = 0.5*(pL + p) - 0.5*cs*(u - uL)
    fp_r = 0.5*cs*cs*(u + uR) - 0.5*cs*(pR - p)
    fu_r = 0.5*(p + pR) - 0.5*cs*(uR - u)
    # GPE diffusion term (central difference)
    diff = nu * (pL - 2*p + pR) / (dx*dx)
    p_new = p - dt/dx*(fp_r - fp) + dt*diff
    u_new = u - dt/dx*(fu_r - fu)
    return p_new, u_new
 
def run_demo(cs=5.0, nu=0.0, T=0.2, N=160):
    dx = 1.0/N
    dt = 0.4*dx/cs                # acoustic CFL
    x = (np.arange(N) + 0.5)*dx
    p = 0.4*np.exp(-((x - 0.5)/0.05)**2)
    u = np.zeros_like(x)
    steps = int(T/dt)
    for _ in range(steps):
        p, u = gpe_step_1d(p, u, cs, nu, dx, dt)
    return x, p, u
 
x, p, u = run_demo()                       # cs=5, no diffusion
x2, p2, u2 = run_demo(cs=15.0, nu=0.0)     # cs=15 → wave 3× faster, dt 1/3× smaller

Pushing csc_s from 5 to 15 makes the wave move three times faster, and the allowed Δt\Delta t shrinks by the same factor. Reaching the same physical time takes three times more steps. That is the GPE bargain in one line.

Interactive — how csc_s eats the time step#

The numbers below are what the sliders above already showed.

What to watch:

  • Push csc_s from 5 to 20: the waves sweep the domain four times faster, and the permissible Δt\Delta t shrinks by the same factor.
  • Push ν\nu to 0.05: the wave crests are shaved off rapidly — exactly the role EDAC's artificial pressure damping plays.
  • At ν=0\nu = 0 the pulse loops the periodic domain forever. Closer to the incompressible limit on paper, but in a rough flow unattenuated acoustics seed spurious oscillations.

Interactive — unpacking the MSTACS blend#

Now compare how CDS, HR, and MSTACS handle the same top-hat profile.

Top-hat advected by U=0.5 with periodic BC. CDS = compressive (sharp but can wrinkle), HR = high-resolution (smoother), MSTACS = γ·CDS + (1−γ)·HR.

What to watch:

  • CDS only: razor-sharp edges, but jitter appears once the Courant number exceeds 1/3.
  • HR only: stable, but the step smears over time. A pseudo-viscosity.
  • MSTACS with θ=0°\theta = 0°: γ=1\gamma = 1 → identical to CDS.
  • MSTACS with θ=90°\theta = 90°: γ=0\gamma = 0 → identical to HR.
  • In real 2D/3D every face sees a different θ\theta, so flat patches stay sharp while inclined ones fall safely to HR.

Validation summary — 2D RT, broken dam, bubble rise, 3D RT#

Caseρ1/ρ2\rho_1/\rho_2ReferenceQuantitative result
2D Rayleigh–Taylor3:1He & Doolen (1999)spike/bubble position within 1%
Broken dam1000:1Martin & Moyce (1952) experimentfront-arrival within 5%
Single bubble rise1000:1, Eo=10Eo=10Hysing benchmark (2009)terminal velocity within 3%
3D Rayleigh–Taylor3:1Tryggvason (1988)spike topology qualitatively matched

OS-MSTACS itself shows a volume-fraction error of EG=6.57×10−8E_G = 6.57 \times 10^{-8} on the shear test, against OS-CICSAM's EG=8.18×10−4E_G = 8.18 \times 10^{-4}. Four orders of magnitude better, thanks to the conservative redistribution step that recovers mass to machine precision.

Divide the two errors: 8.18×10−4/6.57×10−8≈1.25×1048.18\times 10^{-4}/6.57\times 10^{-8} \approx 1.25\times 10^{4}. That is the four orders. The broken dam is density ratio 1000:1, front within 5%. The bubble is the same 1000:1, Eo=10Eo=10, terminal speed within 3%. 2D Rayleigh–Taylor is 3:1, spike and bubble within 1%. 3D is the same 3:1 and only a shape check.

Raising csc_s from 5 to 15 makes the wave three times faster and Δt\Delta t one third. The demo uses T=0.2T=0.2 and N=160N=160. The same TT costs three times the steps. From 5 to 20 is four times. ΔtGPE≈Ma ΔtINS\Delta t_{\mathrm{GPE}} \approx \mathrm{Ma}\,\Delta t_{\mathrm{INS}}, so one-core steps grow as 1/Ma1/\mathrm{Ma}. The text only calls Couacs≤1.25\mathrm{Couacs} \le 1.25 safe. γ=cos⁡4θ\gamma = \cos^4\theta is 1 at θ=0\theta=0 and 0 at θ=π/2\theta=\pi/2. CDS jitters once Courant passes 1/3.

Critical points — costs the paper glosses over#

GPE itself is not free.

  1. Time-step constraint from csc_s: Δt≤Δx/cs\Delta t \le \Delta x / c_s. Too small a csc_s leaks artificial compressibility into the physics; too large a csc_s blows up the wall-clock cost as 1/Ma1/\mathrm{Ma}. The paper only states that Couacs≤1.25\mathrm{Couacs} \le 1.25 is safe in practice.
  2. Physical meaning of the GPE diffusion term: 1ρ∇⋅(μ∇p)\frac{1}{\rho}\nabla \cdot (\mu \nabla p) has a clean single-phase derivation, but the meaning of that diffusion coefficient when ρ\rho jumps 1000× across the interface is left vague.
  3. No well-balanced surface tension proof: CSF + height-function curvature is a standard combination, but the paper offers no quantitative analysis of how spurious currents scale with csc_s.
  4. Serial cost vs HPC promise: ΔtGPE≈Ma ΔtINS\Delta t_{\mathrm{GPE}} \approx \mathrm{Ma}\,\Delta t_{\mathrm{INS}} means a single core always loses. The HPC comparison is explicitly deferred.

OpenFOAM's interFoam (PIMPLE + MULES) has years of validation behind it. The selling point of this paper is the GPU-friendly, iteration-free territory where interFoam cannot easily go — but the GPU port is not released.

Reproducibility score#

  • Algorithm pseudo-code (Section 3.3): ★★★★★ — eight tight steps.
  • MSTACS formulas (13)–(15): ★★★★☆ — possible typo (eqn. (13) printed twice). Better to consult Anghan et al. (2018) for the original derivation.
  • Code release: ★★☆☆☆ — none. Estimate roughly 200 lines for 1D, 1500 lines for the 3D OS-MSTACS.
  • Benchmark data: ★★★★☆ — quantitative comparisons for all four cases with grid-convergence tables.

A Sunday afternoon and a desire to write a small two-phase solver from scratch? This paper is a friendlier starting point than you might expect. The price of skipping a Poisson solver is getting cosy with sound speeds and volume-fraction redistribution algorithms. Dropping the compressibility factor, and the interface error that refinement does not kill, continues in compressibility factor K.

  • Toutant (2017) — the original single-phase GPE derivation.
  • Saincher & Sriram (2022) — the operator-split algorithm.
  • Kajzer & Pozorski (2021) — the EDAC-based two-phase variant, the natural competitor.
  • Yang & Aoki (2021) — projection-based pressure evolution for VOF.

Share if you found it helpful.