# Individual Risk Contours
Source: https://tekrisk.com/en/docs/individual-risk/ir-contours

Technical methodology for calculating Individual Risk (IR) contour maps using TekRisk — grid-based IR aggregation, Marching Squares contouring, and GeoJSON output for QRA visualization

## 1. Executive Summary

**Individual Risk (IR) contours** are iso-risk lines drawn on a map that connect all geographic points sharing the same annual probability of fatality due to industrial hazards. They are the cornerstone of Quantitative Risk Assessment (QRA) in the chemical and oil & gas industries.

TekRisk computes IR contours by:

<Steps>
  <Step>
    **Aggregating** all defined risk scenarios (fires, explosions, toxic clouds) at a facility
  </Step>
  <Step>
    **Evaluating** the fatality probability at thousands of grid points around the site
  </Step>
  <Step>
    **Extracting** contour lines at standard risk levels (e.g., $1 \times 10^{-5}$, $1 \times 10^{-6}$ per year)
  </Step>
  <Step>
    **Projecting** results onto a geographic map as GeoJSON polygons
  </Step>
</Steps>

<Callout type="info" title="Map visualization">
The result is a set of nested contour polygons — each representing a different risk level — overlaid on a Mapbox GL map, allowing engineers to visually assess whether vulnerable receptors (schools, hospitals, residential areas) fall within unacceptable risk zones.
</Callout>

---

## 2. Key Concepts

<Cards>
  <Card title="Individual Risk (IR)">
    Annual probability that a hypothetical person, continuously present and unprotected at a specific location, will be killed due to an industrial accident. Expressed as a dimensionless number per year (e.g., $IR = 1 \times 10^{-5}$/year = 1 in 100,000 chance).
  </Card>
  <Card title="Scenario Frequency (f)">
    How often a particular accident scenario is expected to occur, in events/year. Derived from historical failure rate databases (OREDA, OGP/IOGP) combined with event tree analysis.
  </Card>
  <Card title="Fatality Probability (Pf)">
    Probability of death at a specific location given a scenario occurs. Derived from probit models (thermal/blast) or point-in-polygon tests (flash fire — $P_f = 1.0$ inside the LEL envelope, $0$ outside).
  </Card>
  <Card title="Contour Levels">
    Specific IR values at which iso-risk lines are drawn. TekRisk uses seven standard levels: $10^{-2}$ through $10^{-8}$ per year.
  </Card>
</Cards>

### 2.1 Core Formula

The Individual Risk at any point $(x, y)$ is the sum of contributions from all scenarios:

$$
IR(x, y) = \sum_{i} f_i \times P_{f,i}(x, y)
$$

| Symbol | Description | Units |
|--------|-------------|-------|
| $IR(x, y)$ | Individual risk at location $(x, y)$ | per year |
| $f_i$ | Frequency of scenario $i$ | events/year |
| $P_{f,i}(x, y)$ | Probability of fatality at $(x, y)$ given scenario $i$ occurs | dimensionless $[0, 1]$ |
| $i$ | Scenario index (each risk model is a scenario) | — |

---

## 3. Supported Risk Models

TekRisk supports five consequence model types, each contributing to the overall IR calculation:

| Model | Hazard Type | Symmetry | $P_f$ Method | Wind Dependence |
|-------|-------------|----------|-------------|-----------------|
| **Fireball** | Thermal radiation | Radial | Distance-based interpolation on fatality profile | None — omni-directional |
| **Pool Fire** | Thermal radiation | Radial | Distance-based interpolation on fatality profile | None — radially symmetric |
| **Jet Fire** | Thermal radiation | Radial | Distance-based interpolation on fatality profile | None — radially symmetric |
| **VCE** | Blast overpressure | Radial | Distance-based interpolation on fatality profile | None — radially symmetric |
| **Flash Fire** | Flame engulfment | Directional | Point-in-polygon on rotated LEL envelope | Critical — uses full 16-direction wind rose |

