Appearance
Isothermal equation of state
| ID | Group | Milestone | Backends | Figure | Regression |
|---|---|---|---|---|---|
| EO (eo1 to eo7) | Euler | M13 (#100), P1, P2 | CPU, FNL | yes | iso-tube, iso-collide-hllc |
Case and scope
[eos] type = isothermal closes the Euler equations with rE of the state is inert, and the isothermal Riemann problem has an exact solution built from mass and momentum alone. Every run is checked against that solution, which eos_oracle.py constructs from the jump conditions, independently of the code (its self-test, P0, checks it against properties it is not built from).
What the case catches:
- a wrong eigensystem or Roe average: the characteristic projection would couple the transverse velocity to the acoustic waves, or move the shock and the plateau;
- a wrong isothermal flux: the plateau, the shock speeds and the compression
of a collision; - an energy slot that is not inert: any non-zero
rE, in any checkpoint; - a loss of the design order of the smooth flow, or of mass conservation;
- a gamma-law path reached by the isothermal model: every input the isothermal gas does not define yet must be refused with its own message, not run on a meaningless pressure.
Models and numerics
| Item | Choice | Code |
|---|---|---|
| Model | euler with [eos] type = isothermal, sound_speed MODEL_EULER_ISO, the energy slot inert (D-M13-1) | adam_flume_euler_iso_library_body.INC, adam_flume_physics_object.F90 |
| Space | WENO5 characteristic flux splitting (eo1 to eo5); weno-riemann with the characteristic interpolation, the 6th-order flux correction and llf, hll, hllc (eo6) | adam_flume_cpu_euler_iso_kernels.F90, adam_flume_cpu_euler_iso_{llf,hll,hllc}_kernels.F90; FNL adam_flume_fnl_euler_iso_kernels.F90, adam_flume_fnl_euler_iso_{llf,hll,hllc}_kernels.F90 |
| Time | SSP-RK(3,3), CFL 0.5; SSP-RK(5,4) at CFL 0.1 for the order (eo3), so the time error stays below the WENO5 space error | — |
Initial and boundary conditions
| Leg | Setup |
|---|---|
| eo1 | the shock tube: |
| eo2 | two streams |
| eo3 | a right-running acoustic wave, |
| eo4 | the eo1 input with [cooling], a viscosity, [reference], an immersed cylinder, a wall-noslip or hydrostatic face, isentropic-vortex; euler-de (mhd-ideal until P5, MHD), passive scalars, cp/cv, no or a negative sound_speed, an unknown type |
| eo5 | the eo3 wave at amplitude 0.3, |
| eo6 | eo1 with weno-riemann and each solver |
| eo7 | the eo1, eo2, eo3 (hllc runs of CPU and FNL |
The exact solution. Across a shock the isothermal jump gives
A 1-D run cannot carry a transverse velocity. A null direction freezes its momentum for every Euler model (null_freeze), so in a 1-D tube
Input files
| File | Role |
|---|---|
src/tests/flume/verification/eos/make_eos.py | writes the inputs from the sod-x regression input (`--case tube |
src/tests/flume/verification/eos/check.sh | runs the legs (--legs eo1,...,eo7, default all but eo7; FLUME_EXE selects the backend; eo7 compares the work directories of both) |
src/tests/flume/regression/iso-tube/input.ini, iso-collide-hllc/input.ini | the frozen eo1 tube (WENO5 splitting) and eo2 collision (weno-riemann HLLC), 100 cells in four blocks |
src/tests/flume/verification/eos/eos_oracle.py | the exact isothermal (and barotropic) Riemann solutions, the linear wave, and the comparisons with the runs (riemann, wave, inert) |
make_doc_runs.sh <runs> eos, make_doc_figures.py --only isothermal-eos | the figure (7 runs, 4 minutes) |
bash
cd src/tests/flume/verification/eos && ./check.sh # CPU
FLUME_EXE=$PWD/../../../../../exe/adam_flume_fnl ./check.sh # FNL
./check.sh --legs eo7 # CPU against FNLResults

Top left: the shock tube against the exact solution; the contact carries the transverse velocity only. Top right: the Mach-5 collision, the dense layer at rE stays 0.
| Leg | Asserted | Bound | CPU | FNL |
|---|---|---|---|---|
| eo1 | the plateau mean against | the same | ||
| eo1 | the right shock; the contact (mid- | 1.5 cells; 2 cells | 0.13 cells; 0.11 cells | the same |
| eo1 | rE; the L1 errors of | exactly 0; — | 0; | the same |
| eo2 | the layer mean against | the same | ||
| eo3 | the L1 order of the finest pair | 4.84 (4.94 on 12 → 24; L1 | the same | |
| eo4 | the 13 invalid inputs (16 before P4, which defines [sinks], [gravity] and the density-only positivity_limiter = cell: under gravity) | refused | refused | refused |
| eo5 | rE in every checkpoint; the total mass | exactly 0; | 0; | 0; |
| eo6 | eo1 with llf, hll, hllc | as eo1 | plateau rE 0 | the same |
| eo7 | FNL against CPU, the last checkpoint, per field over its scale (a momentum's at least rE | (the same comparison) | tube |
Related cases: Sod is the grid; radiative cooling checks the isothermal jump at the floor temperature of a radiative shock, which an isothermal gas makes exact.
Findings
- The isothermal gas needs no pressure in its Riemann problem, and no star pressure in its HLLC. The contact carries only the transverse velocity, so the isothermal HLLC is HLL on mass and normal momentum with the transverse momenta upwinded by the mass flux.
- HLLC's contact advantage does not show here. On the tube HLL and HLLC agree to the third digit (the transverse-velocity L1
against ): the characteristic interpolation and the 6th-order flux correction already resolve the contact at 400 cells, so the Riemann solver's own contact resolution is not what limits it. eo6 checks the solvers are correct, not that HLLC is sharper. - A strong isothermal shock leaves a decaying oscillation train. At Mach 5 the dense layer oscillates about
by 2 % next to each shock, falling to 0.2 % at the centre: the post-shock oscillation of WENO flux splitting at a strong shock (Arora & Roe 1997), not an error of the gas. Its mean is within of . - CPU and FNL agree to round-off once a field is measured on its own scale. On the
acoustic wave the momentum differs by absolute, which is of the momentum's own size but of . The momentum flux carries the pressure , so its round-off is that of an quantity, and eo7 measures a momentum against at least . The largest gap of the four runs, in the Mach-5 collision's density, is round-off amplified at two strong shocks. - The inert slot costs nothing and stays exact. Zero flux, zero source and a zero eigenvalue keep
rEat 0 to the bit in every checkpoint, also across shocks; the state layout and every model-agnostic kernel are unchanged.