# Contornos de Riesgo Individual
Source: https://tekrisk.com/es/docs/individual-risk/ir-contours

Metodología técnica para el cálculo de mapas de contornos de Riesgo Individual (RI) usando TekRisk — agregación de RI basada en malla, contorneo por Marching Squares y salida GeoJSON para visualización QRA

## 1. Resumen Ejecutivo

Los **contornos de Riesgo Individual (RI)** son líneas de iso-riesgo trazadas sobre un mapa que conectan todos los puntos geográficos que comparten la misma probabilidad anual de fatalidad debido a peligros industriales. Son la piedra angular del Análisis Cuantitativo de Riesgos (ACR) en las industrias química y de petróleo y gas.

TekRisk calcula los contornos de RI mediante:

<Steps>
  <Step>
    **Agregación** de todos los escenarios de riesgo definidos (incendios, explosiones, nubes tóxicas) en una instalación
  </Step>
  <Step>
    **Evaluación** de la probabilidad de fatalidad en miles de puntos de una malla alrededor del sitio
  </Step>
  <Step>
    **Extracción** de líneas de contorno en niveles de riesgo estándar (por ejemplo, $1 \times 10^{-5}$, $1 \times 10^{-6}$ por año)
  </Step>
  <Step>
    **Proyección** de los resultados sobre un mapa geográfico como polígonos GeoJSON
  </Step>
</Steps>

<Callout type="info" title="Visualización en mapa">
El resultado es un conjunto de polígonos de contorno anidados — cada uno representando un nivel de riesgo diferente — superpuestos en un mapa Mapbox GL, permitiendo a los ingenieros evaluar visualmente si los receptores vulnerables (escuelas, hospitales, áreas residenciales) se encuentran dentro de zonas de riesgo inaceptable.
</Callout>

---

## 2. Conceptos Clave

<Cards>
  <Card title="Riesgo Individual (RI)">
    Probabilidad anual de que una persona hipotética, presente de forma continua y sin protección en una ubicación específica, sea víctima mortal como consecuencia de un accidente industrial. Se expresa como un número adimensional por año (ej., $RI = 1 \times 10^{-5}$/año = 1 en 100,000).
  </Card>
  <Card title="Frecuencia del Escenario (f)">
    Qué tan seguido se espera que ocurra un escenario de accidente particular, en eventos/año. Se deriva de bases de datos de tasas de falla históricas (OREDA, OGP/IOGP) combinadas con análisis de árboles de eventos.
  </Card>
  <Card title="Probabilidad de Fatalidad (Pf)">
    Probabilidad de muerte en una ubicación específica dado que ocurre un escenario. Se deriva de modelos probit (térmicos/explosión) o pruebas punto-en-polígono (flash fire — $P_f = 1.0$ dentro de la envolvente LEL, $0$ fuera).
  </Card>
  <Card title="Niveles de Contorno">
    Valores específicos de RI en los cuales se trazan las líneas de iso-riesgo. TekRisk utiliza siete niveles estándar: $10^{-2}$ a $10^{-8}$ por año.
  </Card>
</Cards>

### 2.1 Fórmula Principal

El Riesgo Individual en cualquier punto $(x, y)$ es la suma de las contribuciones de todos los escenarios:

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

| Símbolo | Descripción | Unidades |
|---------|-------------|----------|
| $RI(x, y)$ | Riesgo individual en la ubicación $(x, y)$ | por año |
| $f_i$ | Frecuencia del escenario $i$ | eventos/año |
| $P_{f,i}(x, y)$ | Probabilidad de fatalidad en $(x, y)$ dado que ocurre el escenario $i$ | adimensional $[0, 1]$ |
| $i$ | Índice del escenario (cada modelo de riesgo es un escenario) | — |

---

## 3. Modelos de Riesgo Soportados

TekRisk soporta cinco tipos de modelos de consecuencias, cada uno contribuyendo al cálculo global del RI:

| Modelo | Tipo de Peligro | Simetría | Método de $P_f$ | Dependencia del Viento |
|--------|----------------|----------|-------------|------------------------|
| **Bola de Fuego** | Radiación térmica | Radial | Interpolación en perfil de fatalidad basada en distancia | Ninguna — omni-direccional |
| **Incendio de Charco** | Radiación térmica | Radial | Interpolación en perfil de fatalidad basada en distancia | Ninguna — radialmente simétrico |
| **Fuego de Chorro** | Radiación térmica | Radial | Interpolación en perfil de fatalidad basada en distancia | Ninguna — radialmente simétrico |
| **VCE (UVCE)** | Sobrepresión por explosión | Radial | Interpolación en perfil de fatalidad basada en distancia | Ninguna — radialmente simétrico |
| **Incendio Súbito** | Envolvimiento por llama | Direccional | Punto-en-polígono sobre envolvente LEL rotada | Crítica — usa rosa de vientos completa de 16 direcciones |

<Tabs items={["Modelos Radiales", "Modelo Direccional (Flash Fire)"]}>
  <Tab value="Modelos Radiales">

**Bola de Fuego, Incendio de Charco, Fuego de Chorro, VCE (UVCE)** — Estos modelos asumen que el efecto del peligro decae con la distancia desde la fuente en todas las direcciones por igual. La probabilidad de fatalidad en cualquier punto depende únicamente de la distancia euclidiana a la fuente, siguiendo un **perfil de fatalidad** precalculado (porcentaje de fatalidad vs. distancia).

  </Tab>
  <Tab value="Modelo Direccional (Flash Fire)">

El **Incendio Súbito** es fundamentalmente diferente. La nube de vapor inflamable se extiende a favor del viento desde la fuente, y su forma depende de la dispersión atmosférica. La probabilidad de fatalidad en cualquier punto depende de si el punto cae dentro de la envolvente del **Límite Inferior de Explosividad (LEL)**, y la **probabilidad** de que el viento sople en la dirección que llevaría la nube hacia ese punto.

  </Tab>
</Tabs>

---

## 4. Metodología Paso a Paso