<Tabs items={["Radial Models", "Directional Model (Flash Fire)"]}>
  <Tab value="Radial Models">

**Fireball, Pool Fire, Jet Fire, VCE** — These models assume the hazard effect decays with distance from the source in all directions equally. The fatality probability at any point depends only on the Euclidean distance to the source, following a pre-computed **fatality profile** (fatality percentage vs. distance).

  </Tab>
  <Tab value="Directional Model (Flash Fire)">

**Flash Fire** is fundamentally different. The flammable vapor cloud extends downwind from the source, and its shape depends on atmospheric dispersion. The fatality probability at any point depends on whether the point falls inside the **Lower Explosive Limit (LEL)** envelope, and the **probability** that the wind is blowing in the direction that would carry the cloud toward that point.

  </Tab>
</Tabs>

---

## 4. Step-by-Step Methodology

<Mermaid>
{`flowchart TD
    A["Input Data<br/>(Risk Models, Source Locations,<br/>Fatality Profiles, Wind Rose)"] --> B["Step 1: Scenario Definition<br/>Build scenario list with<br/>frequency, source, model type"]
    B --> C["Step 2: Wind Rose Integration<br/>(Flash Fire only)<br/>Pre-rotate LEL polygons × 16 dirs"]
    B --> D["Step 3: Grid Generation<br/>2D rectangular grid<br/>resolution + auto-extent"]
    C --> E["Step 4: IR Calculation<br/>For each grid point:<br/>Radial → distance + interpolate<br/>Flash Fire → point-in-polygon"]
    D --> E
    E --> F["Step 5: Contour Extraction<br/>Marching Squares algorithm<br/>4-bit cell → closed polygons"]
    F --> G["Step 6: Geographic Conversion<br/>Local meters → lat/lon<br/>GeoJSON FeatureCollection"]

    style A fill:#e1f5fe
    style G fill:#c8e6c9
    style E fill:#fff3e0`}
</Mermaid>

### Step 1: Scenario Definition

Each enabled risk model defines a **scenario** characterized by:

| Parameter | Description | Source |
|-----------|-------------|--------|
| Frequency ($f$) | Annual occurrence rate | Risk model configuration |
| Source location | Geographic coordinates (lat, lon) | Source definition |
| Model type | fireball, poolfire, jetfire, vce, flashfire | Risk model type |
| Fatality profile | $P_f$ vs. distance curve (radial) or LEL polygon (flash fire) | Prior consequence calculation results |

**Fatality profiles** are extracted from previously completed consequence calculations stored in `RiskCalculation.results.fatalidades`. Each profile consists of distance-fatality percentage pairs:

| Distance (m) | Fatality (%) |
|:---:|:---:|
| 0 | 100 |
| 25 | 95 |
| 50 | 70 |
| 100 | 30 |
| 200 | 5 |
| 350 | 0 |

<Callout type="info" title="Flash Fire profiles">
For flash fire models, the fatality "profile" is replaced by a **LEL polygon** — the geographic outline of the flammable cloud at the Lower Explosive Limit concentration for a single wind direction.
</Callout>

---

### Step 2: Wind Rose Integration (Flash Fire)

Flash fire scenarios require integration with a **Pasquill-Gifford wind rose** to account for the directional nature of vapor cloud propagation.

#### Wind Rose Structure

The wind rose divides the compass into **16 equi-spaced directions** at 22.5° intervals. Each direction carries a probability (fraction of time the wind blows from that direction), split into day and night periods:

| Period | Hours | Stability Classes |
|--------|-------|-------------------|
| Day | 06:00 – 18:00 | A, B, C, D |
| Night | 18:00 – 06:00 | D, E, F |

#### Polygon Rotation

For each of the 16 wind directions, the base LEL polygon is **rotated around the source point**:

$$
x' = x \cos(\theta) - y \sin(\theta)
$$

$$
y' = x \sin(\theta) + y \cos(\theta)
$$

