Ingested from Thomas’s “Compound flood modelling report” (Resilient
Hydrotwin, WP4 — “Integration of Hydro Models with Digital Twin for
Improved Decision-Making”), 2026-07. This is the methodology and data
behind the Rotterdam SFINCS setup in WP4/delftsfincs-rotterdam/ — read it
alongside Raster & Scenario Data Layout (how outputs are served) and
Schema Reconnaissance (Phase 0) (how the platform’s database
represents scenarios/interventions today).
Context¶
Rotterdam is simultaneously exposed to pluvial (rainfall), fluvial (river discharge), and coastal (storm surge) flooding. Traditional modelling assesses these separately; this work package models them as compound events — multiple hazards occurring together — using SFINCS. The pilot domain runs from the Tweede Maasvlakte (North Sea coast) to Rotterdam’s eastern boundary, covering port infrastructure, residential areas, and the North Sea–to–inland-river hydraulic system.
The SFINCS model¶
SFINCS (Super-Fast INundation of CoastS, Deltares) solves the Local Inertial Equations — a simplified form of the shallow water equations — combined with a subgrid scheme (Leijnse et al., 2021), giving 35–1700× speedup over full hydrodynamic models at ~5–14 cm accuracy on hurricane test cases (van Ormondt et al., 2025). Valid for subcritical flow (Froude < 0.5); optimized for inundation and compound flooding, not for supercritical/transcritical regimes.
Model inputs and their provenance¶
This is the authoritative source for the DEM/data provenance question raised in RHT-96 / RHT-98:
| Input | Source | Resolution | Vintage |
|---|---|---|---|
| Base DEM | AHN5 (Actueel Hoogtebestand Nederland) | 0.25 m² | — |
| Inland bathymetry | Rijkswaterstaat | 1 m × 1 m | measured November 2025 |
| North Sea bathymetry | Rijkswaterstaat, via Nationaal Georegister | ~14 m × 14 m | version August 2024 |
| Harbor bathymetry | unknown — filled with default | — | −10 mNAP default, gaps nearest-neighbour interpolated |
| Land use / roughness | STOWA Waterschadeschatter → Manning’s n via NLCD mapping (HEC-RAS methodology, HEC 2024) | — | n = 0.025 (open water) to 0.75 (built infrastructure) |
| Dike trajectories | Waterveiligheidsportaal (Water Safety Portal) | — | levee heights taken from the DEM |
Model grid: 25 m calculation grid, 0.5 m subgrid, EPSG:28992 (Amersfoort
/ RD New), built via HydroMT-SFINCS. This matches
model_subgrid_builder/sfincs.inp exactly (dx=dy=25, epsg=28992).
Forcing scenarios¶
Three hazard types, evaluated individually and in compound combinations:
Pluvial — return periods 1/10, 1/100, 1/250 yr → 63 mm, 99 mm, 117 mm rainfall in 24h (STOWA 2024 statistics). Net effective load subtracts an assumed 25 mm of drainage/storage capacity: e.g. 63 mm event → (63 − 25) / 24 = 1.58 mm/h effective load fed to SFINCS.
Fluvial — derived from 10 years of Rijkswaterstaat 10-minute discharge records at Lobith; the 1/250-yr vs 1/10-yr discharge differs by ~50% (Parmet et al., 2001), so Brienenoord/Puttershoek discharges are scaled ×1.5 for the extreme scenario.
Coastal — storm surge boundary at Hoek van Holland, based on Storm Report SR88 (~1/10-yr return period; Bijlsma, 2007). The 1953 flood is ~1/300-yr.
Because 1/250-yr and 1/300-yr return periods showed inconsistencies across hazard components, a unified 1/300-year return period was assumed for precipitation, storm surge, and fluvial discharge together.
The 1/100-yr values (used throughout the delivered pipeline, e.g.
6_IRP_100_years) come from a two-point Gumbel fit anchored on the
1/10-yr and 1/300-yr values, with uncertainty propagated via 10,000-sample
Monte Carlo across 5 independent sources (surge uncertainty at both anchor
points, discharge uncertainty and scaling, GEV shape parameter). Resulting
nominal 1/100-yr estimates: 3.64 m MSL storm surge, 4886 m³/s at
Brienenoord, 3789 m³/s at Puttershoek — these are the exact values
hard-coded in WP4/delftsfincs-rotterdam/6_superimpose_boundaryconditions.py
(TARGET_WATER_LEVEL_PEAK_M = 3.64, etc.), confirming that script’s
targets are this Gumbel/Monte Carlo analysis, not arbitrary numbers.
Barrier operation: the Maeslantkering is modelled as closed (fixed levels/discharges) consistent with its ~1/100-yr failure-to-close probability (recent analysis suggests this may be conservative — Deltares, 2023); the Hartelkering is assumed to close under comparable conditions.
Simulation window: 5 days spin-up (moderate discharge/tidal levels) +
the main event + 7 days recession = 12 days total — close to, but not
identical to, the 13-day window (tstart–tstop) in the delivered
sfincs.inp.
The 13 compound scenarios¶
| # | Scenario | Precipitation | Discharge (Brienenoord / Puttershoek) | Storm surge (Hoek van Holland) | Return period |
|---|---|---|---|---|---|
| 1 | Base scenario | 63 mm/24h | 3645 / 2827 m³/s | 3.20 m MSL | ~1/10-yr |
| 2 | IRP 300-year | 117 mm/24h | 5468 / 4241 m³/s | 3.85 m MSL | ~1/300-yr |
| 3 | Barriers closed | 117 mm/24h | 5468 / 4241 m³/s | 3.85 m MSL | ~1/300-yr |
| 4 | Hospital storage basin (0.5 m deep × area) | 117 mm/24h | 5468 / 4241 m³/s | 3.85 m MSL | ~1/300-yr |
| 5 | Storage basins (0.5 m deep × area) | 63 mm/24h | 3645 / 2827 m³/s | 3.20 m MSL | ~1/10-yr |
| 6 | IRP 100-year | 99 mm/24h | 4886 / 3789 m³/s | 3.64 m MSL | ~1/100-yr |
| 7 | Storage basins | 99 mm/24h | 4886 / 3789 m³/s | 3.64 m MSL | ~1/100-yr |
| 8 | Base scenario + no rain | 0 mm/24h | 3645 / 2827 m³/s | 3.20 m MSL | ~1/10-yr |
| 9 | Base scenario + barriers closed | 63 mm/24h | 3645 / 2827 m³/s | 3.20 m MSL | ~1/10-yr |
| 10 | IRP 100-year + barriers closed | 99 mm/24h | 4886 / 3789 m³/s | 3.64 m MSL | ~1/100-yr |
| 11 | IRP 100-year, precipitation only | 99 mm/24h | 3645 / 2827 m³/s | 3.20 m MSL | ~1/100-yr |
| 12 | IRP 100-year, discharge only | 0 mm/24h | 4886 / 3789 m³/s | 3.64 m MSL | ~1/100-yr |
| 13 | IRP 100-year, storm surge only | 0 mm/24h | 3645 / 2827 m³/s | 3.64 m MSL | ~1/100-yr |
Scenarios 1–7 match the 7 folders already on disk under
data/rat_data-500/rotterdam/ by name and order (1_base_scenario …
7_IRP_100_years_storagebasins) — this table is their authoritative
definition. Scenarios 8–13 are defined here but not yet generated on
disk; relevant to RHT-81
(generating the real runs the golden question set needs).
Output files¶
Per-timestep GeoTIFFs, {variable}_{YYYYMMDD}_{HHMMSS}.tif, Deflate
compression, all in EPSG:28992:
| Variable | Grid | dtype | Notes |
|---|---|---|---|
h (water depth) | subgrid (e.g. 0.5 m) | float32, NaN nodata | h = zs − dep, downscaled to the subgrid; only cells ≥ 0.05 m written; written as COG (tiled 256×256, predictor 2) |
u, v (velocity components) | model grid (e.g. 25 m) | float32, NaN nodata | not downscaled, not reprojected |
vel (speed) | model grid | float32 | combined vector magnitude |
This matches SCENARIO_PROCESSING.md’s description of stage 4
(4_create_subgrid_results.py) exactly.
Flood damage assessment (Delft-FIAT)¶
Depth–damage approach via HydroMT-FIAT: per building, max potential damage (replacement value) × a depth–damage curve fraction = damage at a given depth, aggregated over the exposure set.
Vulnerability curves: JRC Global flood depth–damage functions (Huizinga et al., 2017), European curves, per building/occupancy type.
Replacement values: JRC country-level construction costs (Netherlands), adjusted via
preprocess_jrc_damage_values(construction cost vs. depreciated value, content share, undamageable part, material use).Units: EUR, price reference year 2010 — not USD (
eur_to_us_dollar = False); a 2010 EUR–USD rate of 1.327 is available in code if needed.Exposure: building footprints/occupancy from OpenStreetMap (confirms the OSM sourcing already documented for the knowledge graph — see Knowledge Graph: Buildings & Flooding §“PDOK/BAG enrichment”).
Full
settings.tomlconfig in the source report’s Appendix 3 (hazard filehazard/hmax.nc,elevation_reference = "datum",risk = false, i.e. this pipeline runs single-event damage, not probabilistic risk).
Measures — the authoritative vocabulary¶
This supersedes the “5 real types” understanding used earlier in this
project. Django’s InterventionArea.InterventionType currently
implements 5 of the following; the other 6 are real, documented measures
this modelling framework supports but that don’t have InterventionArea
rows yet. Per direction from the requester (2026-07-31): treat this
table as the ceiling for RHT-78
— don’t add measure types beyond what’s documented here, and don’t expand
InterventionType to the full 11 yet.
| Measure | Category | SFINCS mechanism | Feature attribute | Effect |
|---|---|---|---|---|
| Underground storage | Blue | volfile (polygon geojson) | volume (m³) | Storage volume per cell |
| Water square or wadi | Blue | subgrid_dem.tiff (polygon geojson) | level_change (m, + up / − down) | Elevation change |
| Pre-drainage / polder level management | Blue | precipfile (scalar) | mm/hr | Change in effective rainfall |
| Dike raising / quay wall heightening | Blue/Grey | weirfile (polyline geojson) | level_change (m) | Crest height |
| Maeslantkering / Hartelkering closure | Grey | weirfile (polyline geojson) | level_change (m) | Closes a waterway |
| Compartmentalization / thin dam | Grey | weirfile (polygon geojson) | level_change (m) | Structure location/orientation |
| Retention basin | Grey | subgrid_dem.tiff (polygon geojson) | level_change (m) | Elevation change |
| Pump capacity / sewer capacity increase | Grey | precipfile (scalar) | mm/hr | Change in net rainfall (overland flow) |
| Green roofs (interception/infiltration) | Green | volfile (polygon geojson) | volume (m³) | Storage volume per cell |
| Permeable pavement | Green | subgrid_manning.tiff (polygon geojson) | — | Manning’s n + negative storage volume |
| Vegetation / urban parks (flow retardation) | Green | subgrid_manning.tiff (polygon geojson) | — | Manning’s n + storage volume |
Bold = already implemented as an InterventionType choice in Django
(water_square, compartmentalization, green_roofs,
permeable_pavement, vegetation_parks).
Two corrections this resolves for the eval question set
(eval/golden.yaml/eval/adversarial.yaml, which assumed
GRN_ROOF, WADI, WATER_SQ, PERM_PAVE, PUMP_CAP, QUAY_RAISE, SEWER_UP, RETENTION):
“Wadi” is not a separate measure from “water square” — Thomas’s table lists them as one row (“Water square or wadi”), sharing the same mechanism (
level_changeon the subgrid DEM). The eval set’sWADIandWATER_SQcodes should map to the same real type, not two.Pump capacity and sewer capacity are one combined measure (“Pump capacity / sewer capacity increase”), not two separate codes (
PUMP_CAP,SEWER_UP) — both act through the same mechanism (net rainfall /precipfile).QUAY_RAISEandRETENTIONare real (“Dike raising / quay wall heightening”, “Retention basin”) — just not yet implemented asInterventionTypechoices.
This also confirms the mechanism mapping used in RHT-102 (automating a SFINCS run per intervention): compartmentalization → weir, water square → subgrid DEM edit, green roofs → storage volume, permeable pavement/vegetation → Manning’s roughness — all independently verified here rather than inferred.
References¶
Full citation list in the source report’s References section — key ones: Leijnse et al. (2021, SFINCS method), van Ormondt et al. (2025, subgrid accuracy), Huizinga et al. (2017, JRC damage functions), STOWA (2024, rainfall statistics), Parmet et al. (2001, Lobith discharge scaling), Bijlsma (2007, SR88 storm report).