<Mermaid>
{`flowchart TD
    A["Datos de Entrada<br/>(Modelos de Riesgo, Ubicaciones,<br/>Perfiles de Fatalidad, Rosa de Vientos)"] --> B["Paso 1: Definición del Escenario<br/>Construir lista de escenarios con<br/>frecuencia, fuente, tipo de modelo"]
    B --> C["Paso 2: Integración Rosa de Vientos<br/>(Solo Flash Fire)<br/>Pre-rotar polígonos LEL × 16 dirs"]
    B --> D["Paso 3: Generación de Malla<br/>Malla rectangular 2D<br/>resolución + extensión automática"]
    C --> E["Paso 4: Cálculo del RI<br/>Para cada punto de malla:<br/>Radial → distancia + interpolar<br/>Flash Fire → punto-en-polígono"]
    D --> E
    E --> F["Paso 5: Extracción de Contornos<br/>Algoritmo Marching Squares<br/>celda 4-bit → polígonos cerrados"]
    F --> G["Paso 6: Conversión Geográfica<br/>Metros locales → lat/lon<br/>GeoJSON FeatureCollection"]

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

### Paso 1: Definición del Escenario

Cada modelo de riesgo habilitado define un **escenario** caracterizado por:

| Parámetro | Descripción | Origen |
|-----------|-------------|--------|
| Frecuencia ($f$) | Tasa de ocurrencia anual | Configuración del modelo de riesgo |
| Ubicación de la fuente | Coordenadas geográficas (lat, lon) | Definición de la fuente |
| Tipo de modelo | fireball, poolfire, jetfire, vce, flashfire | Tipo del modelo de riesgo |
| Perfil de fatalidad | Curva $P_f$ vs. distancia (radial) o polígono LEL (flash fire) | Resultados previos de cálculo de consecuencias |

Los **perfiles de fatalidad** se extraen de cálculos de consecuencias previamente completados almacenados en `RiskCalculation.results.fatalidades`. Cada perfil consiste en pares de distancia-porcentaje de fatalidad:

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

<Callout type="info" title="Perfiles de Flash Fire">
Para modelos de incendio súbito, el "perfil" de fatalidad se reemplaza por un **polígono LEL** — el contorno geográfico de la nube inflamable en la concentración del Límite Inferior de Explosividad para una dirección de viento única.
</Callout>

---

### Paso 2: Integración de la Rosa de Vientos (Flash Fire)

Los escenarios de incendio súbito requieren integración con una **rosa de vientos Pasquill-Gifford** para considerar la naturaleza direccional de la propagación de la nube de vapor.

#### Estructura de la Rosa de Vientos

La rosa de vientos divide la brújula en **16 direcciones equi-espaciadas** a intervalos de 22.5°. Cada dirección lleva una probabilidad (fracción del tiempo en que el viento sopla desde esa dirección), dividida en períodos diurno y nocturno:

| Período | Horas | Clases de Estabilidad |
|---------|-------|----------------------|
| Día | 06:00 – 18:00 | A, B, C, D |
| Noche | 18:00 – 06:00 | D, E, F |

#### Rotación de Polígonos

Para cada una de las 16 direcciones de viento, el polígono LEL base se **rota alrededor del punto fuente**:

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

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

Donde $(x, y)$ es el vértice original del polígono relativo a la fuente, $\theta$ es el ángulo de rotación, y $(x', y')$ es el vértice rotado.

El resultado son **16 polígonos LEL rotados**, cada uno asociado con la probabilidad de viento para su dirección.

#### Fórmula de $P_f$ para Incendio Súbito

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

Donde:

| Símbolo | Descripción |
|---------|-------------|
| $\theta_j$ | Dirección del viento $j \in \{0°, 22.5°, \ldots, 337.5°\}$ |
| $p(\theta_j)$ | Probabilidad del viento desde la dirección $\theta_j$ $(0$ a $1)$ |
| $\text{Polígono}(\theta_j)$ | Polígono LEL rotado a la dirección $\theta_j$ |
| $\mathbb{1}\{\cdot\}$ | Función indicadora: 1 si el punto está dentro del polígono, 0 en caso contrario |

<Callout type="info" title="Límite de probabilidad">
La suma se limita a 1.0 porque la probabilidad máxima de fatalidad no puede exceder la certeza.
</Callout>

---

### Paso 3: Generación de la Malla

Se genera una malla rectangular 2D uniforme para evaluar el RI a través del área de estudio.

| Parámetro | Descripción | Valor por Defecto |
|-----------|-------------|-------------------|
| Centro | Centroide de todas las coordenadas de fuentes | Auto-calculado |
| Resolución | Espaciamiento entre puntos adyacentes de la malla | 25 m |
| Extensión | Mitad del tamaño de la malla desde el centro | Auto-calculada |

**Resoluciones disponibles**: 1, 5, 10, 25, 50, 100 metros.

#### Auto-cálculo de la Extensión

<Steps>
  <Step>
    Encontrar la **distancia máxima del perfil de fatalidad** entre todos los escenarios
  </Step>
  <Step>
    Multiplicar por **1.3** (factor de relleno del 30%)
  </Step>
  <Step>
    Redondear hacia arriba al múltiplo de **100 m** más cercano
  </Step>
</Steps>

#### Dimensiones de la Malla

$$
\text{Puntos por lado} = \frac{2 \times \text{extensión}}{\text{resolución}} + 1
$$

$$
\text{Total de puntos} = (\text{Puntos por lado})^2
$$

**Ejemplo**: Con extensión = 2,000 m y resolución = 25 m → 161 puntos por lado → **25,921 puntos totales**.

#### Sistema de Coordenadas

La malla utiliza un **sistema de coordenadas cartesianas local** en metros:

- **Origen**: Centro de la malla (centroide de las fuentes)
- **Eje X**: Oeste → Este (positivo hacia el este)
- **Eje Y**: Sur → Norte (positivo hacia el norte)

<Callout type="warn" title="Aproximación de tierra plana">
Esta aproximación es válida para distancias de hasta ~50 km desde el centro — adecuada para sitios industriales típicos.
</Callout>

---

### Paso 4: Cálculo del RI en Cada Punto de la Malla

Para cada punto de la malla, el sistema acumula las contribuciones de RI de todos los escenarios habilitados.

<Tabs items={["Modelos Radiales", "Incendio Súbito", "Detalle de Interpolación Lineal"]}>
  <Tab value="Modelos Radiales">

**Bola de Fuego, Incendio de Charco, Fuego de Chorro, VCE (UVCE)** — Para cada punto de la malla $(x_i, y_j)$ y cada escenario radial $s$:

**Paso 1 — Distancia euclidiana:** $d = \sqrt{(x_i - x_s)^2 + (y_j - y_s)^2}$

**Paso 2 — Rechazo rápido:** Si $d > d_{\max}$ → omitir ($P_f = 0$)

**Paso 3 — Interpolar perfil de fatalidad:** Si $d \leq d_0$: $P_f = P_0 / 100$. En otro caso, encontrar intervalo $[d_k, d_{k+1}]$ que contiene $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}
$$

**Paso 4 — Acumular:** $RI(x_i, y_j) \mathrel{+}= f_s \times P_f$

  </Tab>
  <Tab value="Incendio Súbito">

Para cada punto de la malla $(x_i, y_j)$ y cada escenario de flash fire $s$:

**Paso 1 — Convertir** punto de la malla a coordenadas geográficas (lat, lon).

**Paso 2 — Prueba punto-en-polígono:** Para cada uno de los 16 polígonos LEL pre-rotados, verificar si (lon, lat) cae dentro del polígono usando el algoritmo de **ray-casting**.

**Paso 3 — Acumular** probabilidad ponderada por viento:

$$
P_f = \min\!\left(1.0,\; \sum (\text{prob. viento} \times \text{indicador de contención})\right)
$$

**Paso 4 — Acumular:** $RI(x_i, y_j) \mathrel{+}= f_s \times P_f$

  </Tab>
  <Tab value="Detalle de Interpolación Lineal">

Para perfiles de fatalidad térmicos y de VCE (UVCE), la interpolación es **lineal a trozos**.

Dados los puntos del perfil $(d_0, P_0), (d_1, P_1), \ldots, (d_n, P_n)$:

Si $d \leq d_0$ → $P_f = P_0$ (constante por debajo de la distancia mínima). Si $d \geq d_n$ → $P_f = 0$ (cero más allá de la distancia máxima). En otro caso → **interpolación lineal** entre puntos adyacentes.

  </Tab>
</Tabs>

---

### Paso 5: Extracción de Contornos (Marching Squares)

Una vez que la malla de RI está completamente poblada, las líneas de contorno en cada nivel objetivo se extraen usando el algoritmo **Marching Squares**.

<Accordions type="multiple">
  <Accordion title="Visión General del Algoritmo">

Marching Squares procesa la malla **celda por celda**. Cada celda tiene cuatro valores en sus esquinas. Para un nivel de contorno dado, cada esquina se clasifica como **por encima** ($\geq$ nivel) o **por debajo** ($<$ nivel), creando un **índice de 4 bits** (16 configuraciones posibles).

Los cuatro bits corresponden a: bit 0 = inferior-izquierdo, bit 1 = inferior-derecho, bit 2 = superior-derecho, bit 3 = superior-izquierdo. Si un valor de esquina $\geq$ el nivel de contorno, su bit = 1.

Los **puntos silla** (casos 5 y 10) son configuraciones ambiguas que generan dos segmentos de borde separados.

  </Accordion>
  <Accordion title="Interpolación en Bordes">

Para cada borde que el contorno cruza, la posición exacta de cruce se calcula por **interpolación lineal**:

Dados dos valores de esquinas adyacentes $v_1$ y $v_2$, y el nivel de contorno $L$:

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

$$
\text{Punto de cruce} = \text{vértice}_1 + t \times (\text{vértice}_2 - \text{vértice}_1)
$$

  </Accordion>
  <Accordion title="Conexión de Segmentos">

El paso de marching squares produce segmentos de línea desconectados. Estos se conectan en **polígonos cerrados**: Comenzar con un segmento no visitado → encontrar el segmento no visitado más cercano cuyo punto de inicio esté dentro de la tolerancia ($1 \times 10^{-6}$ m) del punto final actual → anexar y continuar hasta que el polígono se cierre (punto final $\approx$ punto de inicio) → repetir para los segmentos no visitados restantes.

  </Accordion>
  <Accordion title="Validación del Orden de Enrollamiento">

Todos los polígonos de salida se validan para asegurar el orden de enrollamiento **anti-horario (CCW)**, como requiere la especificación GeoJSON. Esto se verifica usando el **área con signo** de la fórmula del zapato (shoelace):

$$
\text{Área con Signo} = \frac{1}{2} \sum_{i} (x_i \cdot y_{i+1} - x_{i+1} \cdot y_i)
$$

Si Área con Signo $< 0$ → polígono es horario → **invertir orden de vértices**. Si Área con Signo $> 0$ → polígono es anti-horario → **correcto**.

  </Accordion>
</Accordions>

---

### Paso 6: Conversión Geográfica

Los polígonos de contorno se convierten de coordenadas locales en metros de vuelta a coordenadas geográficas para la visualización en el mapa.

#### Fórmulas de Conversión

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

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

Donde $111{,}320$ es los metros aproximados por grado de latitud (WGS84).

#### Salida GeoJSON

Cada polígono de contorno se empaqueta como un Feature GeoJSON:

```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]]]
  }
}
```

#### Cálculo de Área

El área encerrada por cada contorno se calcula usando la **fórmula del zapato (shoelace)** sobre las coordenadas locales en metros:

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

| Rango de Área | Unidad de Visualización |
|---------------|------------------------|
| $< 10{,}000$ m² | m² |
| $10{,}000 – 1{,}000{,}000$ m² | hectáreas (ha) |
| $\geq 1{,}000{,}000$ m² | km² |

---

## 5. Criterios de Tolerabilidad del Riesgo

La siguiente tabla resume los estándares internacionales para la tolerabilidad del riesgo individual:

| Estándar | Región | Límite Intolerable | Ampliamente Aceptable | Referencia |
|----------|--------|-------------------|------------------------|------------|
| **UK HSE R2P2** | Reino Unido | $1 \times 10^{-4}$ (público) | $1 \times 10^{-6}$ | HSE (2001) |
| **ASEA** | México | $1 \times 10^{-3}$ | $1 \times 10^{-6}$ | Lineamientos ASEA |
| **RIVM** | Países Bajos | $1 \times 10^{-5}$ | $1 \times 10^{-8}$ | Directrices RIVM |
| **Hong Kong** | Hong Kong | $1 \times 10^{-5}$ | $1 \times 10^{-6}$ | Directrices de riesgo HK |
| **HIPAP No. 4** | Australia | $1 \times 10^{-5}$ | $1 \times 10^{-6}$ | NSW HIPAP No. 4 |
| **EPA / OSHA** | Estados Unidos | $1 \times 10^{-4}$ | $1 \times 10^{-6}$ | EPA RMP / OSHA PSM |

### Principio ALARP

<Callout type="warn" title="ALARP — Tan Bajo Como Sea Razonablemente Practicable">
Entre los límites de **intolerable** y **ampliamente aceptable** se encuentra la región **ALARP**. Dentro de esta zona, el riesgo solo se tolera si su reducción adicional es impracticable o desproporcionadamente costosa.
</Callout>

| Zona | Nivel de Riesgo | Acción Requerida |
|------|----------------|-----------------|
| **Intolerable** | $\geq 1 \times 10^{-3}$ a $1 \times 10^{-4}$ (varía por estándar) | El riesgo no puede justificarse excepto en circunstancias extraordinarias |
| **ALARP** | Entre umbrales intolerable y aceptable | Tolerable solo si la reducción es impracticable |
| **Ampliamente Aceptable** | $\leq 1 \times 10^{-6}$ a $1 \times 10^{-8}$ (varía por estándar) | No se requiere acción adicional |

---

## 6. Código de Colores de Contornos

TekRisk utiliza un esquema de siete colores para distinguir las zonas de riesgo en el mapa:

| Nivel (por año) | Color | Código Hex | Interpretación del Riesgo |
|:---:|-------|:---:|--------------------------|
| $1 \times 10^{-2}$ | Índigo | `#4B0082` | Extremo — acción inmediata requerida |
| $1 \times 10^{-3}$ | Rojo Oscuro | `#8B0000` | Intolerable — excede todos los estándares |
| $1 \times 10^{-4}$ | Rojo | `#DC2626` | Intolerable para el público (UK HSE, US EPA) |
| $1 \times 10^{-5}$ | Naranja | `#EA580C` | Límite superior ALARP (muchas jurisdicciones) |
| $1 \times 10^{-6}$ | Amarillo | `#EAB308` | Umbral ampliamente aceptable |
| $1 \times 10^{-7}$ | Verde Claro | `#84CC16` | Riesgo bajo |
| $1 \times 10^{-8}$ | Verde | `#22C55E` | Riesgo insignificante |

