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

この記事は著者が韓国語で書いた原文の翻訳です。 原文(한국어)を読む

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

[論文レビュー] Poissonを使わずに二相流を解く — 一般圧力方程式とMSTACSの完全陽的結合

E_Gの比は約1.25×10^4です。密度比1000:1のダム崩壊では前面誤差が5%以内に収まります。

LBM、ACM、EDAC、GPE — Poisson方程式を解かずに非圧縮流れを模擬する四つの分岐路があります。Bodhanwalla・Raghunathan・Sudhakar(2025)はその最後を選び、二相流まで持ち込みました。さらにMSTACSというより鋭いalgebraic VOFをoperator-splitと組み合わせ、線形ソルバ呼び出しゼロの完全陽的ソルバを作っています。密度比1000:1でも回る秘密は、圧力方程式を双曲型に保ち、人工音速を埋め込んだ点にあります。

人工音速 csc_s か圧力拡散 ν\nu を上げると、中央ガウシアンが左右に割れる速さと峰の高さが一緒に変わります。

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

csc_s を 5 から 20 にすると波は 4 倍速く領域を横切り、許容 Δt\Delta t は 4 分の 1 です。ν=0.05\nu=0.05 では峰が削れ、ν=0\nu=0 では周期境界を回ってパルスが残ります。

論文情報

  • 著者: H. Bodhanwalla, D. Raghunathan, Y. Sudhakar
  • 所属: IIT Goa, School of Mechanical Sciences
  • 誌: Computers & Fluids (2025)
  • 題: A general pressure equation based method for incompressible two-phase flows
  • キーワード: general pressure equation, VOF, MSTACS, operator-split, weakly compressible

「Poissonを捨てる」四つの方法の比較行列#

手法圧力方程式の性質二相適用メモリ並列効率
LBM速度分布関数の総和大密度比で不安定大(Q19/Q27)優秀
ACM人工双曲型(∂tp+β∇⋅u=0\partial_t p + \beta \nabla \cdot \mathbf{u} = 0)dual-time必須中中
EDAC音響減衰を伴う放物型界面でswitch parameter必要中優秀
GPE熱力学から導出した双曲+拡散本論文が初の直接適用中優秀

他の三つが似た出発点から分岐したのに対し、GPEは**状態方程式の仮定γ=Pr\gamma = \mathrm{Pr}**から導かれる点が異なります。人工的に付け加えた変数ではなく、低Mach極限が自ら手渡してくれる式です。

GPE — 圧力に音速を貸し与える式#

運動量方程式は通常のNavier–Stokesそのまま。変わるのは圧力方程式です。

ρ(∂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)

csc_sは人工音速、ρ\rhoは混合密度(ρ=Cρ1+(1−C)ρ2\rho = C\rho_1 + (1-C)\rho_2、CCは体積分率)、μ\muは混合粘性です。右辺の圧力拡散項はEDACのように後付けで足したものではなく、GPEの導出過程で自然に落ちてくる項です。

無次元化すると、人工圧縮性は人工Mach数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)

Ma\mathrm{Ma}を小さくすると圧力が速く伝わり非圧縮極限に近づきますが、安定性のため時間刻みはΔt≤Δx/cs\Delta t \le \Delta x / c_sに縮みます。音速を借りる対価です。

論文Table 5によるとΔtGPE≈Ma ΔtINS\Delta t_{\mathrm{GPE}} \approx \mathrm{Ma}\,\Delta t_{\mathrm{INS}}。直列実行ではINSのPoissonソルバに劣りますが、大域線形解がない分、HPCスケーラビリティで逆転すると著者は主張しています。

MSTACS — donor–acceptorにcos⁴θブレンドを挟む#

体積分率の輸送は∂tC+∇⋅(uC)=C(∇⋅u)\partial_t C + \nabla \cdot (\mathbf{u} C) = C(\nabla \cdot \mathbf{u})。右辺の圧縮性補正C(∇⋅u)C(\nabla \cdot \mathbf{u})に注目してください。弱圧縮枠組みがVOFと静かにつながっている形です。

問題は面値CfaceC_{\text{face}}の計算法。donor–acceptor形式では

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

