Skip to content

Verification ​

Every FLUME capability is backed by a verification case in src/tests/flume/verification/: a check.sh that runs the case (CPU by default; FLUME_EXE=exe/adam_flume_fnl for the GPU backend) and an oracle that asserts the physics (an exact solution, a reference, a symmetry or a conservation property), not a stored golden. The stored goldens are the job of the regression suite; the building blocks below the solver are pinned by the unit tests.

Each case has its own page with the same sections: the case and its scope, the models and numerics with references to the code, the initial and boundary conditions, the input files, the results on CPU and FNL, and the findings. All runs use 2 MPI ranks and WENO5 unless a page says otherwise. The figures are drawn by src/tests/flume/verification/make_doc_figures.py, from the work directories of the check.sh scripts or from the re-runs of make_doc_runs.sh.

Run any case from its directory:

bash
cd src/tests/flume/verification/sod && ./check.sh                  # CPU backend
FLUME_EXE=$PWD/../../../../../exe/adam_flume_fnl ./check.sh        # FNL backend (GPU)

The verification cases are complete simulations, and they are run with a focused scope: the legs a change touches, not the whole catalog. The regression suite is the layer that runs on every change. Every script therefore selects its legs the same way, through the shared legs.sh:

bash
./check.sh --legs vv1,vv3          # the listed legs (commas or blanks)
./check.sh --legs all              # every leg, including those the default leaves out
./check.sh                         # the default selection (the script's header lists it)

Each script lists its legs and its default in its Usage: header. An unknown leg, or a selection that names no leg, stops the script with exit status 2 before anything runs, so a misspelt leg can never pass by running nothing. Each log opens with the resolved selection (>> legs: ...). The older spellings --leg and --cases still work as aliases of --legs.

In the catalog, Figure "no" marks a contract or bitwise leg (an input refusal, CPU = FNL, a restart, a round trip): a setup table documents it better than a plot of a difference that is zero.

Euler ​

