# Social Risk & F-N Curve
Source: https://tekrisk.com/en/docs/social-risk

Technical documentation for Social Risk quantification, F-N Curve construction, ALARP criteria evaluation, and Individual Risk calculation in industrial QRA

## 1. Introduction

**Social Risk** quantifies the hazard that an industrial facility poses to the **surrounding community**. Unlike Individual Risk (which evaluates the probability that a specific person will die), Social Risk expresses the relationship between the frequency of an accident and the number of fatalities it could cause.

The primary tool for visualizing and evaluating Social Risk is the **F-N Curve** (*frequency-number chart*):

- **X-axis (N):** Number of fatalities in a single event
- **Y-axis (F):** Cumulative frequency $F(N)$ = annual frequency of events causing **at least N** fatalities [events/year]

Both axes use a **logarithmic scale**.

<Callout type="info" title="Regulatory requirement">
F-N Curves are required by major QRA standards worldwide (UK R2P2, Netherlands RIVM, Mexico ASEA, Australia HIPAP, Hong Kong HKSAR) for operating permits and land-use planning around hazardous facilities.
</Callout>

---

## 2. Key Concepts

<Cards>
  <Card title="Scenario Frequency P(As)">
    Annual rate [events/year] at which accidental scenario $A_s$ is expected to occur — from LOPA, fault trees, or historical databases (OREDA, TNO FACTS)
  </Card>
  <Card title="Expected Fatalities E[F(As)]">
    Expected number of deaths given that $A_s$ occurs — computed by consequence models via concentric ring integration with Probit functions
  </Card>
  <Card title="Exposed Population Ng">
    Number of people within the risk radius — defined by the 1% Probit radius for thermal/overpressure models, or by the LFL area for Flash Fire
  </Card>
  <Card title="Average Individual Risk RIg">
    Annual probability that an average person in the exposed population will die — $RI_g = E[F_a] / N_g$
  </Card>
</Cards>

### 2.1 Formal Definitions

$$
E[F(A_s)] = \sum_{r_i} P_{death}(r_i) \cdot \rho_{pop} \cdot A_{ring}(r_i)
$$

$$
N_g = \pi \cdot r_{1\%}^2 \cdot \rho_{pop} \quad \text{(Probit models)} \qquad N_g = A_{LFL} \cdot \rho_{pop} \quad \text{(Flash Fire)}
$$

$$
RI_g = \frac{E[F_a]}{N_g}, \quad \text{where} \quad E[F_a] = \sum_s P(A_s) \cdot E[F(A_s)]
$$

---

## 3. Calculation Sequence