<Callout type="info" title="Niveles no estándar">
Los niveles de contorno que no están en este conjunto estándar se muestran en gris (`#6B7280`).
</Callout>

---

## 7. Comparación con la metodología CCPS

TekRisk implementa el **enfoque general** descrito en CCPS *Guidelines for Chemical Process Quantitative Risk Analysis* (2ª Ed., 2000), §4.4.1.2. La fórmula núcleo documentada en §2.1 es literalmente la **Ec. 4.4.2** del CCPS. Esta sección traza la correspondencia implementación a implementación para que auditores y revisores regulatorios puedan mapear las salidas de TekRisk contra la referencia canónica.

### 7.1 Mapeo ecuación a ecuación

| CCPS (2000) | Equivalente TekRisk | Nota |
|---|---|---|
| Ec. 4.4.1 — $IR_{x,y} = \sum_{i} IR_{x,y,i}$ | Aditividad por escenario (§2.1) | Idéntica |
| Ec. 4.4.2 — $IR_{x,y,i} = f_i \cdot p_{f,i}$ | Término por celda de malla (§4 Paso 4) | Base compartida |
| Ec. 4.4.3 — $f_i = F_I \cdot p_{O,i} \cdot p_{OC,i}$ | $f_i$ consumida desde `RiskCalculation.results` upstream (§4 Paso 1) | TekRisk no recalcula el árbol de eventos; ingiere la frecuencia ya derivada |
| Ec. 4.4.4 — factor direccional $f_i \cdot (\theta_i / 360)$ | Sustituida por rosa de 16 direcciones con $p(\theta_j)$ empírica (§4 Paso 2) | TekRisk refina: probabilidades direccionales reales vs. viento uniforme |
| Ec. 4.4.5 — suma acumulativa contorno a contorno | Sustituida por evaluación de IR en toda la malla + Marching Squares (§4 Paso 5) | La Ec. 4.4.5 solo aplica al enfoque simplificado del CCPS |