CaseIDMilestoneBackendsFigure
Sod shock tubeV1, RV-3M1 (#35), M3 (#47)CPU, FNLyes
Lax problemRV-3 (lax leg)M3 (#47)CPU (all schemes), FNL (weno-riemann HLLC)yes
Shu–Osher shock / entropy-wave interactionRV-3 (shu-osher leg)M3 (#47)CPU (all schemes), FNL (weno-riemann HLLC)yes
Isentropic vortex: order of accuracyV2, RV-2M1 (#35), M3 (#47)CPU (all schemes), FNL (weno, weno-riemann LLF and HLLC)yes
Shock over a cylinderV6M1 (#35), M3 (#47)CPU, FNLyes
Conservation across AMR seamsV3, RV-4M1 (#35), M3 (#47)CPU, FNLyes
Multi-realm runsmultirealm legs 1–6M2 entry (#37); #40, #51, #52, #54; M6 (#68)CPU, FNLyes
Forward-facing step: a three-realm forest on quadtreesEV-step— (#46, quadtree AMR; #66)CPU, FNL (trees leg); CPU only (full leg)yes

Ideal MHD ​

CaseIDMilestoneBackendsFigure
MHD on weno-riemannRV-5, RV-6, RV-7M3 (#47, M3-P3c)CPU, FNLyes
Ryu–Jones 2a: all seven wavesMV-4M2 (#41)CPU, FNLyes
Brio–Wu and Ryu–Jones 4d— (mhd/riemann, M2-P3 exit)M2 (#41)CPU, FNLyes
MHD plumbing— (mhd/plumbing, M2-P1)M2 (#41, P1)CPU, FNLno
MHD with a zero fieldMV-2M2 (#41, P3)CPU, FNLno
GLM divergence cleaningMV-3, MV-10M2 (#41); the MV-10 monitor M6 (#68, G1)CPU, FNLyes
Order of accuracy: linear waves, CPAW, magnetised vortexMV-5, MV-6, MV-7M2 (#41)CPU, FNLyes
MHD conservation across AMR seamsMV-11M2 (#41, P7a)CPU, FNLyes
Orszag–Tang vortexMV-12M2 (#41)CPU, FNLyes
MHD rotorMV-13M2 (#41)CPU, FNLyes
Field loop advectionMV-9M2 (#41); --agree #79CPU, FNLyes
Rotated shock tubeMV-8M2 (#41)CPU, FNLyes
EGLM cleaningEV-2, EV-3, EV-4M3 (#47, M3-P4)CPU, FNLyes
Positivity limiterPV-1 to PV-5M3 (#47, M3-P5); PV-5 #50CPU, FNL (PV-1 as a sphere: FNL only)yes
Quadtree AMRMV-15#46 (no milestone, after M3)CPU, FNLyes

Infrastructure ​

CaseIDMilestoneBackendsFigure
Ghost probe: every face and edge ghost on a linear fieldGPM4 (#65 P0, P1), M6 (#68 C2, D1)CPU, FNLyes
Scaling covariance and the reference layerNV-0, NV-4, NV-5, NV-6, NV-8, NV-9— (#49, non-dimensional form, N0–N2)CPU, FNLno
Ranks without blocksDV-1— (#82)CPU, FNLyes
Non-finite state guard— (nonfinite)— (#45)CPU, FNLno

Dissipative terms (M4) ​

CaseIDMilestoneBackendsFigure
Input contract of the dissipative termsDCM4 (#65)CPU, FNLno
Viscous wavesVV-1, VV-2M4 (#65)CPU, FNLyes
Compressible Couette flowVV-3M4 (#65)CPU, FNLyes
Becker's viscous shockVV-4M4 (#65)CPU, FNLyes
Ohmic decay and the visco-resistive Alfvén waveVV-5M4 (#65)CPU, FNLyes
Ohmic heating and the divergence constraintVV-6M4 (#65)CPU, FNLno
Conservation across 2:1 seams and forest seamsVV-7M4 (#65)CPU, FNLyes
Accuracy across 2:1 seamsVV-8M4 (#65)CPU, FNLyes
CPU and FNL agree run by runVV agreeM4 (#65)CPU, FNLno

Runtime AMR (M5) ​

CaseIDMilestoneBackendsFigure
Regrid round trip and input contractRG (rg0, rg1, rg2)M5 (#74)CPU (rg0, a host program); rg1 and rg2 CPU, FNLno
Runtime regrids in FLUMERG (rg3 to rg6)M5 (#74)CPU, FNLyes
Accuracy of runtime AMRAV (av2 to av8)M5 (#74)CPU, FNLyes
MHD blast symmetry on the flux-splitting path#77 study, bounded by av3cM5 (#74), #77CPU, FNLyes

Seam accuracy and divergence (M6) ​

CaseIDMilestoneBackendsFigure
Order across static 2:1 seamsAO (A1, C1)M6 (#68)CPU, FNLyes
Divergence across seamsAD (A2)M6 (#68), #78FNL (tables); CPU for the loop leg and the D_flux cross-checkyes
Shock crossing a static 2:1 faceAS (A3, C3, C3b, C3c)M6 (#68)CPU, FNL (Sod); FNL only (RJ2a, C3, C3c)yes
Integral drift and the WENO sensor near seamsAL (A4)M6 (#68)CPU, FNL (the two backends log the same values)yes

Seam studies (M6) ​

CaseIDMilestoneBackendsFigure
Quintic coarse-to-fine fillD1M6 (#68)CPU, FNL (table: FNL)yes
Limited coarse-to-fine fillsD2M6 (#68)FNL (crossings); CPU, FNL (AO legs)yes
Shock-crossing defect is a capturing errorE0M6 (#68)FNL; CPU re-runs agree to the printed digitsyes
Reflux policy: troubled against alwaysE2 (E1)M6 (#68)FNL (flags checked equal to the CPU's); AO euler-tq: CPU, FNLyes
#78 is the reflux, not the restricted ghostsG3aM6 (#68), #78FNL onlyyes
GLM damping length on a seamG2M6 (#68)FNL onlyyes
EGLM reflux leaves B aloneG3bM6 (#68), #78CPU, FNLyes
2:1 caps in a 2-D prototypeB1M6 (#68)NumPy prototype (no ADAM run)yes
Sensor-gated reflux prototypeB2M6 (#68)NumPy prototype (no ADAM run)yes
Footprint of a high-order restrictionB3M6 (#68)NumPy prototype (no ADAM run)yes

External gravity (M7) ​

CaseIDMilestoneBackendsFigure
Stratified atmospheres and the hydrostatic boundaryGV (G0)M7 (#73)CPU, FNLyes
The gravity forceGV-1, GV-2, GV-3, GV-6, GV-7 (G1)M7 (#73)CPU, FNLyes
The order of the energy sourceGV-9 (G2a)M7 (#73)CPU, FNLyes
The well-balanced modeGV-2b, GV-5, GV-8, GV-10, GV-7 (G2b)M7 (#73)CPU, FNLyes
Rayleigh–TaylorGV-4 (G3)M7 (#73); symmetry study #83CPU, FNLyes

Self-gravity (M8) ​

CaseIDMilestoneBackendsFigure
Gravity from a cell potentialSV-1M8 (#81), P1CPU, FNLyes
The FFT Poisson solverSV-2M8 (#81), P2CPU, FNLyes
Jeans modes under self-gravitySV-3, SV-4, SV-5M8 (#81), P3CPU, FNLyes
The isolated Poisson solverSV-6M8 (#81), P4CPU, FNLyes
The n = 1 polytrope: equilibrium and collapseSV-7, SV-8, SV-14M8 (#81), P4; #87, P3CPU, FNLyes
The multigrid Poisson solver on AMR gridsSV-9, SV-12, SV-13M8 (#81), P5a; #87, P1, P2CPU onlyyes
Jeans modes on a static AMR gridSV-10M8 (#81), P5b, P5cCPU, FNLyes
Self-gravity under runtime AMRSV-11M8 (#81), P5cCPU, FNLyes