Where $(x, y)$ is the original polygon vertex relative to source, $\theta$ is the rotation angle, and $(x', y')$ is the rotated vertex.

The result is **16 rotated LEL polygons**, each associated with the wind probability for its direction.

#### Flash Fire $P_f$ Formula

$$
P_{f,\text{ff}}(x, y) = \min\!\left(1.0,\; \sum_{j} p(\theta_j) \cdot \mathbb{1}\{(x,y) \in \text{Polygon}(\theta_j)\}\right)
$$

Where:

| Symbol | Description |
|--------|-------------|
| $\theta_j$ | Wind direction $j \in \{0°, 22.5°, \ldots, 337.5°\}$ |
| $p(\theta_j)$ | Probability of wind from direction $\theta_j$ $(0$ to $1)$ |
| $\text{Polygon}(\theta_j)$ | LEL polygon rotated to direction $\theta_j$ |
| $\mathbb{1}\{\cdot\}$ | Indicator function: 1 if point is inside polygon, 0 otherwise |

<Callout type="info" title="Probability cap">
The sum is capped at 1.0 because the maximum fatality probability cannot exceed certainty.
</Callout>

---

### Step 3: Grid Generation

A uniform 2D rectangular grid is generated to evaluate IR across the study area.

| Parameter | Description | Default |
|-----------|-------------|---------|
| Center | Centroid of all source coordinates | Auto-calculated |
| Resolution | Spacing between adjacent grid points | 25 m |
| Extent | Half-size of the grid from center | Auto-calculated |

**Available resolutions**: 1, 5, 10, 25, 50, 100 meters.

#### Auto-Calculation of Extent

<Steps>
  <Step>
    Find the **maximum fatality profile distance** across all scenarios
  </Step>
  <Step>
    Multiply by **1.3** (30% padding factor)
  </Step>
  <Step>
    Round up to the nearest **100 m**
  </Step>
</Steps>

#### Grid Dimensions

$$
\text{Points per side} = \frac{2 \times \text{extent}}{\text{resolution}} + 1
$$

$$
\text{Total grid points} = (\text{Points per side})^2
$$

**Example**: With extent = 2,000 m and resolution = 25 m → 161 points per side → **25,921 total points**.

#### Coordinate System

The grid uses a **local Cartesian coordinate system** in meters:

- **Origin**: Grid center (centroid of sources)
- **X-axis**: West → East (positive eastward)
- **Y-axis**: South → North (positive northward)

<Callout type="warn" title="Flat-earth approximation">
This approximation is valid for distances up to ~50 km from the center — adequate for typical industrial sites.
</Callout>

---

### Step 4: IR Calculation at Each Grid Point

For every point in the grid, the system accumulates IR contributions from all enabled scenarios.

<Tabs items={["Radial Models", "Flash Fire", "Linear Interpolation Detail"]}>
  <Tab value="Radial Models">

**Fireball, Pool Fire, Jet Fire, VCE** — For each grid point $(x_i, y_j)$ and each radial scenario $s$:

**Step 1 — Euclidean distance:** $d = \sqrt{(x_i - x_s)^2 + (y_j - y_s)^2}$

**Step 2 — Quick reject:** If $d > d_{\max}$ → skip ($P_f = 0$)

**Step 3 — Interpolate fatality profile:** If $d \leq d_0$: $P_f = P_0 / 100$. Otherwise find interval $[d_k, d_{k+1}]$ containing $d$:

$$
t = \frac{d - d_k}{d_{k+1} - d_k}, \qquad P_f = \frac{P_k + t \cdot (P_{k+1} - P_k)}{100}
$$

**Step 4 — Accumulate:** $IR(x_i, y_j) \mathrel{+}= f_s \times P_f$

  </Tab>
  <Tab value="Flash Fire">

For each grid point $(x_i, y_j)$ and each flash fire scenario $s$:

**Step 1 — Convert** grid point to geographic coordinates (lat, lon).