β\betaは正規化donor値C~D=(CD−CU)/(CA−CU)\widetilde{C}_D = (C_D - C_U)/(C_A - C_U)から決まります。MSTACSは正規化面値を二つのスキームのブレンドにします。

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): 界面を1セル内に圧縮しますが、面に平行でないとしわが入ります。
  • HR (high resolution): 平滑で安全ですが、界面が膨らみます。
  • ブレンドγ=cos⁡4θ\gamma = \cos^4\theta: θ\thetaは界面法線n^\hat{\mathbf{n}}とdonor–acceptor方向d^\hat{\mathbf{d}}の角度。界面が面に垂直ならθ=0\theta=0、γ=1\gamma=1 → CDS。界面が面に平行ならθ=π/2\theta=\pi/2、γ=0\gamma=0 → HR。

自然発生したゲートです。平らな面ではsharpなCDSを使い、斜めの面では安全なHRに滑らかに移行します。毛細時間を外したあとに界面移流へ残る CFL は VOF 移流の上限 の問題です。

演算子分離 + SSP-RK3#

論文のフローチャートを五行に整理:

  1. C(n+1)C^{(n+1)} = OS-MSTACS(C(n),u(n)C^{(n)}, \mathbf{u}^{(n)}). x→y→zx \to y \to z順次sweep、各stepでsweep順序を交替。
  2. ρ(n+1),μ(n+1)\rho^{(n+1)}, \mu^{(n+1)}は混合則から更新。
  3. κ(n+1)\kappa^{(n+1)}をheight functionで曲率計算。
  4. SSP-RK3の三段階で運動量 → GPE順にu(n+1),p(n+1)\mathbf{u}^{(n+1)}, p^{(n+1)}を計算。

SSP-RK3は

Ψ(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)})

全体のアルゴリズム中に線形ソルバの呼び出しはありません。 そのためGPUに直接移植でき、MPI通信はstencil haloだけで済みます。

直接実装 — 1D音響パルス#

GPEの動作原理を最小コードで確認しましょう。粘性を切ると1D線形音響系になります。

import numpy as np
 
def gpe_step_1d(p, u, cs, nu, dx, dt):
    """1D線形音響 + GPE圧力拡散、周期境界。
    p: 圧力擾乱, u: 速度, cs: 人工音速, nu: GPE拡散係数
    """
    # 周期パディング
    pL = np.roll(p, 1); pR = np.roll(p, -1)
    uL = np.roll(u, 1); uR = np.roll(u, -1)
    # Rusanovフラックス(線形系、固有値±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拡散項(中心差分)
    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                # 音響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、拡散なし
x2, p2, u2 = run_demo(cs=15.0, nu=0.0)     # cs=15 → 音波3倍速、dt 1/3に縮小

csc_sを5から15に上げると音波は3倍速く伝播し、安定のためのΔt\Delta tは1/3に縮みます。同じ物理時間に到達するには3倍のステップが必要。GPEの根本的な取引です。

インタラクティブ — csc_sがどう時間刻みを食うか#

下の数字は、上の画面で動かした csc_s と ν\nu の結果です。

観察ポイント:

  • csc_sを5 → 20に上げると音波が4倍速く領域を駆け抜けます。許容Δt\Delta tは4倍縮みます。
  • ν\nuを0.05まで上げると音波の峰が急速に削られます。EDACの人工圧力減衰項とまったく同じ役割です。
  • ν=0\nu = 0だとパルスが周期境界を回り永遠に生き残ります。非圧縮極限に近く理想的に見えますが、乱れた流れでは音波が消えないとspurious oscillationの種になります。

インタラクティブ — MSTACSのブレンドを解いてみる#

CDS、HR、MSTACSの三つの面補間スキームが同じtop-hatをどう違うように運ぶか、直接比べてみましょう。

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

観察ポイント:

  • CDS only: 角を刃のように保ちますが、Courant > 1/3でわずかに跳ねます。
  • HR only: 安定ですがstepが徐々に丸まります。粘性のような擬似拡散です。
  • MSTACS with θ=0°\theta = 0°: γ=1\gamma = 1 → CDSと同一。
  • MSTACS with θ=90°\theta = 90°: γ=0\gamma = 0 → HRと同一。
  • 実際の2D/3Dでは面ごとにθ\thetaが異なるため、平らな部分だけsharpに、斜面は安全なHRに自動的に切り替わります。

検証結果のまとめ — 2D RT、ダム崩壊、気泡上昇、3D RT#

ケースρ1/ρ2\rho_1/\rho_2比較対象定量結果
2D Rayleigh–Taylor3:1He & Doolen (1999)spike・bubble位置1%以内
ダム崩壊1000:1Martin & Moyce (1952) 実験前面到達5%以内
単一気泡上昇1000:1, Eo=10Eo=10Hysingベンチマーク (2009)終端速度3%以内
3D Rayleigh–Taylor3:1Tryggvason (1988)spike形状定性一致

