Appearance
Barotropic equation of state
| ID | Group | Milestone | Backends | Figure | Regression |
|---|---|---|---|---|---|
| EO (eb1 to eb8) | Euler | M13 (#100), P3 | CPU, FNL | yes | baro-tube, baro-collide-hllc |
Case and scope
[eos] type = barotropic closes the Euler equations with a continuous piecewise polytrope, eos_oracle.py constructs it independently of the code; the default table of Mathew & Federrath (2021) is not convex, so it is checked by self-convergence.
What the case catches:
- a wrong table or segment lookup: the plateau at a break density, which a rarefaction through a convex break leaves between its two fans, and the shocks that jump across segments;
- a wrong Roe speed: the HLL and HLLC speeds use the secant
; - a wrong
: the acoustic wave's speed, hence its order; - a table that disagrees with the closed form: the one-segment table
against the isothermal gas; - a scheme that does not converge where no exact solution is available, across a non-convex break;
- a backend that disagrees, or a table the device does not hold.
Models and numerics
| Item | Choice | Code |
|---|---|---|
| Model | euler with [eos] type = barotropic: MODEL_EULER_BARO, the energy slot inert (D-M13-1), the table registered in adam_flume_eos_tables_library | adam_flume_euler_baro_library.F90, adam_flume_eos_tables_library.F90 |
| Space | WENO5 characteristic flux splitting (eb1 to eb3, eb5, eb6); weno-riemann with llf, hll, hllc (eb7) | adam_flume_cpu_euler_baro_kernels.F90, adam_flume_cpu_euler_baro_{llf,hll,hllc}_kernels.F90; FNL adam_flume_fnl_euler_baro_* |
| Time | SSP-RK(3,3), CFL 0.5; SSP-RK(5,4) at CFL 0.1 for the order (eb3) | — |
Initial and boundary conditions
The convex test table is POLY of eos_oracle.py:
| Leg | Setup |
|---|---|
| eb1 | POLY tube, |
| eb2 | POLY collision |
| eb3 | the acoustic wave of amplitude |
| eb4 | decreasing densities, exponents of another count, an exponent below 1, 9 segments, a negative reference_density, the gas keys, [reference], no sound_speed |
| eb5 | the one-segment table exponents = 1 and the isothermal gas, both |
| eb6 | the default table (cgs, [weno] weights = si (the data are far from order 1) |
| eb7 | eb2 with weno-riemann and each solver |
| eb8 | the eb1, eb2, eb3 (hllc runs of CPU and FNL |
The frame of the collision. eb2 is the collision
Input files
| File | Role |
|---|---|
src/tests/flume/verification/eos/make_eos.py | writes the inputs (--eos barotropic --densities --exponents --rho-ref, --left/--right states, --rho0) |
src/tests/flume/verification/eos/check.sh | runs the legs (--legs eb1,...,eb8, default all but eb8 and eo7; FLUME_EXE selects the backend) |
src/tests/flume/verification/eos/eos_oracle.py | the exact barotropic Riemann solver (convex tables), the linear wave, the comparisons: riemann (with the break plateaus), wave, agree, selfconv |
src/tests/flume/regression/baro-tube/input.ini, baro-collide-hllc/input.ini | the frozen eb1 tube (WENO5 splitting) and eb2 collision (weno-riemann HLLC), 100 cells in four blocks |
make_doc_runs.sh <runs> eos, make_doc_figures.py --only barotropic-eos | the figure (10 runs, 20 minutes on one CPU node) |
bash
cd src/tests/flume/verification/eos && ./check.sh --legs eb1,eb2,eb3,eb4,eb5,eb6,eb7 # CPU
FLUME_EXE=$PWD/../../../../../exe/adam_flume_fnl ./check.sh --legs eb1,eb2,eb3,eb7 # FNL
./check.sh --legs eb8 # CPU against FNLResults

Top left: the tube across the breaks of POLY; the inset shows the plateau at the break
| Leg | Asserted | Bound | CPU | FNL |
|---|---|---|---|---|
| eb1 | the plateau mean; the break plateau at rE | the same | ||
| eb2 | the layer mean against | the same | ||
| eb3 | the L1 order of the finest pair | 4.71 (4.94 coarser) | the same | |
| eb4 | the 8 invalid tables and inputs | refused | refused | refused |
| eb5 | the table | |||
| eb6 | the L1 distance to the rE; the total mass | 1.21, 1.58; | the same orders; | |
| eb7 | eb2 with llf, hll, hllc | as eb2 | layer | the same |
| eb8 | FNL against CPU, per field over its scale; rE | (the same comparison) | hllc, ru); 0 |
Related cases: the isothermal gas is the one-segment table
Findings
- A rarefaction through a convex break splits, and the code keeps the plateau. The fan from
to meets the break , where jumps up: the exact solution has two fans with a constant state at the break density between them, and the run holds it to over 24 of its 34 cells. - The slowly moving shock, not the solver. A Galilean shift of
cuts the HLL ripple behind the left shock from 4.6 % to 0.47 % and the plateau error from to : the noise is the frame-dependent slowly-moving-shock anomaly, worst for the least dissipative fluxes (LLF: 1.5 %). - The default table converges where no exact solution exists. Across the non-convex break of Mathew & Federrath (2021) the runs approach the finest one at orders 1.21 and 1.58, with the density kept at
and the mass to .