Hydro pump node
Introduced type and its field
The HydroPump node represents a hydropower unit that consumes electricity to pump water between two reservoir in a hydropower system. The HydroPump can convert electricity to potential energy stored in the reservoirs by pumping water between reservoirs at different head levels under the assumption that the reservoirs has constant head level. The conversion from electric energy is the reversed process of the energy conversion in the HydroGenerator and can be described by an power-discharge relationship, where discharge refer to the flow of pumped water.
Standard fields
HydroPump nodes build on the HydroUnit and the RefNetworkNode nodes, but add additional fields. The standard fields are:
id:
The fieldidis only used for providing a name to the node. This is similar to the approach utilized inEnergyModelsBase.cap::TimeProfile:
The installed capacity corresponds to the nominal capacity of the node. It is the installed pumping capacity, either in form of volume water per time period or power capacity.opex_var::TimeProfile:
The variable operational expenses are based on the capacity utilization through the variablecap_use.opex_fixed::TimeProfile:
The fixed operating expenses are relative to the installed capacity (through the fieldcap) and the chosen duration of a strategic period as outlined on UtilizeTimeStruct. It is important to note that you can only useFixedProfileorStrategicProfilefor the fixed OPEX, but notRepresentativeProfileorOperationalProfile. In addition, all values have to be non-negative.data::Vector{Data}:
An entry for providing additional data to the model.Additional constraints The
datafield can be used to add minimum, maximum, and schedule constraints on pumping using the general constraints types.
HydroGenerator nodes do not utilize the fields input and output. Instead, the input and output resources are identified from the fields water_resource and electricity_resource described below.
Additional fields
pq_curve::AbstractPqCurve:
Describes the relationship between consumed power (electricity) and pumped water. The input can be provided by using the subtypePqPointsor as a single energy equivalent.
The input provided to the pq_curve field has to be relative to the installed capacity, so that either the maximum discharge or the maximum power value given by the PqPoints equals 1. If a single energy equivalent is provided the cap::TimeProfile must refer to the power capacity of the HydroGenerator node.
water_resource::Resource:
The water resource that the node pumps between reservoirs.electricity_resource::Resource:
The electricity resource consumed in the node.
HydroPump nodes include the fields water_resource and electricity_resource field instead of the input and output fields of RefNetworkNode. The conversion of the water resource is set to 1 since the amount of water in the system is constant. The conversion to electricity is described by the input provided in the pq_curve::AbstractPqCurve field.
Mathematical description
The HydroPump inherits its mathematical description from the HydroUnit and NetworkNode.
Variables
Standard variables
The HydroPump utilizes the standard variables from the NetworkNode, as described on the page Optimization variables.
- $\texttt{opex\_var}$
- $\texttt{opex\_fixed}$
- $\texttt{cap\_use}$
- $\texttt{cap\_inst}$
- $\texttt{flow\_in}$
- $\texttt{flow\_out}$
Additional variables
In addition to the standard variables, the variables presented below are defined for HydroUnit nodes. These variabels are hence created for HydroPump nodes.
$\texttt{discharge\_segments}[n, t, q]$: One discharge variable is defined for each segment
qof the PQ-curve defined by the fieldpq_curveof node $n$ in operational period $t$ with unit volume per time unit.
IfPqPointsare provided, the number of discharge segments will be $Q$, where $Q+1$ is the length of the vectors in the fields ofPqPoints. There is only one discharge segment if an energy equivalent is used. The $\texttt{discharge\_segments}$ variables define the utilisation of each discharge segment and sums up to the total discharge.
The following variables are created if required by the additional constraints:
- $\texttt{gen\_penalty\_up}[n, t, p]$: Variable for penalizing violation of the maximum constraint of the resource
pin direction up inHydroGeneratornode $n$ in operational period $t$ with unit volume per time unit. Up implies in this case that the reservoir volume is larger than planned. - $\texttt{gen\_penalty\_down}[n, t, p]$: Variable for penalizing violation of the maximum constraint of the resource
pin direction down inHydroGeneratornode $n$ in operational period $t$ with unit volume per time unit. 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 HydroPump nodes. Instead, it is implicitly assumed that the constraints are valid $\forall n ∈ N$ for all HydroPump 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
HydroPump nodes utilize in general the standard constraints described in Constraint functions for NetworkNode. The majority of these constraints are hence ommitted in the following description.
The new methods for the functions constraints_capacity and constraints_opex_var are explained in the section for HydroGenerator.
Furthermore, we dispatch on the flow constraints for HydroPump nodes. The mathematical description is the same as for the HydroGenerator nodes, except that electricity flows into the node (is consumed) rather than out of the node:
constraints_flow_in:
It is assumed that the amount of water is constant forHydroGeneratornodes, and the flow of water into the node therefore equals the flow out.\[ \texttt{flow\_in}[n, t, water\_resource(n)] = \texttt{flow\_out}[n, t, water\_resource(n)]\]
The flow of electricity into the node is given by the:
\[\texttt{flow\_in}[n, t, electricity\_resource(n)] = \texttt{cap\_use}[n, t]\]
constraints_flow_out:
The flow out of water is constrained to total discharge given by the sum of the $\texttt{discharge\_segments[n,t,q]}$ variables, where Q is the number of segments in the PQ-curve (i.e., Q+1 PQ-points):\[\texttt{flow\_out}[n, t, water\_resource(n)] = \sum_{q=1}^{Q}\texttt{discharge\_segments[n,t,q]}\]
In addition to being constrained by the installed capacity, the $\texttt{cap\_use}$ variables are constrained by the discharge of water multiplied with the conversion rate given by $\texttt{E[q]}$ which is the slope of each segment in the PQ-curve:
\[\texttt{cap\_use}[n, t] = \sum_{q=1}^{Q}(\texttt{discharge\_segments}[n,t,q] \times \texttt{E[q]})\]
The discharge segments are constrained by the
discharge_levelsof thePqPoints:\[\begin{aligned} \texttt{discharge\_segment}[n, t, q] \leq & \texttt{cap\_inst}[n, t] \times (discharge\_levels[q+1] \\ & - discharge\_levels[q]) \qquad \forall q \in [1,Q] \\ \end{aligned}\]
If a single energy eqivalent is used, two points (zero and max) are created to describe a single discharge segment with the slope of the energy equivalent and the capacity of node n. In this case, the installed capacity of the node, provided in the pq_curve::AbstractPqCurve field, has to refer to the power capacity.
Furthermore, the dispatch on constraints_flow_in includes additional pumping capacity constraints. The constraints are optional and only added to the problem if given as input in the Data field of the nodes. Soft constraints, i.e., constraints with a penalty, are used if the constraints have non-infinite penalty values. For HydroPump nodes, the constraints can be defined for the electricity_resource and water_resource, limiting the flow into of the node.
To this end, we declare an internal expression given by:
\[\texttt{cap\_inst\_var}[n, p, t] = \begin{cases} \texttt{cap\_inst}[n, t] \times max\_normalized\_power(n), & \text{if } p == electricity\_resource(n) \\ \texttt{cap\_inst}[n, t] \times max\_normalized\_flow(n), & \text{if } p == water\_resource(n) \end{cases}\]
The expression is subsequently used in the calculations for providing the constraints (the first equation corresponds to hard constraints, the second equation to soft constraints):
Minimum constraints for pumping:
\[\begin{aligned} \texttt{flow\_in}[n, t, p] \geq & \\ & \texttt{cap\_inst\_var}[n, p, t] \times value(c, t) \qquad & \forall c \in C^{min}\\ \texttt{flow\_in}[n, t, p] + & \texttt{gen\_penalty\_up}[n, t, p] \geq \\ & \texttt{cap\_inst\_var}[n, p, t] \times value(c, t) \qquad & \forall c \in C^{min} \\ \end{aligned}\]
Maximum constraints for pumping:
\[\begin{aligned} \texttt{flow\_in}[n, t, p] \leq & \\ & \texttt{cap\_inst\_var}[n, p, t] \times value(c, t) \qquad & \forall c \in C^{max}\\ \texttt{flow\_in}[n, t, p] - & \texttt{gen\_penalty\_down}[n, t, p] \leq \\ & \texttt{cap\_inst\_var}[n, p, t] \times value(c, t) \qquad & \forall c \in C^{max} \\ \end{aligned}\]
Scheduling constraints for pump:
\[\begin{aligned} \texttt{flow\_in}[n, t, p] = & \\ & \texttt{cap\_inst\_var}[n, p, t] \times value(c, t) \qquad & \forall c \in C^{sch} \\ \texttt{flow\_in}[n, t, p] + & \texttt{gen\_penalty\_up}[n, t, p] - \texttt{gen\_penalty\_down}[n, t] = \\ & \texttt{cap\_inst\_var}[n, p, t] \times value(c, t) \qquad & \forall c \in C^{sch} \\ \end{aligned}\]
where $value(c, t)$ returns the relative limit of scheduling constraint c. The sets $C^{min}$,$C^{max}$, and $C^{sch}$ contain additional minimum, maximum and scheduling constraints, repectively.