Riemann solvers - AST-Course/AST5110 GitHub Wiki

Riemann Solvers

A Riemann problem is an initial value problem involving one or a system of hyperbolic PDEs, with piecewise constant initial data separated by one discontinuity. A Riemann problem is solved using Riemann solvers.

Riemann problem and Riemann solvers are of great interest for various reasons. Riemann problem, while being simplified and idealized, can describe the fundamental behaviors (e.g., shock wave) of various hyperbolic PDEs, and thus, Riemann solvers can be used for a wide range of topics. In this course we have introduced several finite-difference methods, which are efficient and whose properties may be rigorously analyzed. Riemann solvers are relatively complicated, but they can be flexible for unstructured discretization, e.g. unstructured finite volume method and smooth particle hydrodynamics.

Moreover, Riemann problem's analytical solutions provide good tests for any numerical codes. More generally, its self-similar or self-preserving solution allows having a unique variable ($x/t$) instead of $x$ and $t$ separately see also ex_2a_analytical. Therefore, Riemann solvers may improve both waves (characteristics) and non-smooth waves (shocks and contacts), which can be advantageous for solving complex problems. The literature is very extended and involves extensive knowledge of mathematics and physics [1]. However, the simple examples below provide the most basic and important idea of Riemann solvers.

The exact solutions of Riemann solvers are too expensive for many applications. Therefore, the non-linear flux functions are replaced by locally linearized approximate flux functions. There are many options, and here we provide a single example.

Three-wave approximate method (secant and tangent lines):

The two most popular linear approximations for a non-linear scalar function $f(u)$ are tangent and secant line approximations. The tangent line about $u_L$ is:

$f(u) \approx a(u_L) (u-u_L) + f(u_L),$

where $a(u) = f'(u)$. This solution is best near $u_L$ and gets progressively worse away from $u_L$. Similarly, the tangent line about $u_R$ is:

$f(u) \approx a(u_R) (u-u_R) + f(u_R),$

It is desired to find a linear approximation that clings to the function in the entire interval $u_L$ and $u_R$. In particular,

$f(u) \approx a(u_{RL}) (u-u_R) + f(u_R),$

where

$a(u_{RL}) = \frac{f(u_R)-f(u_L)}{u_R-u_L}$

Roe's method finds a linear solution of the above in the Euler equations, which describe hydrodynamics problems.

One-wave approximate method:

Roe's may still be too expensive. Consider the following linear flux function:

$\bf{ f(u)} = r_{RL} \bf{u} + \bf{b_{RL}}$

where $r_{RL}$ is any constant scalar and $b_{RL}$ is a any constant vector. Then an approximate linear Rieman problem is:

$\frac{\partial \bf{u}}{\partial t} + \frac{\partial}{\partial x}(r_{RL} \bf{u} + \bf{b_{RL}}) = \frac{\partial \bf{u}}{\partial t} + r_{RL} \frac{\partial \bf{u}}{\partial x} = 0$

Rankine-Hugoniot relations says:

$\bf{f}(\bf{u_R}) - \bf{f}(\bf{u_L}) = S(\bf{u}_L-\bf{u}_R)$

so,

$r_{RL} = S$

Unfortunately, for a single right running shock, a single left running shock, and a single contact, S will follow:

$S = u_{RL} + a_{RL},$ $S = u_{RL} - a_{RL},$

and

$S = u_{R} = u_L = u_{RL}$

And there is no simple way to choose between the three speeds. So we usually define $r_{RL}$ as the largest characteristic value of $|A_{RL}|$.

You may test your own Riemann solver in ex_4b, and also compare the Riemann solver with the conservative finite-difference discretization in Conservative.

[1] E. F. Toro, Riemann Solvers and Numerical Methods for Fluid Dynamics, 3rd Edition, Springer, 2009.