<Mermaid>
{`flowchart TD
    A["Risk Models<br/>(PoolFire, JetFire, VCE, FlashFire, FireBall)<br/>with frequency P(As) per scenario"] --> B["Step 1: Model Fatalities<br/>FatalityUtils.js<br/>Concentric rings 5m wide, up to 10 km<br/>E[F(As)] = Σ Fatal_i"]
    B --> C["Step 2: Exposed Population Ng<br/>ng-calculator.ts<br/>Probit: Ng = π×r₁%²×ρ_pop<br/>Flash Fire: Ng = A_LFL×ρ_pop<br/>Wind rose: Ng = Σ Ng_i×P(dir_i)"]
    C --> D["Step 3: F-N Curve Construction<br/>social-risk-table.tsx<br/>F(N) = Σ fs for all s where Ns ≥ N<br/>Decreasing step function on log-log axes"]
    D --> E["Step 4: ALARP Criteria Evaluation<br/>fn-curve-analysis.ts<br/>Upper limit: F_lim(N) = C₁/N^|n|<br/>Excess: ΔF(N) = F(N) − F_obj(N)"]

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

<Steps>
  <Step>
    **Model Fatalities** — For each scenario, `FatalityUtils.js` integrates the death probability over concentric rings of 5 m width (up to 10 km), computing $E[F(A_s)] = \sum_i F_i$ using the applicable Probit function.
  </Step>
  <Step>
    **Exposed Population $N_g$** — `ng-calculator.ts` computes $N_g$ using the 1% Probit radius for thermal/overpressure models, the LFL polygon area for Flash Fire, or the weighted wind-rose sum for multi-directional scenarios.
  </Step>
  <Step>
    **F-N Curve Construction** — `calculateFnCurve()` collects all $(f_s, N_s)$ pairs and computes $F(N_k) = \sum_{s:\,N_s \geq N_k} f_s$ for each unique $N$ value, producing a decreasing log-log step function.
  </Step>
  <Step>
    **ALARP Evaluation** — `analyzeUnacceptableScenarios()` compares each curve point against the upper limit $F_{lim}(N) = C_1/N^{|n|}$, computes excess frequency $\Delta F$, and generates frequency reduction recommendations per scenario.
  </Step>
</Steps>

---

## 4. Fatality Calculation by Concentric Rings

### 4.1 Ring Geometry and Thermal Dose

The study area is divided into concentric rings of 5 m width, from the emission point to the maximum radius (default 10 km):

$$
A_{ring}(r_i) = \pi \left(r_{i+1}^2 - r_i^2\right) \quad [\text{m}^2]
$$

The accumulated thermal dose in each ring:

$$
D_{dose} = t_{exp} \cdot \left[q(r_i) \times 10^3\right]^{4/3} \quad \left[(\text{W/m}^2)^{4/3} \cdot \text{s}\right]
$$

**Code:** `FatalityUtils.js` → `calculateFatalities()`.

### 4.2 Fatality Probit Functions

<Tabs items={["Thermal Radiation", "Overpressure"]}>
  <Tab value="Thermal Radiation">

**CCPS Methodology (Eisenberg):**
$$
Pr = -14.9 + 2.56 \cdot \ln\!\left(\frac{D_{dose}}{10\,000}\right)
$$
*Reference: CCPS, Guidelines for CPQRA, 2nd Ed., p. 269.*

**TNO Methodology:**
$$
Pr = -36.38 + 2.56 \cdot \ln(D_{dose})
$$
*Reference: TNO Green Book (CPR 14E), 1997, p. 20, eq. 3.5.*

  </Tab>
  <Tab value="Overpressure">

**Eisenberg Model (CCPS):**
$$
Pr = -77.1 + 6.91 \cdot \ln(P_{Pa})
$$
where $P_{Pa}$ is peak overpressure in Pascals.

**Hurst Model (1989):**
$$
Pr = 1.47 + 1.35 \cdot \ln(P_{psi})
$$
where $P_{psi}$ is overpressure in psi.

*Reference: CCPS (1999), p. 273; Hurst, N.W. et al. (1989).*

  </Tab>
</Tabs>

### 4.3 Probit to Fatality Percentage

$$
P_{fatal}\% = 50 \left(1 + \frac{Pr-5}{|Pr-5|} \cdot \text{erf}\!\left(\frac{|Pr-5|}{\sqrt{2}}\right)\right)
$$

### 4.4 Fatalities per Ring

$$
F_i = \frac{P_{fatal,i}}{100} \cdot \rho_{pop} \cdot A_{ring}(r_i)
$$

<Callout type="info" title="Stopping criterion">
Calculation stops when $P_{fatal} < 0.1\%$. If $\sum F_i < 0.6$ the result is returned as 0 (negligible impact). **Code:** `FatalityUtils.js`, lines 111–200.
</Callout>

---

## 5. Exposed Population — $N_g$

<Tabs items={["Probit Models", "Flash Fire (LFL)", "Flash Fire + Wind Rose", "Polygon Correction"]}>
  <Tab value="Probit Models">

### 5.1 PoolFire, JetFire, VCE, FireBall

Interpolates model results to find the **1% death probability radius** $r_{1\%}$:

$$
N_g = \pi \cdot r_{1\%}^2 \cdot \rho_{pop}
$$

Linear interpolation between adjacent rings where fatal percentage crosses 1%:

$$
r_{1\%} = r_i + \frac{1\% - P_i}{P_{i+1} - P_i} \cdot (r_{i+1} - r_i)
$$

**Code:** `ng-calculator.ts` → `calculateNgForProbitModel()`.

  </Tab>
  <Tab value="Flash Fire (LFL)">

### 5.2 Flash Fire

Within the LFL envelope, probability of death is **100%** for unprotected persons:

$$
N_g = A_{LFL} \cdot \rho_{pop}
$$

where $A_{LFL}$ is the SLAB dispersion polygon area at LFL concentration.

**Code:** `ng-calculator.ts` → `calculateNgForFlashFire()`.

  </Tab>
  <Tab value="Flash Fire + Wind Rose">

### 5.3 16-Direction Wind Rose

For events with uncertain wind direction, a **petal diagram** is used:

$$
N_g = \sum_{i=1}^{16} N_{g,i} \cdot P_{dir,i}
$$

Each petal is treated as an independent sub-scenario on the F-N curve:

$$
f_{petal,i} = P(A_s) \cdot P_{dir,i}
$$

**Code:** `ng-calculator.ts` → `calculateNgForFlashFireWithPetals()`.

  </Tab>
  <Tab value="Polygon Correction">

### 5.4 Polygon Receiver Correction

When polygon receivers with known population exist (industrial areas, hospitals, schools):

$$
N_g = (A_{circle} - A_{intersection}) \cdot \rho_{pop} + N_{receiver}
$$

Geometric intersection computed with `@turf/turf`.

**Code:** `ng-calculator.ts` → `calculateNgWithReceiverCorrection()`.

  </Tab>
</Tabs>

---

## 6. F-N Curve Construction

### 6.1 Formal Definition

Given $S$ accidental scenarios, each with frequency $f_s$ [events/year] and fatalities $N_s$ [persons]:

$$
\boxed{F(N) = \sum_{s:\; N_s \geq N} f_s}
$$

$F(N)$ is the sum of frequencies of **all scenarios that produce at least $N$ fatalities**.

**Code:** `social-risk-table.tsx` → `calculateFnCurve()`.

### 6.2 Algorithm

<Steps>
  <Step>
    Collect all scenarios with their pairs $(f_s, N_s)$: frequency and fatalities for each
  </Step>
  <Step>
    Extract the unique set of $N$ values, sorted in **descending** order
  </Step>
  <Step>
    For each $N_k$: compute $F(N_k) = \sum f_s$ where $N_s \geq N_k$
  </Step>
  <Step>
    Plot the pairs $(N_k,\, F(N_k))$ as a **decreasing step function** on log-log axes
  </Step>
</Steps>

<Callout type="info" title="Monotone property">
The F-N curve is always a **decreasing step function**: $F(N) \leq F(N-1)$ for all $N$, since larger fatality thresholds can only be met by fewer scenarios.
</Callout>

---

## 7. Tolerance Zones and ALARP Criteria

### 7.1 Limit Lines

The tolerability lines are power functions on the log-log plane:

$$
F_{lim}(N) = \frac{C}{N^{|n|}}
$$

| Line | Formula | Meaning |
|------|---------|---------|
| Upper limit | $F_{upper}(N) = C_1 / N^{\lvert n \rvert}$ | Boundary between Unacceptable and ALARP zones |
| Lower limit | $F_{lower}(N) = C_2 / N^{\lvert n \rvert}$ | Boundary between ALARP and Acceptable zones |

**Code:** `fn-curve-analysis.ts` → `calculateUpperLimit()`; `fn-curve-chartjs.tsx` → `drawLimitLines()`.

### 7.2 ALARP Zones

<Callout type="warn" title="ALARP principle">
**ALARP** (*As Low As Reasonably Practicable*) — risk must be reduced as far as reasonably practicable. Being in the ALARP zone does not mean risk is acceptable; it must be demonstrated that further reduction is not reasonably practicable.
</Callout>

| Zone | Criterion | Required action |
|------|-----------|----------------|
| **Unacceptable** | $F(N) > F_{upper}(N)$ | Mandatory risk reduction |
| **ALARP** | $F_{lower}(N) < F(N) \leq F_{upper}(N)$ | Reduce unless disproportionately costly |
| **Acceptable** | $F(N) \leq F_{lower}(N)$ | No further action required |

### 7.3 International Standard Criteria

<Tabs items={["UK HSE", "Netherlands (RIVM)", "Hong Kong", "Australia"]}>
  <Tab value="UK HSE">

| Parameter | Value |
|-----------|-------|
| $C_1$ (upper) | $10^{-2}$ events/year |
| $C_2$ (lower) | $10^{-4}$ events/year |
| Slope $n$ | $-1$ |
| Reference | R2P2 (2001) |

  </Tab>
  <Tab value="Netherlands (RIVM)">

| Parameter | Value |
|-----------|-------|
| $C_1$ (upper) | $10^{-3}$ events/year |
| $C_2$ (lower) | $10^{-5}$ events/year |
| Slope $n$ | $-2$ (risk aversion to catastrophes) |
| Reference | IPO/RIVM Bevi |

  </Tab>
  <Tab value="Hong Kong">

| Parameter | Value |
|-----------|-------|
| $C_1$ (upper) | $10^{-3}$ events/year |
| $C_2$ (lower) | $10^{-5}$ events/year |
| Slope $n$ | $-1$ |
| Reference | HKSAR (1994) |

  </Tab>
  <Tab value="Australia">

| Parameter | Value |
|-----------|-------|
| $C_1$ (upper) | $10^{-3}$ events/year |
| $C_2$ (lower) | $10^{-5}$ events/year |
| Slope $n$ | $-2$ (risk aversion to catastrophes) |
| Reference | HIPAP No. 4 (1994) |

  </Tab>
</Tabs>

<Callout type="info" title="Per-project configuration">
Values $C_1$, $C_2$, and $n$ are configured in **Project Settings → Social Risk Criteria** and persisted to `project.socialRiskCriteria`.
</Callout>

---

## 8. Unacceptable Scenario Analysis

A point $(N, F(N))$ is **unacceptable** when $F(N) > C_1 / N^{|n|}$.

<Steps>
  <Step>
    **Identify unacceptable point** — Find all $(N_k, F(N_k))$ where $F(N_k) > F_{upper}(N_k)$
  </Step>
  <Step>
    **Apply ALARP target** — Set objective with 10% safety margin below upper limit:
    $$F_{target}(N) = F_{upper}(N) \cdot (1 - m), \quad m = 0.10$$
  </Step>
  <Step>
    **Compute excess frequency**:
    $$\Delta F(N) = F(N) - F_{target}(N)$$
  </Step>
  <Step>
    **Required reduction per scenario** — For contributing scenario $s$:
    $$f_{required,s} = f_{current,s} - \Delta F(N), \quad RF_s = \frac{f_{current,s}}{f_{required,s}}$$
    If $f_{required,s} \leq 0$, the scenario alone cannot fix the problem — combined reductions are required.
  </Step>
</Steps>

**Code:** `fn-curve-analysis.ts` → `analyzeUnacceptablePoint()`, lines 60–127.

---

## 9. Individual Risk

### 9.1 Calculation

$$
E[F_a] = \sum_{s} P(A_s) \cdot E[F(A_s)], \qquad RI_g = \frac{E[F_a]}{N_g}
$$

### 9.2 Classification

| Classification | Criterion |
|----------------|---------|
| Acceptable | $RI_g < \text{tolerable threshold}$ |
| ALARP | $\text{tolerable} \leq RI_g < \text{intolerable}$ |
| Unacceptable | $RI_g \geq \text{intolerable threshold}$ |

**Code:** `individual-risk-summary.tsx` → `evaluateRiskStatus()`.

### 9.3 Criteria by Country / Standard

<Tabs items={["UK HSE", "Mexico ASEA", "Netherlands RIVM", "Australia / Hong Kong", "USA EPA"]}>
  <Tab value="UK HSE">

| Group | Intolerable | Tolerable |
|-------|------------|----------|
| Public | $10^{-4}$/year | $10^{-6}$/year |
| Workers | $10^{-3}$/year | $10^{-6}$/year |

*Reference: R2P2 (2001)*

  </Tab>
  <Tab value="Mexico ASEA">

| Group | Intolerable | Tolerable |
|-------|------------|----------|
| Public | $10^{-3}$/year | $10^{-6}$/year |

*Reference: ASEA Lineamientos (2016)*

  </Tab>
  <Tab value="Netherlands RIVM">

| Group | Intolerable | Tolerable |
|-------|------------|----------|
| Public | $10^{-5}$/year | $10^{-8}$/year |

*Reference: RIVM Bevi*

  </Tab>
  <Tab value="Australia / Hong Kong">

| Group | Intolerable | Tolerable |
|-------|------------|----------|
| Public | $10^{-5}$/year | $10^{-6}$/year |

*Reference: HIPAP No. 4 / HKSAR*

  </Tab>
  <Tab value="USA EPA">

| Group | Intolerable | Tolerable |
|-------|------------|----------|
| Public | $10^{-4}$/year | $10^{-6}$/year |

*Reference: EPA RMP*

  </Tab>
</Tabs>

**Code:** `individual-risk-presets.ts`.

---

## 10. How to Use in the System

<Steps>
  <Step>
    **Define scenarios** — For each source, create RiskModels with event type (PoolFire, JetFire, FlashFire, VCE, FireBall) and assign frequency $P(A_s)$.
  </Step>
  <Step>
    **Run consequence calculations** — Execute each model to obtain `fatalidades.sumaFatalidades` and `fatalidades.resultados`.
  </Step>
  <Step>
    **Configure criteria** — In *Project Settings → Social Risk Criteria*, select the international standard or enter custom $C_1$, $C_2$, and $n$ values.
  </Step>
  <Step>
    **Visualize the F-N Curve** — In the *Social Risk* tab → *F-N Curve* sub-tab, the table automatically computes $N$ and $F(N)$ for each scenario and plots them.
  </Step>
  <Step>
    **Interpret zones** — Points above the upper line ($F > C_1/N^{|n|}$) are **unacceptable**. The system generates automatic frequency reduction recommendations.
  </Step>
  <Step>
    **Individual Risk** — In the *Individual Risk* sub-tab, enter $N_g$ or let the system calculate it automatically, then verify $RI_g$ against the country criterion.
  </Step>
</Steps>

<Callout type="info" title="Flash Fire with wind rose (petals)">
For Flash Fire events with uncertain wind direction, activate the **wind rose** in the model panel. The system expands the scenario into up to 16 sub-scenarios — one per wind direction — each with effective frequency $P(A_s) \times P_{dir,i}$ and its own $N_{g,i}$. On the F-N curve they appear as separate rows: `{scenario_name} — {direction}`.
</Callout>

---

## 11. Applications of the F-N Curve

| Application | Description |
|-----------|-------------|
| **Industrial QRA** | Quantitative risk assessment of petrochemical facilities, process plants, and storage terminals |
| **Land-use planning** | Determining restriction zones and safety distances around hazardous facilities |
| **Operating permits** | Comparing facility risk against national regulatory criteria to obtain permits |
| **Safeguard design** | Identifying which scenarios need additional protection layers (SIL, safety valves, PLC) |
| **Alternative comparison** | Evaluating the impact of different plant configurations, materials, or technologies |
| **Regulatory communication** | Presenting QRA results to regulators (ASEA, HSE, INERIS) in a standardized format |
| **Industrial insurance** | Quantifying PML (*Probable Maximum Loss*) for insurance premium calculation |
| **Emergency planning** | Determining evacuation zones based on concentration/radiation isopleths |

---

## 12. Analysis Limitations

<Accordions type="multiple">
  <Accordion title="Uniform population density">
    The calculation assumes population is uniformly distributed within the impact radius. Local concentrations (buildings, nighttime patterns) are not modeled, except through explicit polygon receivers.
  </Accordion>
  <Accordion title="Scenario independence">
    The F-N curve assumes all scenarios are statistically independent. Correlated scenarios (chain accidents, domino effects) may underestimate $F(N)$ for high values of $N$.
  </Accordion>
  <Accordion title="No wind direction for non-Flash Fire models">
    PoolFire, JetFire, and VCE models assume radial symmetry for $N_g$ calculation. In reality, impact is asymmetric based on wind direction.
  </Accordion>
  <Accordion title="1% radius as Ng approximation">
    Using the radius where the Probit reaches 1% as the $N_g$ boundary is a conservative convention. The death probability is not integrated across the full distance range.
  </Accordion>
  <Accordion title="Scenario frequency quality">
    The analysis quality fundamentally depends on the accuracy of input frequencies $P(A_s)$. Incorrect frequencies shift the entire F-N curve vertically.
  </Accordion>
  <Accordion title="Fixed facilities only">
    The analysis is limited to fixed industrial facilities. Transportation risk for hazardous materials is not included.
  </Accordion>
</Accordions>

---

## 13. Bibliographic References

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

| # | Reference |
|---|-----------|
| 1 | **CCPS** (1999). *Guidelines for Chemical Process Quantitative Risk Analysis*, 2nd Ed. AIChE, New York. (pp. 269, 273) |
| 2 | **TNO** (1997). *Methods for the Determination of Possible Damage (CPR 16E, "Purple Book")*, 2nd Ed. The Hague. |
| 3 | **TNO** (1997). *Methods for the Calculation of Physical Effects (CPR 14E, "Green Book")*, 3rd Ed. The Hague. |
| 4 | **UK HSE** (2001). *Reducing Risks, Protecting People (R2P2)*. Health & Safety Executive, London. |
| 5 | **RIVM / IPO** (2009). *Reference Manual Bevi Risk Assessments*. Version 3.2. Bilthoven. |
| 6 | **Lees, F.P.** (2005). *Loss Prevention in the Process Industries*, 3rd Ed. Elsevier, Amsterdam. |
| 7 | **HKSAR** (1994). *Risk Guidelines for New Territories East Landfill*. Hong Kong Special Administrative Region. |
| 8 | **HIPAP No. 4** (1994). *Risk Criteria for Land Use Safety Planning*. NSW Department of Planning, Australia. |
| 9 | **Hurst, N.W., Nussey, C. & Pettitt, G.N.** (1989). *Development and Application of a Risk Assessment Methodology for Gaseous Blast Waves*. IChemE Symposium Series No. 110. |
| 10 | **ASEA** (2016). *Lineamientos para la Elaboración del Análisis de Riesgo*. Agencia de Seguridad, Energía y Ambiente, México. |
| 12 | **Eisenberg, N.A., Lynch, C.J. & Breeding, R.J.** (1975). *Vulnerability Model*. CG-D-136-75. USCG, Washington. |

  </Accordion>
</Accordions>
