implemented
draft / partial
upcoming
known limitation
model class
01 · Consequence Type 1
Gas dispersion (passive plume)
Continuous & instantaneous releases of trace species at neutral or near-neutral buoyancy.
Steady-state Gaussian with Pasquill-Gifford spread coefficients. Validated against Prairie Grass
(Barad 1958) and reused as the analytical reference for Tier-2 dispersion V&V.
GaussianPlume — continuous point source
implemented
algebraic
Steady-state Gaussian plume with reflection at ground. Open-country and urban
coefficients selectable per terrain. Wind-speed adjusted by neutral log-law to release height.
- Module
solvers/tier1/gaussian_plume.py
- Spread fit
- Briggs (1973) Pasquill-Gifford — rural & urban variants
- Stability
- Pasquill A → F (six classes)
- Numerics
- closed-form algebraic; vectorised over receptor array
- Calibration
- Prairie Grass trials 17, 23, 24, 29, 38 (PG-38 used at u=4 m/s)
Options & defaults
| Option | Default | Notes |
| stability | D | A=v.unstable, F=stable |
| terrain | rural | rural | urban (Briggs urban set) |
| wind_speed_m_s | 4.0 | at release height |
| release_height_m | 0.0 | ground-level if 0 |
| receptor_height_m | 1.5 | breathing height |
| q_g_per_s | 100.0 | mass emission rate |
AERMOD shim — regulatory cross-check
implemented
comparator
Thin AERMOD-style wrapper exposing the same input form regulators use. Reports the
EPA reference value alongside AgniKawach and the percent deviation. Not a rebuild of
AERMOD's CALPUFF/PRIME terrain logic — a comparator only.
- Module
solvers/tier1/aermod_shim.py
- Use
- cross-validate against EPA reference; CI gate
Calibration note. Pasquill-G coefficients are point-source fits and diverge as x → 0.
Tier-1 reports σ-shifted output by default for finite-radius releases (matches AERMOD/ADMS practice).
Same correction is applied during Tier-2 V&V postprocessing.
02 · Consequence Type 2
Dense-gas dispersion
Heavier-than-air clouds (Cl₂, NH₃, LPG vapour, LNG vapour). Two interchangeable engines —
Britter-McQuaid nomogram for first-pass screening, and HEGADAS-S 1-D ODE for richer
near-field profiles. Tier-1 picks based on initial Richardson number.
Britter-McQuaid (1988) — continuous-release nomogram
implemented
nomogram
Digitised six-curve nomogram from HSE CRR 17/1988 Fig 18. Maps non-dimensional
concentration C/C₀ versus non-dimensional distance for a continuous ground-level
dense release. No solver — pure log-log interpolation.
- Module
solvers/tier1/dense_gas.py
- Original
- Britter & McQuaid (1988), HSE CRR 17/1988
- Numerics
- log-log interpolation over digitised curves
Options & defaults
| release_kind | continuous | instantaneous variant pending |
| surface_roughness_m | 0.10 | entered via HEGADAS path when used |
| switch_Ri0 | ≥ 0.15 | below this: defer to Gaussian |
HEGADAS-S — Witlox/Holt steady 1-D
implemented
1-D ODE
Steady heavy-gas slab + similarity-profile crosswind structure. Solves a coupled
ODE in downwind x for cloud half-width, height, and centreline concentration.
Tunables (entrainment, profile shape) calibrated against Burro/Coyote LNG and Maplin Sands.
- Module
solvers/tier1/hegadas/hegadas_s.py
- Original
- HEGADAS-S (Colenbrander 1980; Witlox 1994)
- Numerics
- Adaptive RK45 (SciPy) with Euler fallback for stiff onsets
- Modifications
- Friction-velocity log-law inlet (κ=0.4); module-level Witlox-Holt tunables exposed
Options & defaults
| species | Cl2 | CoolProp / hazmat DB property lookup |
| q_g_per_s | 100.0 | steady release rate |
| u_ref | 4.0 m/s | at z_ref (default 10 m) |
| z0_m | 0.10 | surface roughness |
| x_max_m | 5000 | integration domain |
| n_eval | 600 | profile output points |
03 · Consequence Type 3
Pool fire — thermal radiation
Two interchangeable thermal-radiation paths. Solid-flame is the default for circular pools
with a clear receiver geometry; point-source is the API-521 fallback for screening.
Solid-flame (Mudan + Rew-Hulbert)
implemented
solid flame
Tilted cylindrical flame body with an SEP envelope and a vertical-receiver view
factor. AGA wind-tilt correction applied via friction-velocity u*.
Atmospheric transmissivity from RH/T modifier (Wayne-style fit). Suitable for x ≥ 2·D
within ~15% of the full Mudan integral.
- Module
solvers/tier1/pool_fire.py
- Originals
- Mudan (1984); Rew & Hulbert (1996); AGA wind tilt
- Burning rate
- Babrauskas (1983)
m″ by fuel
- Radiant fraction η
- fuel-specific, Shokri-Beyler / API 521 table
Options & defaults
| fuel | propane | drives η, m″, ρ_v(flame) |
| D_pool_m | 10.0 | equivalent diameter |
| u_wind_m_s | 2.0 | used by tilt, AGA correction |
| RH_pct | 50 | atmos. transmissivity |
| flux_method | solid_flame | solid_flame | shokri_beyler | auto |
Point-source (Shokri-Beyler / API 521)
implementedpoint source
Lumped radiator at flame midpoint. Used when the pool is non-circular or the
receiver geometry violates Mudan's assumptions. Trivial cost — same property tables.
- Originals
- Shokri & Beyler (1989); API Std 521 (2023)
04 · Consequence Type 4
Jet fire
Continuous flammable gas / two-phase jet ignited at release. Two-method engine: API 521
point-source and Chamberlain (1987) tilted-shell line source. Wind-bend reuses Chamberlain Eq. 8
in simplified form.
JetFire
implementedpoint + line source
- Module
solvers/tier1/jet_fire.py
- Point-source
- API Std 521 (2023) §5.15
- Line-source
- Chamberlain (1987), Chem Eng Res Des 65: 299–309
- Multi-burner
- Cook, Bahrami & Whitehouse (1990) — separate
multipoint_flare.py
- Numerics
- Closed-form per receptor; receiver elevation default 1.5 m
Options & defaults
| fuel | methane | η-table fuel key |
| m_dot_kg_s | 1.0 | released gas mass-flow |
| d_orifice_m | 0.05 | drives jet velocity |
| u_wind_m_s | 2.0 | drives wind-bend Δθ |
| method | auto | auto picks line-source for x < 3·L |
| z_receiver_m | 1.5 | standing person |
Multi-point flare
implementedsuperposition
Cook (1990) multi-burner-flare radiation calculation. Each burner is a JetFire instance;
receptor flux is the burner-wise radiant superposition. Used for ground/elevated multi-tip flares.
- Module
solvers/tier1/multipoint_flare.py
05 · Consequence Type 5
Flash fire
Unconfined flammable cloud burned at deflagration. Hazard = the LFL footprint at the
moment of ignition. Tier-1 flash fire reuses the dispersion engine and contours
to the half-LFL line for receptor screening.
FlashFire
implementedLFL contour
- Module
solvers/tier1/flash_fire.py
- Cloud source
- GaussianPlume or HEGADAS depending on density regime
- Hazard line
- ½·LFL by default (TNO Yellow Book convention)
- Burn time
- 1–3 s instantaneous, no overpressure (defer to VCE/BST)
06 · Consequence Type 6
Vapour Cloud Explosion
Two interchangeable blast-curve methods. TNO Multi-Energy is the regulator default;
BST gives a defensible band for higher-confidence calls. Both keyed to the same
flammable mass & combustion energy.
TNO Multi-Energy Method (MEM)
implementedblast curve
- Module
solvers/tier1/vce.py
- Original
- TNO Yellow Book CPR 14E, 3rd ed. (2005), Ch 5
- Numerics
- log-log interpolation over digitised classes 3–10
Options & defaults
| fuel | propane | heat of combustion |
| flammable_mass_kg | 1000 | post-dispersion ≥ ½·LFL |
| congestion_class | 7 | 3=weak … 10=detonation |
Baker-Strehlow-Tang (BST)
implementedblast curve
- Module
solvers/tier1/bst.py
- Original
- Baker, Strehlow & Tang et al (1994)
- Mach
- by reactivity × congestion (Baker Table 2)
- Same scaled-distance form
- shares
R' = r·(P₀/E)^(1/3) with TNO
Options & defaults
| reactivity | medium | low | medium | high |
| congestion | medium | low | medium | high |
| mach | auto | override Baker-Mf table |
CAM — Combustion Assessment
implementedclassifier
Maps fuel reactivity + confinement walls + obstacle congestion → laminar & turbulent
flame speed → TNO class & BST Mach. Drives both VCE engines from a common front door.
- Module
solvers/tier1/cam.py
- Outputs
- SL, ST, TNO class, BST Mach
UVCE crater
implementedempirical
Crater dimensions for confined ground-level detonation (regulatory bookkeeping for
ERDMP). Empirical only; not propagated to Tier-2.
- Module
solvers/tier1/crater.py
07 · Consequence Type 7
BLEVE / fireball
BLEVE radiative fireball
implementedsolid radiator
Radiating spherical fireball with empirical D, tburn, lift-off height,
and SEP. Receiver flux uses solid-angle geometry plus atmospheric transmissivity.
- Module
solvers/tier1/bleve.py
- Originals
- TNO Yellow Book; Roberts (1982); Hymes / Martinsen empirical fits
- Numerics
- algebraic + 1-D bisection for fatality radius
Options & defaults
| fuel | propane | η, ΔHc |
| mass_kg | 10000 | flashed liquid mass |
| RH_pct | 50 | transmissivity |
Fragment-range projectile
implementedballistic
Single-fragment ballistic range with drag, used for missile-hazard distance reporting.
Vessel mass distribution model (Holden & Reeves) sits on top.
- Module
solvers/tier1/bleve_fragmentation.py
- Originals
- Baker (1983); Holden & Reeves (1985); Hauptmanns drag
08 · Consequence Type 8
Toxic cloud
ToxicCloud — single-species AEGL distance
implementeddose
Wraps GaussianPlume (or HEGADAS for dense toxics) with AEGL-1/2/3 endpoints.
For sub-AEGL-averaging-time releases, the threshold is reduced via ten Berge
C^n · t = const.
- Module
solvers/tier1/toxic_cloud.py
- Tables
- AEGL-60min (NRC), IDLH (NIOSH), ten-Berge n by species
- Numerics
- algebraic distance-to-threshold via bisection
ToxicMixture — multi-species
implementedhazard index
For composite leaks (NH₃ + Cl₂, sour gas, etc.). Hazard index is the additive sum
over species at each receptor; per-species distances reported alongside.
- Module
solvers/tier1/toxic_mixture.py
- Aggregation
- additive HI; probit fatality combined per-species
Indoor release
implementedbox model
Single-compartment well-mixed model with infiltration / ventilation rate; AEGL/IDLH
time-to-reach for occupant evacuation planning.
- Module
solvers/tier1/indoor.py
- Numerics
- 1st-order ODE, closed-form decay/build-up
09 · Cross-cutting
Source terms
Release-rate models that feed the consequence engines. Same numerics power both Tier-1 and
Tier-2 (Tier-2 reads the source term from the same JSON).
Source-term library
implementedorifice + pool
- Module
solvers/tier1/source_terms.py
- Liquid orifice
- Bernoulli, Cd=0.61 (sharp-edge), Torricelli head
- Gas orifice
- compressible isentropic; choked & subsonic branches
- Two-phase
- HEM (Homogeneous Equilibrium Model) per Leung
- Pipe rupture
- full-bore + half-bore; PipeRupture class
- Liquid pool
- spreading + evaporation (Mackay & Matsugu)
- Tank rupture
- instantaneous flash + vapour cloud
Options & defaults
| cd_orifice | 0.61 | sharp-edged; 0.82 round |
| tank_release_duration_s | 10 | instantaneous-equivalent |
| pool_evap_model | mackay_matsugu | windspeed + Sc-corrected |
TwoPhaseFlash
implementedVLE
Adiabatic flash for pressurised liquefied releases (LPG, NH₃, Cl₂). Returns vapour
fraction, post-flash T, and aerosol mass for rainout estimation. Drives BLEVE and
two-phase jet branching.
- Module
solvers/tier1/two_phase.py
- Original
- Leung omega method (1990)
10 · Cross-cutting
Geometry & site preprocessor
Tier-1 itself is point-source — but the same site description is what gets handed to
Tier-2 and to the QRA layer. Geometry preprocessor exists in Tier-1 specifically to make
that hand-off mechanical.
SiteDefinition
implementedscene graph
- Module
solvers/tier1/geometry_preprocessor.py
- Primitives
- Building, PipeRack, EquipmentCluster, Release
- Hands off to Tier-2
- Brinkman boxes (large), PDR zones (sub-grid), STL voxels
STL reader + signed-distance grid
implementedgeometry IO
Binary & ASCII STL ingest; produces an SDF grid the radiation solver and Brinkman
mask consume. Voxelization defaults to 64×32×16 — finer grids only when STL is the
primary obstacle representation.
- Module
solvers/tier1/stl_reader.py
- Companion
- Tier-2 voxelizer at
solvers/radiation/standalone/postprocess/stl_voxelizer.py
PDR calculator (sub-grid drag preview)
implementedPDR helper
Builds Porosity-Distributed-Resistance ParmParse blocks for Tier-2 inputs. Bookkeeps
pipes / beams / mixed congestion / canopy with Cd, area density, and porosity.
Shared object representation across Tier-1 and Tier-2.
- Module
solvers/tier1/pdr_calculator.py
- Outputs
- up to 8 PDR zones, ParmParse format
- Default Cd
- 1.2 cylinder · 2.0 flat · 1.0 canopy
Site & meteorology
implementedsite
- Module
solvers/tier1/site.py
- Classes
- WindRose, Installation, ReceptorZone, Site
- Use
- iterate scenarios over wind-rose bins for QRA aggregation
11 · Risk Workbench
QRA aggregation
Probit + IR + F-N + risk contour
implementedprobit
- Module
solvers/tier1/qra.py
- Probit · thermal
- Eisenberg / TNO Green Book
- Probit · overpressure
- HSE 2010 lung-haemorrhage curve
- Probit · toxic
- per-species coefficients (TNO Green Book)
- Numerics
- scenario superposition; F-N curve with population density
- Outputs
- IR(r), F-N curve, gridded risk contours
Options & defaults
| population_density_per_m2 | 0.001 | 1 person / 1000 m² |
| indoor_fraction | 0.0 | override per-zone |
| grid_step_m | 25 | contour resolution |
LOPA — Layer of Protection
implementedscenario credit
- Module
solvers/tier1/lopa.py
- Form
- frequency × ∏(IPL PFD) → mitigated frequency
- Use
- safety-instrumented function (SIF) sizing input
Fault Tree
implementedgraph
- Module
solvers/tier1/qra_engine/fault_tree.py
- Methods
- Top-event probability; minimal cut sets (SOP minimisation); Fussell-Vesely importance
Accident scenario
implementedorchestration
Top-level orchestrator. Reads example_scenarios.json /
example_lopa.json, runs source-term → consequence → probit → QRA, and emits
the regulatory-ready bundle.
- Module
solvers/tier1/accident.py
12 · Compliance Packs
Regulatory output
Export adapters that translate the QRA bundle into the format the regulator expects.
No solver math here — these read the consequence outputs and format reports.
PNGRB ERDMP
implementedIndia
Emergency Response and Disaster Management Plan, Petroleum and Natural Gas Regulatory Board
(India). MCA + evacuation tables, branded PDF.
- Module
solvers/tier1/regulatory/pngrb.py
Oil Industry Safety Directorate minimum-distance lookup based on inventory tonnage.
Used as an OISD-116 / 118 cross-check.
- Module
solvers/tier1/regulatory/oisd.py
Control of Major Accident Hazards (UK / Northern Ireland). Lower-tier vs upper-tier
classification by substance & inventory.
- Module
solvers/tier1/regulatory/comah.py
EU Seveso-III Directive 2012/18/EU. Substance threshold lookup, additive aggregation rule,
domino-grouping by neighbour distance.
- Module
solvers/tier1/regulatory/seveso.py
13 · Methods
Numerics & sampling
Monte Carlo uncertainty
implementedUQ
- Module
solvers/tier1/montecarlo.py
- Distributions
- Uniform · Triangular · LogNormal · Choice
- Numerics
- seeded NumPy RNG; vectorised; percentile rollups
Options & defaults
| n_samples | 1000 | scaled to 10k for tail estimates |
| seed | 42 | reproducible CI |
| percentiles | [5, 50, 95] | + mean / std reported |
Sobol sensitivity
implementedglobal SA
- Module
solvers/tier1/sobol.py
- Indices
- 1st-order Si + total-order STi
- Numerics
- Saltelli sampling matrix; pick-freeze estimator
Numerics philosophy. Tier-1 is intentionally closed-form / 1-D. Where an ODE is
unavoidable (HEGADAS-S) we use SciPy solve_ivp with RK45 default and a
conservative Euler fallback for stiff inlets — chosen because Tier-1 must run in milliseconds
inside the QRA inner loop.
14 · Roadmap
Upcoming Tier-1 work
Items below are tracked under tier1_future_priorities and are scoped to land
before the Phase-1 close-out. None require Tier-2 changes.
Crosswind & meander corrections
upcomingdispersion
Time-averaged centreline overshoot correction for low wind / class F. Targets
regulatory parity with AERMOD's MEANDER block.
Probit expansion
upcomingQRA
Adds species-specific probit constants for HF, COCl₂, AsH₃, B₂H₆ — Indian
hazmat-tier list. Same probit infrastructure, table-only.
Britter-McQuaid instantaneous
upcomingdense gas
Second nomogram for catastrophic puff releases. Required to size BLEVE-adjacent
dense vapour clouds without re-running HEGADAS.
Full Mudan solid-flame integral
upcomingpool fire
Full 2-D view-factor integral for non-circular pools. Current implementation uses
the simplified vertical-receiver form (within ~15% for x ≥ 2·D).
AERMOD shim → terrain & PRIME
upcomingcomparator
Lift the comparator from flat terrain to AERMOD's elevated-terrain receptors and
PRIME building-downwash. Lets AgniKawach be cited as a side-by-side AERMOD reference.
Tier-1 → Tier-2 auto-optimiser
draftorchestration
Designed: Tier-1 result determines Tier-2 domain extents, base grid, source
footprint, solver branch (low-Mach vs compressible). 37 unit tests already in tree;
integration with scenario_builder.html pending.
- Module (draft)
solvers/tier1/tier1_to_tier2.py