Members · Solver Reference · Tier-1

Tier-1 Integral Models

Screening-grade consequence models. Algebraic / 1-D ODE physics — seconds to minutes per scenario. Always-on; gates Tier-2 CFD when results approach regulatory thresholds. All eight consequence types plus QRA aggregation.

Module root: solvers/tier1/ Language: Python 3.11 + NumPy Tests: 280+ unit (Tier-1 ≈ 65% coverage) Status: Phase 1 ≈ 70% complete
Consequence types
8
dispersion · dense · pool · jet · flash · VCE · BLEVE · toxic
Modules
28
Python files in solvers/tier1/
Regulatory packs
4
PNGRB · OISD · COMAH · Seveso-III
Speed
~2–500 ms
per scenario, single core
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

OptionDefaultNotes
stabilityDA=v.unstable, F=stable
terrainruralrural | urban (Briggs urban set)
wind_speed_m_s4.0at release height
release_height_m0.0ground-level if 0
receptor_height_m1.5breathing height
q_g_per_s100.0mass 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_kindcontinuousinstantaneous variant pending
surface_roughness_m0.10entered via HEGADAS path when used
switch_Ri0≥ 0.15below 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

speciesCl2CoolProp / hazmat DB property lookup
q_g_per_s100.0steady release rate
u_ref4.0 m/sat z_ref (default 10 m)
z0_m0.10surface roughness
x_max_m5000integration domain
n_eval600profile 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

fuelpropanedrives η, m″, ρ_v(flame)
D_pool_m10.0equivalent diameter
u_wind_m_s2.0used by tilt, AGA correction
RH_pct50atmos. transmissivity
flux_methodsolid_flamesolid_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

fuelmethaneη-table fuel key
m_dot_kg_s1.0released gas mass-flow
d_orifice_m0.05drives jet velocity
u_wind_m_s2.0drives wind-bend Δθ
methodautoauto picks line-source for x < 3·L
z_receiver_m1.5standing 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

fuelpropaneheat of combustion
flammable_mass_kg1000post-dispersion ≥ ½·LFL
congestion_class73=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

reactivitymediumlow | medium | high
congestionmediumlow | medium | high
machautooverride 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

fuelpropaneη, ΔHc
mass_kg10000flashed liquid mass
RH_pct50transmissivity
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_orifice0.61sharp-edged; 0.82 round
tank_release_duration_s10instantaneous-equivalent
pool_evap_modelmackay_matsuguwindspeed + 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_m20.0011 person / 1000 m²
indoor_fraction0.0override per-zone
grid_step_m25contour 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
OISD
implementedIndia

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
COMAH
implementedUK

Control of Major Accident Hazards (UK / Northern Ireland). Lower-tier vs upper-tier classification by substance & inventory.

Module
solvers/tier1/regulatory/comah.py
Seveso-III
implementedEU

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_samples1000scaled to 10k for tail estimates
seed42reproducible 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