Skip to content

Input reference ​

A FLUME run reads one INI file: mpirun -np N exe/adam_flume_cpu input.ini (or adam_flume_fnl). This page lists every section and key the application reads, with its type, whether it is required, its default, the accepted values and what happens on an invalid one. The two complete inputs at the end are verification cases, copied verbatim; the verification gallery shows their results.

Program entry and read order ​

adam_flume_cpu [file] / adam_flume_fnl [file] (default input.ini). If the file has a [forest] section with realms_number >= 1, it is a forest manifest and every [realm.N] names a per-realm INI of the form documented below; otherwise the file is itself a single-realm input.

A realm input is read in this order: [IO] → [reference] (if present it converts the file to code units, then [IO] is read again) → [numerics] → [physics] (+ [eos], [mhd], [gravity]) → [runge_kutta].scheme (memory budget) → [grid] → [amr] (tree, seam fill, markers) → [solids] → [slices] → [runge_kutta] → [weno] → [fdv] → [bc_*] → [time] → [initial_conditions] → [diagnostics] → [IO].save_auxiliary_fields. After reading, FLUME applies cross-section checks (slices, WENO scheme, Riemann solver per model, ghost cells, even block cells for AMR).

Units ​

Any consistent unit system works: the equations carry no dimensionless number (units and scaling), so SI, cgs and units of order 1 give the same run. Magnetic fields are always BSI/μ0 (a Gaussian field divided by 4π). With the classic WENO weights the data should be of order 1: either write the input in such units, add a [reference] section that converts a physical input, or set [weno] weights = si.

Parsing rules ​

The library input reference gives the rules of the INI parser (case, comments, missing keys, numbers, logicals, CRLF, the removed-keys lint). A Windows (CRLF) input reads as an LF one on both backends.

Legend for the tables ​

  • Req.: yes means a missing key causes error_stop. cond. means it is required only under the stated condition. no means optional (the default is applied). no check means the error is ignored; see the notes for what happens.
  • Used: yes means FLUME's behaviour depends on the value. no means the key is read but FLUME never uses it; the key usually must still be present, because the library reader requires it.

[IO] ​

The library reads [IO] (library reference); FLUME adds one key. [IO] is loaded twice (FLUME common, then the realm), and both loads are identical.

KeyTypeReq.DefaultAccepted / invalidUsedMeaning
save_auxiliary_fieldslogicalyes—logicalyesAlso write the auxiliary fields (rho,u,v,w,p,T,H,a, plus s with dual energy, s1..s4 with passive scalars, Bx,By,Bz for MHD). For MHD it also writes the derived fields pt, beta, bmag, divb.

Of the library keys FLUME uses output_basename, it_save, restart, restart_basename, restart_save, residuals_save and save_residual_fields. The field save writes the first step (it = 0, not on restart) and the last step whenever it_save > 0; the last step is also a restart save. The other [IO] keys are read and unused by FLUME (its div(B) history cadence is [diagnostics], its div(B) monitor [mhd] divb_tol).

Output formats (no format key exists) ​

FLUME has no output-format selector. It always writes these files:

OutputFile nameControlled by
Fields: XDMF + HDF5 (XH5F), ghost cells included<output_basename>-<it:9 digits>.xdmf + ...-procNNNNNN.h5it_save, save_residual_fields, save_auxiliary_fields
Restart<restart_basename>.time, .tnd, -procNNNNNN.fbd + an XH5F snapshot <restart_basename>.xdmf/.h5restart_save
Residuals history (ASCII, Tecplot header)<output_basename>-residuals.datresiduals_save
Conservation history (ASCII)<output_basename>-conservation_history.dat[diagnostics].conservation_history_save
Turbulence history (ASCII, optional)<output_basename>-turbulence_history.dat[diagnostics].turbulence_history_save
Wall-model history (ASCII, optional)<output_basename>-wall_<face>_history.dat[diagnostics].wall_history_save
div(B) history (MHD only)<output_basename>-divb_history.dat[diagnostics].conservation_history_save
Slices (MPI-IO binary)<output_basename>-slice_NN-<it:9>.mat[slices], [slice_N]

Library sections in FLUME ​

[grid], [amr], [amr_marker_N], [field], [runge_kutta], [weno], [fdv], [solids], [solid_N], [slices] and [slice_N] are read by the library and documented in the library input reference. FLUME adds these rules:

SectionFLUME rule
[grid]ngc >= [weno] S (fatal); >= 2 with scheme_space = weno-riemann; with gravity on a gas with an energy equation, one more (S + 1, or max(S, 2) + 1 with weno-riemann), the face beyond each block end (#73); MHD: fdv_order/2 <= ngc (CPU) or <= min(ngc, 3) (FNL), checked at the first div(B) diagnostic. With [initial_conditions] amr_iterations > 0, ni/nj/nk must be even along every non-null axis (fatal). With markers and max_level > iu_ref_levels, every refined non-null axis needs an even cell count (#39) and at least 2 ngc cells (#66); both fatal at initialisation. For Euler a null direction also freezes the momentum along it.
[amr]frequency > 0 regrids at runtime (#74): negative is fatal, and so is runtime regridding without markers. On a multi-realm forest each realm regrids by its own [amr] section (#110): the forest balances the marks of the realms across each seam (for coupling = mirror and refined, one level per seam side and, across, equal cells or the declared 2:1 jump; for auto, face by face, neighbouring cells across the seam equal or in a ratio of 2, so the levels may differ along it as inside a realm) and rebuilds the seams after each regrid. The FNL backend regrids by a host round trip (each regrid logs its wall time). regrid_prolongation defaults to conservative in FLUME (the library default is linear); conservative-state (#88) keeps a runtime-AMR stellar collapse admissible (SV-15) but is less accurate on smooth flow (AV). Derefinement is always the mean of the children.
[amr_marker_N]Modes 1 (solid, primitive-box), 2, 4, 5 and 6 (a registered criterion); mode 3, stl and an unknown mode are fatal at initialisation (regrid leg rg8). A Löhner marker (mode 4) acts at the runtime regrids only, with buffer <= ngc - 1 (fatal otherwise); a Jeans marker (mode 5) needs [gravity] self_gravity = .true. (fatal otherwise). At a runtime regrid the markers vote per block: refine when any asks, coarsen only when all agree, keep otherwise, never below iu_ref_levels; the box marker votes to coarsen outside its box. The gradient is centred, across the faces between blocks too (#76), one-sided at the domain boundary.
[runge_kutta]runge-kutta-yoshida is fatal (no FLUME integrator); the staged path (2:1 faces, forests) and the positivity limiter need an SSP scheme.
[weno]weno-c-* is fatal. weights = si makes the scheme independent of the units of the data (numerics); si with weno-riemann and reconstruction_variables = primitive is fatal. With scheme_space = weno-riemann the same scheme sets the order of the WENO interpolation tables. ROR is not implemented: its keys are read and unused.
[fdv]fdv_scheme is read and unused (the div(B) diagnostic is always centred FD); fdv_order sets the order of that diagnostic, MHD only.
[solids]Euler only: number > 0 with mhd-ideal is fatal.
[slices]Only the conservative variables are sliced.

Variable indices for the gradient marker:

IndexConservative (field = 1)Auxiliary (field = 2)
1rrho
2ruu
3rvv
4rww
5rEp
6bx (MHD)T
7by (MHD)H
8bz (MHD)a
9psi (MHD + GLM or EGLM)Bx (MHD)
10—By (MHD)
11—Bz (MHD)

Setting up runtime AMR ​

Runtime AMR (#74) regrids during the run, on both backends. A minimal setup tracks a feature from a base level to a finest level (the spacings below are for a unit box with 16 cells per block):

ini
[amr]
max_level      = 3          ; finest level
iu_ref_levels  = 1          ; base level: no block is ever coarsened below it
frequency      = 5          ; regrid after every 5th step
iters          = 2          ; up to 2 sweeps per regrid (a sweep moves a block by one level)
markers_number = 2
; regrid_prolongation = conservative   (the FLUME default; the refined children average to the parent)

[amr_marker_1]               ; refines the initial grid too (Loehner does not act at initialisation)
mode         = 2             ; gradient
delta_type   = max
delta_fine   = 0.0079        ; ~1 % above the finest spacing: the blocks where the gradient fires reach it
delta_coarse = 0.0316        ; ~1 % above the base spacing
field        = 1
var          = 1             ; density
tol          = 0.05

[amr_marker_2]
mode         = 4             ; Loehner: scale-free, ~0 where smooth, ~1 at a jump
delta_type   = max           ; read but unused by mode 4
delta_fine   = 0.0
delta_coarse = 0.0
field        = 1
var          = 1
refine_tol   = 0.5           ; refine above
derefine_tol = 0.2           ; coarsen below (keep between: the hysteresis band)
buffer       = 2             ; ghost layers read: a feature at a neighbour's edge marks the block
; floor      = 1e-4          ; needed when the variable vanishes in quiet regions (e.g. B outside a loop)

How the pieces combine, and what to expect:

  • Markers vote. A block is refined when any marker asks for it and coarsened only when all agree; the box marker votes to coarsen outside its box. Use a gradient (or solid, or box) marker to shape the initial grid and Loehner to follow the solution: without an initial marker the first frequency steps run on the base grid, and their error persists.
  • Thresholds. Loehner's refine_tol around 0.5 follows shocks and contacts; smooth structures (a vortex, a rarefaction) score low and may stay coarse, so mark them with a gradient marker. On a variable that is zero in quiet regions set floor to a fraction of the feature's jump, or round-off noise marks the whole grid.
  • Cost. The time step is global (no subcycling), so a run regridding to level L advances at the step of level L everywhere; the savings come from the cells, and on the verification cases the wall time dropped by 3–19 % (verification). On the FNL backend each regrid is a host round trip whose copies scale with the blocks in use, about 0.02 s per regrid on a 50-block grid on the development box (#75).
  • Limits. On a multi-realm forest (#110) the blocks along each side of a mirror or refined seam keep one level: a refine vote on one refines the whole side. A coupling = auto seam may hold different levels along it, face by face (equal cells or 2:1); its checks are per axis since #71, but the mixed-level legs run on octrees only. With EGLM the 2:1 seams raise the divergence error B_z well above its uniform-grid level (#78).
  • Restart. A run restarted from any step regrids on the same steps and continues bitwise (the regrid happens before the step's output and restart files). On a forest every realm restarts from its own files and the inter-realm seams are rebuilt from the restored trees, mixed levels along a seam included (multirealm/check.sh leg 13), bitwise under either coupling_cadence (end_of_step since #113, leg 14). Restart on the rank count the run was saved with: fewer ranks stop the run.
  • Log. Each regrid prints flume: regrid at step N: blocks a -> b, R refined, C coarsened, S sweeps (plus its wall time on FNL); a state with non-positive density or pressure after a regrid stops the run with its location.
  • Your own criterion (#110). Extend amr_criterion_object (adam_amr_criterion_object) with a vote(realm, b) returning TO_BE_REFINED, TO_NOT_TOUCH or TO_BE_DEREFINED for block b, register an instance on every realm in a copy of the driver (call realm(i)%register_amr_criterion(c), before simulate; c a TARGET variable of the main program, since the realm keeps a pointer to it; an unregistered name stops the run at initialisation), and select it with [amr_marker_N] mode = 6 and name = <its name>; its votes combine with the other markers' as theirs do, at runtime regrids. The example src/tests/flume/verification/regrid/test_flume_user_criterion.F90 is the CPU driver plus a criterion that reproduces the built-in box marker (bitwise the same run, multirealm/check.sh leg 10).

[reference] (optional: dimensional input) ​

FLUME's equations carry no dimensionless number (B is B_SI/sqrt(mu0)), so a dimensional input runs once every value is divided by the reference of its dimension (issue #49). With this section present, FLUME does that once, on the loaded file, before any other section is parsed; without it nothing changes. References: density rho0, length L0, velocity u0; derived: time L0/u0, pressure and energy density rho0 u0^2, field u0 sqrt(rho0), the GLM psi u0^2 sqrt(rho0) (the EGLM one as the field). cp, cv are replaced by gamma = cp/cv (the gas constant becomes 1, the temperature unit u0^2/R); the physics derives cv = R/(gamma-1), cp = gamma cv on both paths, so the conversion is bit for bit. Restart files and logs stay in code units; the other outputs follow output_units. Every restart save also writes <restart_basename>.reference (the three references, 1 without this section); a restart under different references is refused, and restart files without that record (written before it existed, so in code units) restart only when the references are all 1.

KeyTypeReq.Accepted / invalidMeaning
densityrealno (1)> 0, otherwise fatalrho0.
lengthrealno (1)> 0, otherwise fatalL0.
velocityreal or stringno (1)> 0; acoustic (sqrt(gamma pressure / density), needs pressure); alfvenic (field / sqrt(density), needs field and mhd-ideal). Other → fatal.u0.
pressurerealcond.> 0Reference pressure of the acoustic preset.
fieldrealcond.> 0Reference field of the alfvenic preset.
output_unitsstringno (code)code, dimensional; other → fatalUnits of the fields, grid, time, slices and histories.

With output_units = dimensional every written value is multiplied, at write time only, by the reference of its dimension: the fields (conservative, residuals, auxiliary, MHD derived: beta is dimensionless, divb a field per length), the block origins and spacings, the time, the slice points and values, the conservation integrals (times L0^3, the cell volume includes the null directions), the div(B) and residual histories. The temperature is written as p / (rho R) with the gas constant of the input (cp - cv, or 1 with gamma). <output_basename>.units (written whenever the section is present) records the output units, the references, the derived ones and the factor of every written variable. The state, the restart files and the solver are unaffected.

Any other key is fatal. With the section active every section and key of the file must be known to the layer: an unknown one is fatal, so no dimensional value can pass unconverted. Keys whose dimension depends on the context are resolved from it: [amr_marker_N].tol of a gradient marker takes the dimension of the marked variable per length, floor of a Löhner marker that of the marked variable (a marker on the temperature is refused; the Löhner refine_tol, derefine_tol and epsilon are dimensionless), [initial_conditions].wave_amplitude that of the eigenvector it multiplies. type = orszag-tang (a state hard-coded in code units) and multi-realm runs are refused. The log lists every converted key with its old and new value.

The dissipative coefficients and the wall keys (issue #49 N4, issue #65) convert as follows; the numbers are dimensionless and pass unchanged. R is the gas constant of the input (cp−cv, or 1 with gamma), since the layer replaces cp, cv by gamma and the code temperature becomes p/ρ:

KeyDivided by
viscosityρ0u0L0
conductivityρ0u0L0R
resistivityu0L0
[bc_*] wall_model_heightL0
[bc_*] wall_model_filterL0/u0
[bc_*] wall_model_edge_velocityu0
[bc_*] wall_model_edge_temperatureu02/R
[forcing] bulk_momentumρ0u0
[initial_conditions] ch_rhoρ0
[initial_conditions] ch_ubu0
[initial_conditions] ch_h, ch_lx, ch_lzL0
[initial_conditions] ch_mach, ch_pert; every [turbulence] key; [forcing] type, axis— (dimensionless)
wall_u, wall_v, wall_wu0
wall_temperature, reference_temperature, sutherland_temperatureu02/R
temperature_unit_kelvinits inverse: kelvin per input temperature unit, times u02/R
reynolds, prandtl, magnetic_reynolds, viscosity_exponent— (dimensionless)
lundquist— (refused unless velocity = alfvenic)
[gravity] g_x, g_y, g_zu02/L0
[gravity] Gu02/(ρ0L02)
[gravity] froude, G_star; [initial_conditions] polytropic_gamma— (dimensionless)
[cooling] temperatures (each value)u02/R
[cooling] lambdas (each value)L05u03ρ0
[cooling] particle_massρ0L03
[cooling] dt_factor— (dimensionless)
[sinks] x, y, z (each value)L0
[sinks] u, v, w (each value)u0
[sinks] mass (each value)ρ0L03

The conversion divides by the power-of-two reference first and applies R last, a single rounding, so the verification DC can check every converted value exactly.


[physics] ​

physical_model is required, with either gamma or both cp and cv (neither with [eos] isothermal or barotropic).

KeyTypeReq.Accepted / invalidMeaning
physical_modelstringyeseuler (nv = 5), euler-de (nv = 6) or mhd-ideal (nv = 8, or 9 with GLM or EGLM). Other → fatal.Equation set. euler-de is Euler with dual energy, the advected entropy rs (#91, numerics; CPU and FNL). mhd-ideal also loads [mhd].
passive_scalarsintno (euler, euler-de)0..4, default 0; above 4 or with mhd-ideal → fatalPassive scalars (#92, numerics): N > 0 selects the scalar variant of the model, 4 more conserved variables rs1..rs4 (nv 9, or 10 with euler-de), the first N set by the s1..sN keys of the initial-condition regions and of the inflows, the others zero. CPU and FNL.
dual_energy_etarealno (euler-de)(0, 1), default 0.05; otherwise fatalDual-energy switch: a cell whose internal energy is below dual_energy_eta times its total energy takes the entropy as the floor of its internal energy.
gammarealcond.> 1; with cp or cv → fatalSpecific heats ratio; the gas constant is 1 (code units).
cprealcond.cp > cv > 0, otherwise fatal; required without gammaSpecific heat at constant pressure.
cvrealcond.as aboveSpecific heat at constant volume. gamma = cp/cv, R = cp - cv; the physics then uses cv = R/(gamma-1), cp = gamma cv (an input cp may move by an ulp).

Dissipative terms (issue #65, M4) ​

Each term is given either as its coefficient or as the dimensionless number it stands for. In code units the references are 1, so a number is the reciprocal coefficient. Giving two keys of a term is fatal; giving none leaves the term off, so an input without these keys stays ideal and bitwise unchanged. The viscosity and the conductivity drive the Navier–Stokes fluxes of every model, the resistivity the Ohmic ones of mhd-ideal (numerics).

KeyTypeAccepted / invalidMeaning
viscosityreal>= 0; with reynolds → fatalDynamic viscosity μ (code units, or dimensional with [reference]).
reynoldsreal> 0Re: μ=1/Re.
conductivityreal>= 0; with prandtl → fatalThermal conductivity k; the heat flux is −k∇T with T=p/(ρR).
prandtlreal> 0; needs viscosity or reynoldsPr: k=μcp/Pr (follows μ(T) under the power and Sutherland laws).
resistivityreal>= 0; MHD only; with a number → fatalMagnetic diffusivity η (Ohmic resistivity).
magnetic_reynoldsreal> 0; MHD onlyRm: η=1/Rm.
lundquistreal> 0; MHD only; with [reference] it needs velocity = alfvenicS: η=1/S, the magnetic Reynolds number at the Alfvén speed.
viscosity_lawstringconstant (default), power-law, sutherland; other → fatal; power-law and sutherland need a viscosityTemperature law of the viscosity.
viscosity_exponentreal>= 0; required by power-law, fatal without itω in μ(T)=μ(T/Tref)ω (non-negative: the diffusive time step bound evaluates the laws at the largest temperature a face can see).
reference_temperaturereal> 0; required by power-law and sutherland, fatal without itTref (code temperature p/(ρR)), where μ is the given viscosity.
temperature_unit_kelvinreal> 0; optionalThe kelvin value of one temperature unit of the input (p/(\rho R)): the absolute-temperature anchor of a non-dimensional input, read by what needs kelvin (Sutherland's default S; the thermally perfect gas to come). With a dimensional [reference] input in kelvin it is 1, and the layer converts it to kelvin per code unit.
sutherland_temperaturereal> 0; required by sutherland unless temperature_unit_kelvin is given (then S = 110.4 K, air), fatal with another law; viscosity_exponent is fatal with sutherlandS in Sutherland's law μ(T)=μ(T/Tref)3/2(Tref+S)/(T+S), in the units of reference_temperature (110.4 K for air: with a dimensional [reference] input both are given in kelvin; in code units S=110.4Tref/Tref,K).

[numerics] positivity_limiter = cell is refused with any non-zero coefficient: the limiter's first-order backbone with a central dissipative flux is not admissible without the extension of Zhang (2017, J. Comput. Phys. 328), which is not implemented (D-M4-5). A coefficient is also fatal with immersed solids (their walls are inviscid), and dissipative_order = 4 with [grid] ngc < 3.


[eos] (optional: equation of state) ​

Without the section the gas is the ideal gas of [physics] (gamma, or cp and cv). type = isothermal (#100, M13 P1) selects the isothermal gas P=c02ρ, and type = barotropic (P3) a piecewise polytrope P=KkρΓk, continuous across its density breaks (numerics). Both drop the energy equation: the state keeps its five slots, the energy slot rE is inert (zero flux, zero source) and stays 0, and the checkpoints still write it. The auxiliary fields report p=P(ρ), T=P/ρ (with R=1), a=dP/dρ, H=0.

KeyTypeReq.Accepted / invalidMeaning
typestringyesideal, isothermal, barotropic; other → fatalThe equation of state. ideal is the default gas of [physics].
sound_speedrealwith isothermal, barotropic> 0; missing or non-positive → fatalc0: the sound speed of the isothermal gas; for a table, the isothermal speed P/ρ at reference_density, so K1=c02ρref1−Γ1 (the sound speed there when Γ1=1).
reference_densityrealno (1)> 0, otherwise fatalρref of barotropic.
densitieslist of realsnoall > 0, strictly increasing; otherwise fatalThe breaks ρ1<⋯<ρn−1 of barotropic; a break belongs to the segment above it.
exponentslist of realsnoone per segment (one more than densities), all >= 1, at most 8 segments; otherwise fatalΓ1,…,Γn of barotropic. Kk+1=KkρkΓk−Γk+1 keeps P continuous.

Without densities and exponents, barotropic takes the table of Mathew & Federrath (2021, MNRAS 507, 2448), Γ=1,1.1,1.4,1.1,5/3 with breaks at 2.5⋅10−16, 3.84⋅10−13, 3.84⋅10−8 and 3.84⋅10−3 g cm−3: a cgs input (their c0 is 0.2 km/s). A break where Γ decreases upward (that table's 1.4→1.1) is not genuinely nonlinear: its Riemann solutions contain composite waves. It is accepted (the schemes do not depend on convexity) and reported at start-up.

With type = isothermal or barotropic:

  • [physics] must be physical_model = euler or mhd-ideal (P5, below) without passive_scalars, and must not set gamma, cp or cv (fatal: they would be ignored);
  • the regions of [initial_conditions] and the inflow faces need no p (it is ignored: P=P(ρ));
  • the accepted initial conditions are uniform, riemann-problem, rotated-riemann, sine-wave (with wave_mode = acoustic the wave travels at P′(ρ0), with wave_mode = jeans it obeys ω2=P′(ρ0)k2−4πGρ0), linear, polynomial, shu-osher and boss-bodenheimer; with isothermal also singular-isothermal-sphere (a2=c02) and bonnor-ebert (initial conditions); the others, whose density needs γ, are fatal;
  • gravity (P4): [gravity], external and self-gravity, acts on the momentum only, the energy slot stays 0 (no energy source, so no fourth-order energy correction and no ngc >= 4 requirement, no seam gravity work in the AMR reflux); the Jeans marker ([amr_marker_*] mode = 5) and the sinks take cs2=dP/dρ of the cell, and the sinks' Jeans test (|E_grav| > 2 E_th) the virial thermal energy Eth=32∫PdV (equal to the internal energy at γ=5/3);
  • [numerics] positivity_limiter = cell (P4) is the density-only limiter: the models' admissible quantity is the density, kept above POSITIVITY_LIMITER_KAPPA times its first-order backbone value (the stages and the AMR reflux), with a kinetic chord that keeps the velocity of a limited cell near its backbone's (numerics); the sinks need it, since accretion drains the cells within the accretion radius to the threshold density;
  • refused, each with its own message: [cooling] (nothing to radiate), the dissipative terms, [reference] (it converts no barotropic law), immersed solids, and the wall-noslip, wall-isothermal and hydrostatic faces;
  • CPU and FNL run the weno and weno-riemann schemes, all reconstructions, and the llf, hll, hllc solvers; the FNL kernels are the device twins of the CPU ones, on the same library;
  • with physical_model = mhd-ideal (P5) the gas closes ideal MHD without an energy equation, the total pressure P(ρ)+|B|2/2 (numerics):
    • [mhd] divergence_control must be none or glm. eglm is fatal, because its sources are built on the energy equation.
    • rho_floor and p_floor must be 0 (fatal otherwise: there is no pressure to floor).
    • The accepted initial conditions are those above plus glm-pulse, divb-peak, mhd-linear-wave (the eigenvectors of Kim et al. 1999; wave = entropy is fatal, since these gases have no entropy mode), mhd-cpaw, mhd-rotor and field-loop. orszag-tang and mhd-vortex are fatal: their states need γ.
    • The schemes are weno and weno-riemann, with the llf, hll and hlld solvers (Mignone's isothermal HLLD, on any P(ρ)).
    • positivity_limiter = cell works as for the Euler gases, and is fatal with glm, as for the ideal gas.
    • CPU and FNL run them (P5a, P5b); the FNL kernels are the device twins of the CPU ones, on the same library.

[mhd] (only with physical_model = mhd-ideal) ​

The section is not read for euler.

KeyTypeReq.Accepted / invalidMeaning
divergence_controlstringyesglm (nv = 9, psi added), eglm (nv = 9, psi also in the energy; the glm_* keys apply) or none (nv = 8). Other → fatal.div(B) control. Under eglm the AMR reflux leaves B alone (ρ, ρu, E and psi are refluxed): with the Derigs sources B is not a conserved integral, and refluxing it broke the sources' cancellation of the flux-generated Bz at 2:1 seams (#68 G3b, #78).
glm_chrealglm, eglm> 0, otherwise fatalConstant cleaning speed c_h. It also bounds the time step (c_h * sum 1/dx). Keep it just above the fastest signal speed: a larger one speeds up the growth of small asymmetries in sheared, magnetised flows (#83).
glm_alpharealglm, eglm>= 0, otherwise fatalDamping parameter: c_h^2/c_p^2 = glm_alpha * c_h / L.
glm_damping_lengthreal or min-cellglm, eglmA positive real, or the literal min-cell (the minimum cell spacing over the active directions, MPI-reduced; with runtime regridding, [amr] frequency > 0, the spacing of the finest level max_level allows, fixed for the run). A non-number or a value <= 0 is fatal.Damping length L.
glm_ch_checkstringglm, eglmwarning or error. Other → fatal. Without GLM it is forced to warning and not read.What happens when max(|u|+c_f) > glm_ch: warn (logged each time a new maximum appears) or stop.
divb_tolrealyes>= 0, otherwise fatal. 0 disables the monitor; > 0 needs [diagnostics] divb_flux = .true. (hence GLM or EGLM), fatal otherwise.Monitor on the normalised D_flux (#68 G1): max h|D_flux| / max|B| > divb_tol warns or stops. Dimensionless (no [reference] conversion): the divergence of the interface field the cleaning acts on, scaled by the spacing and the field, bounded on a resolved run with an O(H) seam floor (A2).
divb_errorlogicalyeslogical.true.: exceeding divb_tol is fatal.
rho_floorrealyes>= 0, otherwise fatal. 0 disables it.Density positivity floor.
p_floorrealyes>= 0, otherwise fatal. 0 disables it.Pressure positivity floor. With both floors at 0, any non-positive density or pressure stops the run.

[gravity] (optional: external gravity and self-gravity) ​

A constant acceleration g (#73, milestone M7) and the self-gravity of the gas (#81, milestone M8). Without the section there is no gravity and nothing changes.

KeyTypeReq.Accepted / invalidMeaning
g_x, g_y, g_zrealone of the two formsany; each optional (default 0)The acceleration. Dimensional (length / time²) with [reference].
frouderealthe other form, with axis> 0, otherwise fatalThe number form: g=1/Fr2 along axis (gL0/u02 in the reference units; not converted by [reference]).
axisstringwith froude+x, -x, +y, -y, +z, -z; other → fatalThe signed direction of g.
equilibriumstringno (default none)none or atmosphere; other → fatal. atmosphere needs an isothermal-atmosphere, polytropic-atmosphere or rayleigh-taylor initial condition, and is fatal with [numerics] reflux_policy = troubled and on multi-realm runsThe well-balanced mode (M7-G2b): the initial atmosphere at rest (zero velocity, region 1's field, no pulse or seed) is kept to round-off. See below.
potentialstringno (default uniform)uniform or linear; other → fatal. linear is fatal with equilibrium = atmosphere and with self_gravityHow g reaches the sources. uniform: the constant acceleration in every kernel, with the fourth-order energy source. linear (#81, M8-P1): the same field written as the cell potential Φ = −g·x and applied through the potential path of self-gravity (face gravity −ΔΦ/Δx, second order); a test of that path (SV-1).
self_gravitylogicalno (default .false.)with it: equilibrium = atmosphere, potential = linear, multi-realm runs, immersed solids and a build without an FFT library (the *-fft modes) are fatal, and so are the boundaries poisson_bc cannot hold (below)Self-gravity (M8-P3): LhΦ=4πG(ρ−ρ¯) (periodic) or LhΦ=4πGρ, Φ→0 at infinity (isolated, M8-P4), solved every Runge–Kutta stage, applied through the potential path. See below.
Grealone of G, G_star with self_gravity> 0, otherwise fatal; fatal without self_gravity, and together with G_starThe gravitational constant. Dimensional with [reference].
G_starrealthe other formas GThe number Gρ0L02/u02; not converted by [reference].
poisson_solverstringno (default auto)auto, fft or multigrid; other → fatal. fft is fatal on an AMR gridauto: the FFT solver on a uniform grid, the multigrid solver on an AMR grid (leaves at more than one level, M8-P5b). fft: the library FFT solver only (FFTW on the CPU, cuFFT on FNL). multigrid: the multigrid solver on any grid (periodic, or isolated by the James step of #87), a check against fft on a uniform one.
poisson_bcstringno (default periodic)periodic or isolated; other → fatal. periodic is fatal with a non-periodic active direction; isolated is fatal in 2-D, with a periodic direction, with non-cubic cells, and on AMR grids with a leaf above the coarsest level on the domain boundary (at start or at the regrid that makes one, #87)periodic: every active direction periodic, the mean density removed. isolated (M8-P4): the free-space potential of the mass on the grid (Hockney–Eastwood zero padding with the lattice Green's function of Lh; on AMR grids the multigrid's symmetric James step, #87); the fluid boundaries are the [bc_*] ones, e.g. wall-inviscid for a closed box.

Giving g_* together with froude is fatal, as is a section with neither (unless self_gravity, where g defaults to 0).

g sets the isothermal-atmosphere and polytropic-atmosphere initial conditions and the hydrostatic boundary condition (M7-G0), and drives the sources (M7-G1):

  • momentum ρg; energy from the face mass fluxes the continuity equation uses, 124∑dgd(−Fd,i−3/2ρ+13Fd,i−1/2ρ+13Fd,i+1/2ρ−Fd,i+3/2ρ), so that with this static potential the total energy E+ρΦ (Φ=−g⋅x) is conserved exactly (Mikami et al. 2008, Mullen et al. 2021: each face's weights sum to one over the cells) with periodic boundaries and across block interfaces; at a wall-inviscid wall along g the source reads the mirrored face beyond the wall, and the exactly conserved total is ∑(E+ρΦ)V±∑gnΔxnρV/12 over the cells beside the wall (+ at the lower wall, − at the upper), which differs from the plain sum by O(Δx2). The fluxes of a finite-difference scheme are point values of the primitive function of ρu, not of ρu itself, so the two-face average 12(Fi−1/2ρ+Fi+1/2ρ) alone is a second-order cell value and takes the whole scheme to second order; the four-face form is fourth order (M7-G2a, verification). It reads the face beyond each block end, so gravity needs [grid] ngc >= S + 1 (S the WENO half-stencil, 3 for WENO-5; with weno-riemannmax(S,2)+1), fatal otherwise;
  • with positivity_limiter = cell, the limiter's first-order backbone takes the time-centred energy ρg⋅(u+gΔt/2), which leaves its internal energy unchanged, and limits the rest of the face form with the cell factor Λ: gravity never makes the backbone inadmissible (near vacuum, or with gΔt above the sound speed), and E+ρΦ stays exact wherever the limiter does not act;
  • with equilibrium = atmosphere (M7-G2b, the deviation method of Edelmann et al. 2021, §4.3), the residual of the atmosphere at rest is computed once per grid (at the first step, after a restart, after every regrid) with the run's own space operator and subtracted from every residual: the atmosphere is then an exact discrete steady state (round-off), on weno and weno-riemann, Euler and MHD, across AMR 2:1 seams (the equilibrium's reflux is folded into its residual), and a perturbation of it evolves without the stationary truncation flow of the unbalanced scheme (verification). It costs one more field (the stored residual) and one residual evaluation per grid. The subtracted residual is outside the positivity limiter's factor: it is the truncation error of the equilibrium, small against the state wherever the atmosphere is resolved;
  • no time-step limit: the first step logs |g|Δt2/(CFLhmin), at least the velocity gravity adds in a step over the fastest wave speed (near 1 or above, gravity is stiff);
  • refused (fatal) along a null direction and with immersed solids.

With self_gravity (models):

  • every Runge–Kutta stage solves Φ from that stage's density after the ghost update, with the library FFT solver: distributed over the z-planes of the transform array (#84 E5d; bitwise the same on every rank count), Φ returned with every ghost layer filled. Periodic: it divides each Fourier mode by the eigenvalue of the 7-point Laplacian Lh, so the discrete residual is round-off. Isolated: the density sits in a zero-padded array of 2(N+ngc) cells per direction and is convolved with the lattice Green's function of Lh, whose residual is about 10−13 per offset (scripts/lattice_green.py); the residual of Φ is that summed over the source, 2⋅10−11 of 4πGρ at 643, and the ghosts beyond the domain hold the free-space potential. The solve is serial on rank 0 and, on FNL, the density and Φ cross the host every stage: correct, not scalable;
  • on an AMR grid (M8-P5b) the multigrid solver (adam_poisson_mg_object) solves the composite Laplacian, whose 2:1 faces carry the mimetic mean flux (symmetric and consistent; SV-9): flexible CG preconditioned by a V-cycle, its coarsest level solved by the FFT solver of the backend; on FNL it runs on the host. The face gravity at a 2:1 face is the mean-flux one on both sides (first order there, the potential second order), and the gravity work across each seam rides on the reflux (below), so E+W stays exact in the semi-discrete form;
  • across a 2:1 face the reflux, which corrects the coarse cells once at the end of the step, also hands the coarse cell the seam's gravity work, so that summed over the cells the energy sources equal −W˙ exactly. Its stages, though, advance the coarse cells with their own seam fluxes: on AMR the drift of E+W is first order in Δt, not of the Runge–Kutta order (SV-10); with [numerics] reflux_cadence = stage the correction is made every stage and the drift is of the Runge–Kutta order again. reflux = .false. or reflux_policy = troubled leave the work uncorrected where they leave the flux;
  • under runtime AMR ([amr] frequency > 0, P5c) every regrid sets the solver up again on the new grid (the FFT solver when the grid is uniform, the multigrid otherwise) and solves Φ from the regridded state. The regrid conserves ρ, ρu and E, but W is the grid's own discrete energy: E+W jumps at every regrid that changes the grid, by a truncation-sized amount (2⋅10−4 of E+W on the SV-11 collapse at base 322);
  • the conservation history gains the columns W =12∑ρΦdV and E_plus_W, the energy the scheme conserves (each row solves Φ from the committed state);
  • the first step logs G, the free-fall time tff=3π/(32Gρmax) of the densest cell, Δt/tff (a warning above 0.1) and the wall time of one solve;
  • a constant g may be given too; it adds through its own kernels;
  • with positivity_limiter = cell, the limiter's gravity energy correction (above) acts on the potential path too: E+W stays exact only where the limiter does not act. A star in a light atmosphere (10−4 of its central density) needs the limiter at its surface and drifts by 2⋅10−3 of E+W over a free-fall time at 323, against 10−9 without it (the SV-7 and SV-8 cases use a 10−2 atmosphere, which runs without it);
  • build: flume-cpu-gnu-fft (FFTW 3, executable adam_flume_cpu_fft) or flume-fnl-nvf-fft (cuFFT, adam_flume_fnl_fft); the default modes refuse self_gravity at the first solve.

[cooling] (optional: optically thin radiative cooling) ​

The section switches on radiative cooling (#93, M11): ∂t(ρe)=−n2Λ(T) at fixed density and momentum, with n=ρ/m and T=p/(ρR). It is applied once per step, after the step, by Townsend's exact integration (numerics). Without the section nothing changes. The hydrodynamic models only (euler, euler-de, with or without passive scalars): with mhd-ideal it is fatal. CPU and FNL run the same rule and the same arithmetic.

KeyTypeReq.Accepted / invalidMeaning
temperatureslist of realsyes2 to 64 values (COOLING_NODES_MAX: the device kernels take fixed-size tables), all > 0, strictly increasing; otherwise fatalThe nodes T1<⋯<TN of the cooling function. T1 is the floor: below it nothing cools, and a cooling cell stops exactly at it.
lambdaslist of realsyesas many values as temperatures, all > 0; otherwise fatalΛk at the nodes. Λ is the piecewise power law through them, Λk(T/Tk)αk on [Tk,Tk+1]; above TN the last segment continues.
particle_massrealyes> 0, otherwise fatalThe mass m per particle of n=ρ/m (for nH: mH/X).
dt_factorrealno (0)>= 0, otherwise fatal0: off. Otherwise the step is also limited to dt_factor times the shortest cooling time tcool=ρe/(n2Λ), for runs that need the coupling of cooling and dynamics resolved (the cooling itself is exact for any step).

The values are in the units of the rest of the input: T uses the gas constant of [physics] (cp−cv, or 1 with gamma), so a table in kelvin needs cp, cv in J/(kg K) and Λ, m in the same unit system (with Λ in erg cm³ s⁻¹ and SI elsewhere, multiply Λ by 10−13). The [reference] layer converts the three keys (above). The conservation history gains two columns: radiated, the energy radiated since the start of the run (of this run segment: it restarts from 0 on a restart), and E_plus_radiated, which the scheme conserves.


[sinks] (optional: sink particles) ​

The section switches on sink particles (#94, M12): point masses that act on the gas through the self-gravity solve only (numerics). It needs [gravity] self_gravity = .true. and a hydrodynamic model (euler, euler-de, with or without passive scalars); otherwise it is fatal. CPU and FNL (on FNL, creation copies the state to the host every step: its checks run on the host). The keys list the initial sinks, one value each; their number is that of mass (none: the section with no initial sink).

KeyTypeReq.Accepted / invalidMeaning
masslist of realsno (no sink)all > 0; otherwise fatalThe sinks' masses.
x, y, zlists of realswith massas many values as mass, inside the domain; otherwise fatalThe positions.
u, v, wlists of realsno (0)as many values as mass; otherwise fatalThe velocities.
creationlogicalno (.false.)Sinks form where the gas passes the checks of Federrath et al. (2010) (numerics).
accretionlogicalno (.true.)Sinks accrete the gas above the threshold within their accretion radius.
merginglogicalno (.true.)Two bound, converging sinks within an accretion radius merge.
accretion_radius_cellsrealno (2.5)in [1, ngc]; otherwise fatalThe accretion radius racc in cells of the sink's level (with runtime regridding, [amr] frequency > 0, of the finest level allowed, where the sinks form and stay). The threshold density is ρthr=πcs2/(4Gracc2), a Jeans length of 2racc, with the cell's own cs2=γp/ρ.

The conservation history gains M_sinks, Px_sinks, Py_sinks, Pz_sinks and K_sinks (W then includes the sinks' mass), and <output_basename>-sinks_history.dat gets one row per sink per save (it time id m x y z u v w). Restart files carry <restart_basename>.sinks. A sink that leaves a closed domain is fatal.


[turbulence] (optional: algebraic subgrid-scale model) ​

A library section (#119, T1). Without it, or with sgs_model = none, nothing changes.

KeyTypeRequiredValuesMeaning
sgs_modelstringno (none)none, vreman, wale, sigma. Other → fatal.Eddy viscosity of the model (numerics).
sgs_constantrealno> 0, otherwise fatal; defaults 0.07 (Vreman: c=2.5Cs2), 0.5 (WALE), 1.35 (Sigma)Model constant. Taken from other discretizations, not calibrated on WENO.
prandtl_trealno (0.9)> 0, otherwise fatalTurbulent Prandtl number.

A model needs physical_model = euler or euler-de (fatal otherwise) and ngc >= 3 (fatal otherwise). It runs without a viscosity (viscosity = 0). It counts as a dissipative term, so the positivity limiter and immersed solids are refused with it. The turbulence history gains a last column, eps_sgs.

[forcing] (optional: mass-flow forcing of a periodic channel) ​

KeyTypeRequiredAcceptedMeaning
typestringno (none)none, mass-flow; other → fatalOnce per step a uniform momentum is added along axis so that the volume mean of the momentum is bulk_momentum; the total energy gains the change of kinetic energy. Euler only.
axisstringwith mass-flowx, y, zDirection of the flow.
bulk_momentumrealwith mass-flowTarget mean of the momentum along the axis.

The force per unit volume, the added momentum over the step, goes to <output_basename>-forcing_history.dat (header VARIABLES="it" "time" "f", then one row per save) on the conservation history cadence, in the output units of [reference]: at a statistically steady state its mean times the half height is the wall shear stress (issue #119, T3.1). A restart appends to it. Files written before the header existed have none.

[numerics] ​

KeyTypeReq.Accepted / invalidMeaning
scheme_spacestringyesweno (WENO flux splitting), weno-riemann (WENO interpolation + Riemann flux + high-order correction) or hybrid-kep-weno (central KEP flux where the Ducros sensor allows, weno elsewhere and at 2:1 seams, physical faces and forest seams; Euler, ngc >= 3, no limiter, no immersed solid, all fatal otherwise, #119). Other → fatal.Spatial operator. MHD at very low β (≲ 1e-3, e.g. the Balsara–Spicer blast): weno needs the positivity limiter at every step and breaks point symmetry at the grid scale; use weno-riemann with hlld where symmetry or backend agreement matter (#77, verification).
hybrid_thresholdrealno (0.2), only with hybrid-kep-weno> 0, otherwise fatalDucros sensor above which a cell keeps WENO (numerics).
hybrid_floorrealno (10−8), only with hybrid-kep-weno> 0, otherwise fatalFloor of the sensor denominator over (a/Δxmin)2. Not calibrated.
hybrid_jumprealno (0.1), only with hybrid-kep-weno> 0, otherwise fatalLargest relative density jump of a central cell. Not calibrated.
hybrid_skinstringno (weno), only with hybrid-kep-wenoweno, central-seams, central-bcs, central, otherwise fatalWhich block faces keep WENO on their skin: all that are not same-level; all but resolution jumps; all but boundaries and forest seams; none. The relaxed values are for measurement (verification). With central-bcs the sensor ghost at a forest seam is computed locally: not tested.
reconstruction_variablesstringyesWith weno: characteristic or conservative. With weno-riemann: characteristic or primitive. Other → fatal.Variables reconstructed (or interpolated) at the faces.
riemann_solverstringweno-riemannllf, hll, hllc, hlld. Other → fatal. By model: euler allows llf, hll, hllc; mhd-ideal allows llf, hll, hlld (fatal otherwise). Not read with weno.Face Riemann solver.
flux_correctionstringweno-riemann6th, 4th, none (2nd order). Other → fatal.Face-flux correction F^ = c1 F + c2 (f_i+f_i+1) + c3 (f_i-1+f_i+2).
flux_correction_sensorstringweno-riemannweno or none. Other → fatal.weno: the correction is switched off at faces where min_k w_k/d_k < 0.2 (fixed threshold FLUX_CORRECTION_SENSOR_TAU). none: always on.
refluxlogicalyeslogicalBerger–Colella reflux at AMR coarse-fine faces (and inter-realm seams). .false. is a diagnostic only: the run is then not conservative across 2:1 faces.
reflux_policystringnoalways, troubled (default always; any other value is fatal)With reflux = .true., which seam face cells the reflux corrects (#68 E1). always: every one, conservative to round-off. troubled: only those flagged in some stage of the step, by the positivity limiter (a blended seam face, issue #50) or by the WENO-5 sensor (the minimum weight ratio minkwk/dk of density, normal velocity or pressure across the face below 0.2, the weno-riemann flux-correction sensor); elsewhere the coarse flux stays, so smooth regions keep the accuracy of the high-order seam operators at the cost of conservation there (Sod c2f: mass drift 1.5⋅10−7, shock unchanged). The log reports the flagged face cells per step. CPU and FNL (E1b: the FNL backend gathers the seam cells' auxiliary variables to the host and flags them there). The default stays always (owner decision after E2: exact conservation); troubled is the switch that lets seam_restriction = lagrange6 with seam_ghost_fill = quintic keep sixth order across 2:1 seams with the reflux on (AO euler-tq), at the price of a bounded conservation drift (about 10−5 per period on the smooth vortex at N = 64, the reflux-off rate).
reflux_cadencestringnostep, stage (default step; any other value is fatal; stage is fatal on multi-realm runs)With reflux = .true., when the coarse cells are corrected (#81 P5c). step: once, at the end of the step, from the step's fluxes (Berger–Colella, the AMReX cadence). stage: at every Runge–Kutta stage the coarse seam cells' residual is corrected from that stage's fluxes, so every stage advances them with the restricted fine fluxes and the scheme is the conservative composite one at every stage. Both conserve to round-off; stage keeps the time integration's order where step leaves an O(Δt) inconsistency, e.g. the E+W of self-gravity on AMR (first order with step, third with stage: SV-10). Intra-realm 2:1 faces only; the exceptions of the step cadence (the equilibrium's mismatch, B under EGLM, troubled) apply per stage.
positivity_limiterstringno (default none)none or cell. Other → fatal. cell is fatal with [mhd] divergence_control = glm, a non-SSP [runge_kutta] scheme, immersed solids, multi-realm runs and any dissipative coefficient (issue #65, D-M4-5).cell: the cell-based positivity limiter (numerics): every face flux blended with the first-order Lax–Friedrichs backbone so that each stage keeps the density and the pressure positive; the limited faces are logged per stage.

| dissipative_order | int | no (default 4) | 2 or 4. Other → fatal; 4 needs [grid] ngc >= 3 (fatal otherwise). | Order of the dissipative face fluxes (issue #65, D-M4-2): 4 is the conservative 4th-order flux with the Shu–Osher correction, 2 the compact central one (numerics). An ideal run ignores it. |


[bc_x_min], [bc_x_max], [bc_y_min], [bc_y_max], [bc_z_min], [bc_z_max] ​

All six sections are required, even along null directions.

KeyTypeReq.Accepted / invalidMeaning
typestringyes (every face)extrapolation, inflow, inflow-digital-filter, non-reflecting, shock-generator, wall-inviscid, wall-noslip, wall-isothermal, wall-modelled, periodic, hydrostatic. Other → fatal. The two faces of an axis must be both periodic or neither (fatal).See the list below.
r, u, v, w, prealtype = inflowno range checkPrescribed primitive inflow state.
bx, by, bzrealtype = inflow and mhd-idealno range checkPrescribed inflow magnetic field. psi is set to 0.
s1 .. sNrealno (type = inflow with passive_scalars = N)default 0, no range checkSpecific values (mass fractions) of the passive scalars of the inflow.
wall_u, wall_v, wall_wrealno (default 0) with wall-noslip, wall-isothermalthe component normal to the face must be 0 (fatal)Velocity of the wall (tangential): a moving lid, a Couette wall.
wall_temperaturerealtype = wall-isothermal> 0, otherwise fatalWall temperature, T=p/(ρR) in code units.
wall_temperature with wall-modelledrealyes> 0, otherwise fatalAn isothermal wall whose face flux comes from a wall model (numerics), sampled at the 3rd cell off the wall; the ghosts mirror as wall-inviscid. Euler with a viscosity and a prandtl only, 3 cells per block along the normal.
wall_model with wall-modelledstringno (equilibrium)equilibrium, inverse-transformation; other → fatalThe equilibrium thin-layer model, or the inverse-velocity-transformation model of Griffin, Fu & Moin (2023), which needs the two edge keys below.
wall_model_height with wall-modelledrealno (0)>= 0Matching height, a length; 0 samples the 3rd cell. Otherwise interpolated between the cells around it, within the block (beyond it, its last cell). The literature matches at 0.1–0.3 of the boundary-layer thickness with at least 3 cells below (numerics).
wall_model_damping with wall-modelledstringno (classical)classical, semi-local; other → fatal; given with wall_model = inverse-transformation → fatalVan Driest damping of the equilibrium model in wall units, or with the local density and viscosity.
wall_model_filter with wall-modelledrealno (0)>= 0Time scale Tf of an exponential filter of the sampled velocity, pressure and density, updated once per step with weight min(Δt/Tf,1); 0 for none (numerics).
wall_model_eddy_viscosity with wall-modelledlogicalno (.false.)The model's eddy viscosity in the cells below the matching height, so the resolved layer carries the modelled stress and heat flux to the face (numerics).
r, u, p with inflow-digital-filterrealyes> 0, otherwise fatalFree-stream density, speed along the inward normal, pressure. Euler only, one such face per realm.
df_profilestringwith inflow-digital-filterfile must exist, 7 numbers per row, y increasing, T>0 (fatal)The layer table: y / delta, U / U_inf, T / T_inf, R_uu, R_vv, R_ww, R_uv in units of U∞2 (v wall-normal, w spanwise), # comments; the free stream beyond its last row. tbl_oracle.py profile writes it from a DNS station file.
df_delta, df_spacingrealwith inflow-digital-filter> 0Layer thickness (the table's unit of y); spacing of the filter plane, about the grid's.
df_wall_axisstringwith inflow-digital-filterx, y, z, not the face normal (fatal)Wall-normal axis, the wall on its minimum side; the span is the third axis (wrapped when periodic).
df_length_streamwise, df_length_normal, df_length_spanwiserealwith inflow-digital-filter> 0Integral lengths in units of df_delta; the streamwise one becomes the time scale Lx/U∞.
df_seedintegerno (1)Seed of the random stream (the same plane on every rank).
r, u, v, w, p with non-reflectingrealyesr, p > 0 (fatal)The target state: its pressure is the one the face relaxes to, its entropy and tangential velocity those of flow entering through it. Euler only (no dual energy, no passive scalars).
nr_lengthrealwith non-reflecting> 0 (fatal)L of the relaxation K=σ(1−M2)c/L, a length of the domain.
nr_sigmarealno (0.28)>= 0 (fatal)σ: 0 is extrapolation at an outflow; larger holds the pressure faster and reflects more.
r, u, v, w, p with shock-generatorrealyesr, p > 0; supersonic in the x-y plane (fatal)The state upstream of the shock. Euler only, bc_y_min and bc_y_max only.
shock_deflection, shock_anglerealexactly one, with shock-generatordegrees; 0<θ< detachment, μ<β≤90 (fatal)The flow turning (the weak shock) or the shock angle from the upstream velocity.
shock_x, shock_x_endrealshock_x yes, shock_x_end no (no end)shock_x_end > shock_x (fatal)Where the shock enters: the ghosts with shock_x ≤x< shock_x_end hold the post-shock state, the others are extrapolated.
wall_model_edge_velocity, wall_model_edge_temperaturerealwith wall_model = inverse-transformation> 0, otherwise fatalSpeed and temperature at the edge of the layer (the free stream; the centreline of a channel), constants of the run.

What each type does:

  • extrapolation: zeroth-order extrapolation.
  • inflow: prescribed state.
  • non-reflecting (#121 S2): characteristic outflow and far field, the incoming acoustic wave relaxed toward the target pressure (boundary conditions).
  • shock-generator (#121 S3): the post-shock state of an oblique shock in a range of x on a y face, extrapolation elsewhere (boundary conditions).
  • inflow-digital-filter (#119, T3.7): a turbulent boundary layer through the face, the table's mean plus fluctuations of its Reynolds stresses from the digital filter of Klein, Sadiki & Janicka in the form of Touber & Sandham and Xie & Castro (numerics). The plane state is saved with the restart (<restart_basename>.dff), so a restart continues bit for bit; without the file it starts a fresh field (warned).
  • wall-inviscid: slip wall (mirror state with the normal momentum negated; for MHD the normal B is negated too).
  • wall-noslip: adiabatic no-slip wall (the velocity reflected about the wall velocity, the temperature mirrored).
  • wall-isothermal: isothermal no-slip wall (the velocity as above, the ghost temperature Tw2/T, the geometric mirror). See Boundary conditions.
  • periodic: library periodicity, so true periodic neighbours across blocks and ranks.
  • hydrostatic (#73): closes a stratified atmosphere under [gravity]. The ghost density and pressure continue the isothermal hydrostatic equilibrium from the first interior cell along the normal, ρg=ρ1exp⁡(gds/T1), pg=ρgT1 (T1=p1/ρ1, s the signed distance from that cell to the ghost), so an isothermal atmosphere has exact ghosts. The velocity is mirrored with its normal component negated (no mass flux). The field and psi are mirrored even: field lines pass through the boundary, so a uniform field along or across gravity stays uniform (a reflecting conductor is wall-inviscid). Without gravity along the normal it is a slip wall that copies the thermodynamic state of the first interior cell.

In a forest, a face glued to another realm by the manifest still needs a type here. The seam overrides the ghost fill.


[initial_conditions] ​

amr_iterations and type are always required. The other keys depend on type, and every key the selected type uses is required (fatal "failed to load" otherwise).

KeyTypeReq.Accepted / invalidMeaning
amr_iterationsintyesNegative values are clamped to 0.Number of initial-condition + AMR passes (each pass: set IC, run the markers). > 0 requires even ni/nj/nk.
typestringyesSee the table below. Other → fatal.Initial condition kind.
regions_numberintriemann-problem>= 1, otherwise fatal. Ignored by the other types (they fix the count).Number of [initial_conditions_region_N] sections.

Accepted type values and their extra keys ​

typeModelRegions readExtra [initial_conditions] keys (all real unless stated) and checks
uniformany1s: signed relative amplitude of a deterministic hashed perturbation of rho and p.
boundary-layereuler0bl_profile (the table of df_profile), bl_delta, bl_rho, bl_u, bl_p (free stream), bl_wall (default 0): the table's mean profile over a wall at y = bl_wall, flow along +x, uniform along x and z, the density ρ∞T∞/T (issue #119, T3.7).
channeleuler0ch_rho, ch_ub (bulk velocity), ch_mach (on the wall sound speed), ch_h (half height; the walls at y=±h), ch_lx, ch_lz, ch_pert (amplitude over ch_ub): the laminar profile 32Ub(1−η2), uniform density and pressure, and a deterministic perturbation vanishing at the walls (issue #119, T3.1).
isentropic-vortexeuler (fatal otherwise)1 (free stream)x0, y0, radius (> 0), strength; optional shock_x: past it the post-shock state of a stationary shock, region 1 its supersonic upstream state with u>0.
isotropic-turbulenceeuler, euler-de (fatal otherwise)0hit_density, hit_urms, hit_mach, hit_k0 (all > 0), hit_seed (default 1). Decaying compressible isotropic turbulence (Johnsen et al. 2010): uniform density and pressure, Mt=3urms/c0, a solenoidal velocity of spectrum E(k)∝(k/k0)4e−2(k/k0)2 on the integer wavevectors up to 3k0, random phases from the seed: the same field on any rank count or resolution. The box [0,2π]3, its periodicity and that 3k0 is resolved are the input's: not checked (#119).
taylor-greeneuler, euler-de (fatal otherwise)0tg_density, tg_velocity, tg_mach (all > 0), tg_length (default 1). The compressible Taylor–Green vortex of DeBonis (2013), at uniform temperature. The box [0,2πL]3 and its periodicity are the input's: not checked (#119).
riemann-problemanyregions_numberregions_number. Each region also needs extents (see the next section). Every cell must be covered by a region (fatal otherwise, at set time), and the first matching region wins.
glm-pulsemhd-ideal1pulse_axis (string x/y/z, fatal otherwise), pulse_center, pulse_width (> 0), pulse_amplitude.
divb-peakmhd-ideal1peak_x0, peak_y0, peak_radius (> 0), peak_amplitude.
mhd-linear-wavemhd-ideal1wave (string fast/alfven/slow/entropy, fatal otherwise), wave_angle (degrees, x-y plane), wave_amplitude, wavelength (> 0).
mhd-cpawmhd-ideal1 (u, v, w, bx, by, bz must be 0, fatal otherwise)polarisation (string right/left, fatal otherwise), wave_angle, wave_amplitude, wavelength (> 0), b_par (/= 0).
mhd-vortexmhd-ideal1 (bx, by must be 0, fatal otherwise)x0, y0, radius (> 0), kappa, mu.
orszag-tangmhd-idealnoneNo extra keys. The unit-period Orszag–Tang state is hard-coded (gamma comes from [physics]).
mhd-rotormhd-ideal1 (ambient)x0, y0, r0, r1 (0 < r0 < r1), rho_in (> 0), v0.
field-loopmhd-ideal1x0, y0, loop_radius (> 0), loop_amplitude.
rotated-riemannany2 (states given in the normal frame: u, bx normal; v, by tangential)normal_x, normal_y (not both 0), interface_1, interface_2, period (> 0), interface_2_width (>= 0). Requires interface_1 < interface_2 and interface_2 + interface_2_width < interface_1 + period, fatal otherwise.
shu-oshereuler2axis (string x/y/z), interface, rho_amplitude, rho_wavenumber. Requires rho_amplitude < region_2 r. Region 1 applies where s <= interface; region 2 applies elsewhere, with r + rho_amplitude * sin(rho_wavenumber * s).
linearany1gradient_x, gradient_y, gradient_z (inverse length). Every conservative variable is q_1 (1 + g . x), q_1 the state of region 1: the verification field of the ghost probe (issue #65 P0), not a flow.
isothermal-atmosphereany1 (the state at the origin; its velocity and field uniform)Needs [gravity] (fatal otherwise). Optional, both atmospheres: a relative pressure pulse $p(1 + A e^{-
polytropic-atmosphereany1 (as above)polytropic_gamma G>1 (fatal otherwise); needs [gravity]. p=p1(ρ/ρ1)G, ρ=ρ1s1/(G−1), s=1+G−1Gρ1p1g⋅x; fatal where s≤0 (the top of the atmosphere inside the domain).
rayleigh-taylorany1 (the light layer: Tl=p1/ρ1, p1 the pressure at the interface; its field uniform)Needs [gravity] along one axis (fatal otherwise). rt_height h0 (along −g, $h = -\mathbf g\cdot\mathbf x/
polynomialany1gradient_x, gradient_y, gradient_z, degree (an integer n≥1). Every conservative variable is q_1 (1 + sum_d g_d x_d^n): the ghost probe's field for the high-order seam operators (#68 D1), not a flow. Fatal under a non-dimensional reference (g_d has dimension L−n).
bonnor-eberteuler, [eos] type = isothermal1 (its velocity)Needs [gravity] self_gravity. be_density ρc (> 0, required), be_x0, be_y0, be_z0 (default 0), be_overdensity f (> 0, default 1). ρ=fρce−ψ(r/r0), r0=c0/4πGρc, ψ the isothermal Lane–Emden function (#100 P4).
boss-bodenheimereuler, [eos] isothermal or barotropic1 (the ambient medium)Needs [gravity] self_gravity. bb_radius R, bb_density ρ0 (> 0, required), bb_omega Ω (required), bb_amplitude A (default 0.1), bb_x0, bb_y0, bb_z0 (default 0). Inside R: ρ=ρ0(1+Acos⁡2ϕ), solid-body rotation Ωez×(x−x0) (P4).

Five more types are accepted and documented, with their keys, in initial conditions: sine-wave, couette, becker-shock, polytrope and singular-isothermal-sphere. A model mismatch (for example glm-pulse with euler) is fatal. The complete formulas are in the module header. With [eos] type = isothermal or barotropic only uniform, riemann-problem, rotated-riemann, sine-wave, linear, polynomial, shu-osher and boss-bodenheimer are accepted (with isothermal also singular-isothermal-sphere and bonnor-ebert; with mhd-ideal also glm-pulse, divb-peak, mhd-linear-wave without the entropy wave, mhd-cpaw, mhd-rotor and field-loop), and the regions need no p.

[initial_conditions_region_N] ​

N runs over the regions the selected type reads (see the table above).

KeyTypeReq.Meaning
r, u, v, w, prealyesPrimitive state (density, velocity, pressure). No positivity check.
bx, by, bzrealmhd-idealMagnetic field. psi starts at 0.
s1 .. sNrealno (passive_scalars = N)Specific values (mass fractions) of the passive scalars, default 0. Each cell takes those of the first region whose box holds its centre; the closed-form types (vortex, Shu–Osher, ...) take region 1's everywhere.
emin_x, emin_y, emin_z, emax_x, emax_y, emax_zrealtype = riemann-problem onlyRegion box. A cell belongs to it iff emin < centre <= emax on every axis.

[time] ​

Every key is required, and none has a range check.

KeyTypeReq.Meaning
it_maxintyes> 0: stop after it_max steps (iteration-driven). <= 0: time-driven run.
time_maxrealyesEnd time (time-driven runs). The last step is clipped to hit it.
CFLrealyesCFL number (note the upper-case key).

[diagnostics] ​

KeyTypeReq.Meaning
conservation_history_saveintyesCadence (steps) of <output_basename>-conservation_history.dat (volume integrals of every conservative variable). For MHD it is also the cadence of -divb_history.dat and of the divb_tol monitor. <= 0 disables them.
ghost_poisonlogicalno (.false.)Verification instrument (issue #65): before each field write every ghost cell is set to NaN and refilled in the order of a stage (seams, exchange, boundary conditions), so a ghost the fill misses, or reads before its donor is written, is written as NaN instead of a stale value. Used by the ghost probe GP; it costs one pass over the ghosts per write.
divb_fluxlogicalno (.false.)MHD with GLM or EGLM (#68 A2): adds four columns to -divb_history.dat (max_dflux, l1_dflux, seam_max_dflux, max_h_dflux_over_bmax). D_flux is the divergence the cleaning acts on: that of the interface normal field Bn=Fψ/s read from the scheme's own ψ face fluxes (s=ch2 GLM, ch EGLM), the coarse 2:1 faces taking the fine fluxes (the reflux), so its integral over a composite periodic domain is round-off. The last column is the scale-free $\max(h,
turbulence_history_saveintno (0, disabled)Cadence (steps) of <output_basename>-turbulence_history.dat: volume integrals K (ρ|u|2/2), Z (ρ|ω|2/2), eps_s (μ|ω|2), eps_d (43μθ2), eps (τij∂jui), pd (pθ), from 4th-order central velocity gradients, not divided by the volume, in the output units of [reference] (K an energy ρ0u02L03, Z ρ0u02L0, the others a power ρ0u03L02). In a periodic box $dK/dt = $ pd − eps, up to the scheme's numerical dissipation. Needs ngc >= 2. On a forest of several realms there is no step-0 row: the seams are not built yet. Each row refreshes the ghosts and the auxiliary variables of the committed state (#119).
wall_history_saveintno (0, disabled)Cadence (steps) of <output_basename>-wall_<face>_history.dat, one file per wall-modelled face: it, time, then the wall shear stress along wall_history_axis (positive for a drag of a flow along +axis) and the wall heat flux (kdT/dy at the wall, positive when the gas is hotter), each area-averaged over the face cells in wall_history_bins equal bins along the axis; code units, appended on restart. The model is evaluated on the committed state at its sample with the solvers the face fluxes use, so it is the stress the solver applies (with wall_model_filter, the unfiltered one) (#119 T3.7).
wall_history_binsintwith wall_history_saveBins along the axis, >= 1 (fatal otherwise).
wall_history_axisstringno (x)x, y or z, not the normal of a modelled face (fatal).

Forest manifest (multi-realm) ​

A multi-realm FLUME run reads a forest manifest, documented in the library input reference; every [realm.N] points at a full FLUME input of the form documented here. Each realm regrids by its own [amr] section, balanced across the seams by the forest (see [amr] above and the forest); a forest restarts on the rank count it was saved with.


Complete example 1: Euler, Sod shock tube (verbatim) ​

The file is src/tests/flume/verification/sod/sod-x.ini, copied without changes.

ini
; FLUME verification V1 (issue #35, section 11): Sod shock tube along x, 1-D (the other directions are null).
; 64 blocks, four along x (200 cells); the 8 sibling groups split 32/32 over two ranks (the library never splits a
; sibling group, so one refinement level would leave a rank empty). WENO-5 characteristic, SSP-33, CFL 0.5, t = 0.2.
; check.sh compares density with the exact Riemann solution (L1 bound) and the three directions with each other (bitwise).
[IO]
output_basename        = sod-x
it_save                = 100000
restart                = .false.
restart_basename       = sod-x-restart
restart_save           = 0
residuals_save         = 1
save_memory_status     = .false.
save_residual_fields   = .false.
save_auxiliary_fields  = .false.
save_curl_fields       = .false.
save_divergence_fields = .false.
save_gradient_fields   = .false.
save_laplacian_fields  = .false.

[grid]
ni     = 50
nj     = 4
nk     = 4
ngc    = 3
emin_x = 0.0
emin_y = 0.0
emin_z = 0.0
emax_x = 1.0
emax_y = 1.0
emax_z = 1.0
null_x = .false.
null_y = .true.
null_z = .true.

[amr]
max_level      = 2
ratio          = 8
iu_ref_levels  = 2
i_prune        = 0
j_prune        = 0
k_prune        = 0
l_prune        = -1
frequency      = 0
iters          = 1
markers_number = 0

[field]
nv = 5

[runge_kutta]
scheme = runge-kutta-ssp-33

[weno]
scheme              = weno-u-5
ror_number          = 0
ror_threshold       = 0.9
ror_vars_number     = 0
enable_ror_stats    = .false.
ib_reduction_extent = 0
ib_reduced_order    = 2

[fdv]
fdv_scheme = fd
fdv_order  = 2

[solids]
number    = 0
n_eikonal = 0

[slices]
slices_number = 0

[physics]
physical_model = euler
cp             = 1040.004
cv             = 742.86

[numerics]
scheme_space             = weno
reconstruction_variables = characteristic
reflux                   = .true.

[bc_x_min]
type = extrapolation
[bc_x_max]
type = extrapolation
[bc_y_min]
type = extrapolation
[bc_y_max]
type = extrapolation
[bc_z_min]
type = extrapolation
[bc_z_max]
type = extrapolation

[initial_conditions]
type           = riemann-problem
regions_number = 2
amr_iterations = 0

[initial_conditions_region_1]
r      = 1.0
u      = 0.0
v      = 0.0
w      = 0.0
p      = 1.0
emin_x = 0.0
emin_y = 0.0
emin_z = 0.0
emax_x = 0.5
emax_y = 1.0
emax_z = 1.0

[initial_conditions_region_2]
r      = 0.125
u      = 0.0
v      = 0.0
w      = 0.0
p      = 0.1
emin_x = 0.5
emin_y = 0.0
emin_z = 0.0
emax_x = 1.0
emax_y = 1.0
emax_z = 1.0

[time]
it_max   = -1
time_max = 0.2
CFL      = 0.5

[diagnostics]
conservation_history_save = 1

Annotations for the Sod input ​

  • Grid and block count. With ratio = 8 and iu_ref_levels = 2 the domain is split into 8^2 = 64 blocks of 50 x 4 x 4 cells. The run is 1-D: null_y and null_z make y and z inactive, so there are 4 blocks along x and 200 cells in total along x.
  • it_save = 100000. This is effectively "first and last step only", because the last step is always saved.
  • restart_save = 0 and residuals_save = 1. Restarts are disabled, and the residual history is written every step.
  • Keys FLUME ignores. [field] nv, fdv_scheme and the ror_*/ib_* keys of [weno] are ignored by FLUME. All of them except [field] must still be present.
  • Riemann-problem regions. The regions tile x at 0.5: region 1 owns 0 < x <= 0.5 and region 2 owns 0.5 < x <= 1. The domain minimum corner is covered because emin is the domain minimum and cell centres are strictly larger.

Complete example 2: ideal MHD with GLM, Orszag–Tang vortex with a 2:1 AMR box (verbatim) ​

There is no committed INI under src/tests/flume/verification/mhd/orszag-tang/. check.sh generates the input with make_orszag_tang.py from verification/vortex/vortex-n064.ini. The file below is copied without changes from the generated (git-ignored) src/tests/flume/verification/mhd/orszag-tang/work-adam_flume_cpu-np2-amr/orszag-tang.ini (written 2026-09-29, --cells 32 --refine-box 0.25 0.25 0.75 0.75). It is written by Python configparser, which explains the section order and the spacing.

ini
[IO]
output_basename = orszag-tang
it_save = 1000000
restart = .false.
restart_basename = vortex-n064-restart
restart_save = 0
residuals_save = 1
save_memory_status = .false.
save_residual_fields = .false.
save_auxiliary_fields = .false.
save_curl_fields = .false.
save_divergence_fields = .false.
save_gradient_fields = .false.
save_laplacian_fields = .false.

[grid]
ni = 8
nj = 8
nk = 4
ngc = 3
emin_x = 0.0
emin_y = 0.0
emin_z = 0.0
emax_x = 1.0
emax_y = 1.0
emax_z = 1.0
null_x = .false.
null_y = .false.
null_z = .true.

[amr]
max_level = 3
ratio = 8
iu_ref_levels = 2
i_prune = 0
j_prune = 0
k_prune = 0
l_prune = -1
frequency = 0
iters = 1
markers_number = 1

[field]
nv = 9

[runge_kutta]
scheme = runge-kutta-ssp-54

[weno]
scheme = weno-u-5
ror_number = 0
ror_threshold = 0.9
ror_vars_number = 0
enable_ror_stats = .false.
ib_reduction_extent = 0
ib_reduced_order = 2

[fdv]
fdv_scheme = fd
fdv_order = 2

[solids]
number = 0
n_eikonal = 0

[slices]
slices_number = 0

[physics]
physical_model = mhd-ideal
cp = 2.5
cv = 1.5

[numerics]
scheme_space = weno
reconstruction_variables = characteristic
reflux = .true.

[bc_x_min]
type = periodic

[bc_x_max]
type = periodic

[bc_y_min]
type = periodic

[bc_y_max]
type = periodic

[bc_z_min]
type = extrapolation

[bc_z_max]
type = extrapolation

[initial_conditions]
type = orszag-tang
amr_iterations = 1

[time]
it_max = -1
time_max = 0.5
CFL = 0.4

[diagnostics]
conservation_history_save = 1

[mhd]
divergence_control = glm
divb_tol = 0.0
divb_error = .false.
rho_floor = 0.0
p_floor = 0.0
glm_ch = 4.0
glm_alpha = 0.18
glm_damping_length = 1.0
glm_ch_check = error

[amr_marker_1]
mode = 1
geo_type = primitive-box
delta_type = max
delta_fine = 0.0
delta_coarse = 0.0
box_xmin = 0.25
box_ymin = 0.25
box_zmin = -1e+30
box_xmax = 0.75
box_ymax = 0.75
box_zmax = 1e+30
target_level = 3

Annotations for the Orszag–Tang input ​

  • Physics. cp/cv = 5/3. divergence_control = glm gives nv = 9 (psi); [field] nv = 9 is ignored.
  • Time step and cleaning speed. glm_ch = 4 enters the time step. glm_ch_check = error stops the run if a fast wave ever outruns c_h.
  • Monitors and floors. divb_tol = 0 disables the div(B) monitor (on the normalised D_flux, which needs [diagnostics] divb_flux), but -divb_history.dat is still written every step. Both floors are 0, so a non-positive density or pressure is fatal.
  • Grid. The base grid is 4 x 4 blocks (iu_ref_levels = 2 on a quasi-2-D octree, with z null) of 8 x 8 cells, i.e. 32² cells. ni and nj are even, as amr_iterations = 1 requires.
  • Refinement. amr_iterations = 1 runs one pass of the single marker. The marker is mode = 1 + geo_type = primitive-box: it refines the blocks whose centroid lies in [0.25, 0.75]^2 to level 3, one level above iu_ref_levels, capped by max_level = 3. delta_type, delta_fine and delta_coarse are required but unused for a box.
  • Boundaries and IC. x and y are periodic (both faces of each axis). The IC has no region sections.
  • Restart basename. restart_basename = vortex-n064-restart is inherited from the base input. It is harmless here because restart_save = 0.

Derived output fields ​

Both groups are written to the XH5F output only when [IO] save_auxiliary_fields = .true.. The key is required. The auxiliary variables are recomputed on the host from the saved q, including ghost cells. The derived MHD group is written only for the MHD models.

save_simulation_data calls save_xh5f(with_ghost=.true.), so field files include the ghost cells. In a forest the inter-realm seam ghosts are refilled before the write, then the intra-realm ghosts and the boundary conditions (the order of a Runge-Kutta stage), so the written ghosts are those the stencils read; the step-0 file, written while each realm initialises and before the forest connects them, holds unfilled seam ghosts.

Auxiliary variables ​

nameindexEulerMHD
rhoIA_Rρρ
u, v, wIA_U..IA_W(ρu)/ρ, …same
pIA_P(γ−1)(E−12ρ|u|2)(γ−1)(E−12ρ|u|2−12|B|2)
TIA_Tp/(ρR), with R=cp−cvsame
HIA_H(E+p)/ρ(E+p+12|B|2)/ρ, which includes the magnetic pressure
aIA_Aγp/ργp/ρ (the sound speed, not the fast speed)
Bx, By, BzIA_BX..IA_BZ—copies of Bx,By,Bz (capitalised to avoid clashing with the conservative bx, by, bz)
sIA_Seuler-de: (ρs)/ρ, the advected entropy per unit mass—
s1 .. s4after IA_Spassive scalars: (ρsk)/ρ, all four written whatever passive_scalars—

With [eos] type = isothermal or barotropic (no energy equation): p =P(ρ), T =P/(ρR), a =dP/dρ and H =0.

The conservative variables are named r, ru, rv, rw, rE [, rs] [, rs1 .. rs4] (Euler) or r, ru, rv, rw, rE, bx, by, bz [, psi] (MHD), and the residuals dq_<name>. With an inert energy (isothermal, barotropic) rE is carried and stays 0.

MHD derived fields ​

namedefinitionwhere
ptp+12|B|2 (total pressure, rationalised units)every cell, ghosts included
beta2p/|B|2, or huge(1._R8P) ≈1.8×10308 where |B|2=0every cell
bmag|B|=Bx2+By2+Bz2every cell
divb∑dwdδdBd (signed; see below)interior only, zero in the ghost cells

Here |B|2 is summed in plain x,y,z order, not through mhd_sum3.

Discretisation of divb. Each δd is the library centred first derivative, δB=1Δ∑m=1scm,s(Bi+m−Bi−m). The coefficients are:

sordercm,s
1212
24812,−112
364560,−960,160
. The half stencil is s = fdv_half_stencils(1) = [fdv] fdv_order / 2,
so the formal order equals fdv_order. Every FLUME test input sets fdv_order = 2, which gives
(Bi+1−Bi−1)/(2Δx).

Two further rules apply:

  • Null directions are weighted wd=0.
  • The scheme is always FD-centred, even when [fdv] fdv_scheme = fv.

The operator is the same one used by the div(B) history kernels, compute_divb_norms_dev. Those kernels report max|∇⋅B|, ∑|∇⋅B|ΔV and a seam-band maximum, and cap s at HS_MAX = 3. The CPU history also requires s≤ngc. The output path has no such cap or check.