Hydro reservoir node
Introduced type and its field
The HydroReservoir
nodes represents a water storage in a hydropower system. In its simplest form, the HydroGenerator
and HydroPump
can convert potential energy between HydroReservoir
nodes at different head levels to electricity, under the assumption that the reservoirs have constant head levels. In these cases, the HydroReservoir
node does not require a description of the relation between volume level and head level. For more detailed modelling, this relation is required to account for the increased power output when the head level difference between reservoirs increase. Head-dependencies are currently not implemented.
The HydroReservoir
nodes do not include a spillage variable. To avoid infeasible solutions, all reservoir nodes should be connected to a HydroGate
node representing a water way for spillage in case of full reservoirs.
Standard fields
The HydroReservoir
nodes builds on the RefStorage
node type. The tandard fields are given as:
id
:
The fieldid
is only used for providing a name to the node. This is similar to the approach utilized inEnergyModelsBase
.vol::EMB.UnionCapacity
:
The installed volume corresponds to the total water volume storage capacity of the reservoir. It is equivalent to the fieldlevel
in aRefStorage
node.Change of name The storage field level is renamed as a hydro reservoir is described by both the level (the height of the water column in the reservoir) and the storage volume (the volume of water stored). This results in consistency in terminology with existing hydro power models.
stor_res::ResourceCarrier
:
The resource that is stored in the reservoir. This must be the reserource representing water. The resource must consistent for all components in the watercourse.data::Vector{Data}
:
An entry for providing additional data to the model.Additional constraints The
data
field can be used to add minimum, maximum, and schedule constraints on the storage volume using the general constraints types.
Additional fields
HydroReservoir
nodes add a single additional field compared to a RefStorage
, and does not include the charge
field since charge/discharge capacity is given through the HydroGenerator
, HydroPump
, and HydroGate
:
vol_inflow::TimeProfile
:
The water inflow rate to the reservoir. The inflow is representing the potential water flowing into the reservoir in each operational period. It is depending on rivers flowing into the reservoir or rainfall. It can be provided asOperationalProfile
.
Mathematical description
The mathematical description is similar to the RefStorage
nodes except that the inflow is added to the storage balance.
Variables
Standard variables
HydroReservoir
nodes utilize all standard variables from RefStorage
, as described on the page Optimization variables.
- $\texttt{opex\_var}$
- $\texttt{opex\_fixed}$
- $\texttt{stor\_level}$
- $\texttt{stor\_level\_inst}$
- $\texttt{stor\_charge\_use}$
- $\texttt{stor\_discharge\_use}$
- $\texttt{flow\_in}$
- $\texttt{flow\_out}$
- $\texttt{stor\_level\_Δ\_op}$
- $\texttt{stor\_level\_Δ\_rp}$ if the
TimeStruct
includesRepresentativePeriods
It will however not use the vaeriables $\texttt{stor\_charge\_inst}$ and $\texttt{stor\_discharge\_inst}$ as the charge and discharge capacities are handled by the connected HydroGenerator
, HydroPump
, and HydroGate
.
Additional variables
HydroReservoir
nodes add additional variables if required by the additional constraints:
- $\texttt{rsv\_vol\_penalty\_up}[n, t]$: Variable for penalizing violation of the volume constraint in direction up in
HydroReservoir
node $n$ in operational period $t$ with a typical unit of $Mm^3$.
Up implies in this case that the reservoir volume is larger than planned. - $\texttt{rsv\_vol\_penalty\_down}[n, t]$: Variable for penalizing violation of the volume constraint in direction down in
HydroReservoir
node $n$ in operational period $t$ with a typical unit of $Mm^3$.
Down implies in this case that the reservoir volume is smaller than planned.
Constraints
The following sections omit the direct inclusion of the vector of HydroReservoir
nodes. Instead, it is implicitly assumed that the constraints are valid $\forall n ∈ N$ for all HydroReservoir
types if not stated differently. In addition, all constraints are valid $\forall t \in T$ (that is in all operational periods) or $\forall t_{inv} \in T^{Inv}$ (that is in all strategic periods).
Standard constraints
HydroReservoir
nodes utilize in general the standard constraints described in Constraint functions for Storage
nodes. The majority of these constraints are hence ommitted in the following description. Specifically, the level constraints are created using the same functions.
The function constraints_opex_var
requires a new method as we have to include the penalty variables for violating the constraints if required:
\[\begin{aligned} \texttt{opex\_var}&[n, t_{inv}] = \\ \sum_{t \in t_{inv}} \Big( & opex\_var(level(n), t) \times \texttt{stor\_level}[n, t] + \\ & opex\_var(charge(n), t) \times \texttt{stor\_charge\_use}[n, t] + \\ & opex\_var(discharge(n), t) \times \texttt{stor\_discharge\_use}[n, t] \\ & penalty(c_{up}, t) \times \texttt{rsv\_vol\_penalty\_up}[n, t]+ \\ & penalty(c_{down}, t) \times \texttt{rsv\_vol\_penalty\_down}[n, t] \Big) \times scale\_op\_sp(t_{inv}, t) \end{aligned}\]
where $penalty()$ returns the penalty value for violation of constraints with penalty variables in the upward and downward direction, denoted by $c_{up}$ and $c_{down}$.
The function $scale\_op\_sp(t_{inv}, t)$ calculates the scaling factor between operational and strategic periods. It also takes into account potential operational scenarios and their probability as well as representative periods.
The energy balance in constraints_level_aux
is altered to include the inflow to the reservoir:
\[\begin{aligned} \texttt{stor\_level\_Δ\_op}&[n, t] = \\ & vol\_inflow(n, t) + \texttt{stor\_charge\_use}[n, t] - \texttt{stor\_discharge\_use}[n, t] \end{aligned}\]
The new method adds furthermore additional constraints, if the corresponding types are provided in the Data
field. Soft constraints, i.e., constraints with a penalty, are used if the constraints have non-infinite penalty values. The mathematical formulation of the constraints are:
Minumum constraints for the reservoir level:
\[\begin{aligned} \texttt{stor\_level}[n, t] \geq & capacity(level(n), t) \times value(c, t) \qquad & \forall c \in C^{min} \\ \texttt{stor\_level}[n, t] + & \texttt{rsv\_vol\_penalty\_up}[n, t] \geq \\ & capacity(level(n), t) * value(c, t) \qquad & \forall c \in C^{min} \end{aligned}\]
Maximum constraints for the reservoir level:
\[\begin{aligned} \texttt{stor\_level}[n, t] \leq & capacity(level(n), t) \times value(c, t) \qquad & \forall c \in C^{max} \\ \texttt{stor\_level}[n, t] - & \texttt{rsv\_vol\_penalty\_down}[n, t] \leq \\ & capacity(level(n), t) \times value(c, t) \qquad & \forall c \in C^{max} \end{aligned}\]
Scheduling constraints for the reservoir level:
\[\begin{aligned} \texttt{stor\_level}[n, t] = & capacity(level(n), t) \times value(c, t) \quad & \forall c \in C^{sch} \\ \texttt{stor\_level}[n, t] + & \texttt{rsv\_vol\_penalty\_up}[n, t] - \texttt{rsv\_vol\_penalty\_down}[n, t] = \\ & capacity(level(n), t) \times value(c, t) \quad & \forall c \in C^{sch} \\ \end{aligned}\]
where $value(c,t)$ returns the relative limit of constraint c
and $capacity(n,t)$ returns the installed capacity of node n
. The sets $C^{min}$,$C^{max}$ and $C^{sch}$ contain additional minimum, maximum, and scheduling constraints, repectively.
Additional constraints
The HydroReservoir
nodes do not include any additional constraints other than through dispatching on Constraint functions for Storage
nodes as described above.