Integration of reservoirs as nodes in the network
Following #51 (closed) which allows to integrate a time series of a released flow in the middle of the network, the idea here is to be able to model the volume of a reservoir in a GRiwrm node with a given release time series. This release time series can be provided for the simulation (open-loop / feed-forward control) or calculated by a controller in a supervision (closed-loop / feedback control).
For the moment, the only available way to simulate a reservoir is to handle it manually through a supervisor and at least one controller. With this solution, only the management rules (release) would be handled manually.
Modelled processes
What about having a dedicated RunModel
function which would model the following processes:
graph TD
R([fa:fa-water Reservoir])
P(fa:fa-cloud-rain Precip) -- + --> R
U[fa:fa-bacon Qupstream] -- + --> R
R -- - --> E(fa:fa-sun PotEvap)
R -- Release --> D[fa:fa-bacon River downstream]
The main process to model is the mass conservation in the reservoir:
V(t) = V(t-\Delta t) + \sum Q_{upstream}(t) - Q_{release}(t) + Q_P(t) - Q_{PE}(t)
Implementation of RunModel_Reservoir
Integration of precipitation and evaporation can be optional if necessary data are not available.
The provided InputsModel
would contain Precip
and PotEvap
and the release would be provided in the argument Qobs
of CreateInputsModel.GRiwrm
like for a direct injection node.
OutputsModel
would contain Qsim
the release time series and Vsim
the simulated volume.
V would be a state variable in the model and an initial value must be handled and can be treated like a reservoir state in a GR model (With Vini = 0 by default).
Further variables are necessary to handle this calculation:
- The relationship between the water area and the volume for the calculation of the volume lost by evaporation
- The useful capacity of the reservoir (can be the maximum volume in 1. by default)
- The direct run-off area for the volume gained by precipitation (can be the maximum water area in 1. by default)
The useful capacity could be a parameter of the model which could be calibrated...
In case of overflow of the reservoir, this overflow can be added to the release flow provided by the user. This overflow can also be attenuated in order to simulate the release over a spillway using a free weir equation and with some assumptions on the water height over the spillway.
Implementation in the GRiwrm network
An inline reservoir would be integrate as follow in the network:
graph LR
CHAUM_07 --> |0km| PANNEC_R
PANNEC_R --> |153km| GURGY_02
style PANNEC_R fill:#9ed6e3
For a reservoir behind a derivation, the situation is more challenging and can be done using a Diversion:
graph LR
BAR-S_06 -->|6km| SEINE_P7
SEINE_P7 -->|32km| SEINE_R8
SEINE_P7 --> SEINE(SEINE)
SEINE--> SEINE_R8
SEINE_R8 -->|41.7km| MERY-_22
style SEINE_P7 fill:#afa, stroke:#faa, stroke-width:3px
style SEINE_R8 fill:#afa
style SEINE fill:#9de
style MERY-_22 fill:#afa
style BAR-S_06 fill:#eef
linkStyle 2 stroke:#faa, stroke-width:2px,stroke-dasharray: 5 5;
graph LR
LOUVE_19 -->|0.5km| MARNE_P28
MARNE_P23 -->|3km| STDIZ_04
MARNE_P23 --> M(MARNE)
MARNE_P28 --> M
MARNE_P28 -->|25.6km| MARNE_R25
M --> MARNE_R25
STDIZ_04 -->|28.7km| MARNE_R25
MARNE_R25 -->|56.9km| CHALO_21
style MARNE_P28 fill:#afa, stroke:#faa, stroke-width:3px
style MARNE_P23 fill:#eef, stroke:#faa, stroke-width:3px
style MARNE_R25 fill:#afa
style STDIZ_04 fill:#afa
style CHALO_21 fill:#afa
style M fill:#9de
linkStyle 2 stroke:#faa, stroke-width:2px,stroke-dasharray: 5 5;
linkStyle 3 stroke:#faa, stroke-width:2px,stroke-dasharray: 5 5;