**Step 2 — Point-in-polygon test:** For each of 16 pre-rotated LEL polygons, test if (lon, lat) falls inside the polygon using the **ray-casting** algorithm.

**Step 3 — Accumulate** wind-weighted probability:

$$
P_f = \min\!\left(1.0,\; \sum (\text{wind probability} \times \text{inside indicator})\right)
$$

**Step 4 — Accumulate:** $IR(x_i, y_j) \mathrel{+}= f_s \times P_f$

  </Tab>
  <Tab value="Linear Interpolation Detail">

For thermal and VCE fatality profiles, the interpolation is **piecewise linear**.

Given profile points $(d_0, P_0), (d_1, P_1), \ldots, (d_n, P_n)$:

If $d \leq d_0$ → $P_f = P_0$ (constant below minimum distance). If $d \geq d_n$ → $P_f = 0$ (zero beyond maximum distance). Otherwise → **linear interpolation** between bracketing points.

  </Tab>
</Tabs>

---

### Step 5: Contour Extraction (Marching Squares)

Once the IR grid is fully populated, contour lines at each target level are extracted using the **Marching Squares** algorithm.

<Accordions type="multiple">
  <Accordion title="Algorithm Overview">

Marching Squares processes the grid **cell by cell**. Each cell has four corner values. For a given contour level, each corner is classified as **above** ($\geq$ level) or **below** ($<$ level), creating a **4-bit index** (16 possible configurations).

The four bits correspond to: bit 0 = bottom-left, bit 1 = bottom-right, bit 2 = top-right, bit 3 = top-left. If a corner value $\geq$ the contour level, its bit = 1.

**Saddle points** (cases 5 and 10) are ambiguous configurations that generate two separate edge segments.

  </Accordion>
  <Accordion title="Edge Interpolation">

For each edge that the contour crosses, the exact crossing position is computed by **linear interpolation**:

Given two adjacent corner values $v_1$ and $v_2$, and the contour level $L$:

$$
t = \frac{L - v_1}{v_2 - v_1}, \qquad t \in [0, 1]
$$

$$
\text{Crossing point} = \text{vertex}_1 + t \times (\text{vertex}_2 - \text{vertex}_1)
$$

  </Accordion>
  <Accordion title="Segment Connection">

The marching squares pass produces disconnected line segments. These are connected into **closed polygons**: Start with an unvisited segment → find the nearest unvisited segment whose start point is within tolerance ($1 \times 10^{-6}$ m) of the current endpoint → append and continue until the polygon closes (endpoint $\approx$ start point) → repeat for remaining unvisited segments.

  </Accordion>
  <Accordion title="Winding Order Validation">

All output polygons are validated to ensure **counter-clockwise (CCW)** winding order, as required by the GeoJSON specification. This is verified using the **signed area** from the shoelace formula:

$$
\text{Signed Area} = \frac{1}{2} \sum_{i} (x_i \cdot y_{i+1} - x_{i+1} \cdot y_i)
$$

If Signed Area $< 0$ → polygon is clockwise → **reverse vertex order**. If Signed Area $> 0$ → polygon is counter-clockwise → **correct**.

  </Accordion>
</Accordions>

---

### Step 6: Geographic Conversion

Contour polygons are converted from local meter coordinates back to geographic coordinates for map display.

#### Conversion Formulas

$$
\text{lat} = \text{lat}_{\text{center}} + \frac{y}{111{,}320}
$$

$$
\text{lon} = \text{lon}_{\text{center}} + \frac{x}{111{,}320 \times \cos(\text{lat}_{\text{center}} \times \pi / 180)}
$$

Where $111{,}320$ is the approximate meters per degree of latitude (WGS84).

#### GeoJSON Output

Each contour polygon is packaged as a GeoJSON Feature:

```json
{
  "type": "Feature",
  "properties": {
    "level": 1e-5,
    "levelFormatted": "1e-5",
    "color": "#EA580C",
    "opacity": 0.3,
    "type": "ir_contour"
  },
  "geometry": {
    "type": "Polygon",
    "coordinates": [[[lon1, lat1], [lon2, lat2], "...", [lon1, lat1]]]
  }
}
```

