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

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

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

From the Riemann Problem to Godunov's Scheme - The Essence of Numerical Flux

Drop the contact and HLL is enough. Keep the contact, and the flux needs the middle wave speed S* from HLLC.

The Riemann Problem: The Heart of CFD#

In the Finite Volume Method (FVM), accuracy and stability hang on the numerical flux at a cell face. The key is a Riemann problem: two constant states, one jump.

Push the pressure-ratio slider from near 1 toward 1000:1 and both outer waves switch from rarefaction to shock.

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

The contact in the middle stays put as the ratio grows. Both outer waves are shocks together only once the star pressure p∗p^* sits above the pressure on each side.

What is the Riemann Problem?#

The Riemann problem is an initial value problem where the initial conditions consist of two constant states separated by a single discontinuity:

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}

For the 1D Euler equations, the analytical solution to this problem consists of three waves:

  1. Left-moving wave (rarefaction or shock)
  2. Contact discontinuity
  3. Right-moving wave (rarefaction or shock)

Godunov's Idea (1959)#

Godunov's key insight is simple yet powerful:

To find the flux at a cell boundary, treat the average values of the two adjacent cells as the left and right states and solve the Riemann problem.

The update formula for the Finite Volume Method:

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)

where F^i+1/2\hat{\mathbf{F}}_{i+1/2} is the numerical flux determined from the solution to the Riemann problem.

Exact Riemann Solver#

An exact Riemann solver finds the pressure in the star region, p∗p^*, using the Newton-Raphson iterative method. Rankine-Hugoniot relations or isentropic relations are applied depending on the type of wave (shock or rarefaction).

Shock wave relation (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}

where AK=2(γ+1)ρKA_K = \frac{2}{(\gamma+1)\rho_K} and BK=γ−1γ+1pKB_K = \frac{\gamma-1}{\gamma+1}p_K.

Rarefaction wave relation (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^* satisfies the following condition:

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

The split is one comparison: p∗p^* against pKp_K. If p∗p^* is above pKp_K, that side is a shock. fKf_K is the pressure jump times [AK/(p∗+BK)]1/2[A_K/(p^*+B_K)]^{1/2}. AK=2/((γ+1)ρK)A_K=2/((\gamma+1)\rho_K), so a denser fluid changes speed less for the same pressure jump. BK=(γ−1)pK/(γ+1)B_K=(\gamma-1)p_K/(\gamma+1) fattens the denominator a little past p∗p^*. If p∗p^* is at or below pKp_K, that side is a rarefaction. The factor 2cK/(γ−1)2c_K/(\gamma-1) grows with sound speed, and it grows again as γ\gamma nears 1. The pressure-ratio exponent is (γ−1)/(2γ)(\gamma-1)/(2\gamma). Lower γ\gamma, smaller exponent, and fKf_K cares less about the pressure ratio.

The two ff values plus uR−uLu_R-u_L have to sum to zero. If uRu_R is below uLu_L, fluid piles into the middle. Then fL+fRf_L+f_R is positive and p∗p^* is pushed above both side pressures. Both outer waves are shocks. The 1000:1 end of the slider is that limit. The low-side pKp_K sits under the star pressure, so that fKf_K stays on the shock branch. The high side can remain a rarefaction, depending on the ratio. Both sides are shocks only when the velocity difference closing on the contact is large enough. A cell treated as its own shock tube is the calculation in Godunov's shock tube inside one cell.

Approximate Riemann Solver: Why is it Needed?#

Exact solvers are expensive because they require iterative calculations. Most CFD codes use approximate Riemann solvers.

Roe Solver (1981)#

Roe linearizes the non-linear Riemann problem into a linear Riemann problem for the matrix A^\hat{\mathbf{A}}:

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

The Roe average is used to construct 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}}

Pros: Captures contact discontinuities accurately. Cons: Can violate entropy conditions (requires an entropy fix).

HLLC Solver (Toro, 1994)#

HLLC improves the HLL solver by restoring the contact discontinuity. It estimates three wave speeds: SLS_L, S∗S^*, and 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}

Star region flux:

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

HLLC is easy to implement and robust, making it the most widely used in compressible multiphase flow codes.

AUSM+ (Liou, 1996)#

The AUSM family splits the flux into convective and pressure terms:

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}

where m˙1/2\dot{m}_{1/2} is the mass flow rate at the cell boundary and Ψ\boldsymbol{\Psi} is the convected quantity. It is stable even in low-Mach flows, making it easy to extend to all-speed schemes.

Extension to Multiphase Flows#

In multiphase flows, since the EOS on both sides of the interface are different, Riemann solvers must be generalized to multi-material versions.

Common approaches:

  • Ghost Fluid Method: Constructs ghost cells for the fluid on the opposite side near the interface and solves independent single-material Riemann problems for each phase.
  • HLLC for multi-material: Determines p∗p^* and u∗u^* by applying each EOS on both sides of the star region.

The next article compares interface capturing techniques (VOF, Level Set, Diffuse Interface).

Splitting advection from pressure once the flow is multiphase continues in TV splitting of the Baer–Nunziato flux.

Share if you found it helpful.