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

本文译自作者的韩语原文。 阅读原文(한국어)

NOTE #002DAY THU 유체역학DATE 2026.03.05UPDATED 2026.10.19READ 3 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 问题?#

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}

对于一维 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 求解器使用 Newton-Raphson 迭代法求解中间区域 (star region) 的压力 p∗p^*。根据波的类型(冲击波/稀疏波)应用 Rankine-Hugoniot 关系式或等熵关系式。

冲击波 (Shock wave) 关系式 (p∗>pKp^* > p_K, K=LK = L 或 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}}

优点:能精确捕捉接触不连续。缺点:可能违反熵条件(需要熵修正 entropy fix)。

HLLC Solver (Toro, 1994)#

HLLC 是对 HLL 求解器的改进,它恢复了接触不连续 (Contact)。它估计三个波速 (wave speed) SLS_L, S∗S^* 和 SRS_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 实现简单且鲁棒,因此在压缩性多相流代码中应用最为广泛。

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:在界面附近构建另一侧流体的虚网格 (ghost cell),并在每相中独立求解单材料 Riemann 问题。
  • HLLC for multi-material:在中间区域分别应用两侧的 EOS 来确定 p∗p^* 和 u∗u^*。

下一篇再对比界面捕捉技术 (VOF, Level Set, Diffuse Interface)。

多相里把对流和压力彻底拆开,接在 Baer–Nunziato 通量的 TV 分离 后面。

如果对您有帮助,请分享。