Skip to content
cfd-lab:~/ja/posts/riemann-solvers● online

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

NOTE #002DAY THU 유체역학DATE 2026.03.05UPDATED 2026.10.19READ 4 min read#Riemann-Solver#Godunov#Numerical-Methods

Riemann 問題から Godunov 法まで - 数値フラックスの核心

接触不連続を捨てるなら HLL で足ります。残すなら HLLC の中間波速 S* が必要です。

Riemann 問題:CFD の心臓#

有限体積法 (Finite Volume Method) では、セル境界の 数値フラックス (numerical flux) の置き方が解の正確さと安定性を分けます。鍵は Riemann 問題 です。左右が定数で、不連続は一つです。

圧力比のスライダーを 1 付近から 1000:1 へ動かすと、左右の波が膨張から衝撃へ切り替わります。

x–t 다이어그램에서 좌·우로 가는 파(shock 또는 rarefaction)와 가운데 접촉 불연속이 보인다. p_L > p_R이 충분히 크면 양쪽 모두 shock이 된다.

中央の接触面は圧力比を上げても残ります。左右の波が同時に衝撃になるのは、スター圧力 p∗p^* が左右の圧力よりどちらも大きくなったときです。

Riemann 問題とは?#

初期条件が一つの不連続面を境に、左右で異なる定数値を持つ初期値問題のことです。

