Skip to content

FLUME ​

FLUME (Fluid Laboratory for Unsteady Multiphysics at Exascale) is the compressible-flow application of ADAM: compressible Euler, Navier–Stokes and ideal MHD with external gravity, self-gravity and sink particles, ideal, isothermal and barotropic gases, radiative cooling, passive scalars and immersed boundaries, solved with high-order WENO finite differences on block-structured adaptive grids (static and runtime AMR, multi-realm forests), on CPUs (MPI + OpenMP) and on GPUs (MPI + OpenACC, or OpenMP offload). It supersedes the deprecated CHASE.

Orszag-Tang vortex

What is implemented ​

AreaCapabilitiesDetails
PhysicsCompressible Euler (optionally with dual energy and up to 4 passive scalars); ideal MHD with mixed GLM or EGLM divergence cleaning (or without control, for diagnostics); ideal, isothermal or barotropic gas; viscosity, heat conduction and Ohmic resistivity; external gravity and self-gravity; optically thin radiative cooling; sink particlesPhysical models
SpaceWENO flux splitting (weno, orders 3–9, characteristic or conservative); WENO interpolation + Riemann flux + high-order correction (weno-riemann, LLF/HLL/HLLC for Euler, LLF/HLL/HLLD for MHD); cell-based positivity limiterNumerical methods
TimeSSP and low-storage Runge–Kutta, CFL time step (with the GLM cleaning speed)Numerical methods
GridOctree/quadtree of Cartesian blocks, AMR at initialisation and during the run (box, gradient, Löhner and solid markers), 2:1 coarse–fine faces with conservative refluxNumerical methods
GeometryImmersed boundary for static solids (Euler)Numerical methods
CouplingMulti-realm runs glued by a forest manifestNumerical methods
Setup25 initial conditions (Riemann problems, vortices, Shu–Osher, Orszag–Tang, rotor, field loop, linear waves, exact viscous states, atmospheres, self-gravitating spheres and clouds, ...), 7 boundary conditions (no-slip and isothermal walls, hydrostatic faces under gravity included)Initial conditions, Boundary conditions
InputOne INI file per realm, every value checkedInput reference
OutputXDMF + HDF5 checkpoints (ParaView), restart, slices, residual, conservation and div(B) historiesInput reference
VerificationExact solutions, convergence orders, symmetry and conservation oracles on both backendsVerification gallery

Status. Milestones M1 to M13 are complete:

MilestoneContent
M1 #35compressible Euler
M2 #41ideal MHD with GLM
M3 #47the Riemann-solver scheme (weno-riemann, Euler and MHD), EGLM cleaning, the positivity-preserving limiter
M4 #65viscosity, heat conduction (no-slip walls) and Ohmic resistivity, conservative across AMR seams and realms
M5 #74runtime AMR ([amr] frequency, setting it up), restarts across regrids
M6 #68seam accuracy and divergence at 2:1 faces
M7 #73external gravity
M8 #81self-gravity, periodic and isolated, uniform and AMR (#87)
M9 #91dual energy (euler-de) and the Jeans refinement marker
M10 #92passive scalars
M11 #93optically thin radiative cooling
M12 #94sink particles
M13 #100isothermal and barotropic equations of state, Euler and MHD

Every milestone runs on both backends.

Quick start ​

Build (FoBiS, from the repository root):

bash
fobis build --mode flume-cpu-gnu                         # CPU backend
fobis build --mode flume-fnl-nvf --varset local_nvf      # GPU backend (OpenACC, NVIDIA HPC SDK)

Run the Sod shock tube of the verification suite:

bash
cd src/tests/flume/verification/sod
mpirun -np 2 ../../../../../exe/adam_flume_cpu sod-x.ini

The run writes sod-x-<iteration>.xdmf (open it with ParaView) and the residual and conservation histories. The input reference explains every key of sod-x.ini. To run the same problem with the Riemann-solver scheme, change its [numerics] section to

ini
[numerics]
scheme_space             = weno-riemann
reconstruction_variables = characteristic
riemann_solver           = hllc
flux_correction          = 6th
flux_correction_sensor   = weno
reflux                   = .true.

./check.sh in the same directory runs the three directions and compares them with the exact solution.

Pages ​

Known limitations ​

  • Seam div(B). A cell-centred B cannot be kept divergence-free across a 2:1 coarse–fine face (Tóth & Roe 2002): the seams inject a truncation-level ∇⋅B, which GLM keeps bounded; seam_max_divb in the div(B) history monitors it.
  • Positivity at very low plasma β. The floors alone do not hold it: without the positivity limiter the flux-splitting scheme stops on the Balsara–Spicer blast (β=2.5⋅10−4) at step 3 and on the Wu–Shu blast (β=2.51⋅10−6) at step 1. With [numerics] positivity_limiter = cell (M3, #47) both schemes run both to the end (positivity limiter). On the flux-splitting path at β≲10−3 the point symmetry and the CPU–FNL agreement then hold only to a grid-scale instability (#77, MHD blast symmetry); where they matter, use scheme_space = weno-riemann with riemann_solver = hlld.
  • GLM damping and reflux. With damping, ∫ψ is not conserved across 2:1 faces; the 8 physical integrals are.
  • The GPU backend copies the coarse–fine seam faces to the host at every stage (the flux register is host-side), in one transfer for all the faces of a rank since #90.
  • Inter-realm seams join cells of the same size (mirror) or across a 2:1 jump (refined, #52; octrees, quadtrees and binary trees, the seam normal to a refined axis, #71); all realms advance with one time step (no subcycling).