# Distributed small-reservoir pumped-storage hydropower screening — Europe (36 countries)

GIS screening of **distributed small-reservoir pumped-storage hydropower**
in Europe: detection of natural closed depressions in the DEM
(FABDEM), combination with existing water bodies, constrained pairing of
upper/lower reservoirs (head, distance, grid proximity, protected areas),
non-overlapping site selection with explicit lake-drawdown, karst and
site-size scenarios, and global sensitivity analysis. Companion code of
the paper *"Distributed small-reservoir pumped-storage hydropower in Europe:
a continental GIS screening under drawdown and geological constraints"*
(Girard, Rogeau and Quaranta, 2026, in preparation) —
extension of [Rogeau, Girard & Kariniotakis (2017, Applied
Energy)](https://doi.org/10.1016/j.apenergy.2017.03.100) to 36 European
countries on open pan-European data.

**Résumé (fr)** : criblage topographique de petites STEP distribuées en
Europe (36 pays) — cuvettes naturelles + lacs existants, appariement sous
contraintes, scénarios de marnage et de taille, filtre karst et Sobol.

## État / Status

🟢 Pipeline complet et évalué (France : comparaison partielle avec
l'étude 2017 et données nationales ; Europe : 36 pays, MNT FABDEM,
réseau OSM). Le code d'origine 2020
(Antoine Rogeau) est conservé dans [`legacy/`](legacy/) comme référence
historique, non maintenu. Historique de la modernisation : [`PLAN.md`](PLAN.md).

## Structure (convention étude maison)

```
MicroSTEP/
├── config/            # PROFILS par pays (france.yaml, switzerland.yaml + README)
│   └── README.md      #   système de profils ; France (validé) vs Europe (exploratoire)
├── Snakefile          # orchestration du pipeline (squelette du DAG)
├── workflow/
│   ├── R/             # scripts R modernisés (do_*.R : sf/terra/whitebox), partagés
│   ├── run_chain.sh   # chaîne 9 étapes/zone ; run_region.sh : dispatch parallèle
│   └── scripts/       # helpers Python (ex. accès BD TOPO via buildingdata)
├── reports/           # rapports Quarto (*.qmd → *.html) — livrables
├── output/            # sorties intermédiaires/finales (hors dépôt)
├── figures/           # figures générées (hors dépôt)
└── legacy/            # code d'origine 2020 (référence, non maintenu)
```

## Données (hors dépôt)

Les données ne sont **jamais** versionnées ; elles sont lues dans
`~/Documents/Code/Data` (cf. `config/france.yaml`, clé `data_root`). Sources principales :

| Couche | Emplacement |
|--------|-------------|
| MNT France (SRTM ~30 m) | `Data/Maps/Relief/SRTM - France/Source` |
| MNT Europe (Copernicus 30 m) | `Data/Maps/Copernicus` |
| BD TOPO (lacs, réseau, bâti) | package Python `buildingdata` |
| Zones protégées | `Data/Maps/{WDPA,Natura2000,ZNIEFF}` |
| Réseau électrique | `Data/Maps/reseau` |
| Précipitations (bassins versants) | `Bases de donnees/WorldClim` |

## Prérequis

- **R ≥ 4.5** — dépendances figées dans `renv.lock` (`sf`, `terra`, `whitebox`,
  `exactextractr`, `raster`, `yaml`, `tictoc`, `knitr`/`rmarkdown`…). Restaurer :
  ```r
  renv::restore()
  ```
- **whitebox** (WhiteboxTools) : remplace SAGA-GIS (remplissage de cuvettes) et
  TauDEM/MPI (bassins versants) de la version 2020 — binaire autonome, multi-plateforme.
  Après `renv::restore()`, installer le binaire une fois : `whitebox::install_whitebox()`.
- **Snakemake** + **Quarto** sur le `PATH` (orchestration + rapport).
- Corrélation surface→volume des lacs pré-calibrée : `workflow/lake_correlation.rds` (versionnée).

## Lancer

```bash
snakemake -c1 -n                 # dry-run : DAG à construire
snakemake -c4 testzone_report    # fil rouge vertical (zone de test)
```

Un pays Europe (profils `config/europe/<cc>f.yaml`, MNT FABDEM) :

```bash
Rscript workflow/gen_europe.R AT            # génère les profils du pays
NP=6 bash workflow/run_europe.sh AT         # terrain (tiles→pairing→sélection)
NP=6 bash workflow/run_europe_osm.sh AT     # variante contrainte réseau OSM
```

CRS de travail : **EPSG:2154 (Lambert-93)** pour la France,
**EPSG:3035 (ETRS89-LAEA)** pour l'Europe.

## Données d'entrée

Aucune donnée n'est versionnée ; tout est lu sous `data_root`
(cf. profils YAML). La plupart des couches sont **récupérées par le code**
(FABDEM via `workflow/dl_driver.sh`, RGE ALTI par WMS IGN, BD TOPO par WFS,
OSM par Overpass avec cache par pays, WorldClim, frontières Eurostat,
karst WOKAM, base hydro JRC). Exceptions nécessitant un compte gratuit :
CLC 2018 et EU-DEM (Copernicus), WDPA (Protected Planet, la licence
interdit la redistribution), ERA5 (CDS).

Toutes les figures du papier se régénèrent d'une commande depuis les
couches de résultats (scripts un-par-figure dans `workflow/analysis/`) :

```bash
bash workflow/make_paper_figures.sh
```

### Scénarios de marnage et définition de l'énergie

L'attribut historique `energy_kwh` applique le rendement de cycle et une
fraction utile uniforme à tous les réservoirs. Il est conservé pour reproduire
les runs antérieurs, mais ne doit plus être interprété seul comme une capacité
technique des lacs naturels. L'analyse révisée plafonne leur volume mobilisable
par `surface du lac × marnage admissible` et distingue énergie hydraulique brute
et énergie électrique restituable :

```bash
Rscript workflow/analysis/lake_drawdown_sensitivity.R
Rscript workflow/analysis/lake_drawdown_prepare_candidates.R
Rscript workflow/analysis/lake_drawdown_summarize_matching.R
```

Les scénarios de 0,5, 1, 2 et 5 m sont écrits dans `output/compare/`. Le script
de préparation reconstruit aussi les attributs des deux réservoirs pour les
anciens GeoPackages ; les nouveaux runs les écrivent directement depuis
`do_pairing.R`. La sélection principale maximise l'énergie par un glouton
continental non recouvrant. `exact_energy_matching.py` permet des contrôles par
couplage de poids maximal ; le blossom exact devient coûteux sur la plus grande
composante continentale et n'est pas utilisé silencieusement comme résultat
principal.

### Analyse continentale révisée (référence du papier, 2026-07-13)

La chaîne complète se lance avec `bash workflow/make_paper_figures.sh`. Elle
construit deux jeux de candidats (5 km pour le portefeuille de référence,
10 km pour couvrir le domaine Sobol), puis régénère scénarios de marnage,
Sobol, typologie et cartes. Le scénario principal combine marnage 1 m,
réseau <=5 km, exclusion des cuvettes sèches karstiques, plafond
d'altitude 2500 m (haute montagne) et plafond de 100 MWh/site, avec
sélection non-recouvrante par matching exact (max-weight, blossom) :
**29 213 sites et 752,888 GWh**.

Le reporting complémentaire `policy_review_outputs.R` calcule le sous-ensemble
géographique UE-27, le volume d'eau transférable, les classes de taille et de
rapport distance/chute `L/H`, et produit un classeur de revue site par site.
Pour le portefeuille de référence : **2 875,5 Mm3** d'eau transférable sur
l'ensemble du criblage, dont **279,466 GWh et 1 354,3 Mm3** dans l'UE-27 ;
81,5 % de l'énergie se trouve sur des sites avec `L/H >= 10`. Les puissances
sur 4 h et 8 h du classeur sont de simples conversions énergie/durée, pas des
dimensionnements hydrauliques.

Le Sobol Jansen (`sobol_drawdown_size.R`) échantillonne explicitement chute
minimale, distance entre bassins, distance au réseau, énergie minimale,
marnage, plafond d'énergie par site et plafond d'altitude (2000--3000 m).
Le run publié utilise N=4 000, 36 000 évaluations, 500 bootstraps et la graine
20260713. Indices totaux : distance entre bassins 0,747 ; plafond de taille
0,149 ; réseau 0,137 ; chute 0,036 ; énergie minimale 0,025 ; marnage 0,009 ;
altitude 0,001. Les sorties sont dans
`output/compare/sobol_drawdown_size_*`.

La typologie (`fig_clusters_revised.R`) applique CLARA aux 29 213 sites et
sélectionne k=3 parmi k=3--8 par silhouette : lake-connected (246,1 GWh),
high-head dry (364,4 GWh) et small dry (142,4 GWh). Les cartes NUTS-2 et des
classes, les trois médoïdes réels et le diagnostic géographique sont produits
par `fig_revised_maps.R`, `fig_medoid_sites_revised.R` et
`geo_distribution_revised.R`.

Ne pas mélanger ces sorties avec les anciennes analyses utilisant
`energy_kwh` historique, une fraction utile uniforme pour les lacs, une
sélection par score de coût ou l'ancienne typologie PAM.

## Résultats & citation

Les couches de résultats (sites sélectionnés par pays, jeux de candidats
complets, courbes coût-potentiel, table maître corrigée) sont archivées
sur **Zenodo** : <https://doi.org/10.5281/zenodo.21326693>
(CC BY-NC-SA 4.0). Si vous utilisez ce code ou ces résultats, merci de
citer le papier ci-dessus et l'archive Zenodo.

## Licence

Code sous licence [MIT](LICENSE). Le MNT FABDEM utilisé par le pipeline
est sous licence **CC BY-NC-SA 4.0** (usage non commercial) — les couches
dérivées en héritent ; voir Hawker et al. (2022, ERL).