OS-MSTACS自体の体積分率保存誤差はEG=6.57×10−8E_G = 6.57 \times 10^{-8}で、OS-CICSAMのEG=8.18×10−4E_G = 8.18 \times 10^{-4}より4桁改善されています。conservative redistribution stepが質量を機械精度で回復させた結果です。

二つの誤差を割ると 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} です。4桁という言葉と一致します。ダム崩壊は密度比 1000:1 で前面 5% 以内です。気泡は同じ 1000:1、Eo=10Eo=10、終端速度 3% 以内です。2D Rayleigh–Taylor は 3:1 で spike と bubble が 1% 以内です。3D は同じ 3:1 で定性比較だけが残ります。

csc_s を 5 から 15 に上げると波は 3 倍速く、Δt\Delta t は 1/3 です。デモの物理時間は T=0.2T=0.2、格子は N=160N=160 です。同じ TT ならステップは 3 倍です。5 から 20 は 4 倍です。ΔtGPE≈Ma ΔtINS\Delta t_{\mathrm{GPE}} \approx \mathrm{Ma}\,\Delta t_{\mathrm{INS}} なので 1 コアのステップ数は 1/Ma1/\mathrm{Ma} で増えます。本文は Couacs≤1.25\mathrm{Couacs} \le 1.25 までを安全と書くだけです。γ=cos⁡4θ\gamma = \cos^4\theta は θ=0\theta=0 で 1、θ=π/2\theta=\pi/2 で 0 です。CDS は Courant が 1/3 を超えると角が跳ねます。

批判ポイント — 論文が隠したコスト

GPEそのものが持ち込む負担は明確にあります。

  1. 音速制約の時間刻み: Δt≤Δx/cs\Delta t \le \Delta x / c_s。csc_sを小さくすると人工圧縮性が物理に漏れ、大きくすると壁時間が1/Ma1/\mathrm{Ma}倍に伸びます。本文はCouacs≤1.25\mathrm{Couacs} \le 1.25までは安全と述べるだけ。
  2. GPE拡散項の物理的正当化: 1ρ∇⋅(μ∇p)\frac{1}{\rho}\nabla \cdot (\mu \nabla p)は単相では熱力学的導出がきれいですが、二相でρ\rhoが界面を越えて1000倍ジャンプするときこの拡散係数が何を意味するか曖昧です。
  3. 表面張力のwell-balanced性未保証: CSF + height function曲率は標準組み合わせですが、spurious currentがcsc_sとどうスケールするか定量解析がありません。静的droplet試験で定性確認のみ。
  4. 直列コストとHPC約束のギャップ: ΔtGPE≈Ma ΔtINS\Delta t_{\mathrm{GPE}} \approx \mathrm{Ma}\,\Delta t_{\mathrm{INS}}なので1コアでは常に損。HPC比較はfuture workに先送り。

OpenFOAMのinterFoamはPIMPLE + MULES組み合わせで検証蓄積が十分。本論文の最大の魅力はGPU + iteration-free領域ですが、GPU実装は公開されていません。

再現可能性スコア

  • アルゴリズム擬似コード(Section 3.3): ★★★★★ — 八段階で隙間なく。
  • MSTACS式(13)–(15): ★★★★☆ — Cou_adv分岐にtypo疑いあり(式(13)が二度登場)。結局Anghan et al. 2018原典を参照する必要。
  • コード公開: ★★☆☆☆ — なし。1Dは200行、3D OS-MSTACSは1500行程度と推定。
  • ベンチマークデータ: ★★★★☆ — 4ケース全てで定量比較、格子収束表付き。

日曜の午後、OpenFOAMなしで軽量な二相ソルバを一から書きたいなら、本論文は意外に親切な出発点です。Poissonソルバのコードを書かない代わりに、音速と体積分率redistributionアルゴリズムと仲良くなることになります。体積分率式から圧縮性係数を外すと界面誤差が格子だけでは減らない話は、圧縮性係数 K が受けます。

次に読むべき論文

  • Toutant (2017) — GPEの原典単相導出。
  • Saincher & Sriram (2022) — operator-splitアルゴリズム原典。
  • Kajzer & Pozorski (2021) — EDACベースの二相変種、比較対象。
  • Yang & Aoki (2021) — VOF用のprojection-based pressure evolution。

役に立ったらシェアしてください。