#### Area Calculation

The area enclosed by each contour is computed using the **shoelace formula** on local meter coordinates:

$$
A = \frac{1}{2} \left| \sum_{i} (x_i \cdot y_{i+1} - x_{i+1} \cdot y_i) \right| \quad [\text{m}^2]
$$

| Area Range | Display Unit |
|------------|-------------|
| $< 10{,}000$ m² | m² |
| $10{,}000 – 1{,}000{,}000$ m² | hectares (ha) |
| $\geq 1{,}000{,}000$ m² | km² |

---

## 5. Risk Tolerability Criteria

The following table summarizes international standards for individual risk tolerability:

| Standard | Region | Intolerable Limit | Broadly Acceptable | Reference |
|----------|--------|-------------------|---------------------|-----------|
| **UK HSE R2P2** | United Kingdom | $1 \times 10^{-4}$ (public) | $1 \times 10^{-6}$ | HSE (2001) |
| **ASEA** | Mexico | $1 \times 10^{-3}$ | $1 \times 10^{-6}$ | ASEA Guidelines |
| **RIVM** | Netherlands | $1 \times 10^{-5}$ | $1 \times 10^{-8}$ | RIVM guidelines |
| **Hong Kong** | Hong Kong | $1 \times 10^{-5}$ | $1 \times 10^{-6}$ | HK risk guidelines |
| **HIPAP No. 4** | Australia | $1 \times 10^{-5}$ | $1 \times 10^{-6}$ | NSW HIPAP No. 4 |
| **EPA / OSHA** | United States | $1 \times 10^{-4}$ | $1 \times 10^{-6}$ | EPA RMP / OSHA PSM |

### ALARP Principle

<Callout type="warn" title="ALARP — As Low As Reasonably Practicable">
Between the **intolerable** and **broadly acceptable** limits lies the **ALARP** region. Within this zone, risk is tolerated only if further reduction is impracticable or disproportionately costly.
</Callout>

| Zone | Risk Level | Required Action |
|------|-----------|----------------|
| **Intolerable** | $\geq 1 \times 10^{-3}$ to $1 \times 10^{-4}$ (varies by standard) | Risk cannot be justified except in extraordinary circumstances |
| **ALARP** | Between intolerable and acceptable thresholds | Tolerable only if reduction is impracticable |
| **Broadly Acceptable** | $\leq 1 \times 10^{-6}$ to $1 \times 10^{-8}$ (varies by standard) | No further action needed |

---

## 6. Contour Color Code

TekRisk uses a seven-level color scheme to distinguish risk zones on the map:

| Level (per year) | Color | Hex Code | Risk Interpretation |
|:---:|-------|:---:|---------------------|
| $1 \times 10^{-2}$ | Indigo | `#4B0082` | Extreme — immediate action required |
| $1 \times 10^{-3}$ | Dark Red | `#8B0000` | Intolerable — exceeds all standards |
| $1 \times 10^{-4}$ | Red | `#DC2626` | Intolerable for public (UK HSE, US EPA) |
| $1 \times 10^{-5}$ | Orange | `#EA580C` | Upper ALARP bound (many jurisdictions) |
| $1 \times 10^{-6}$ | Yellow | `#EAB308` | Broadly acceptable threshold |
| $1 \times 10^{-7}$ | Light Green | `#84CC16` | Low risk |
| $1 \times 10^{-8}$ | Green | `#22C55E` | Negligible risk |

<Callout type="info" title="Non-standard levels">
Contour levels not in this standard set default to gray (`#6B7280`).
</Callout>

---

## 7. Comparison with CCPS Methodology