U(x,0)={ULif x<0URif x>0\mathbf{U}(x, 0) = \begin{cases} \mathbf{U}_L & \text{if } x < 0 \\ \mathbf{U}_R & \text{if } x > 0 \end{cases}

1次元 Euler 方程式に対し、この問題の解析解は三つの波 (wave) で構成されます。

  1. 左向きの波 (rarefaction または shock)
  2. 接触不連続 (contact discontinuity)
  3. 右向きの波 (rarefaction または shock)

Godunov のアイデア (1959)#

Godunov の核心となる洞察は、シンプルながらも強力なものでした。

セル境界におけるフラックスを求めるには、隣接する二つのセルの平均値を左右の状態量として、Riemann 問題を解けばよい。

有限体積法の更新公式は以下の通りです。

Uin+1=Uin−ΔtΔx(F^i+1/2−F^i−1/2)\mathbf{U}_i^{n+1} = \mathbf{U}_i^n - \frac{\Delta t}{\Delta x}\left(\hat{\mathbf{F}}_{i+1/2} - \hat{\mathbf{F}}_{i-1/2}\right)

ここで F^i+1/2\hat{\mathbf{F}}_{i+1/2} こそが、Riemann 問題の解から決定される数値フラックスです。

Exact Riemann Solver#

厳密な Riemann 解法 (Exact Riemann Solver) では、Newton-Raphson 反復法を用いてスター領域 (star region) の圧力 p∗p^* を求めます。左右の波の種類 (shock/rarefaction) に応じて、Rankine-Hugoniot 関係式または等エントロピー関係式を適用します。

衝撃波 (Shock wave) の関係式 (p∗>pKp^* > p_K, K=LK = L or RR):

fK(p∗)=(p∗−pK)[AKp∗+BK]1/2f_K(p^*) = (p^* - p_K)\left[\frac{A_K}{p^* + B_K}\right]^{1/2}

ここで AK=2(γ+1)ρKA_K = \frac{2}{(\gamma+1)\rho_K}、 BK=γ−1γ+1pKB_K = \frac{\gamma-1}{\gamma+1}p_K です。

膨張波 (Rarefaction wave) の関係式 (p∗≤pKp^* \leq p_K):

fK(p∗)=2cKγ−1[(p∗pK)γ−12γ−1]f_K(p^*) = \frac{2c_K}{\gamma - 1}\left[\left(\frac{p^*}{p_K}\right)^{\frac{\gamma-1}{2\gamma}} - 1\right]

p∗p^* は以下の条件を満足します。

fL(p∗)+fR(p∗)+(uR−uL)=0f_L(p^*) + f_R(p^*) + (u_R - u_L) = 0

分かれ目は p∗p^* と pKp_K の大小だけです。p∗p^* が pKp_K より大きいとその側は衝撃です。fKf_K は圧力差に [AK/(p∗+BK)]1/2[A_K/(p^*+B_K)]^{1/2} を掛けた値です。AK=2/((γ+1)ρK)A_K=2/((\gamma+1)\rho_K) なので、密度が大きいと同じ圧力ジャンプでも速度の変化は小さくなります。BK=(γ−1)pK/(γ+1)B_K=(\gamma-1)p_K/(\gamma+1) は分母を p∗p^* より少し大きくします。p∗p^* が pKp_K 以下なら膨張です。前の係数 2cK/(γ−1)2c_K/(\gamma-1) は、音速が大きいほど、そして γ\gamma が 1 に近いほど大きくなります。圧力比の指数は (γ−1)/(2γ)(\gamma-1)/(2\gamma) です。γ\gamma が下がると指数も下がり、圧力比は fKf_K に効きにくくなります。

二つの ff の和に uR−uLu_R-u_L を足して 0 になる必要があります。uRu_R が uLu_L より小さいと流体は中央へ集まります。和 fL+fRf_L+f_R は正で、p∗p^* は左右の圧力より上へ押されます。そのとき左右の波は両方とも衝撃です。画面の 1000:1 はその端です。低い側の pKp_K はスター圧力より小さくなり、その fKf_K は衝撃の枝に残ります。高い側は圧力比次第で膨張のままもあり得ます。両側が衝撃になるには、中央へ寄る速度差が十分大きくなければなりません。セル一つをそのまま衝撃管にする計算は、Godunov がセルの中で解く衝撃管にあります。

Approximate Riemann Solver:なぜ必要なのか?#

厳密解法は反復計算が必要なため、計算コストが高くなります。実際の CFD コードでは、その多くが 近似 Riemann 解法 (Approximate Riemann Solver) を使用しています。

Roe Solver (1981)#

Roe は非線形な Riemann 問題を 線形化 (linearization) し、行列 A^\hat{\mathbf{A}} に対する線形 Riemann 問題へと変換します。

F^i+1/2=12(FL+FR)−12∑k=13∣λ^k∣α^kr^k\hat{\mathbf{F}}_{i+1/2} = \frac{1}{2}(\mathbf{F}_L + \mathbf{F}_R) - \frac{1}{2}\sum_{k=1}^{3}|\hat{\lambda}_k|\hat{\alpha}_k\hat{\mathbf{r}}_k

Roe 平均 (Roe average) を用いて A^\hat{\mathbf{A}} を構成します。

u^=ρL uL+ρR uRρL+ρR,H^=ρL HL+ρR HRρL+ρR\hat{u} = \frac{\sqrt{\rho_L}\,u_L + \sqrt{\rho_R}\,u_R}{\sqrt{\rho_L} + \sqrt{\rho_R}}, \quad \hat{H} = \frac{\sqrt{\rho_L}\,H_L + \sqrt{\rho_R}\,H_R}{\sqrt{\rho_L} + \sqrt{\rho_R}}

長所: 接触不連続を正確に捕捉。 短所: エントロピー条件に違反する可能性(エントロピー修正が必要)。

HLLC Solver (Toro, 1994)#

HLL 解法を改良し、 接触不連続 (Contact) を復元 したものが HLLC です。三つの波の速度 (wave speed) SL,S∗,SRS_L, S^*, S_R を推定します。

F^i+1/2={FLif SL>0FL∗if SL≤0<S∗FR∗if S∗≤0≤SRFRif SR<0\hat{\mathbf{F}}_{i+1/2} = \begin{cases} \mathbf{F}_L & \text{if } S_L > 0 \\ \mathbf{F}^*_L & \text{if } S_L \leq 0 < S^* \\ \mathbf{F}^*_R & \text{if } S^* \leq 0 \leq S_R \\ \mathbf{F}_R & \text{if } S_R < 0 \end{cases}

スター領域のフラックスは以下の通りです。

FK∗=FK+SK(UK∗−UK)\mathbf{F}^*_K = \mathbf{F}_K + S_K(\mathbf{U}^*_K - \mathbf{U}_K)

HLLC は実装がシンプルでありながら頑健 (robust) であるため、 圧縮性多相流コードで最も広く利用されています 。

AUSM+ (Liou, 1996)#

AUSM 系は、フラックスを対流項 (convective) と圧力項 (pressure) に分離します。

F^i+1/2=m˙1/2Ψ1/2+p^1/2D\hat{\mathbf{F}}_{i+1/2} = \dot{m}_{1/2}\boldsymbol{\Psi}_{1/2} + \hat{p}_{1/2}\mathbf{D}

ここで m˙1/2\dot{m}_{1/2} はセル境界の質量流量、 Ψ\boldsymbol{\Psi} は対流される物理量です。低マッハ数流でも安定しているため、全速度域スキーム (all-speed scheme) への拡張が容易です。

多相流への拡張

多相流では界面の両側で状態方程式 (EOS) が異なるため、Riemann 解法を マルチマテリアル (multi-material) 版へと一般化する必要があります。

代表的なアプローチには以下があります。

  • Ghost Fluid Method: 界面付近で反対側の流体のゴーストセルを構成し、各相において独立したシングルマテリアルの Riemann 問題を解きます。
  • HLLC for multi-material: スター領域において両側の EOS をそれぞれ適用し、 p∗,u∗p^*, u^* を決定します。

次の記事では、 界面捕捉法 (VOF, Level Set, Diffuse Interface) を比較します。

多相になって移流と圧力を切り離す分離は、Baer–Nunziato 流束の TV 分離へ続きます。

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