### 7.2 Enfoque general (CCPS §4.4.1.2, Fig. 4.7) vs TekRisk

| Aspecto | Enfoque general CCPS | TekRisk |
|---|---|---|
| Evaluación geográfica | "Cada ubicación geográfica" (discretización no especificada) | Malla rectangular uniforme (1–100 m), extensión automática según perfil de fatalidad |
| Zonas de efecto | Modelo probit o zonas discretas por incidente | Perfil continuo $P_f(d)$ con interpolación lineal por tramos |
| Tratamiento del viento | Cualquier nivel de detalle (manual) | Rosa de vientos Pasquill–Gifford de 16 direcciones, separación día/noche |
| Trazado de contornos | "Manualmente o con cualquier paquete gráfico de contorneo" | Marching Squares (16 casos + manejo de saddle points) |
| Formato de salida | Mapa impreso | FeatureCollection GeoJSON + visualización en Mapbox GL |

### 7.3 Enfoque simplificado (CCPS §4.4.1.3, Fig. 4.8) vs TekRisk

El enfoque simplificado del CCPS agrupa seis supuestos conservadores pensados para cálculo a mano. Al ejecutarse sobre una malla numérica, TekRisk no necesita esas simplificaciones y **sustituye los más restrictivos por modelos físicos reales**, lo que produce contornos más precisos, direccionalmente correctos y menos conservadores que los círculos uniformes del CCPS:

| Supuesto simplificado CCPS | TekRisk |
|---|---|
| Fuentes puntuales | Fuentes puntuales (compatible) |
| Distribución de viento uniforme (misma probabilidad en todas direcciones) | **Rosa de 16 direcciones con probabilidades empíricas** |
| Velocidad de viento y clase de estabilidad únicas | Separación día/noche a través de las clases Pasquill–Gifford A–F |
| Zonas de efecto discretas (100% dentro / 0% fuera) | **Perfil continuo $P_f$ vs distancia** |
| Distribución uniforme de fuentes de ignición | Heredada del árbol de eventos del escenario (upstream) |
| Contornos de riesgo circulares | **Contornos con forma realista que sigue la dispersión real del riesgo, trazados por Marching Squares** |

### 7.4 Qué añade TekRisk más allá del CCPS

- **Perfil de fatalidad continuo** con interpolación lineal por tramos — el CCPS §4.4.1.3 solo contempla funciones escalón o modelos probit completos
- **Extracción de contornos por Marching Squares** con validación de winding CCW para cumplir GeoJSON — el CCPS solo especifica "manualmente o con cualquier paquete gráfico"
- **Flash fire con envolvente LEL rotada** a lo largo de 16 direcciones — el CCPS §8.2 solo cubre la simplificación de sector pie-shape
- **Conversión automática metros locales ↔ lat/lon** más cálculo del área encerrada vía la fórmula del shoelace (§4 Paso 6)
- **Siete niveles de contorno estandarizados** ($10^{-2}$ a $10^{-8}$) con código de color fijo (§6) — el CCPS deja la selección de niveles al analista

