Members · Solver Reference · Tier-2

Tier-2 GPU-AMR-CFD

Publication-grade consequence physics on AMReX block-structured AMR with the Pele suite. This page is organised by physics first (geometry, turbulence, radiation, combustion, soot, transport, …), then the solver stack that delivers it (AMReX / Pele family, adapter layer, AMR & time stepping, custom patches), and finally how those pieces compose into the scenario solvers (dispersion, fire, gas explosion, BLEVE, cryogenic, toxic). Numerical methods and non-default options sit with the physics or the layer that owns them.

Solver root: solvers/{dispersion,fire,explosion,bleve,toxic,cryogenic,radiation}/ Externals: AMReX · AMReX-Hydro · PeleLMeX · PeleC · PeleMP · PelePhysics · Hypre Build: CPU OMP=2 (dev) · CUDA A100 (prod) Status: Phase 2 ≈ 75% (dispersion) · Phase 3 ≈ 15% (radiation matured standalone)
Validated cases
19/20
Hanna FB / NMSE / FAC2 vs PG, NIST, CODASC, Henson, Hsu-Farmer …
Custom patches
5
aux-LES · D(x) ramp · turb clamp · PDR L · turb LP-filter
Geometry models
3
EB cut-cell · Brinkman + IBM · PDR sub-grid (composable)
Radiation modes
4 + 1
MC full-field · MC monitor · MC hemisphere · MC qinc · P1
implemented default research mode (accurate · slow) custom patch draft / partial upcoming known limitation model class
One code base, two operating points. AgniKawach is a single solver tree. The physics models below are all available in every deployment — V&V studies, customer runs, and internal benchmarks share the same binary. Choices that trade speed for fidelity (cut-cell EB, dense Monte Carlo ray counts, fine AMR) are tagged research mode. They are routinely enabled in V&V to improve quality and tighten the production defaults.
I
Part I
Solver stack
Seven external libraries plus an in-repo adapter layer. Each layer's numerical method, role in the Tier-2 pipeline, and the non-default knobs that affect AgniKawach's runs.
1.1 · Stack

Stack diagram & isolation boundary

Pele/AMReX headers are imported only inside solvers/adapters/*.hpp — everything else calls through AK:: namespace types, so upstream API breaks touch the adapter, not the whole tree. All externals are pinned to PeleProduction-validated commits and Renovate-tracked.

External · Mesh
AMReX
Block-structured AMR · MultiFab data · MLMG geometric multigrid · ParmParse · CUDA / HIP / OMP backends.
External · Advection
AMReX-Hydro
Godunov MOL/PLM/PPM · mass-conservative redistribution near EB cut cells.
External · Low-Mach
PeleLMeX
Variable-density low-Mach NS; SDC time integration; nodal & MAC pressure projections; LES.
External · Compressible
PeleC
Compressible reactive flow; Riemann-solver hyperbolic update; will host explosion + BLEVE blast wave.
External · Lagrangian
PeleMP
Multi-phase / spray particles; KIVA-style droplet evaporation. Cryogenic LNG path.
External · Physics
PelePhysics
EOS · transport · TurbInflow (HIT) · CHEMKIN-format mechanisms. Constant-transport mode used for dispersion.
External · Linear
Hypre v2.28
No-MPI user-local build. Bottom solver for stiff MLMG cases (urms ≥ 0.6, gravity coupled).
1.2 · Stack

AMReX

AMReX — block-structured AMR core
implementedmesh + linear
Mesh
Block-structured AMR with refinement ratio 2; level-by-level grid hierarchies; box-centred MultiFab data structure.
Numerical method
MLMG geometric multigrid for elliptic solves (V-cycle default; W-cycle / semi-coarsening selectable).
Particle
ParticleContainer (used by PeleMP spray adapter).
Backends
OpenMP (dev box) · CUDA (A100 prod) · HIP (future ROCm). MPI off in dev; single-rank only.
I/O
HDF5 / native plotfile binary; checkpoints & plotfiles share format.

Non-default options

  • amrex.fpe_trap_invalid = 1 — FPE trap on dev builds
  • amrex.use_gpu_aware_mpi = 0 — enable when MPI returns to prod
  • amrex.regtest_reduction — deterministic reductions for V&V
1.3 · Stack

AMReX-Hydro

AMReX-Hydro — advection
implementedFV advection
Schemes
Godunov with PLM (2nd-order) or PPM (4th-order) reconstruction; MOL (Method-of-Lines) used near EB cut faces.
EB redistribution
State + flux redistribution; small-cell merging preserves global conservation.
Compatibility check
CI runs solvers/tools/check_hydro_compatibility.py on every submodule bump — catches AMReX-Hydro / AMReX API drift before merge.
1.4 · Stack

PeleLMeX

PeleLMeX — low-Mach reactive Navier-Stokes
implementedlow-Mach

The flow engine for dispersion (Phase 2) and fire (Phase 3). Variable-density low-Mach formulation; passive scalar dispersion is handled via the auxiliary-variable transport hooks.

Time integration
SDC (Spectral Deferred Correction). Default 2 corrector iterations. Used in V&V; production may drop to 1 corrector once accuracy parity holds.
Pressure projection
Approximate-projection MAC (face-centred) + nodal projection; geometric MLMG bottom solver, optional Hypre.
Advection
AMReX-Hydro Godunov PPM (default).
Diffusion
Implicit Crank-Nicolson, MLMG.
Reactions
Stiff CVODE (PelePhysics ReactorCvode) when do_react = 1.
LES
Smagorinsky default; aux-LES wired by patch 0001.
Subcycling
Level-by-level subcycling (PeleLMeX default).

Non-default options

  • peleLM.sdc.nIter = 2
  • peleLM.do_react = 0 — 1 for fire/explosion
  • peleLM.do_temporals = 1 — time-series probes
  • peleLM.steady_state_atol — early-stop when Δstate plateaus
  • peleLM.advection_scheme · peleLM.cfl — see Convection
  • peleLM.aux_les_contrib = 1 patch 0001
  • peleLM.D_x_ramp · D_x_u_cal patch 0002
  • peleLM.turbinflow_clip_vel patch 0003
  • peleLM.turbinflow_lowpass_cutoff patch 0005
Hard assertion (open issue). Setup.cpp:48 asserts dx == dy == dz. Anisotropic dz=2m (e.g. VC-014) cannot run without a ~2 hr solver patch.
1.5 · Stack

PeleC

PeleC — compressible reactive flow
linkedscenarios in build-outcompressible
Hyperbolic update
Riemann solver (HLLC default; HLL fallback); MUSCL-Hancock predictor.
Time scheme
Explicit RK2 / RK3 (Strong-Stability-Preserving).
Reactions
Same PelePhysics CVODE backend as PeleLMeX.
EB
Same AMReX EB cut-cell infrastructure; flux + state redistribution.
Will host
Phase 4–5 explosion (PDR-required), BLEVE blast wave.
1.6 · Stack

PeleMP

PeleMP — Lagrangian multi-phase
linkedcryogenic in build-outparticle
Particles
KIVA-style droplets; AMReX ParticleContainer storage.
Drag
Stokes / Schiller-Naumann selectable.
Evaporation
Spalding mass-transfer coupled to gas-phase species.
Adapter
solvers/adapters/spray_adapter.{hpp,cpp}
1.7 · Stack

PelePhysics

PelePhysics — EOS · transport · turb inflow
linkedclosures
EOS
Ideal-gas mixture (default for dispersion); PR / SRK available for cryogenic + real-fluid jets.
Transport
Constant (Tier-2 dispersion); Fuego (mixture-averaged) for fire.
TurbInflow
HIT box-superposition (Klein-style). See 2.2 turb inflow.
Mechanisms
CHEMKIN-format mechanism files; per-fuel sub-directory under solvers/core/mechanisms/.
Reactor
CVODE stiff implicit (default); CVODE explicit / RK2 / RK4 selectable.
1.8 · Stack

Hypre

Hypre v2.28 (no MPI)
linkedlinear solver

User-local build; auto-detection at build time. Bottom solver for stiff MLMG cases. Documented per-input toggle.

Methods used
SMG (semi-coarsening multigrid), PFMG (parallel full multigrid).
Default rule
Native MLMG default (fastest on easy cases). Hypre adds ~35% overhead when native suffices.
Switch when
urms ≥ 0.6 m/s · gravity-coupled · stratified ρ.

Non-default options

  • mac_proj.bottom_solver = "native" → "hypre"
  • nodal_proj.bottom_solver = "native" → "hypre"
  • Build flag: USE_HYPRE = TRUE
Build recipe: solvers/dispersion/pele_problem/BUILD_WITH_HYPRE.md.
1.9 · Stack

Adapter layer (AgniKawach-owned)

solvers/adapters/pele_adapter.hpp
implementedisolation

Defines AKMeshAdapter, AKLowMachAdapter, AKCompressibleAdapter, PhysicsAdapter. The only file that imports PeleLMeX.H / PeleC.H directly.

solvers/adapters/spray_adapter.hpp
implementedisolation

AKSprayAdapter wraps PeleMP Lagrangian particles. Drag, evaporation, vapour coupling routed back into the low-Mach scalar field.

solvers/adapters/coolprop_adapter.hpp
implementedisolation

AKCoolPropAdapter for real-fluid EOS, VLE, TTSE tabulation. Used by source terms (Tier-1 and Tier-2 share the table cache).

solvers/extern/* — pinned commits
implementedsubmodules

Submodules at PeleProduction-validated commits. Renovate Bot tracks; CI gate runs solvers/tools/check_hydro_compatibility.py to catch AMReX-Hydro drift before merge.

1.10 · Stack

AMR & time stepping

Block-structured AMR — refinement & tagging
implementedAMR
Refinement
2× per level (configurable); n_error_buf = 2 base cells.
Tagging
Concentration-gradient tagger (default); obstacle-aware tagger added with patch 0005 helper.
Subcycling
Level-by-level (PeleLMeX default).
Block factor
blocking_factor = 8 — every box dim must be divisible by 8.
MLMG tolerances
32K cells: atol=1e-8, maxiter=200. 262K + turb inflow: atol=1e-1, maxiter=20 (post-projection divu ≈ 1e-4 acceptable).
Auto Hypre
Build flag detects when to fall through to Hypre on native MLMG stall.

Non-default options

  • amr.max_level = 0 — 0 uniform; 2 standard for AMR
  • amr.n_cell = 128 64 32 — base grid
  • amr.blocking_factor = 8
  • amr.max_grid_size = 32 — maxgrid32 in α-ceiling workaround
  • amr.regrid_int = 2
  • amr.n_error_buf = 2
  • amr.max_dt = 0.12 s
  • amr.max_step — guardrail; for 1500 s @ dt=0.12 set ≥ 12500
Known limitation — AMR + turbulent inflow. dt collapses to 1e-12 around t ≈ 100–200 s. Workarounds: uniform 8 m for turb; smooth log-law for AMR. Patch 0005 spectral filter available default-off.
1.11 · Stack

In-tree patches against PeleLMeX

Live in solvers/dispersion/pele_problem/patches/. Applied by apply_patches.sh at build time. Two are upstream-PR-worthy (patches/upstream_pr/).

0001 — aux-var LES contribution
patchappliedLES

Wires μt/Sct,n into diff_aux_cc[n]. Without it the tracer carries only laminar viscosity — defeating LES for dispersion. Toggle peleLM.aux_les_contrib = 1. Upstream PR draft in patches/upstream_pr/.

0002 — D(x) ramp (+ deprecated top-hat)
patchappliedfar-field

Distance-dependent D ramp; calibrated at u_cal = 4.0 m/s and scaled to other wind speeds. Without scaling, PG-23 (u=6.05) over-predicts at x=800m by 3.4×. Winner: D_far = 20, transition x = 200 m (sweep 2026-05-03). Part A (volumetric top-hat BC) superseded after virtual-source σ-shift fix landed in postprocess.

0003 — TurbInflow velocity clamp
patchappliedCFL

Clip per-cell turbulent perturbation to clip_vel × urms. Required at urms ≥ 0.6 to avoid step-1028 collapse even with Hypre. urms=0.4 unaffected.

0004 — PDR length scale
patchappliedPDR

PDR L-scale = min(dx, Av⁻¹) with wind-speed scaling. Without this, turbulence-generation source was non-monotone under refinement.

0005 — TurbInflow low-pass filter
patchappliedspectral

Spectral low-pass on the HIT box across coarse-fine AMR boundaries. Default off; opt-in for the AMR + turb path. Smoke-verified: AMR + turb 240 s clean; Brinkman + AMR 60 s clean (3 levels active). Ships with an obstacle-aware AMR tag generator.

1.12 · Stack

Build matrix

GNUmakefile flags
implementedbuild
  • USE_OMP = TRUE — must be on its own line, no inline comment (AMReX Make.defs string-matches)
  • USE_MPI = FALSE — MLMG nodal projection diverges multi-rank on 64×32×16
  • USE_CUDA = TRUE — A100 deploy; not on dev box
  • USE_HYPRE = TRUE — v2.28 user-local, no MPI
  • DEBUG = FALSE · TINY_PROFILE = TRUE — production build
  • XTRA_CXXFLAGS += -march=native — +10–20% on CPU build

Hardware ceilings (dev box i5-7600 / 16GB)

  • OMP=2 ceiling 1.53× single DDR4 channel saturates beyond
  • P600 GPU unusable 2GB VRAM, FP64 1/32 rate
  • MPI broken MLMG nodal projection diverges multi-rank
II
Part II
Physics models
Geometry, turbulence, radiation, combustion, soot, transport, source. Each entry lists model lineage, numerical method, and non-default options.
2.1 · Physics

Geometry handling

Three composable obstacle representations. EB and Brinkman+IBM are sharp / accurate choices; PDR is the always-on sub-grid drag for sub-cell congestion. They are physical alternatives, not deployment paths — pick whichever resolves the geometry at hand. EB and Brinkman+IBM are tagged research mode because cut-cell and high-α penalty flows pay an MLMG cost that is justified by accuracy gains during V&V.

Embedded Boundary (EB) — cut-cell
implementedresearch modecut cell

AMReX EB cut cells with conservative state redistribution. Sharp interface. Required for canyon-flow and surface-pressure benchmarks (CODASC, EB-001 → EB-004).

Numerical method
State redistribution + small-cell combinatorial merging; AMReX-Hydro Godunov MOL fallback near cut faces; flux redistribution for conservation.
Wall model
no-slip default; upcoming wall-function for coarse-grid accuracy without cell-merging penalty.
Geometry kinds
box · sphere · cylinder · plane · STL signed-distance.

Non-default options

  • eb2.geom_type = "all_regular" → "box" / "sphere" / "stl" / …
  • eb2.stl_file — STL path when geom_type=stl
  • eb2.small_volfrac = 1e-3 — small-cell merge threshold
  • mac_proj.bottom_solver = "native" — set "hypre" for stiff EB cases (Hypre v2.28 in tree)
  • nodal_proj.bottom_solver = "native" — same as above for nodal projection
Brinkman penalization + IBM wall drag
implementedresearch mode (high α)VOS

Volume-of-Solid (VOS) penalization. Runtime-configurable via JSON → ParmParse — drop boxes / cylinders / spheres without a mesh-generation step. Augmented with an immersed-boundary wall drag (Item 1, 2026-05-04), a wake-spike softener (Item 3) and accelerated relaxation by substepping (Item 4).

Penalty form
F = −α · u inside obstacle (NOT α/dt — the inverse-dt form creates a stiffness feedback loop).
α default
α = 100 [1/s] (relaxation time ≈ 0.05 s for u = 4 m/s wind).
α ceiling
α ≥ 1000 collapses MLMG at sim time ≈ 280 s — cap α ≤ 500. Higher α = sharper wall but slower projection (research-mode trade).
Numerical method
Explicit pointwise penalty + optional semi-implicit Brinkman update (5× speed factor on obstacle-heavy cases). Substepping = M sub-cycles within one outer dt.
IBM wall drag
Item 1: velocity correction in a 2-cell band outside the obstacle, closes the Brinkman ramp under-prediction (≈ 9× concentration gap vs EB at x = 200 m → within 20%).
Initial condition
Mandatory: u = 0 inside obstacles. Without this, log-law IC creates u ≈ 4 m/s inside solid; penalty pulse generates a 1600 m/s shock at corners → CFL collapse to dt ≈ 3e-6 s.
CFL ceiling
≈ 0.024 s on 8 m grid (limited by flow acceleration around corners, not by Brinkman itself).

Non-default options

  • prob.use_brinkman = 0 → 1 enables
  • prob.brinkman_alpha = 100.0 — relaxation rate [1/s]; cap at 500
  • prob.brinkman_substeps = 1 — Item 4; raise to 4–8 for accelerated transient
  • prob.brinkman_semi_implicit = 0 — 1 enables semi-implicit update (5× faster)
  • prob.wall_drag = 0 — 1 enables Item 1 IBM correction
  • prob.wall_drag_band_cells = 2
  • prob.wake_soft = 0 — Item 3 wake-spike softener
  • prob.brinkman_n_obstacles · brinkman_obstacle_type[i] · brinkman_lo[i] · brinkman_hi[i] · brinkman_centre[i] · brinkman_radius[i]
PDR — Porosity Distributed Resistance (sub-grid)
implementedpatch 0004always-on candidatesub-grid drag

Sub-grid representation for pipe racks, beams, equipment clusters, canopies. Adds directional Forchheimer drag plus a turbulence-generation source. Up to 8 PDR zones per simulation. Composable: Brinkman or EB for large bodies, PDR for everything you can't or shouldn't resolve.

Drag form
Forchheimer (quadratic) by face direction with Cd·Av per axis.
Turb. source
Ck · |u|³ injected as TKE generation (Smagorinsky-compatible).
L-scale fix
patch 0004 PDR length scale = min(dx, Av⁻¹) with wind-speed scaling. Without it, drag was non-monotone in mesh refinement.
Numerical method
Explicit pointwise source on momentum + TKE; no implicit step.
Required for
gas explosion (Phase 4–5). For dispersion, VOS-Brinkman drag is sufficient.
Helper
Tier-1 solvers/tier1/pdr_calculator.py writes ParmParse blocks for pipes / beams / mixed / canopy.

Non-default options (per zone i ∈ 0..7)

  • prob.pdr.{i}.lo / prob.pdr.{i}.hi — zone bounding box
  • prob.pdr.{i}.Cd = 1.2 — cylinder; 2.0 flat plate; 1.0 canopy
  • prob.pdr.{i}.Av_x / Av_y / Av_z — face area density [m²/m³]
  • prob.pdr.{i}.porosity = 1.0 — 1 = fully open
  • prob.pdr.{i}.Ck = 0.1 — turbulence-generation coefficient
  • prob.pdr.n_zones — max 8 (MAX_PDR)
Known interaction. PDR + turbulent inflow exhibits a fast collapse (≈200 steps), likely Forchheimer + turb-gust stiffening. Avoid the combination until root cause is closed; use smooth log-law inlet when PDR is active.
STL → SDF voxelizer
implementedgeometry IO

Reads binary & ASCII STL via solvers/tier1/stl_reader.py; voxelizes to a signed-distance grid that drives both the EB level-set and the Brinkman mask. Same voxelizer also serves the radiation solver (solvers/radiation/standalone/postprocess/stl_voxelizer.py).

Default grid
64 × 32 × 16 (override per case).
Numerical method
Ray-casting inside test; AABB-tree-accelerated nearest-triangle SDF.
Outputs
SDF MultiFab + binary mask, written next to the run directory.
2.2 · Physics

Turbulence

LES closure on top of the variable-density low-Mach Navier-Stokes core. Eddy viscosity μt is wired through species + thermal + auxiliary diffusion via patch 0001; required for any meaningful passive-scalar dispersion result.

LES closure — Smagorinsky (default)
implementeddefaulteddy-viscosity
Model
Smagorinsky · static. Cs = 0.18 neutral / 0.10 stable F (workaround for class F/A while gravity-projection limitation persists).
Aux-var coupling
patch 0001 adds μt/Sct,n to diff_aux_cc[n] — without it, the tracer carries only laminar viscosity and LES is defeated for dispersion.
Sct
0.7.
Numerical method
Cell-centred strain-rate from finite-difference velocity gradients; μt averaged to faces for diffusion solve.

Non-default options

  • peleLM.use_les = 1
  • peleLM.les_model = "Smagorinsky" — only model in tree today
  • peleLM.smagorinsky_constant = 0.18 — 0.10 for class F
  • peleLM.turb_Sc = 0.7
  • peleLM.aux_les_contrib = 1 patch 0001
Vreman / σ-model LES
upcomingeddy-viscosity

Drop-in alternatives to static Smagorinsky. Better wall behaviour, no Cs-tuning per stability class. Same peleLM.les_model switch — selectable by name.

HIT TurbInflow (PelePhysics)
implementedsynthetic turbulence

Pre-computed homogeneous-isotropic-turbulence box, time-superposed on the inflow plane (Klein 2003 family). Drives the realistic LES boundary that the dispersion benchmarks require. Two safety patches in tree.

Numerical method
Box read at start; bilinear interpolation in time; two-mode urms scaling; Sct-coupled mass continuity at inflow plane.
ParmParse pitfall
module uses bare turbinflows = ..., NOT peleLM.turbinflows. Wrong namespace silently runs laminar.
Velocity clamp
patch 0003 — clip per-cell turbulent perturbation to clip_vel × urms. Required at urms ≥ 0.6 to avoid step-1028 collapse even with Hypre.
Spectral filter
patch 0005 — low-pass on the HIT box for the AMR + turb path. Default off.

Non-default options

  • turbinflows = inflow_lo_x — bare key (no peleLM. prefix)
  • turbinflow.{name}.turb_file — path to HIT box
  • turbinflow.{name}.iso_scale = 1.0
  • turbinflow.{name}.urms0 = 0.4 m/s — 10% TI at 4 m/s wind
  • turbinflow.{name}.k0 = 4
  • turbinflow.{name}.N = 64
  • peleLM.turbinflow_clip_vel = 0.5 patch 0003
  • peleLM.turbinflow_lowpass_cutoff = 0.0 patch 0005
2.3 · Physics

Convection & advection

Godunov advection (AMReX-Hydro)
implementeddefaultfinite volume
Method
Godunov finite-volume with PPM (Piecewise-Parabolic Method, 4th-order) slope limiter — default for momentum, species, aux scalars.
Alternates
PLM (Piecewise-Linear, 2nd-order, more diffusive but very robust); MOL (Method-of-Lines) used near EB cut cells.
Conservation near EB
Flux redistribution + state redistribution merge small cells, preserving global mass/momentum.
Reflux
Level-by-level subcycling refluxes coarse-fine fluxes at the end of each fine sub-step.

Non-default options

  • peleLM.advection_scheme = "Godunov_PPM" — "Godunov_PLM" / "MOL"
  • peleLM.cfl = 0.9 — bumped from 0.5 post-sweep, verified stable
  • peleLM.max_dt · peleLM.init_dt · peleLM.dt_change_max — dt growth governor
  • amr.max_dt = 0.12 — required for VC-003 (no-AMR 8 m) to avoid MLMG divergence
2.4 · Physics

Diffusion & conduction

Implicit diffusion (Crank-Nicolson + MLMG)
implementeddefaultelliptic
Time scheme
Crank-Nicolson (CN, 2nd-order) for momentum / species / thermal / aux diffusion.
Linear solver
AMReX MLMG (geometric multigrid). V-cycle default; W-cycle and semi-coarsening selectable.
Bottom solver
Native by default; Hypre v2.28 available (no MPI) when MLMG stalls.
Transport model
Constant (not Fuego). All values in CGS for Pele compatibility. fixed_Le = 0 mandatory — otherwise Constant-transport diffusivity is silently ignored in favour of Sc-derived D.
D(x) ramp
patch 0002 — distance-dependent eddy diffusivity, scaled by u_ref / u_cal (calibration wind 4.0 m/s).

Non-default options

  • transport.const_viscosity = 30.0 [Poise = 3 Pa·s] · ν = 2.5 m²/s before LES
  • transport.const_diffusivity = 25000.0 [cm²/s = 2.5 m²/s, Pasquill-D eddy D]
  • transport.const_conductivity = 4.3e8 [erg/cm/s/K]
  • peleLM.fixed_Le = 0 — mandatory
  • peleLM.D_x_ramp = 1 · peleLM.D_x_u_cal = 4.0 — D(x) ramp; winner D_far=20, transition x=200 m (sweep 2026-05-03)
  • mlmg.atol = 1e-8 · mlmg.maxiter = 200 — relax to atol=1e-1 / maxiter=20 for 262K + turb inflow
  • mlmg.bottom_solver = "native" → "hypre" for stiff cases
  • mlmg.semicoarsen_dir · mlmg.use_W_cycle — escape hatches for anisotropic stiffness
Hypre rule. Hypre adds ~35% overhead on cases native MLMG handles. Switch to Hypre when: urms ≥ 0.6 m/s, gravity coupling, stratified ρ. Otherwise stay native.
2.5 · Physics

Radiation

Standalone AMReX-based RTE solver at solvers/radiation/standalone/. Two engines (Monte Carlo + P1) sharing the same gas/soot properties and geometry. MC is the default for every consequence type — it is the model of record for V&V (15 / 27 cases at ±15% wall flux) and the production fire-radiation engine. P1 remains available as a fast alternative for screening. Couples back to the fire solver via the AMReX MultiFab interface.

Monte Carlo RTE — default engine, 4 modes
implementeddefaultstochastic

Unbiased ray tracing through participating media. Default for all VC-R cases — pelerad.mc_wall_flux = 1 auto-writes mc_wall_flux.csv. Higher ray counts are research mode.

Mode 1
Full-field incident radiation everywhere; G(x) MultiFab.
Mode 2
Monitor probes (directional or omni). Position + optional surface normal → qinc per probe (analytical κ at probe).
Mode 3
Hemisphere wall flux — exact integration over wall hemisphere. Default-on per case.
Mode 4
qinc(x) field + iso-contour — directional qinc field + iso-line export (built 2026-04-29).
Numerical method
Woodcock tracking default (κmax auto-computed at start); analog ray-marching available. Anisotropic scattering supported with Henyey-Greenstein phase function.
Wall flux formula
MC uses the exact hemispheric integral; P1 uses Marshak (not Lambert — Lambert was the bug).

Non-default options

  • pelerad.mc_n_rays — rays per sample point / probe; raise for research-mode V&V
  • pelerad.mc_woodcock = 1 — 0 = analog ray-march
  • pelerad.mc_wall_flux = 1 — Mode 3, default-on per case
  • pelerad.mc_skip_wall_flux = 0 — opt-out
  • pelerad.mc_include_net_flux = 0 — opt-in
  • pelerad.mc_monitor_positions · mc_monitor_normals · mc_monitor_T_surf · mc_monitor_eps_surf · mc_monitor_samples — Mode 2 probes
  • pelerad.mc_compute_q_inc_field = 0 — Mode 4 toggle
  • pelerad.mc_q_inc_field_normals — per-direction iso-contour
  • pelerad.mc_use_sobol = 1 · mc_use_hot_ray = "auto" — Sobol on by default; hot-ray auto-fires for narrow sources (see 2.5 variance reduction)
P1 / spherical-harmonics — fast alternative
implementeddiffusion

P1 / SP1 spherical-harmonics approximation; gradient diffusion equation for the incident radiation. Cheap, parallel-friendly, used as a screening engine and for comparison studies. Not the default — fails at low optical thickness.

Wall BC
Marshak (the right one). Lambert was the bug fixed 2026-04-19.
Numerical method
MLMG-style elliptic solve on the radiation field; CN-style time stepping when coupled to fire.
Limitation
P1 fails at optical thickness τ ≲ 0.5 (no formula gets the wall flux right). Use MC for thin media.
Radiative properties — WSGGM · soot · Mie
implementedspectral
Gas absorption
WSGGM from RADCAL. Composition selectable via pelerad.wsggm_composition (e.g. H₂O+CO₂ at AR Confluence ratios from the Bressloff thesis).
Auto-rule
If spectral_model not set: gray for κ-uniform / single-band cases, WSGGM otherwise. pelerad.spectral_model = gray|wsggm always wins.
Soot
Rayleigh small-particle approximation; volume-fraction field consumed by κ.
Droplet Mie
upcoming — Mie tables drafted; integration with cryogenic spray pending.
WSGGM accumulation bug
Fixed 2026-04-28 (Phase D).
Variance reduction — Sobol (default) + hot-ray (auto)
implementeddefaultQMC + IS

Both samplers are on by default; the user only sees them as a toggle when they want to disable variance reduction for a baseline reference run.

Sobol primary-ray
Default for every MC run. 2-D Sobol sequence on (azimuth, polar) for Modes 1/2/3/4. 44× variance reduction at N = 1024 on smooth integrands. Replaces pseudo-random primary directions with no per-case tuning required.
Hot-ray adaptive
Auto-selected for narrow / localised emitters. Cumber (2009) two-pass importance sampling on top of Sobol; slope −1.4 observed on localised-source cases. Decision rule: enabled when the emitter footprint covers fewer than ~1% of domain cells (configurable via pelerad.hot_ray_auto_threshold) — fires automatically for jet-fire flames, vent-stack ports, and small-radius pool fires.
Override
Auto-detection can be forced on or off per-case if the user disagrees with the heuristic.

Non-default options

  • pelerad.mc_use_sobol = 1 — default; set 0 only for baseline pseudo-random reference runs
  • pelerad.mc_use_hot_ray = "auto" — "1" force on, "0" force off
  • pelerad.hot_ray_auto_threshold = 0.01 — emitter cell-fraction below which hot-ray auto-enables
  • pelerad.hot_ray_pilot_rays · pelerad.hot_ray_passes — Cumber two-pass tuning
Outdoor BCs & atmospheric attenuation
implementedoutdoor

For outdoor pool / jet fires: ground albedo, sky cold-source, and Wayne (1976) atmospheric attenuation between flame and receiver. Default-off so V&V cases stay indoor-canonical.

Toggle
pelerad.outdoor_scenario = 1
Wayne attenuation
pelerad.use_wayne_attenuation = 1
Equilibrium iter
pelerad.radiative_equilibrium = 0 · equil_max_iter = 30
Geometry primitives (radiation scene)
implementedprimitives

Lightweight primitive system inside ProbParm — sphere / box / cylinder / cone — each assignable an EMITTER or OBSTACLE role. Up to PRIM_MAX = 16 per scene. Used for VCR-006 cylinder, VCR-007 L-shape, VCR-001 hot/cold slab, and the production scenarios that read STL → SDF.

Geometry mask
pelerad.geometry_mask_type selects analytic mask, primitive-list mask, or STL voxel mask.
2.6 · Physics

Combustion

Combustion chemistry
draftfinite-rate / EDC

Built on PelePhysics CHEMKIN-format mechanisms (PMF / GRI3.0 / DRM-19 family). Production fire solver wraps two closures.

Default closure
Eddy-Dissipation Concept (EDC) for turbulence-chemistry interaction. Algebraic; cheap; matches LES costs.
Research closure
Flamelet (steady or unsteady) upcoming — pre-tabulated chemistry, Z & C variables. Tagged research mode.
Time scheme
SDC operator-split with stiff CVODE chemistry sub-step (PelePhysics).
Mechanisms
per-fuel: methane (DRM-19 default), propane, hydrogen, NH₃; ports from PelePhysics.

Files / non-default options

  • solvers/fire/AKFireSolver.{hpp,cpp}
  • solvers/core/mechanisms/ — CHEMKIN files
  • peleLM.chem_integrator = "ReactorCvode" — stiff implicit
  • peleLM.do_react = 1
  • peleLM.sdc.nIter = 2 — corrector iterations
2.7 · Physics

Soot

Soot formation & radiative coupling
implemented (radiation κ)draft (formation)two-equation
Formation
Brookes-Moss two-equation soot model (number density + mass fraction). Acetylene precursor + OH oxidation.
Radiative κ
Rayleigh small-particle approximation (already in radiation properties). Volume-fraction field fv consumed by WSGGM-coupled κ.
Coupling
Soot field returned to PelePhysics species transport; Rayleigh contribution added to gas-mixture absorption coefficient at runtime.
Files
solvers/fire/AKSootModel.hpp · radiation side at solvers/radiation/standalone/ already supports soot input.
2.8 · Physics

Pool spreading & Lagrangian spray

LNG / cryogenic pool
draftmoving boundary
Spreading
Briscoe & Shaw / Webber 1990 thin-layer ODE for pool radius; arrest at substrate edge or by complete vaporisation.
Boil-off
Conduction-limited heat flux from substrate; convective + radiative top heat to film. Vapour rate fed back as a species source on the gas grid.
Coupling
Pool footprint discretised onto the EB / Brinkman mask; vapour generation appears as a volumetric source above the pool.
Files
solvers/cryogenic/AKLNGPoolModel.hpp · AKCryoSolver.hpp
Lagrangian spray (PeleMP)
draftparticle
Particle motion
KIVA-style explicit drag (Stokes / Schiller-Naumann selectable); two-way momentum coupling to the gas.
Evaporation
Spalding mass-transfer with CoolProp VLE for real-fluid VLE.
Numerical method
Predictor-corrector for particle position; explicit cell-to-particle interpolation.
Adapter
solvers/adapters/spray_adapter.{hpp,cpp} wraps PeleMP particle containers; the only file that imports PeleMP headers.
2.9 · Physics

Buoyancy & low-Mach coupling

Boussinesq + multi-component (MW) buoyancy
implemented|Δρ/ρ| ≲ 0.03 ceilingexplicit

Explicit Boussinesq buoyancy for dense-gas (Cl₂, NH₃, LPG vapour) and light-gas (H₂, CH₄) effects. Multi-component (MW) coupling fixed in 21 unit tests. Beyond |Δρ/ρ| ≈ 0.03 the low-Mach explicit-Boussinesq stability ceiling is hit; anelastic reformulation deferred.

Form
Boussinesq density perturbation from concentration + temperature; gravity term added to momentum.
MW coupling
Δρ/ρ = release_conc · (MW/MWair − 1) + thermal term.
Workaround
keep release_conc · |MW/MW_air − 1| < 0.03.

Non-default options

  • prob.boussinesq = 0 — 1 enables
  • prob.MW_release = 29.0 g/mol — air-equivalent default
  • prob.MW_air = 28.97 g/mol
  • peleLM.gravity = 0 0 0 — class F/A workaround keeps gravity off; stability is encoded via Cs/D
Anelastic / pseudo-incompressible
upcominglow-Mach

Replaces explicit Boussinesq beyond |Δρ/ρ| ≈ 0.03. Eliminates the gravity-projection workaround for class F/A and the empirical light-gas crash limit.

2.10 · Physics

Source-term injection

Volumetric Gaussian-radius release
implementedvolumetric source

Implemented in pelelmex_prob.H::initdata() + time-resolved injection in the SDC RHS. Q is read by Tier-1 source-term library and matched at postprocess via virtual-source σ shift.

Continuous
Steady Q at finite-radius origin; matches Tier-1 Q with virtual-source σ shift.
Instantaneous puff
Finite-time top-hat (Patch 0002 part A — superseded after virtual-source fix landed in postprocess).
Volumetric
Scattered injection across cylinder/box for elevated stacks.
Numerical method
Mass + species + scalar source vector built per cell from analytic mask; integrated by SDC alongside the rest of the RHS.

Non-default options

  • prob.release_x / y / z — centre of source
  • prob.release_radius = 16.0 m — PG default; reduce for stack
  • prob.release_conc = 1.0 — mass fraction at source
  • prob.release_duration = -1.0 — negative = continuous
  • prob.wind_speed = 4.0 m/s — consumed by D(x) ramp
  • prob.hydrostatic_ic = 0 — class F/A workaround
III
Part III
Scenario solvers
How the physics + stack compose into the consequence-type solvers. Each scenario lists which physics modules it activates and any scenario-specific options.
3.1 · Scenario

Gas dispersion (Phase 2 — ~75%)

Validated against Prairie Grass (PG-23, 24, 38), CODASC, and GUM/MUST. 19/20 cases pass Hanna FB / NMSE / FAC2.

Dispersion build
implementedlow-Mach LES
Solver
PeleLMeX low-Mach + AgniKawach pelelmex_prob.H.
Tracer
Single passive aux variable; multi-species mixtures iterate Tier-2 in QRA loop.
Turbulence
Smagorinsky LES (Cs = 0.18) + HIT TurbInflow (urms = 0.4 m/s default).
Geometry
EB · Brinkman+IBM · PDR — composable; CODASC uses EB, industrial sites use Brinkman+IBM + PDR.
Buoyancy
Boussinesq+MW (within |Δρ/ρ| ≲ 0.03 ceiling).
Source
Volumetric Gaussian-radius release. Virtual-source σ shift in postprocess.
Validated config
VC-005 inputs.pg-turb-8m-optimal: 8 m uniform grid, 262K cells, 1024×512×256 m domain. Centerline ratio at x=500m: 0.84. σ_y at x=104m: 16.5 vs PG-D 16.7.
3.2 · Scenario

Fire — pool / jet (Phase 3 — ~15%)

Radiation engine matured standalone (28 V&V cases). Combustion side in build-out. The AKFireSolver wrapper plugs combustion + soot + radiation into the same low-Mach core that already runs dispersion.

AKFireSolver
draftorchestration
Solver
PeleLMeX low-Mach + reactive; do_react = 1; CVODE chemistry.
Combustion
EDC default; flamelet upcoming (research mode).
Soot
Brookes-Moss two-equation; Rayleigh κ in radiation (already in tree).
Radiation
MC default (in-loop coupling planned via shared MultiFab); P1 standalone for screening.
Geometry
Brinkman+IBM for tank/dike; PDR for surrounding congestion.
Files
solvers/fire/AKFireSolver.{hpp,cpp} · AKRadiationModel.cu · AKSootModel.hpp
3.3 · Scenario

Gas explosion / VCE (Phase 4–5)

AKExplosionSolver / AKMEMModel
upcomingcompressible
Solver
PeleC compressible reactive; HLLC Riemann; SSP-RK time stepping.
Combustion
Flame-thickening + EDC (research-mode flamelet planned).
Geometry
PDR required — resolved drag insufficient at coarse grid for industrial congestion. Brinkman / EB optional for major obstacles.
Source-term branch
Shared with TNO MEM / BST Tier-1 inputs.
Files
solvers/explosion/AKExplosionSolver.hpp · AKMEMModel.hpp (stubs)
3.4 · Scenario

BLEVE (Phase 4–5)

AKBLEVESolver / AKLiquidReleaseModel
upcomingcompressible
Solver
PeleC compressible; combined compressible-blast + radiation.
Inlet state
Tier-1 two_phase.py::TwoPhaseFlash provides flashed state.
Radiation
MC fireball with WSGGM + soot.
Files
solvers/bleve/AKBLEVESolver.hpp · AKLiquidReleaseModel.hpp (stubs)
3.5 · Scenario

Cryogenic / LNG (Phase 4)

AKCryoSolver + AKLNGPoolModel
draftspray + low-Mach
Pool
Webber-style spreading + boil-off (1.8).
Spray
PeleMP Lagrangian droplets via AKSprayAdapter.
Gas phase
PeleLMeX low-Mach with vapour species source above pool footprint.
Radiation
MC with droplet Mie tables (upcoming).
Files
solvers/cryogenic/AKCryoSolver.hpp · AKLNGPoolModel.hpp
3.6 · Scenario

Toxic CFD

AKToxicSolver / AKProbitModels
draftmulti-species
Solver
PeleLMeX low-Mach with multi-species transport (Sct per species).
Probit
Per-species probit applied at postprocess; coefficients shared with Tier-1 qra.py.
Files
solvers/toxic/AKToxicSolver.hpp · AKProbitModels.hpp
IV
Part IV
Operations
V&V pipeline · performance · known limitations · upcoming work.
4.1 · Operations

V&V & postprocessing

postprocess.py — Hanna metrics
implementedV&V
Module
solvers/vv/scripts/postprocess.py
Q normalization
Auto via compute_inflow_flux() — required to compare C_sim to Pasquill-D.
σ shift
Virtual-source correction σ_eff = √(σ²Pasquill + r²release) applied automatically.
Metrics
Hanna FB · NMSE · FAC2 · MG · VG against PG / NIST datasets.
Cell_H parser
Multi-fab plotfile fix (n_fabs reading); same fix in extract_centerline.py.
Radiation V&V pipeline
implementedunified
Phase A+B+C+D
Closed 2026-04-28. Unified MC + P1 runner with single-pass PDF report.
Cases
28 cases total (VCR-001 through VCR-011 + AR Confluence WSGGM benchmarks).
Pass rate
15/27 at ±15% wall flux at last full sweep.
Reports
solvers/radiation/standalone/postprocess/agnikawach_report.py — house-brand PDF.
Tier-1 → Tier-2 case generator
implementedorchestration

Reads Tier-1 result + scenario JSON; emits a Tier-2 inputs file with optimised domain extents, base grid, source footprint, and solver branch (low-Mach vs compressible).

Modules
solvers/radiation/standalone/postprocess/tier1_to_mc.py · tier1_to_tier2.py (draft)
4.2 · Operations

Performance

Speed factors (cumulative)
implementedruntime
  • CFL 0.5 → 0.9 ~2× — confirmed stable on parametric sweep v2
  • Steady-state early stop 1.5–2× wired to run_case.sh
  • Semi-implicit Brinkman on obstacle-heavy cases
  • Domain reduction 3–5× when Tier-1 sized
  • Velocity warm-start QRA batch reuse
  • -march=native +10–20%
  • Sobol primary-ray (radiation) 44× variance reduction at N=1024
  • Hot-ray adaptive (radiation) slope −1.4 on localised-source cases
4.3 · Operations

Known limitations & workarounds

Gravity + low-Mach projection (class F/A)
knownprojection

PeleLMeX low-Mach projection cannot close ρ-gravity balance on 128×64×32 + mixed inflow / outflow / slipwall BCs. Crashes step 26. Workaround: peleLM.gravity = 0, prob.hydrostatic_ic = 0; encode stability via reduced Cs (0.10 vs 0.18) + reduced D. Real fix: anelastic reformulation (1.9 upcoming).

AMR + TurbInflow CFL collapse
knownCFL

Refluxing across coarse-fine boundaries amplifies turbulent fluctuations the coarse side cannot represent. dt → 1e-12 around t≈100–200s. Workarounds: uniform 8 m grid for turb inflow; smooth log-law for AMR. Spectral-filter patch 0005 available default-off. Issue draft in patches/upstream_pr/ISSUE_amr_turbinflow_cfl_collapse.md.

PeleLMeX isotropic-cell assertion
knownsolver

Setup.cpp:48 hard-asserts dx == dy == dz. Anisotropic dz=2m (e.g. VC-014) cannot run without ~2 hr solver patch.

Brinkman α-ceiling
knownMLMG

α ≥ 1000 collapses at sim time ≈ 280 s — late-time MLMG failure. Workaround: cap α ≤ 500, or use CFL=0.9 + maxgrid32.

PDR + turbulent inflow stiffening
knownstiffness

Distinct from Brinkman α-ceiling — fast collapse around 200 steps. Likely Forchheimer + turb-inflow combo. Avoid until root cause closed.

Boussinesq |Δρ/ρ| > 0.03
knownlow-Mach

Formula bug fixed; 21 unit tests added. End-to-end light-gas sim still crashes empirically when |Δρ/ρ| > ≈0.03. Real fix: anelastic reformulation. Workaround: keep release_conc · |MW/MW_air − 1| < 0.03.

P1 wall flux at τ ≲ 0.5
knownradiation

Optically-thin media: no P1 formula gets the wall flux right. Use MC instead — MC is the default radiation engine for exactly this reason.

4.4 · Operations

Upcoming work

EB wall-function + IBM hybrid
upcomingEB

Critical priority (2026-04-17): wall-function + IBM for coarse-grid EB accuracy without cut-cell complications. Tightens Brinkman ↔ EB agreement to < 10%.

Anelastic / pseudo-incompressible buoyancy
upcominglow-Mach

Replaces explicit Boussinesq beyond |Δρ/ρ| ≈ 0.03. Eliminates the gravity-projection workaround for class F/A and the empirical light-gas crash limit.

Local time stepping
upcomingtime

Per-level dt that bypasses the isotropic-CFL ceiling for cases dominated by a single fine region.

Accelerated transient driver
upcomingtime

Skips the early establishment phase with the steady-state early-stop continuing the run; large gains for QRA batch.

Mie tables (radiation)
upcomingspectral

Droplet Mie scattering tables for cryogenic LNG / NH₃ aerosol. Tables drafted; integration with PeleMP-coupled spray pending.

Vreman / σ-model LES
upcomingLES

Drop-in alternatives to static Smagorinsky. Better wall behaviour, no Cs-tuning per stability class.

PeleC explosion / BLEVE branch
upcomingcompressible

Phase 4–5. Compressible reactive on PeleC, with PDR for industrial congestion. Source-term branch shared with TNO MEM / BST Tier-1.

GPU Monte Carlo radiation
upcomingresearch

Phase 6 (deferred). Move MC ray-tracing to CUDA. Sobol + hot-ray already vectorisable; the win is the tracking kernel.

Compute orchestration (infra)
upcomingdeploy

K8s + Karpenter spot job runner pulling scenario JSON, building PeleLMeX with USE_CUDA=TRUE, shipping plotfiles to S3. Required to unlock the ₹2500–8000/hr A100 cost model. Not solver work but blocks Phase 3 graduation.