Skip to content
Snippets Groups Projects
Commit 59088c13 authored by David Dorchies's avatar David Dorchies
Browse files

feat: finalisation

Refs #3
parent 93152d93
No related branches found
No related tags found
1 merge request!2Resolve "Training session for the Territorial Hydrology Workgroup"
......@@ -57,14 +57,14 @@ xaringanExtra::use_logo(
# Programme de la formation
- Accueil des participants (10 mn)
- Introduction au modèle semi-distribué (5 mn)
- Présentation du package **airGRiwrm** (10 mn)
- Présentation du package **airGRiwrm** (15 mn)
- Installation du package **airGRiwrm** (5 mn)
- Présentation du jeu de données de la formation (15 mn)
- Créer un réseau semi-distribué avec **airGRiwrm** (15 mn)
- Présentation du jeu de données de la formation (20 mn)
- Créer un réseau semi-distribué avec **airGRiwrm** (20 mn)
- Calage d'un réseau semi-distribué de modèles hydrologiques (60 mn)
- Modélisation du barrage de la Bultière (30 mn)
- Régulation du barrage de la Bultière (30 mn)
- Régulation du barrage du Salagou (30 mn)
## Pré-requis
......@@ -90,7 +90,7 @@ class: inverse, middle, center
.pull-left[
- 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 global (GR...)
- 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"
......@@ -177,15 +177,23 @@ d'un réseau semi-distribué:
detach("package:airGRiwrm")
```
```{r}
```{r, message=TRUE, warning=TRUE}
library(airGRiwrm)
```
Les fonctions originales de **airGR** restent accessibles (Redirection avec [les classes S3](http://www.duclert.org/r-divers/classes-S3-R.php)).
```r
Loading required package: airGR
Attaching package: ‘airGRiwrm’
The following objects are masked from
‘package:airGR’:
Calibration, CreateCalibOptions,
CreateInputsCrit, CreateInputsModel,
CreateRunOptions, RunModel
```
## Procédure de calage d'un réseau avec *airGRiwrm*
Les fonctions originales de **airGR** restent accessibles.
Par rapport à *airGR*, on ajoute une étape préalable de description du
Par rapport à **airGR**, on ajoute une étape préalable de description du
réseau : avec la fonction `CreateGRiwrm`
]
......@@ -231,8 +239,8 @@ plot(diagram)
## Version officielle diffusée sur le CRAN *(v0.7.0)*
- Extension des fonctionnalités de *airGR* sur un réseau semi-distribué
via [la description d'un réseau de "noeuds"](https://inrae.github.io/airGRiwrm/reference/CreateGRiwrm.html)
- Extension de *airGR* sur un réseau semi-distribué via
[la description d'un réseau de "noeuds"](https://inrae.github.io/airGRiwrm/reference/CreateGRiwrm.html)
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)
......@@ -298,7 +306,7 @@ load("data/sf_reaches.rda")
```
```{r map-BV, echo=FALSE, message=FALSE, out.width="100%", fig.asp=0.45}
```{r map-BV, echo=FALSE, message=FALSE, out.width="100%", fig.asp=0.4}
library(tmap)
tmap_mode("view")
tm <-
......@@ -316,17 +324,23 @@ tm
# Synoptique de la représentation du réseau
.pull-left[
```{r situation-map2, out.width="100%"}
```{r situation-map2, out.width="95%", echo=FALSE, fig.asp=0.45}
tm
```
]
--
Exercice: *Quel est l'ordre d'écoulement des différents objets du bassin ?*
.pull-right[
```{r network-basic-synoptic}
```{r network-basic-synoptic, echo=FALSE, out.width="100%"}
load("herault.RData")
reseau_herault$model <- "RunModel_GR4J"
reseau_herault$model[reseau_herault$id == "DAM"] <- "RunModel_Reservoir"
g <- airGRiwrm::CreateGRiwrm(reseau_herault, list(area = "tot_area"))
plot(g)
r <- reseau_herault
r$model <- "RunModel_GR4J"
r$model[r$id == "DAM"] <- "RunModel_Reservoir"
g <- airGRiwrm::CreateGRiwrm(r, list(area = "tot_area"))
plot(g, orientation="TD")
```
]
......@@ -354,8 +368,9 @@ load("herault.RData")
ls()
```
N.B.: Les codes qui ont générés 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/
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:<br/>
**https://airgriwrm.pages.mia.inra.fr/airgrccia/articles/**
---
......@@ -363,11 +378,11 @@ publiques sont disponibles à l'URL: https://airgriwrm.pages.mia.inra.fr/airgrcc
## Description des données fournies
```{r ls-data, warning=FALSE, echo=FALSE}
```{r ls-data}
ls()
```
- `reseau_herault`` (*data.frame*): Description des noeuds du réseau hydrographique
- `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
......@@ -378,44 +393,72 @@ ls()
Exercice: *Afficher le tableau décrivant le réseau de stations*
--
```{r ex-reseau, eval=F, echo=Sys.getenv("FORMATION_HIDE_SOLUTIONS")==""}
reseau_herault
```
.left-column[
```{r network-basic-synoptic2, echo=FALSE, out.width="100%"}
load("herault.RData")
r <- reseau_herault
r$model <- "RunModel_GR4J"
r$model[r$id == "DAM"] <- "RunModel_Reservoir"
g <- airGRiwrm::CreateGRiwrm(r, list(area = "tot_area"))
plot(g, orientation="TD")
```
]
--
.right-column[
```{r kable-reseau, echo=FALSE}
knitr::kable(reseau_herault[, c("id", "down", "length", "tot_area", "libelle_site")])
```
]
---
# 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)
```
## 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
```{r, echo=Sys.getenv("FORMATION_HIDE_SOLUTIONS")==""}
id_WD <- names(Qinf)
id_bvi_down <- sub("_WD", "", names(Qinf))
reseau_herault <- rbind(
reseau_herault,
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_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)
```
......@@ -467,7 +510,7 @@ summary(Qinf, echo=Sys.getenv("FORMATION_HIDE_SOLUTIONS")=="")
# Cas d'étude: description des chroniques de prélèvement
```{r str.plot.Qinf, echo=Sys.getenv("FORMATION_HIDE_SOLUTIONS")==""}
```{r str.plot.Qinf, echo=Sys.getenv("FORMATION_HIDE_SOLUTIONS")=="", out.width="100%", fig.asp=0.36}
TSstudio::ts_plot(cbind(DatesR, Qinf))
```
......@@ -481,7 +524,7 @@ TSstudio::ts_plot(cbind(DatesR, Qinf))
--
```{r plot-Qrelease, fig.asp=0.5, echo=Sys.getenv("FORMATION_HIDE_SOLUTIONS")==""}
```{r plot-Qrelease, fig.asp=0.5, echo=Sys.getenv("FORMATION_HIDE_SOLUTIONS")=="", out.width="100%", fig.asp=0.3}
TSstudio::ts_plot(cbind(DatesR, Qrelease))
```
......@@ -495,7 +538,7 @@ TSstudio::ts_plot(cbind(DatesR, Qrelease))
--
```{r plot-Qobs, fig.asp=0.5, echo=Sys.getenv("FORMATION_HIDE_SOLUTIONS")==""}
```{r plot-Qobs, fig.asp=0.5, echo=Sys.getenv("FORMATION_HIDE_SOLUTIONS")=="", out.width="100%", fig.asp=0.3}
TSstudio::ts_plot(cbind(DatesR, Qobs))
```
......@@ -510,7 +553,8 @@ Il n'y a pas de débits observés pour un des bassins versants intermédiaires :
setdiff(names(Precip), names(Qobs))
```
Ce sera un bassin non jaugé pour lequel il faudra transmettre les paramètres d'un bassin ayant des caractéristiques voisines.
Ce sera un bassin non jaugé pour lequel il faudra transmettre les paramètres d'un
bassin ayant des caractéristiques voisines.
N.B.&nbsp;: 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
......@@ -569,11 +613,22 @@ 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.
.left-column[
```{r network-basic-synoptic3, echo=FALSE, out.width="100%"}
plot(g, orientation="TD")
```
]
--
.right-column[
```{r}
reseau_herault$donor <- as.character(NA)
reseau_herault$donor[reseau_herault$id == "Y2230010"] <- "Y2210010"
```
]
---
......@@ -605,13 +660,22 @@ La fonction `plot.GRiwrm` permet de tracer une représentation schématique du r
?plot.GRiwrm
```
Exercice: *afficher le schéma du réseau en mode "top-bottom"*
Exercice: *afficher le schéma du réseau*
--
```{r plot.GRiwrm, out.width="100%", echo=Sys.getenv("FORMATION_HIDE_SOLUTIONS")==""}
plot(griwrm, orientation = "LR")
.pull-left[
```{r plot.GRiwrm, out.width="60%", echo=Sys.getenv("FORMATION_HIDE_SOLUTIONS")=="", eval=FALSE}
plot(griwrm, orientation = "TB")
```
]
.pull-right[
```{r plot.GRiwrm2, out.width="100%", echo=FALSE}
plot(griwrm, orientation = "TB")
```
]
---
class: inverse, middle, center
......@@ -714,7 +778,8 @@ str(RO)
## Exercice
*Amender l'objet `RunOptions` pour définir l'état initial de remplissage du réservoir*
*Amender l'objet `RunOptions` pour définir l'état initial de remplissage du
réservoir à 100 millions de m<sup>3</sup>*
```{r, eval = FALSE}
?RunModel_Reservoir
......@@ -735,6 +800,8 @@ str(RO$DAM)
# Calage avec *airGRiwrm*: `CreateInputsCrit`
.pull-left[
Définition des critères de calage&nbsp;:
......@@ -742,10 +809,19 @@ Définition des critères de calage&nbsp;:
?CreateInputsCrit.GRiwrmInputsModel
```
## Exercice
**Exercice :** *Créer un critère de calage utilisant:*
*Créer un critère de calage utilisant les débit observées au stations hydrométriques,
un critère **KGE2** et une transformation "Racine carrée" des débits*
- *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*
]
.pull-right[
```{r network-basic-synoptic4, echo=FALSE, out.width="100%"}
plot(g, orientation="TD")
```
]
--
......@@ -755,11 +831,14 @@ IC <- CreateInputsCrit(
FUN_CRIT = airGR::ErrorCrit_KGE2,
RunOptions = RO,
Obs = Qobs[I_Run,],
transfo = "sqrt"
transfo = "sqrt",
AprioriIds = c(Y2140020 = "Y2100020", Y2140010 = "Y2140020", Y2300020 = "Y2140010")
)
```
--
---
# Calage avec *airGRiwrm*: `CreateInputsCrit`
```{r str.IC, echo=Sys.getenv("FORMATION_HIDE_SOLUTIONS")==""}
str(IC)
......@@ -799,12 +878,12 @@ CO <- CreateCalibOptions(IM)
## Exercice
*Créer l'objet `CalibOptions` avec les options par défaut*
*Créer l'objet `CalibOptions` avec une capacité de stockage du lac de 120 millions de m<sup>3</sup>*
--
```{r CO-FixedParam-DAM, echo=Sys.getenv("FORMATION_HIDE_SOLUTIONS")==""}
CO <- CreateCalibOptions(IM, FixedParam = list('DAM' = c(Vmax = 102.2E6, celerity = 1)))
CO <- CreateCalibOptions(IM, FixedParam = list('DAM' = c(Vmax = 120E6, celerity = 1)))
```
--
......@@ -854,21 +933,32 @@ str(OC)
# `RunModel` dans *airGRiwrm*
```r
?RunModel.GRiwrmInputsModel
?extractParam
```
## Exercice
Récupérer les paramètres de calage et lancer le modèle avec les inputs et les
Récupérer les paramètres de calage avec `extractParam` et lancer le modèle avec les inputs et les
options de simulation
--
```{r Params.OC, echo=Sys.getenv("FORMATION_HIDE_SOLUTIONS")==""}
Params <- lapply(OC, "[[", "ParamFinalR")
Params <- extractParam(OC)
str(Params)
```
---
# `RunModel` dans *airGRiwrm*
```r
?RunModel.GRiwrmInputsModel
```
## Exercice
Lancer le modèle avec les inputs, les paramètres et les options de simulation
--
```{r OM, echo=Sys.getenv("FORMATION_HIDE_SOLUTIONS")==""}
......@@ -885,9 +975,7 @@ OM <- RunModel(IM,
?plot.GRiwrmOutputsModel
```
## Exercice
Afficher les plots d'analyse de **airGR** avec les débits simulés/observés
**Exercice :** *Afficher les plots d'analyse de **airGR** avec les débits simulés/observés*
--
......@@ -899,35 +987,36 @@ plot(OM, Qobs[I_Run,])
# Visualisation des données de simulation
Le plot des débits simulés sur tous les noeuds du modèle en m3/s
.pull-left[
Le plot des débits simulés sur tous les noeuds du modèle en m<sup>3</sup>/s
]
.pull-right[
```r
?plot.Qm3s
```
]
## Exercice
Afficher tous les débits simulés pour la première année de simulation
.pull_left[
**Exercice :** *Afficher tous les débits simulés pour la première année de simulation*
--
```{r plot.Qm3s, echo=Sys.getenv("FORMATION_HIDE_SOLUTIONS")==""}
```{r plot.Qm3s, echo=Sys.getenv("FORMATION_HIDE_SOLUTIONS")=="", out.width="100%", fig.asp=0.37}
Qm3s <- attr(OM, "Qm3s")
plot(Qm3s)
plot(Qm3s[1:365,])
```
]
--
---
.pull_right[
```{r}
# Visualisation des données de simulation
Le plot des débits simulés sur tous les noeuds du modèle en m<sup>3</sup>/s
**Exercice :** *Afficher tous les débits simulés pour la première année de simulation*
```{r, out.width="100%", fig.asp=0.32}
TSstudio::ts_plot(Qm3s)
```
]
---
class: inverse, middle, center
......@@ -950,6 +1039,10 @@ DOE de 2.5 m<sup>3</sup>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 :
......@@ -992,7 +1085,7 @@ Aspiran de façon à avoir un débit minimum de 2.5&nbsp;m<sup>3</sup>s. Le déb
```{r, logicFun}
#' Fonction de logique pour un DOE de 2.5 m3/s à Aspiran
#' @param Y [numeric] avec:
#' - Y[1]: le débit simulé à Rémouillé (m3/j)
#' - 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) {
......@@ -1067,7 +1160,7 @@ plot(OM_doe$DAM)
*Traçons la chronique des débits simulés*
```{r plotFlowsRemouille, out.width="100%", fig.asp=0.3, fig.width=10}
```{r plotFlowsRemouille, out.width="100%", fig.asp=0.28, fig.width=10}
Qm3s <- attr(OM_doe, "Qm3s")
TSstudio::ts_plot(Qm3s[, c("DatesR", "DAM", "Y2300020")])
```
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment