# Découverte de airGRiwrm sur la Moyenne Vallée de l’Hérault

David Dorchies

► To cite this version:

David Dorchies. Découverte de airGRiwrm sur la Moyenne Vallée de l'Hérault. Master. Formation à airGRiwrm, Montpellier (en ligne), France. 2024, pp.89. [hal-04812296](https://hal.inrae.fr/hal-04812296v1)

HAL Id: hal-04812296

https://hal.inrae.fr/hal-04812296v1

Submitted on 30 Nov 2024

HAL is a multi-disciplinary open access
archive for the deposit and dissemination of sci-
entific research documents, whether they are pub-
lished or not. The documents may come from
teaching and research institutions in France or
abroad, or from public or private research centers.

L'archive ouverte pluridisciplinaire HAL, est
destinée au dépôt et à la diffusion de documents
scientifiques de niveau recherche, publiés ou non,
émanant des établissements d'enseignement et de
recherche français ou étrangers, des laboratoires
publics ou privés.

<figure><img src="image_1.png" /></figure>
<figure><img src="image_2.png" /></figure>

RÉPUBLIQUE
FRANÇAISE

Liberté
Egalité
Fraternité

INRAE

# Découverte de airGRiwrm sur la Moyenne Vallée de l'Hérault
## Gestion intégrée de la ressource en eau avec airGR

David Dorchies

UMR G-EAU

Montpellier, le 25 novembre 2024
# Programme de la formation

## Pré-requis

* Un minimum de connaissance du langage R

* Une installation de R (≥4.3.3) et Rstudio: https://posit.co/download/rstudio-desktop/

## Diffusion du support de cette formation

Ce support est disponible sur :
https://airgriwrm.pages.mia.inra.fr/formation-airgriwrm

Code source: https://forgemia.inra.fr/airgriwrm/formation-airgriwrm

<table><thead><tr><td>Séquence</td><td>Temps</td><td>Heure</td></tr></thead><tbody><tr><td>Accueil des participants</td><td>10 mn</td><td>14h00</td></tr><tr><td>Introduction au modèle semi-distribué</td><td>05 mn</td><td>14h10</td></tr><tr><td>Présentation du package airGRiwrm</td><td>15 mn</td><td>14h15</td></tr><tr><td>Installation du package airGRiwrm</td><td>10 mn</td><td>14h30</td></tr><tr><td>Présentation du jeu de données de la formation</td><td>30 mn</td><td>14h40</td></tr><tr><td>Créer un réseau semi-distribué avec airGRiwrm</td><td>15 mn</td><td>15h10</td></tr><tr><td>Calage d'un réseau semi-distribué de modèles hydrologiques</td><td>60 mn</td><td>15h25</td></tr><tr><td>Régulation du barrage du Salagou</td><td>30 mn</td><td>16h25</td></tr><tr><td>Fin de la formation</td><td></td><td>16h55</td></tr></tbody></table>
Le modèle semi-distribué
# Un modèle semi-distribué : c'est quoi ?

* Découpage du bassin versant en sous-bassins en fonction de la position des stations hydrométriques exutoires de chaque sous-bassin

* Le ruissellement de chaque sous-bassin est modélisé par un modèle pluie-débit global (GR...)

* Le modèle semi-distribué relie les stations hydrométrique grâce à un routage hydraulique de type "lag"

<figure><img src="image_3.png" /></figure>
# Intérêt du modèle hydrologique semi-distribué

Au delà de la simulation de débits ayant une cohérence amont-aval dans le modèle, la semi-distribution et le routage hydraulique permettent l'introduction d'influences humaines :

* Prélèvements de débit

* Réservoirs

* Transferts inter-bassins

Exemple ci-contre avec le bassin versant de l'Aude où sont modélisés 7 réservoirs, des transferts inter-bassins et des canaux de navigation.

<figure><img src="image_4.png" /></figure>
<figure><img src="image_5.png" /></figure>

**airGRiwrm:** extension de airGR pour un réseau de modèles semi-distribués
# Introduction au package airGRiwrm

airGRiwrm complète la galaxie airGR en automatisant la semi-distribution et en ajoutant des fonctionnalités pour simuler les influences humaines.

Principalement utilisé pour les études d'impact et d'adaptation aux changements globaux de bassins versants anthropisés.

* Le package airGRiwrm est en développement depuis mai 2020

* Diffusé sur le CRAN depuis mars 2022 (v0.7.0 - sept. 2024)

