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 5× on obstacle-heavy cases
- Domain reduction 3–5× when Tier-1 sized
- Velocity warm-start 7× 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.