TekRisk implements the **general approach** described in CCPS *Guidelines for Chemical Process Quantitative Risk Analysis* (2nd Ed., 2000), §4.4.1.2. The core formula documented in §2.1 is literally **Eq. 4.4.2** of CCPS. This section traces the implementation-to-implementation correspondence so that auditors and regulatory reviewers can map TekRisk's outputs back to the canonical reference.

### 7.1 Equation-to-Equation Mapping

| CCPS (2000) | TekRisk Equivalent | Note |
|---|---|---|
| Eq. 4.4.1 — $IR_{x,y} = \sum_{i} IR_{x,y,i}$ | Scenario additivity (§2.1) | Identical |
| Eq. 4.4.2 — $IR_{x,y,i} = f_i \cdot p_{f,i}$ | Per-grid-cell term (§4 Step 4) | Shared foundation |
| Eq. 4.4.3 — $f_i = F_I \cdot p_{O,i} \cdot p_{OC,i}$ | $f_i$ consumed from upstream `RiskCalculation.results` (§4 Step 1) | TekRisk does not recompute the event tree; it ingests the frequency already derived |
| Eq. 4.4.4 — directional factor $f_i \cdot (\theta_i / 360)$ | Replaced by 16-direction wind rose with empirical $p(\theta_j)$ (§4 Step 2) | TekRisk refines: real directional probabilities vs. uniform wind |
| Eq. 4.4.5 — cumulative contour-by-contour summation | Replaced by full-grid IR evaluation + Marching Squares (§4 Step 5) | Eq. 4.4.5 only applies to the CCPS simplified approach |

### 7.2 General Approach (CCPS §4.4.1.2, Fig. 4.7) vs TekRisk

| Aspect | CCPS General Approach | TekRisk |
|---|---|---|
| Geographic evaluation | "Every geographical location" (unspecified discretization) | Uniform rectangular grid (1–100 m), auto-extent from fatality profile |
| Effect zones | Probit model or discrete zones per incident outcome | Continuous $P_f(d)$ profile with piecewise-linear interpolation |
| Wind treatment | Any level of detail (manual) | 16-direction Pasquill–Gifford wind rose, day/night split |
| Contour tracing | "Manually or by any standard graphics contouring package" | Marching Squares (16 cases + saddle-point handling) |
| Output format | Printed map | GeoJSON FeatureCollection + Mapbox GL visualization |

### 7.3 Simplified Approach (CCPS §4.4.1.3, Fig. 4.8) vs TekRisk

The CCPS simplified approach bundles six conservative assumptions designed for hand calculation. Because TekRisk runs on a numerical grid, those simplifications are unnecessary and **the most restrictive ones are replaced with realistic physical models**, yielding contours that are more accurate, directionally correct, and less conservative than the CCPS uniform circles:

| CCPS Simplified Assumption | TekRisk |
|---|---|
| Point sources | Point sources (compatible) |
| Uniform wind distribution (equally likely in any direction) | **16-direction wind rose with empirical probabilities** |
| Single wind speed and stability class | Day/night split across Pasquill–Gifford classes A–F |
| Discrete effect zones (100% inside / 0% outside) | **Continuous $P_f$ vs distance profile** |
| Uniform ignition distribution | Inherited from the scenario event tree (upstream) |
| Circular risk contours | **Realistic contour shapes that follow the actual risk distribution, traced by Marching Squares** |

### 7.4 What TekRisk Adds Beyond CCPS

- **Continuous fatality profile** with piecewise-linear interpolation — CCPS §4.4.1.3 contemplates only step functions or full probit models
- **Marching Squares contour extraction** with CCW winding validation for GeoJSON compliance — CCPS specifies only "manually or by any standard graphics contouring package"
- **Flash fire via rotated LEL envelope** across 16 directions — CCPS §8.2 only covers the pie-shaped sector simplification
- **Automatic local-meter ↔ lat/lon conversion** plus enclosed-area computation via the shoelace formula (§4 Step 6)
- **Seven standardized contour levels** ($10^{-2}$ to $10^{-8}$) with fixed color coding (§6) — CCPS leaves level selection to the analyst