* Logiciel gratuit et open-source (Github : https://github.com/inrae/airGRiwrm)

<figure><img src="image_6.png" /></figure>

<figure><img src="image_7.png" /></figure>

## Documentation avec des exemples d'utilisation:

* https://inrae.github.io/airGRiwrm (v0.7.0)

* https://inrae.github.io/airGRiwrm/dev/ (v0.7.0.9000 en développement)
airGRiwrm redéfinit les fonctions de airGR pour automatiser la gestion d'un réseau semi-distribué:

```
library(airGRiwrm)
```

```
Loading required package: airGR
```

```
Attaching package: 'airGRiwrm'
```

The following objects are masked from
`package:airGR`:

```
Calibration, CreateCalibOptions,
CreateInputsCrit, CreateInputsModel,
CreateRunOptions, RunModel
```

Les fonctions originales de airGR restent accessibles.

Par rapport à airGR, on ajoute une étape préalable de description du réseau :
avec la fonction CreateGRiwrm

<figure><img src="image_8.png" /></figure>
# Les fonctionnalités de airGRiwrm

## Version officielle diffusée sur le CRAN (v0.7.0)

* Extension de airGR sur un réseau semi-distribué via la description d'un réseau de "noeuds" confluant de l'amont vers l'aval

* Les noeuds de modèle supportent :

* Les Modèles GR (pas de temps journalier et horaire) et transfert hydraulique (Lag)

* Un modèle RunModel_Reservoir pour simuler l'évolution du volume d'un réservoir

* D'autres types de noeuds sont disponibles :

* Noeuds DirectInjection pour introduire des influences humaines dans le réseau via des chroniques prédéfinies de débits prélevés ou lâchés

* Noeuds Ungauged pour simuler les débits du cours d'eau sur des points non jaugés en transférant le modèle et les paramètres d'un noeud jaugé (régionalisation)

* Noeuds Diversion pour dériver une partie du débit d'un noeud vers un autre noeud que son noeud aval (pour les transferts inter-bassin et les canaux de dérivation)

* Calage et run des simulations

* Régularisation des paramètres (de Lavenne et al., 2019)

* Simulation en mode "Superviseur" permettant l'utilisation d'algorithmes de régulation centralisée

## Version en développement

* Fonction utilisateur de régulation locale à l'échelle du noeud utilisable en calage
Installation du package airGRiwrm

<figure><img src="image_9.png" /></figure>
# Installation du package airGRiwrm

## La version diffusée sur le CRAN

```
install.packages("airGRiwrm")
```

## La version en cours de développement

Installation de airGRiwrm branche "dev" :

```
install.packages("remotes")
remotes::install_github("inrae/airGRiwrm", "dev")
```
# Le jeu de données de la formation: le cas d'étude "Moyenne Vallée de l'Hérault"
# Présentation du cas d'étude "Moyenne Vallée de l'Hérault"
Synoptique de la représentation du réseau

<figure><img src="image_10.png" /></figure>

Leaflet | © OpenStreetMap contributors
Synoptique de la représentation du réseau

<figure><img src="image_11.png" /></figure>

<figure><img src="image_12.png" /></figure>
# Cas d'étude: chargement des données

## Exercice

* Créer un R Notebook sous RStudio

* Récupérer le fichier herault.Rdata sur https://forgemia.inra.fr/airgriwrm/formation-airgriwrm (Lien direct)

* Enregistrer le fichier herault.Rdata et le R Notebook dans le même dossier

* Définir le working directory (Menu Session > Set working directory > To source file location)

* Créer un premier chunk pour :

* effacer l'environnement de travail

* charger les données du fichier herault.RData

* afficher la liste des variables présentes dans l'environnement de travail
# Cas d'étude: chargement des données

## Exercice

* Créer un R Notebook sous RStudio

* Récupérer le fichier herault.Rdata sur https://forgemia.inra.fr/airgriwrm/formation-airgriwrm (Lien direct)

* Enregistrer le fichier herault.Rdata et le R Notebook dans le même dossier

* Définir le working directory (Menu Session > Set working directory > To source file location)

* Créer un premier chunk pour :

* effacer l'environnement de travail

* charger les données du fichier herault.RData

* afficher la liste des variables présentes dans l'environnement de travail

```r
rm(list = ls())
load("herault.RData")
ls()
#> [1] "DatesR"      "PotEvap"      "Precip"       "Qinf"
#> [5] "Qobs"       "Qrelease"     "reseau_herault"
```

N.B.: Les codes qui ont généré ces données issues de bases de données et de littérature publiques sont disponibles à l'URL: https://airgriwrm.pages.mia.inra.fr/airgrccia/articles/
# Cas d'étude: chargement des données

## Description des données fournies

```
ls()
#> [1] "DatesR"
#> [5] "Qobs"
"PotEvap" "Precip" "Qinf"
"Qrelease" "reseau_herault"
```

* reseau_herault (*data.frame*): Description des noeuds du réseau hydrographique

* DatesR (*POSIXct*): Dates des pas de temps d'observation

* Precip, PotEvap (*matrix*): Chroniques de précipitations et ETP journalières moyennes sur chaque BVI

* Qinf, Qrelease, Qobs (*matrix*): Chroniques des débits prélevés, lâchers par les réservoir, observés aux stations de jaugeage
# Cas d'étude: description du réseau de stations hydrométriques

Exercice: Afficher le tableau décrivant le réseau de stations

reseau_herault

<figure><img src="image_13.png" /></figure>
# Cas d'étude: description du réseau de stations hydrométriques

Exercice: Afficher le tableau décrivant le réseau de stations

reseau_herault

<figure><img src="image_14.png" /></figure>

<table><thead><tr><td>id</td><td>down</td><td>length</td><td>tot_area</td><td>libelle_site</td></tr></thead><tbody><tr><td>Y2300020</td><td>NA</td><td>NA</td><td>1954.93625</td><td>L'Hérault à Aspiran</td></tr><tr><td>Y2140010</td><td>Y2300020</td><td>33.40</td><td>1407.61063</td><td>L'Hérault à Gignac</td></tr><tr><td>Y2140020</td><td>Y2140010</td><td>45.10</td><td>1227.02063</td><td>L'Hérault à Saint-Guilhem-le-Désert [La Combe du Corps]</td></tr><tr><td>Y2100020</td><td>Y2140020</td><td>73.45</td><td>910.51250</td><td>L'Hérault à Laroque</td></tr><tr><td>Y2210010</td><td>Y2300020</td><td>79.10</td><td>181.88000</td><td>La Lergue à Lodève</td></tr><tr><td>Y2230010</td><td>DAM</td><td>0.00</td><td>78.87438</td><td>Le Salagou à Clermont-l'Hérault [Mas Audran]</td></tr><tr><td>DAM</td><td>Y2300020</td><td>48.50</td><td>NA</td><td>Barrage du Salagou</td></tr></tbody></table>
# Cas d'étude: description du réseau intégrant les prélèvements

La variable Qinf contient les chroniques de prélèvements agrégés à l'échelle des BVI (Une colonne par BVI)

```r
str(Qinf)

#> 'data.frame': 4017 obs. of 6 variables:
#> $ Y2100020_WD: num -5258 -5258 -5258 -5258 -5258 ...
#> $ Y2140010_WD: num -95933 -95933 -95933 -95933 -95933 ...
#> $ Y2140020_WD: num -329 -329 -329 -329 -329 ...
#> $ Y2210010_WD: num -810 -810 -810 -810 -810 ...
#> $ Y2230010_WD: num -1289 -1289 -1289 -1289 -1289 ...
#> $ Y2300020_WD: num -12949 -12949 -12949 -12949 -12949 ...
```

## Exercice

Ajouter les noeuds de prélèvement dans la description du réseau

* Explorer la variable Qinf contenant les chroniques de prélèvement

* Créer la liste des identifiants des noeuds à créer

* Créer le tableau de description de ces nouveaux noeuds dans le réseau (même colonnes que reseau_herault)

* Concaténer les deux tableaux de description du réseau
Cas d'étude: description du réseau intégrant les prélèvements

```
id_WD <- names(Qinf)
id_bvi_down <- sub("_WD", "", names(Qinf))
reseau_WD <- data.frame(
  id = id_WD,
  down = id_bvi_down,
  length = 0,
  tot_area = as.numeric(NA),
  libelle_site = paste("Withdrawals on",
                       reseau_herault$libelle_site[reseau_herault?id %in% id_bvi_down])
)
reseau_herault <- rbind(reseau_herault, reseau_WD)
```

<table><thead><tr><th>id</th><th>down</th><th>length</th><th>tot_area</th><th>libelle_site</th></tr></thead><tbody><tr><td>Y2300020</td><td>NA</td><td>NA</td><td>1954.93625</td><td>L'Hérault à Aspiran</td></tr><tr><td>Y2140010</td><td>Y2300020</td><td>33.40</td><td>1407.61063</td><td>L'Hérault à Gignac</td></tr><tr><td>Y2140020</td><td>Y2140010</td><td>45.10</td><td>1227.02063</td><td>L'Hérault à Saint-Guilhem-le-Désert [La Combe du Corps]</td></tr><tr><td>Y2100020</td><td>Y2140020</td><td>73.45</td><td>910.51250</td><td>L'Hérault à Laroque</td></tr><tr><td>Y2210010</td><td>Y2300020</td><td>79.10</td><td>181.88000</td><td>La Lergue à Lodève</td></tr><tr><td>Y2230010</td><td>DAM</td><td>0.00</td><td>78.87438</td><td>Le Salagou à Clermont-l'Hérault [Mas Audran]</td></tr><tr><td>DAM</td><td>Y2300020</td><td>48.50</td><td>NA</td><td>Barrage du Salagou</td></tr><tr><td>Y2100020_WD</td><td>Y2100020</td><td>0.00</td><td>NA</td><td>Withdrawals on L'Hérault à Aspiran</td></tr><tr><td>Y2140010_WD</td><td>Y2140010</td><td>0.00</td><td>NA</td><td>Withdrawals on L'Hérault à Gignac</td></tr><tr><td>Y2140020_WD</td><td>Y2140020</td><td>0.00</td><td>NA</td><td>Withdrawals on L'Hérault à Saint-Guilhem-le-Désert [La Combe du Corps]</td></tr><tr><td>Y2210010_WD</td><td>Y2210010</td><td>0.00</td><td>NA</td><td>Withdrawals on L'Hérault à Laroque</td></tr><tr><td>Y2230010_WD</td><td>Y2230010</td><td>0.00</td><td>NA</td><td>Withdrawals on La Lergue à Lodève</td></tr><tr><td>Y2300020_WD</td><td>Y2300020</td><td>0.00</td><td>NA</td><td>Withdrawals on Le Salagou à Clermont-l'Hérault [Mas Audran]</td></tr></tbody></table>
Cas d'étude: description des observations hydroclimatiques

Exercice: Afficher des informations concernant les dates de chroniques (début/fin) et les statistiques des chroniques de données météo
# Cas d'étude: description des observations hydroclimatiques

Exercice: Afficher des informations concernant les dates de chroniques (début/fin) et les statistiques des chroniques de données météo

```
head(DatesR, 3)
```

```
#> [1] "2012-08-01 UTC" "2012-08-02 UTC" "2012-08-03 UTC"
```

```
tail(DatesR, 3)
```

```
#> [1] "2023-07-29 UTC" "2023-07-30 UTC" "2023-07-31 UTC"
```

```
summary(Precip)
```

```
#> Y2300020 Y2140010 Y2140020 Y2100020
#> Min. : 0.00000 Min. : 0.00000 Min. : 0.00000 Min. : 0.00000
#> 1st Qu.: 0.00000 1st Qu.: 0.00000 1st Qu.: 0.00000 1st Qu.: 0.00000
#> Median : 0.01455 Median : 0.02533 Median : 0.06252 Median : 0.1115
#> Mean : 2.21053 Mean : 2.30651 Mean : 2.70923 Mean : 3.6820
#> 3rd Qu.: 0.69084 3rd Qu.: 0.80960 3rd Qu.: 0.95105 3rd Qu.: 1.6304
#> Max. :225.10429 Max. :212.05096 Max. :143.04563 Max. :218.9613
#> Y2210010 Y2230010
#> Min. : 0.00000 Min. : 0.00000
#> 1st Qu.: 0.00000 1st Qu.: 0.00000
#> Median : 0.00476 Median : 0.00168
#> Mean : 3.36031 Mean : 2.16033
#> 3rd Qu.: 1.28997 3rd Qu.: 0.58991
#> Max. :292.21172 Max. :247.89930
```

```
summary(PotEvap)
```

```
#> Y2300020 Y2140010 Y2140020 Y2100020
#> Min. :0.1883 Min. :0.1427 Min. :0.02319 Min. :0.006492
#> 1st Qu.:0.9457 1st Qu.:0.9360 1st Qu.:0.88077 1st Qu.:0.755963
#> Median :2.0877 Median :2.0442 Median :1.95908 Median :1.783624
#> Mean :2.4441 Mean :2.4096 Mean :2.32429 Mean :2.136128
#> 3rd Qu.:3.8575 3rd Qu.:3.8122 3rd Qu.:3.71109 3rd Qu.:3.392739
#> Max. :6.2505 Max. :6.2099 Max. :6.05675 Max. :6.100467
#> Y2210010 Y2230010
#> Min. :0.004761 Min. :0.1409
#> 1st Qu.:0.776905 1st Qu.:0.9391
#> Median :1.790155 Median :2.0392
#> Mean :2.115719 Mean :2.4100
#> 3rd Qu.:3.369112 3rd Qu.:3.7950
#> Max. :5.783518 Max. :6.2375
```

# Cas d'étude: description des observations hydroclimatiques

Exercice: Afficher des informations concernant les dates de chroniques (début/fin) et les statistiques des chroniques de données météo
# Cas d'étude: description des chroniques de prélèvement

## Exercice

Afficher les chroniques des prélèvements (*str*, *summary*, *plot*) (Attention aux unités)
# Cas d'étude: description des chroniques de prélèvement

## Exercice

Afficher les chroniques des prélèvements (str, summary, plot) (Attention aux unités)

```r
str(Qinf)
```

```r
summary(Qinf, echo=Sys.getenv("FORMATIONamatSOLUTIONS")==")")
```

```r
#> Y2100020_WD      Y2140010_WD      Y2140020_WD      Y2210010_WD
#> Min.  : -5277      Min.  : -95933.3      Min.  : -377.0       Min.  : -886.5
#> 1st Qu.: -3868      1st Qu.: -51675.4      1st Qu.: -341.3       1st Qu.: -880.1
#> Median : -1469      Median :  -765.8       Median : -327.0       Median : -855.7
#> Mean  : -2415      Mean  : -20922.2      Mean  : -329.4       Mean  : -825.9
#> 3rd Qu.: -1404      3rd Qu.:  -492.5       3rd Qu.: -313.8       3rd Qu.: -810.1
#> Max.  : -1139      Max.  :  -285.4       Max.  : -281.9       Max.  : -722.7
#> Y2230010_WD      Y2300020_WD
#> Min.  : -2425.82    Min.  : -19096
#> 1st Qu.: -1494.86    1st Qu.: -12406
#> Median :  -75.59     Median :  -2097
#> Mean  :  -617.80     Mean  :  -5681
#> 3rd Qu.:  -70.33     3rd Qu.:  -1946
#> Max.  :  -60.95     Max.  :  -1396
```
Cas d'étude: description des chroniques de prélèvement

TSstudio::ts_plot(cbind(DatesR, Qinf))

<figure><img src="image_15.png" /></figure>
# Cas d'étude: description des chroniques de lâchers

Exercice: Afficher les données des chroniques de lâchers (str, summary, TSstudio::ts_plot)
# Cas d'étude: description des chroniques de lâchers

Exercice: Afficher les données des chroniques de lâchers (str, summary, TSstudio::ts_plot)

TSstudio::ts_plot(cbind(DatesR, Qrelease))

<figure><img src="image_16.png" /></figure>
# Cas d'étude: description des chroniques des débits observés

**Exercice:** Afficher les données des chroniques des débits observés (str, summary, TSstudio::ts_plot)
# Cas d'étude: description des chroniques des débits observés

Exercice: Afficher les données des chroniques des débits observés (str, summary, TSstudio::ts_plot)

TSstudio::ts_plot(cbind(DatesR, Qobs))

<figure><img src="image_17.png" /></figure>
# Cas d'étude: description des chroniques des débits observés

Il n'y a pas de débits observés pour un des bassins versants intermédiaires :

```
setdiff Exhibit(Precip), names(Qobs))
#> [1] "Y2230010"
```

Ce sera un bassin non jaugé pour lequel il faudra transmettre les paramètres d'un bassin ayant des caractéristiques voisines.

N.B. : Le mécanisme de transfert des paramètres de airGRiwrm applique la transformation du paramètre $X_4$ dépendant de l'aire du sous-bassin décrite dans Lobligeois (2014).

Lobligeois, Florent. 2014. « Mieux connaître la distribution spatiale des pluies améliore-t-il la modélisation des crues ? Diagnostic sur 181 bassins versants français ». Phdthesis, AgroParisTech. https://pastel.archives-ouvertes.fr/tel-01134990/document.

<figure><img src="image_18.png" /></figure>

Leaflet | © OpenStreetMap contributors
# Créer un réseau de modèles semi-distribués
avec airGRiwrm
# Créer un réseau de modèles semi-distribués avec airGRiwrm

Le réseau est décrit par un objet GRiwrm qu'il faut créer :

```
?CreateGRiwrm
```

## Exercice

Quelles colonnes manquent au tableau de description du réseau ?
# Créer un réseau de modèles semi-distribués avec airGRiwrm

Le réseau est décrit par un objet GRiwrm qu'il faut créer :

```
?CreateGRiwrm
```

## Exercice

*Quelles colonnes manquent au tableau de description du réseau ?*

Il faut définir quel modèle on souhaite utiliser pour chaque noeud du réseau :

* Un modèle hydrologique pour les noeuds correspondants à une station hydrométrique;

* Un modèle Ungauged pour le bassin versant intermédiaire non jaugé

* Un modèle RunModel_Reservoir pour le réservoir du Salagou

* ... autre chose pour les noeuds utilisés pour les influences humaines observées.
# Créer un réseau de modèles semi-distribués avec airGRiwrm

Le réseau est décrit par un objet GRiwrm qu'il faut créer :

```
?CreateGRiwrm
```

## Exercice

*Quelles colonnes manquent au tableau de description du réseau ?*

Il faut définir quel modèle on souhaite utiliser pour chaque noeud du réseau :

* Un modèle hydrologique pour les noeuds correspondants à une station hydrométrique;

* Un modèle Ungauged pour le bassin versant intermédiaire non jaugé

* Un modèle RunModel_Reservoir pour le réservoir du Salagou

* ... autre chose pour les noeuds utilisés pour les influences humaines observées.

```
reseau_herault$model <- "RunModel_GR4J"
reseau_herault$model[reseau_herault == "DAM"] <- "RunModel_Reservoir"
reseau_herault$model[reseau_herault$id == "Y2230010"] <- "Ungauged"
reseau_herault$model[grep("_WD", reseau_herault)] <- as.character(NA)
```
# Définir le BVI donnant ses paramètres au BVI non jaugé

Par défaut, les bassins non jaugés récupèrent les paramètres du premier BVI jaugé à l'aval et le calage des BVI non jaugé et le BVI jaugés s'effectuent simultanément.

Dans le cas présent le BVI non jaugé est situé dans une vallée voisine et l'utilisateur doit définir lui-même quel BVI donnera ses paramètres.

<figure><img src="image_19.png" /></figure>
# Définir le BVI donnant ses paramètres au BVI non jaugé

Par défaut, les bassins non jaugés récupèrent les paramètres du premier BVI jaugé à l'aval et le calage des BVI non jaugé et le BVI jaugés s'effectuent simultanément.

Dans le cas présent le BVI non jaugé est situé dans une vallée voisine et l'utilisateur doit définir lui-même quel BVI donnera ses paramètres.

<figure><img src="image_20.png" /></figure>

```
reseau_herault$donor <- as.character(NA)
reseau_herault$donor[reseau_herault?id == "Y2230010"] <- "Y2210010"
```
# Création de l'objet GRiwrm

On peut faire correspondre les noms de colonne avec le paramètre cols :

## Exercice

Créer l'objet GRiwrm à partir du réseau fusionné
# Création de l'objet GRiwrm

On peut faire correspondre les noms de colonne avec le paramètre cols :

## Exercice

Créer l'objet GRiwrm à partir du réseau fusionné

```r
griwrm <- CreateGRiwrm(
  reseau_herault,
  cols = list(area = "tot_area")
)

str(griwrm)

#> GRiwrm [13 x 6] (S3: GRiwrm/tbl DF/tbl/data.frame)
#> $ id     : chr [1:13] "Y2100020" "Y2210010" "Y2140020" "Y2230010" ...
#> $ down  : chr [1:13] "Y2140020" "Y2300020" "Y2140010" "DAM" ...
#> $ length: num [1:13] 73.5 79.1 45.1 0 33.4 ...
#> $ area   : num [1:13] 910.5 181.9 1227 78.9 1407.6 ...
#> $ model : chr [1:13] "RunModel_GR4J" "RunModel_GR4J" "RunModel_GR4J" "Ungauged" ...
#> $ donor  : chr [1:13] "Y2100020" "Y2210010" "Y2140020" "Y2210010" ...
```
# Créer un réseau de modèles semi-distribués avec airGRiwrm

La fonction plot.GRiwrm permet de tracer une représentation schématique du réseau.

?plot.GRiwrm

Exercice: afficher le schéma du réseau
# Créer un réseau de modèles semi-distribués avec airGRiwrm

La fonction plot.GRiwrm permet de tracer une représentation schématique du réseau.

?plot.GRiwrm

Exercice: afficher le schéma du réseau

plot(griwrm, orientation = "TB")

<figure><img src="image_21.png" /></figure>
Calage d'un réseau de modèles
hydrologiques semi-distribués avec
airGRiwrm
## CreateInputsModel dans airGRiwrm

### Exercice

Créer l'objet *InputsModel* avec le réseau, les dates, les entrées climatiques et les influences observées (Attention aux unités des prélèvements/rejets)
# CreateInputsModel dans airGRiwrm

## Exercice

Créer l'objet InputsModel avec le réseau, les dates, les entrées climatiques et les influences observées (Attention aux unités des prélèvements/rejets)

?CreateInputsModel.GRiwrm
# CreateInputsModel dans airGRiwrm

## Exercice

Créer l'objet `InputsModel` avec le réseau, les dates, les entrées climatiques et les influences observées (Attention aux unités des prélèvements/rejets)

```R
?CreateInputsModel.GRiwrm
```

```R
IM <- CreateInputsModel(
  griwrm,
  DatesR = DatesR,
  Precip = Precip,
  PotEvap = PotEvap,
  Qinf = Qinf,
  Qrelease = Qrelease
)

#> CreateInputsModel.GRiwrm: Processing sub-basin Y2100020...
#> CreateInputsModel.GRiwrm: Processing sub-basin Y2210010...
#> CreateInputsModel.GRiwrm: Processing sub-basin Y2140020...
#> CreateInputsModel.GRiwrm: Processing sub-basin Y2230010...
#> CreateInputsModel.GRiwrm: Processing sub-basin Y2140010...
#> CreateInputsModel.GRiwrm: Processing sub-basin DAM...
#> CreateInputsModel.GRiwrm: Processing sub-basin Y2300020...
```
# L'objet GRiwrmInputsModel

L'objet GRiwrmInputsModel est une liste d'InputsModel : 1 élément de liste = 1 modèle GR (+ Lag) ou RunModel_Reservoir

str(IM)

#> List of 7

#> $ Y2100020:List of 19

#> ..$ DatesR : POSIXlt[1:4017], format: "2012-08-01" "2012-08-02" ...

#> ..$ Precip : num [1:4017] 0 0 0 6.67 13.52 ...

#> ..$ PotEvap : num [1:4017] 4.39 4.51 4.39 4.33 3.92 ...

#> ..$ Qupstream : num [1:4017, 1] -5258 -5258 -5258 -5258 -5258 ...

#> ...- attr(*, "dimnames")=List of 2

#> ... ...$ : NULL

#> ... ...$ : chr "Y2100020_WD"

#> ..$ LengthHydro : Named num 0

#> ...- attr(*, "names")= chr "Y2100020_WD"

#> ..$ BasinAreas : Named num [1:2] NA 911

#> ...- attr(*, "names")= chr [1:2] "Y2100020_WD" "Y2100020"

#> ..$ id : chr "Y2100020"

#> ..$ down : chr "Y2140020"

#> ..$ UpstreamNodes : chr "Y2100020_WD"

#> ..$ UpstreamIsModeled: Named logi FALSE

#> ...- attr(*, "names")= chr "Y2100020_WD"

#> ..$ UpstreamVarQ : Named chr "Qsim_m3"

#> ...- attr(*, "names")= chr "Y2100020_WD"

#> ..$ FUN_MOD : chr "RunModel_GR4J"

#> ..$ inUngaugedCluster: logi FALSE

#> ..$ isReceiver : logi FALSE

#> ..$ gaugedId : chr "Y2100020"

#> ..$ hasUngaugedNodes : logi FALSE

#> ..$ model :List of 4

#> ...$ indexParamUngauged: num [1:5] 1 2 3 4 5

#> ...$ hasX4 : logi TRUE

#> ...$ iX4 : num 5

#> ...$ IsHyst : logi FALSE

#> ..$ hasDiversion : logi FALSE

#> ..$ isReservoir : logi FALSE

#> ...- attr(*, "class")= chr [1:5] "RunModel_GR4J" "InputsModel" "daily" "GR" ...

#> $ Y2210010:List of 19

#> ..$ DatesR : POSIXlt[1:4017], format: "2012-08-01" "2012-08-02" ...

#> ..$ Precip : num [1:4017] 0 0 0 1.79 8.5 ...

#> ..$ PotEvap : num [1:4017] 4.24 4.47 4.33 4.29 3.97 ...

#> ..$ Qupstream : num [1:4017, 1] -810 -810 -810 -810 -810 ...

#> ...- attr(*, "dimnames")=List of 2

#> ... ...$ : NULL
# Calage avec airGRiwrm: CreateRunOptions

Définition des options de simulation:

* Pas de temps de simulation (warm-up + run)

* états initiaux du modèle

* Liste des variables en sortie du modèle

?CreateRunOptions

## Exercice

Définir les indices des pas de temps des périodes de :

* initialisation du modèle (Warm-up) sur un an en début de chronique

* simulation (Run) sur le reste de la chronique
# Calage avec airGRiwrm: CreateRunOptions

Définition des options de simulation:

* Pas de temps de simulation (warm-up + run)

* états initiaux du modèle

* Liste des variables en sortie du modèle

?CreateRunOptions

## Exercice

Définir les indices des pas de temps des périodes de :

* initialisation du modèle (Warm-up) sur un an en début de chronique

* simulation (Run) sur le reste de la chronique

I_WarmUp <- 1:365
I_Run <- seq(366, length(DatesR))
# Calage avec airGRiwrm: CreateRunOptions

## Exercice

Créer l'objet RunOptions à partir de l'objet InputsModel et des indices des périodes de chauffe et simulation
# Calage avec airGRiwrm: CreateRunOptions

## Exercice

Créer l'objet `RunOptions` à partir de l'objet `InputsModel` et des indices des périodes de chauffe et simulation

```r
RO <- CreateRunOptions(
  IM,
  IndPeriod_WarmUp = I_WarmUp,
  IndPeriod_RUN = I_RUN
)
```
# Calage avec airGRiwrm: CreateRunOptions

## Exercice

Créer l'objet RunOptions à partir de l'objet InputsModel et des indices des périodes de chauffe et simulation

```R
RO <- CreateRunOptions(
  IM,
  IndPeriod_WarmUp = I_WarmUp,
  IndPeriod_Run = I_Run
)
```

```R
str(RO)

#> List of 7
#>   $ Y2100020:List of 9
#>     ..$ IndPeriod_WarmUp: int [1:365] 1 2 3 4 5 6 7 8 9 10 ...
#>     ..$ IndPeriod_Run   : int [1:3652] 366 367 368 369 370 371 372 373 374 375 ...
#>     ..$ IniStates     : num [1:67] 0 0 0 0 0 0 0 0 0 0 ...
#>     ..$ IniResLevels  : num [1:4] 0.3 0.5 NA NA
#>     ..$ Outputs_Cal   : chr [1:2] "Qsim" "Param"
#>     ..$ Outputs_Sim   : Named chr [1:24] "DatesR" "PotEvap" "Precip" "Prod" ...
#>     ... - attr(*, "names")= chr [1:24] "GR1" "GR2" "GR3" ...
#>     ..$ FortranOutputs :List of 2
#>     ...$ GR: chr [1:18] "PotEvap" "Precip" "Prod" "Pn" ...
#>     ...$ CN: NULL
#>     ..$ FeatFUN_MOD   :List of 12
#>     ...$ CodeMod      : chr "GR4J"
#>     ...$ NameMod      : chr "GR4J"
#>     ...$ NbParam      : num 5
#>     ...$ TimeUnit     : chr "daily"
#>     ...$ Id          : logi NA
#>     ...$ Class       : chr [1:2] "daily" "GR"
#>     ...$ Pkg         : chr "airGR"
#>     ...$ NameFunMod   : chr "RunModel_GR4J"
#>     ...$ TimeStep     : num 86400
#>     ...$ TimeStepMean: int 86400
#>     ...$ CodeModHydro: chr "GR4J"
#>     ...$ IsSD        : logi TRUE
#>     ..$ id          : chr "Y2100020"
#>     ... - attr(*, "class")= chr [1:3] "RunOptions" "daily" "GR"
#>   $ Y2210010:List of 9
#>     ..$ IndPeriod_WarmUp: int [1:365] 1 2 3 4 5 6 7 8 9 10 ...
#>     ..$ IndPeriod_Run   : int [1:3652] 366 367 368 369 370 371 372 373 374 375 ...
#>     ..$ IniStates     : num [1:67] 0 0 0 0 0 0 0 0 0 0 ...
```
# Calage avec airGRiwrm: Etats initiaux du système

## Exercice

Amender l'objet RunOptions pour définir l'état initial de remplissage du réservoir à 100 millions de m³

?RunModel_Reservoir
# Calage avec airGRiwrm: Etats initiaux du système

## Exercice

Amender l'objet RunOptions pour définir l'état initial de remplissage du réservoir à 100 millions de m³

?RunModel_Reservoir

RO["DAM"]$IniStates <- c("Reservoir.V" = 100E6)

str(RO$DAM)

#> List of 9

#> $ IndPeriod_WarmUp: int [1:365] 1 2 3 4 5 6 7 8 9 10 ...

#> $ IndPeriod_Run : int [1:3652] 366 367 368 369 370 371 372 373 374 375 ...

#> $ IniStates : Named num 1e+08

#> ..$ attr(*, "names") = chr "Reservoir.V"

#> $ IniResLevels : NULL

#> $ Outputs_Cal : NULL

#> $ Outputs_Sim : chr [1:6] "DatesR" "WarmUpQsim" "StateEnd" "Param" ...

#> $ FortranOutputs :List of 2

#> ..$ GR: NULL

#> ..$ CN: NULL

#> $ FeatFUN_MOD :List of 12

#> ..$ CodeMod : chr "Lag"

#> ..$ NameMod : chr "Lag"

#> ..$ NbParam : num 2

#> ..$ TimeUnit : chr "daily"

#> ..$ Id : logi NA

#> ..$ Class : chr [1:2] "daily" "SD"

#> ..$ Pkg : chr "airGR"

#> ..$ NameFunMod : chr "RunModel_Lag"

#> ..$ TimeStep : num 86400

#> ..$ TimeStepMean: int 86400

#> ..$ CodeModHydro: chr "Lag"

#> ..$ IsSD : logi TRUE

#> $ id : chr "DAM"

#> - attr(*, "class") = chr [1:3] "RunOptions" "daily" "SD"
# Calage avec airGRiwrm: CreateInputsCrit

Définition des critères de calage :

?CreateInputsCrit.GRiwrmInputsModel

Exercice : Créer un critère de calage utilisant :

* un critère KGE2

* calculé à partir de la racine carrée des débits

* une régularisation des paramètres à partir de la station amont ayant le plus grand BV

<figure><img src="image_22.png" /></figure>
# Calage avec airGRiwrm: CreateInputsCrit

Définition des critères de calage :

`?CreateInputsCrit.GRiwrmInputsModel`

Exercice : Créer un critère de calage utilisant :

* un critère KGE2

* calculé à partir de la racine carrée des débits

* une régularisation des paramètres à partir de la station amont ayant le plus grand BV

<figure><img src="image_23.png" /></figure>

```R
IC <- CreateInputsCrit(
  IM,
  FUN_CRIT = airGR::ErrorCrit_KGE2,
  RunOptions = RO,
  Obs = Qobs[I_Run,],
  transfo = "sqrt",
  AprioriIds = c(Y2140020 = "Y2100020", Y2140010 = "Y2140020", Y2300020 = "Y2140010")
)
```
## Calage avec airGRiwrm: CreateInputsCrit

### str(IC)

```r
#> List of 5
```

```r
#> $ Y2100020:List of 8
```

```r
#> ..$ FUN_CRIT:function (InputsCrit, OutputsModel, warnings = TRUE, verbose = TRUE)
```

```r
#> ...- attr(*, "class")= chr [1:2] "FUN_CRIT" "function"
```

```r
#> ..$ Obs : num [1:3652] 0.354 0.329 0.349 0.366 0.357 ...
```

```r
#> ..$ VarObs : chr "Q"
```

```r
#> ..$ BoolCrit: logi [1:3652] TRUE TRUE TRUE TRUE TRUE TRUE ...
```

```r
#> ..$ idLayer : logi NA
```

```r
#> ..$ transfo : chr "sqrt"
```

```r
#> ..$ epsilon : NULL
```

```r
#> ..$ Weights : NULL
```

```r
#> ..- attr(*, "class")= chr [1:2] "Single" "InputsCrit"
```

```r
#> $ Y2210010:List of 8
```

```r
#> ..$ FUN_CRIT:function (InputsCrit, OutputsModel, warnings = TRUE, verbose = TRUE)
```

```r
#> ...- attr(*, "class")= chr [1:2] "FUN_CRIT" "function"
```

```r
#> ..$ Obs : num [1:3652] 0.663 0.655 0.643 0.638 0.629 ...
```

```r
#> ..$ VarObs : chr "Q"
```

```r
#> ..$ BoolCrit: logi [1:3652] TRUE TRUE TRUE TRUE TRUE TRUE ...
```

```r
#> ..$ idLayer : logi NA
```

```r
#> ..$ transfo : chr "sqrt"
```

```r
#> ..$ epsilon : NULL
```

```r
#> ..$ Weights : NULL
```

```r
#> ..- attr(*, "class")= chr [1:2] "Single" "InputsCrit"
```

```r
#> $ Y2140020:List of 8
```

```r
#> ..$ FUN_CRIT:function (InputsCrit, OutputsModel, warnings = TRUE, verbose = TRUE)
```

```r
#> ...- attr(*, "class")= chr [1:2] "FUN_CRIT" "function"
```

```r
#> ..$ Obs : num [1:3652] 0.253 0.246 0.239 0.232 0.239 ...
```

```r
#> ..$ VarObs : chr "Q"
```

```r
#> ..$ BoolCrit: logi [1:3652] TRUE TRUE TRUE TRUE TRUE TRUE ...
```

```r
#> ..$ idLayer : logi NA
```

```r
#> ..$ transfo : chr "sqrt"
```

```r
#> ..$ epsilon : NULL
```

```r
#> ..$ Weights : NULL
```

```r
#> ..- attr(*, "class")= chr [1:3] "InputsCritLavenneFunction" "Single" "InputsCrit"
```

```r
#> ..- attr(*, "Lavenne FUN")=function (AprParamR, AprCrit)
```

```r
#> ..- attr(*, "AprioriId")= Named chr "Y2100020"
```

```r
#> ...- attr(*, "names")= chr "Y2140020"
```

```r
#> ..- attr(*, "AprCelerity")= num 1
```

```r
#> ..- attr(*, "model")=List of 5
```

```r
#> ...$ indexParamUngauged: num [1:5] 1 2 3 4 5
```

```r
#> ...$ hasX4 : logi TRUE
```

```r
#> ...$ iX4 : num 5
```

```r
#> $ Tshyst : logi FALSE
```
Calage avec airGRiwrm: CreateCalibOptions

?CreateInputsCrit.GRiwrmInputsModel
# Calage avec airGRiwrm: CreateCalibOptions

?CreateInputsCrit.GRiwrmInputsModel

## Exercice

Créer l'objet CalibOptions avec les options par défaut
# Calage avec airGRiwrm: CreateCalibOptions

`?CreateInputsCrit.GRiwrmInputsModel`

## Exercice

Créer l'objet CalibOptions avec les options par défaut

```
CO <- CreateCalibOptions(IM)
```

```r
#> Warning in CreateCalibOptions/runModel_Reservoir(IM, FixedParam = FP, ...): The node 'DAM' which uses 'RunModel_Reservoir' must have its parameters fixed.
```

```r
#> You can either fix these parameters afterward by using the command:
```

```r
#> `CalibOptions[[ 'DAM ']]$FixedParam <- c(Vmax, celerity)'
```

```r
#> Or by calling `CreateCalibOptions(InputsModel, FixedParam = list('DAM' = c(Vmax, celerity)))`
```

<figure><img src="image_24.png" /></figure>

<figure><img src="image_25.png" /></figure>
Calage avec airGRiwrm: CreateCalibOptions

?CreateInputsCrit.GRiwrmInputsModel
# Calage avec airGRiwrm: CreateCalibOptions

?CreateInputsCrit.GRiwrmInputsModel

## Exercice

Créer l'objet CalibOptions avec une capacité de stockage du lac de 120 millions de m³
# Calage avec airGRiwrm: CreateCalibOptions

```r
?CreateInputsCrit.GRiwrmInputsModel
```

## Exercice

Créer l'objet CalibOptions avec une capacité de stockage du lac de 120 millions de m³

```r
CO <- CreateCalibOptions(IM, FixedParam = list('DAM' = c(Vmax = 120E6, celerity = 1)))
```
# Calage avec airGRiwrm: CreateCalibOptions

```
?CreateInputsCrit.GRiwrmInputsModel
```

## Exercice

Créer l'objet CalibOptions avec une capacité de stockage du lac de 120 millions de m³

```
CO <- CreateCalibOptions(IM, FixedParam = list('DAM' = c(Vmax = 120E6, celerity = 1)))
```

```
str(CO)
```

```
$ List of 6
```

```
$ Y2100020:List of 4
```

```
$ ..$ FixedParam : logi [1:5] NA NA NA NA NA
```

```
$ ..$ SearchRanges : num [1:2, 1:5] 1.00e-02 2.00e+01 4.59e-05 2.18e+04 -1.09e+04 ...
```

```
$ ..$ FUN_TRANSFO :function (ParamIn, Direction)
```

```
$ ..$ StartParamDistrib: num [1:3, 1:5] 1.25 2.5 5 169.02 247.15 ...
```

```
$ ..- attr(*, "class")= chr [1:5] "CalibOptions" "daily" "GR" "SD" ...
```

```
$ Y2210010:List of 4
```

```
$ ..$ FixedParam : logi [1:5] NA NA NA NA NA
```

```
$ ..$ SearchRanges : num [1:2, 1:5] 1.00e-02 2.00e+01 4.59e-05 2.18e+04 -1.09e+04 ...
```

```
$ ..$ FUN_TRANSFO :function (ParamIn, Direction)
```

```
$ ..$ StartParamDistrib: num [1:3, 1:5] 1.25 2.5 5 169.02 247.15 ...
```

```
$ ..- attr(*, "class")= chr [1:5] "CalibOptions" "daily" "GR" "SD" ...
```

```
$ Y2140020:List of 4
```

```
$ ..$ FixedParam : logi [1:5] NA NA NA NA NA
```

```
$ ..$ SearchRanges : num [1:2, 1:5] 1.00e-02 2.00e+01 4.59e-05 2.18e+04 -1.09e+04 ...
```

```
$ ..$ FUN_TRANSFO :function (ParamIn, Direction)
```

```
$ ..$ StartParamDistrib: num [1:3, 1:5] 1.25 2.5 5 169.02 247.15 ...
```

```
$ ..- attr(*, "class")= chr [1:5] "CalibOptions" "daily" "GR" "SD" ...
```

```
$ Y2140010:List of 4
```

```
$ ..$ FixedParam : logi [1:5] NA NA NA NA NA
```

```
$ ..$ SearchRanges : num [1:2, 1:5] 1.00e-02 2.00e+01 4.59e-05 2.18e+04 -1.09e+04 ...
```

```
$ ..$ FUN_TRANSFO :function (ParamIn, Direction)
```

```
$ ..$ StartParamDistrib: num [1:3, 1:5] 1.25 2.5 5 169.02 247.15 ...
```

```
$ ..- attr(*, "class")= chr [1:5] "CalibOptions" "daily" "GR" "SD" ...
```

```
$ DAM :List of 4
```

```
$ ..$ FixedParam : Named num [1:2] 1.2e+08 1.0
```

```
$ ..- attr(*, "names")= chr [1:2] "Vmax" "celerity"
```

```
$ ..$ SearchRanges : num [1:2, 1] 0.01 19.99
```

```
$ ..$ FUN_TRANSFO :function (ParamIn, Direction)
```

```
$ ..$ StartParamDistrib: num [1:2, 1] 0.01 19.99
```

```
$ ..- attr(*, "class")= chr [1:3] "CalibOptions" "SD" "HBAN"
```
# Calibration dans airGRiwrm: Calibration

airGRiwrm opère un calage séquentiel amont-aval des modèles hydrologiques des sous-bassins.

?Calibration.GRiwrmInputsModel

## Exercice

Lancer la calibration du modèle avec les inputs (InputsModel), les options de simulations (RunOptions), les critères de calage (InputsCrit) et les options de calage (CalibOptions)
# Calibration dans airGRiwrm: Calibration

airGRiwrm opère un calage séquentiel amont-aval des modèles hydrologiques des sous-bassins.

`?Calibration.GRiwrmInputsModel`

## Exercice

Lancer la calibration du modèle avec les inputs (InputsModel), les options de simulations (RunOptions), les critères de calage (InputsCrit) et les options de calage (CalibOptions)

```
OC <- suppressWarnings(Calibration(
  IM,
  RunOptions = RO,
  InputsCrit = IC,
  CalibOptions = CO
))
```

```
#> Calibration.GRiwrmInputsModel: Processing sub-basin 'Y2100020'...
```

```
#> Grid-Screening in progress (0% 20% 40% 60% 80% 100%)
```

```
#> Screening completed (243 runs)
```

```
#> Param = 1.250, 432.681, -0.649, 83.096, 1.417
```

```
#> Crit. KGE2[sqrt(Q)] = 0.7833
```

```
#> Steepest-descent local search in progress
```

```
#> Calibration completed (23 iterations, 450 runs)
```

```
#> Param = 1.250, 561.157, -1.820, 85.627, 1.398
```

```
#> Crit. KGE2[sqrt(Q)] = 0.7954
```

```
#> Calibration.GRiwrmInputsModel: Processing sub-basin 'Y2210010'...
```

```
#> Grid-Screening in progress (0% 20% 40% 60% 80% 100%)
```

```
#> Screening completed (243 runs)
```

```
#> Param = 1.250, 432.681, -0.020, 83.096, 1.417
```

```
#> Crit. KGE2[sqrt(Q)] = 0.7244
```

```
#> Steepest-descent local search in progress
```

```
#> Calibration completed (16 iterations, 386 runs)
```

```
#> Param = 1.250, 812.406, -0.080, 98.494, 1.408
```

```
#> Crit. KGE2[sqrt(Q)] = 0.8489
```

```
#> Calibration.GRiwrmInputsModel: Processing sub-basin 'Y2140020'...
```

```
#> Parameter regularization: get a priori parameters from node Y2100020: 1.25, 561.157, -1.82, 85.627, 1.018
```

```
#> Crit. KGE2[sqrt(Q)] = 0.7954
```

```
#> SubCrit. KGE2[sqrt(Q)] cor(sim, obs, "pearson") = 0.7954
```

```
#> SubCrit. KGE2[sqrt(Q)] cv(sim)/cv(obs) = 0.9987
```

```
#> SubCrit. KGE2[sqrt(Q)] mean(sim)/mean(obs) = 0.9987
```

```
#> Grid-Screening in progress (0% 20% 40% 60% 80% 100%)
```
Calibration dans airGRiwrm: Calibration

str(OC)
#> List of 7
#> $ Y2100020:List of 9
#> ..$ ParamFinalR : num [1:5] 1.25 561.16 -1.82 85.63 1.4
#> ..$ CritFinal : num 0.795
#> ..$ NIter : num 23
#> ..$ NRuns : num 450
#> ..$ HistParamR : num [1:23, 1:5] 1.25 1.25 1.25 1.25 1.25 1.25 1.25 1.25 1.25 1.25 ...
#> ...- attr(*, "dimnames")=List of 2
#> ... ...$ : NULL
#> ... ...$ : chr [1:5] "Param1" "Param2" "Param3" "Param4" ...
#> ..$ HistCrit : num [1:23, 1] 0.783 0.783 0.785 0.789 0.794 ...
#> ..$ MatBoolCrit : logi [1:3652, 1:2] TRUE TRUE TRUE TRUE TRUE TRUE ...
#> ...- attr(*, "dimnames")=List of 2
#> ... ...$ : NULL
#> ... ...$ : chr [1:2] "BoolCrit_Requested" "BoolCrit_Actual"
#> ..$ CritName : chr "KGE2[sqrt(Q)]"
#> ..$ CritBestValue: num 1
#> ...- attr(*, "class")= chr [1:2] "OutputsCalib" "HBAN"
#> $ Y2210010:List of 9
#> ..$ ParamFinalR : num [1:5] 1.25 812.4058 -0.0801 98.4944 1.4077
#> ..$ CritFinal : num 0.849
#> ..$ NIter : num 16
#> ..$ NRuns : num 386
#> ..$ HistParamR : num [1:16, 1:5] 1.25 1.25 1.25 1.25 1.25 1.25 1.25 1.25 1.25 1.25 ...
#> ...- attr(*, "dimnames")=List of 2
#> ... ...$ : NULL
#> ... ...$ : chr [1:5] "Param1" "Param2" "Param3" "Param4" ...
#> ..$ HistCrit : num [1:16, 1] 0.724 0.847 0.847 0.847 0.849 ...
#> ..$ MatBoolCrit : logi [1:3652, 1:2] TRUE TRUE TRUE TRUE TRUE TRUE ...
#> ...- attr(*, "dimnames")=List of 2
#> ... ...$ : NULL
#> ... ...$ : chr [1:2] "BoolCrit_Requested" "BoolCrit_Actual"
#> ..$ CritName : chr "KGE2[sqrt(Q)]"
#> ..$ CritBestValue: num 1
#> ...- attr(*, "class")= chr [1:2] "OutputsCalib" "HBAN"
#> $ Y2140020:List of 9
#> ..$ ParamFinalR : num [1:5] 1.72 99.48 -1.42 68.03 1.48
#> ..$ CritFinal : num 0.83
#> ..$ NIter : num 28
#> ..$ NRuns : num 502
#> ..$ HistParamR : num [1:28, 1:5] 1.25 1.89 1.89 1.89 1.89 1.89 1.89 1.73 1.73 1.73 ...
#> ...- attr(*, "dimnames")=List of 2
#> ... ...$ : NULL
?extractParam

Exercice

Récupérer les paramètres de calage avec extractParam et lancer le modèle avec les inputs et les options de simulation
?extractParam

Exercice

Récupérer les paramètres de calage avec extractParam et lancer le modèle avec les inputs et les options de simulation

Params <- extractParam(OC)
str(Params)
#> List of 7
#> $ Y2100020: num [1:5] 1.25 561.16 -1.82 85.63 1.4
#> $ Y2210010: num [1:5] 1.25 812.4058 -0.0801 98.4944 1.4077
#> $ Y2140020: num [1:5] 1.72 99.48 -1.42 68.03 1.48
#> $ Y2230010: num [1:5] 1.25 812.4058 -0.0801 98.4944 1.0956
#> $ Y2140010: num [1:5] 1.73 98.49 -1.4 68.72 1.26
#> $ DAM      : Named num [1:2] 1.2e+08 1.0
#> ..- attr(*, "names")= chr [1:2] "Vmax" "celerity"
#> $ Y2300020: num [1:5] 1.73 98.49 -1.4 68.72 1.45
?RunModel.GRiwrmInputsModel

Exercice

Lancer le modèle avec les inputs, les paramètres et les options de simulation
?RunModel.GRiwrmInputsModel

Exercice

Lancer le modèle avec les inputs, les paramètres et les options de simulation

```
OM <- RunModel(IM,
               RunOptions = RO,
               Param = Params)

#> RunModel.GRiwrmInputsModel: Processing sub-basin Y2100020...
#> RunModel.GRiwrmInputsModel: Processing sub-basin Y2210010...
#> RunModel.GRiwrmInputsModel: Processing sub-basin Y2140020...
#> RunModel.GRiwrmInputsModel: Processing sub-basin Y2230010...
#> RunModel.GRiwrmInputsModel: Processing sub-basin Y2140010...
#> Warning in RunModel_Lag(InputsModel, RunOptions, Param[1], OutputsModel): 44
#> time steps with negative flow, set to zero.
#> RunModel.GRiwrmInputsModel: Processing sub-basin DAM...
#> RunModel.GRiwrmInputsModel: Processing sub-basin Y2300020...
```
# Visualisation des données de simulation

```r
?plot.GRiwrmOutputsModel
```

**Exercice :** Afficher les plots d'analyse de *airGR* avec les débits simulés/observés
# Visualisation des données de simulation

`?plot.GRiwrmOutputsModel`

Exercice : Afficher les plots d'analyse de *airGR* avec les débits simulés/observés

`plot(OM, Qobs[I_RUN,])`

<figure><img src="image_26.png" /></figure>

<figure><img src="image_27.png" /></figure>
# Visualisation des données de simulation

Le plot des débits simulés sur tous les noeuds du modèle en m³/s

**Exercice : Afficher tous les débits simulés pour la première année de simulation**

?plot.Qm3s
# Visualisation des données de simulation

Le plot des débits simulés sur tous les noeuds du modèle en m³/s

?plot.Qm3s

**Exercice : Afficher tous les débits simulés pour la première année de simulation**

```
Qm3s <- attr(OM, "Qm3s")
plot(Qm3s[1:365,])
```

<figure><img src="image_28.png" /></figure>
# Visualisation des données de simulation

Le plot des débits simulés sur tous les noeuds du modèle en m³/s

**Exercice : Afficher tous les débits simulés pour la première année de simulation**

```
TSstudio::ts_plot(Qm3s)
```

<figure><img src="image_29.png" /></figure>
# Modélisation d'un soutien d'étiage du réservoir du Salagou

<figure><img src="image_30.png" /></figure>
# Modélisation d'un soutien d'étiage du réservoir du Salagou

L'objectif est ici de modéliser une gestion automatique du réservoir qui consiste à :

* contrôler si le débit coulant dans l'Hérault à Aspiran (Y2300020) est inférieur au débit objectif d'étiage (DOE) de 2.5 m³/s

* Ajouter le débit manquant au débit déjà lâché par le réservoir pour arriver au DOE de 2.5 m³/s

* Hors période de soutien d'étiage le débit lâché est de 500 L/s en continu hormis entre juin et septembre où il est de 340 L/s en moyenne (source: PGRE de l'Hérault)
# Modélisation d'un soutien d'étiage du réservoir du Salagou

## Création du superviseur

Le superviseur est un ordonnanceur de la simulation qui va :

* stopper la simulation tous les *n* pas de temps

* lancer un ou plusieurs contrôleurs qui vont :

* récupérer des données simulées (mesures) aux pas de temps précédents

* calculer des commandes (ex: prélèvement, lâcher de réservoir...) à partir d'une fonction dite de logique de contrôle

* appliquer les commandes calculées pour les prochains pas de temps de simulation

?CreateSupervisor

## Exercice

Créer un superviseur avec un pas de temps de décision de 1 jour
# Modélisation d'un soutien d'étiage du réservoir du Salagou

## Création du superviseur

Le superviseur est un ordonnanceur de la simulation qui va :

* stopper la simulation tous les *n* pas de temps

* lancer un ou plusieurs contrôleurs qui vont :

* récupérer des données simulées (mesures) aux pas de temps précédents

* calculer des commandes (ex: prélèvement, lâcher de réservoir...) à partir d'une fonction dite de logique de contrôle

* appliquer les commandes calculées pour les prochains pas de temps de simulation

```
?CreateSupervisor
```

## Exercice

Créer un superviseur avec un pas de temps de décision de 1 jour

```
sv <- CreateSupervisor(IM, TimeStep = 1L)
```
# La fonction de logique de contrôle

Elle prend en entrée, les mesures (Y) qui seront effectuées durant la simulation. Dans notre cas, la mesure principale correspondra au débit simulé à Aspiran.

Dans le cas où un soutien d'étiage est nécessaire, il faut savoir quelle part du débit à Aspiran est déjà soutenu par le barrage. Le débit simulé au niveau du barrage sera nécessaire pour naturaliser le débit à Aspiran et ainsi savoir combien ajouter pour le soutien.

Le débit réservé est de 2.5 m³/s et il faut soutenir l'étiage à Aspiran de façon à avoir un débit minimum de 2.5 m³/s. Le débit à lâcher peut être calculé comme suit.

```R
#' Fonction de logique pour un DOE de 2.5 m3/s à Aspiran
#' @param Y [numeric] avec:
#' - Y[1]: le débit simulé à Aspiran (m3/j)
#' - Y[2]: le débit simulé au barrage (m3/j)
#' @return Le débit à lâcher au barrage (m3/j)
logicFun <- function(Y) {
  Qnat <- Y[1] - Y[2] # Débit naturel à Aspiran sans soutien (m3/j)
  U <- 0 # Commençons avec un soutien nul
  # Le soutien pour 2.5 m3/s à Aspiran
  if (Qnat < 2.5 * 86400) U <- 2.5 * 86400 - Qnat
  # Respectons le débit minimum lâcher 500 L/s toute l'année
  if (U < 0.5 * 86400) U <- 0.5 * 86400
  return(U)
}
```
# Création du contrôleur

```perl
?CreateController
```

Le contrôleur est ajouté au superviseur et doit définir:

* Son nom

* La localisation des mesures Y

* La localisation des commandes U

* La fonction de logique de contrôle utilisée FUN

## Exercice

Créer le contrôleur de soutien d'étiage
# Création du contrôleur

```php
?CreateController
```

Le contrôleur est ajouté au superviseur et doit définir:

* Son nom

* La localisation des mesures Y

* La localisation des commandes U

* La fonction de logique de contrôle utilisée FUN

## Exercice

Créer le contrôleur de soutien d'étiage

```php
CreateController(sv, "DOE",
    Y = c("Y2300020", "DAM"),
    U = "DAM", FUN = logicFun)
```

#> The controller 'DOE' has been added to the supervisor
# Simulation avec superviseur

?RunModel.Supervisor

## Exercice

Lancer la simulation supervisée :)
# Simulation avec superviseur

`?RunModel.Supervisor`

## Exercice

Lancer la simulation supervisée :)

```
OM_doe <- RunModel(sv,
                   RunOptions = RO,
                   Param = Params)

#> Processing: 0% 10% 20% 30% 40% 50% 60% 70% 80% 90% 100%
```
Visualisation du résultat au barrage

plot(OM_doe$DAM)

<figure><img src="image_31.png" /></figure>

<figure><img src="image_32.png" /></figure>
# Visualisation du résultat à Rémouillé

## Traçons la chronique des débits simulés

```
Qm3s <- attr(OM_doe, "Qm3s")
TSstudio::ts_plot(Qm3s[, c("DatesR", "DAM", "Y2300020")])
```

<figure><img src="image_33.png" /></figure>
# Merci pour votre attention

airGRiwrm: 'airGR' Integrated Water Resource Management

Documentation: https://airgriwrm.g-eau.fr

Contact: David Dorchies (david.dorchies@inrae.fr)
<figure><img src="image_34.png" /></figure>