---

## 8. Limitaciones

<Accordions type="multiple">
  <Accordion title="Aproximación de conversión de coordenadas">
    **Aproximación de tierra plana** para la conversión de coordenadas. Válida solo para distancias $< 50$ km desde el centro de la malla. Insignificante para sitios industriales típicos ($< 5$ km de extensión).
  </Accordion>
  <Accordion title="Interpolación lineal">
    **Interpolación lineal** entre puntos del perfil de fatalidad. Las curvas de fatalidad reales pueden ser no lineales. Conservadora entre puntos; la precisión depende de la densidad del perfil.
  </Accordion>
  <Accordion title="Granularidad de la rosa de vientos">
    16 direcciones (espaciamiento de 22.5°). No se captura resolución direccional más fina. Adecuada para la mayoría de aplicaciones de ACR; se alinea con la convención Pasquill-Gifford.
  </Accordion>
  <Accordion title="Sin variación estacional u horaria del viento">
    Usa la rosa de vientos promedio anual o promedio día/noche. Puede subestimar el riesgo direccional para ubicaciones con patrones estacionales fuertes.
  </Accordion>
  <Accordion title="Sin protección o blindaje de edificios">
    Todas las personas se asumen al aire libre y sin protección. Los resultados son conservadores (sobreestiman el riesgo para poblaciones resguardadas).
  </Accordion>
  <Accordion title="Sin efectos del terreno">
    Se asume terreno plano para la dispersión de gases. Puede subestimar el riesgo en valles o subestimar la dilución en crestas.
  </Accordion>
  <Accordion title="Sin efectos dominó">
    Cada escenario se trata de forma independiente. No captura fallas en cascada ni escalamiento multi-fuente.
  </Accordion>
  <Accordion title="Límites de resolución de malla">
    Características más pequeñas que el espaciamiento de la malla pueden no detectarse. Usar resolución más fina (1–10 m) cerca de las fuentes si es necesario.
  </Accordion>
  <Accordion title="Asunción de simetría radial">
    Modelos térmicos y de VCE (UVCE) asumen sin deformación de la forma del fuego por el viento. Las columnas de fuego reales pueden alargarse a favor del viento.
  </Accordion>
  <Accordion title="Asunción de exposición uniforme">
    Se asume que la población está presente permanentemente al aire libre. Asunción de peor caso; la exposición real varía con los horarios de ocupación.
  </Accordion>
  <Accordion title="Frecuencia constante">
    La frecuencia del escenario se asume constante durante todo el año. No tiene en cuenta operaciones estacionales o períodos de paro.
  </Accordion>
  <Accordion title="Precisión del modelo probit">
    Depende de la calidad de los cálculos de consecuencias previos. Los contornos de RI heredan cualquier error en el modelado de consecuencias.
  </Accordion>
</Accordions>

---

## 9. Referencias Bibliográficas

<Accordions type="single">
  <Accordion title="Ver lista completa de referencias">

| # | Referencia |
|---|-----------|
| 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), 3ra Ed. Committee for the Prevention of Disasters, Países Bajos. |
| 3 | **TNO** (1999). *"Guidelines for Quantitative Risk Assessment"* (Purple Book), CPR 18E. Committee for the Prevention of Disasters, Países Bajos. |
| 4 | **CCPS** (2000). *"Guidelines for Chemical Process Quantitative Risk Analysis"*, 2da Ed. AIChE. |
| 5 | **UK HSE** (2001). *"Reducing Risks, Protecting People"* (R2P2). Health and Safety Executive, Reino Unido. |
| 6 | **ASEA** (México). *Marco regulatorio para criterios de tolerabilidad del riesgo*. Agencia de Seguridad, Energía y Ambiente. |
| 8 | **Lees, F.P.** (2012). *"Loss Prevention in the Process Industries"*, 4ta Ed. Butterworth-Heinemann. |
| 9 | **Crowl, D.A. & Louvar, J.F.** (2011). *"Chemical Process Safety: Fundamentals with Applications"*, 3ra Ed. Prentice Hall. |
| 10 | **RIVM** (Países Bajos). *Documentación de criterios de tolerabilidad del riesgo*. National Institute for Public Health and the Environment. |

  </Accordion>
</Accordions>