---

## 8. Limitations

<Accordions type="multiple">
  <Accordion title="Coordinate conversion approximation">
    **Flat-earth approximation** for coordinate conversion. Valid only for distances $< 50$ km from the grid center. Negligible for typical industrial sites ($< 5$ km extent).
  </Accordion>
  <Accordion title="Linear interpolation">
    **Linear interpolation** between fatality profile points. Real fatality curves may be non-linear. Conservative between points; accuracy depends on profile density.
  </Accordion>
  <Accordion title="Wind rose granularity">
    16 directions (22.5° spacing). Finer directional resolution is not captured. Adequate for most QRA applications; aligns with Pasquill-Gifford convention.
  </Accordion>
  <Accordion title="No seasonal or hourly wind variation">
    Uses annual average or day/night average wind rose. May underestimate directional risk for locations with strong seasonal patterns.
  </Accordion>
  <Accordion title="No shelter or building shielding">
    All persons assumed to be outdoors and unprotected. Results are conservative (overestimate risk to sheltered populations).
  </Accordion>
  <Accordion title="No terrain effects">
    Flat terrain assumed for gas dispersion. May underestimate risk in valleys or underestimate dilution on ridges.
  </Accordion>
  <Accordion title="No domino effects">
    Each scenario is treated independently. Does not capture cascading failures or multi-source escalation.
  </Accordion>
  <Accordion title="Grid resolution limits">
    Features smaller than the grid spacing may be missed. Use finer resolution (1–10 m) near sources if needed.
  </Accordion>
  <Accordion title="Radial symmetry assumption">
    Thermal and VCE models assume no wind-driven fire shape deformation. Real fire plumes may be elongated downwind.
  </Accordion>
  <Accordion title="Uniform exposure assumption">
    Population assumed permanently present outdoors. Worst-case assumption; actual exposure varies with occupancy schedules.
  </Accordion>
  <Accordion title="Constant frequency">
    Scenario frequency assumed constant throughout the year. Does not account for seasonal operations or shutdown periods.
  </Accordion>
  <Accordion title="Probit model accuracy">
    Depends on quality of upstream consequence calculations. IR contours inherit any errors in consequence modeling.
  </Accordion>
</Accordions>

---

## 9. Bibliographic References

<Accordions type="single">
  <Accordion title="View complete reference list">

| # | Reference |
|---|-----------|
| 1 | **Ermak, D.L.** (1990). *"User's Manual for SLAB: An Atmospheric Dispersion Model for Denser-Than-Air Releases"*. UCRL-MA-105607, Lawrence Livermore National Laboratory. |
| 2 | **TNO** (2005). *"Methods for the Calculation of Physical Effects"* (Yellow Book), 3rd Ed. Committee for the Prevention of Disasters, The Netherlands. |
| 3 | **TNO** (1999). *"Guidelines for Quantitative Risk Assessment"* (Purple Book), CPR 18E. Committee for the Prevention of Disasters, The Netherlands. |
| 4 | **CCPS** (2000). *"Guidelines for Chemical Process Quantitative Risk Analysis"*, 2nd Ed. AIChE. |
| 5 | **UK HSE** (2001). *"Reducing Risks, Protecting People"* (R2P2). Health and Safety Executive, United Kingdom. |
| 6 | **ASEA** (Mexico). *Regulatory framework for risk tolerability criteria*. Agencia de Seguridad, Energía y Ambiente. |
| 8 | **Lees, F.P.** (2012). *"Loss Prevention in the Process Industries"*, 4th Ed. Butterworth-Heinemann. |
| 9 | **Crowl, D.A. & Louvar, J.F.** (2011). *"Chemical Process Safety: Fundamentals with Applications"*, 3rd Ed. Prentice Hall. |
| 10 | **RIVM** (Netherlands). *Risk tolerability criteria documentation*. National Institute for Public Health and the Environment. |

  </Accordion>
</Accordions>
