reservoir#
A reservoir that is part of a regulated hydropower watercourse
Input connections |
plant, gate, junction, volume_constraint, cut_group, inflow_series, tunnel, river |
Output connections |
plant, river, gate, tunnel, cut_group, inflow_series, junction_gate, junction, creek_intake, volume_constraint |
License |
SHOP_OPEN |
Release version |
13.0.0.a |
Introduction#
The reservoir is the storage element in hydro system modelling where the following attributes are mandatory:
Volume and head#
The releation between volume and head is required and given by the vol_head attribute, which is a piecewise linear XY-curve. The total reservoir volume before forced overflow is given by max_vol. The max_vol can either represent only the active volume or the full volume of the reservoir. If only the active volume is considered, lrl will coincide with zero volume.
Overflow#
In reservoirs where overflow may occur, it is recommended to also define the vol_head curve for levels above hrl. Overflow is described with the flow_descr XY-curve, where the x-values represents reservoir levels and the y-values overflow rates in \(m^3/s\). The first xy pair must be hrl and zero, meaning that there is no overflow at hrl. The following pair must have increasing x and y values.
To ensure the spilled water is directed to the right reservoir and assigned a reasonable penalty cost, the reservoir should be connected to a river where the river upstream_elevation equals the hrl. Overflow penalty can be given by setting the flow_cost. If the water is spilled to a different reservoir and not the ocean, the river should be connected to this reservoir.
Previously, gate has been used for overflow modelling but river is the recommended way for future compatibility. To model overflow using gate, the upstream reservoir has to been connected to the gate using connection type SPILL.
Physical overflow description#
The overflow description is a linear relaxation, hence overflow may occur in siutations where it is not physically possible in special situation. SHOP includes a MIP formulation to prevent this that can be activated using the river mip_flag, reservoir overflow_mip_flag or universal_overflow_mip.
See the overflow modelling example for further details.
Constraints#
The user can specify different types of reservoir limits to enforce correct physical behaviour and to enforce different physical and environmental restrictions. Figure 1 illustrates the available reservoir limits and Table 1 gives an overview of which inputs and outputs that relates to the different limits.
Figure 1: Overview of reservoir limit types. |
Attribute |
Constraint type |
Penalty input |
Penalty output |
Objective |
---|---|---|---|---|
flow_descr [meter] |
||||
soft |
||||
hard |
||||
soft |
||||
soft |
||||
hard |
||||
soft |
The outer limits are typically max_vol, hrl and lrl that represents the physical limts the system is designed and regulated to operate within. These are soft constraints such that SHOP also can provide a solution in situations where the input is overspecified such that no physical solution exist. A penalty will apply in these situations.
The min_vol_constr and max_vol_constr are time dependent operation constraints. These can, for example, be used if the system must be operated within given limits due to maintenance. However, hard constraints should be used carefully since they may cause infeasibility or non-physical behaviour in other parts of the system to fulfill the hard constraints.
Tactical limits, tactical_limit_min and tactical_limit_max lets the user specify time dependent soft constraints at a time dependent self defined cost.
Water value#
The value of stored water beyond the optimization horizon will typically come from a seasonal- or long-term model. Details on how to set the water values are described in tutorial and example.
Schedule#
Schedule imposes a specific strategy on a reservoir and limits the way the system can be operated, hence it should be used very carefully. A schedule can be set either for end value or for specific moments through the optimization period.
Further details on the use of reservoir schedule is illustrated in this example.
Slack#
Reservoir upper_slack and lower_slack are limits to apply at the end of the optimization period to validate the water values. Slack should be used in combination with schedule. The upper_slack adds a band on top of the schedule, while the lower_slack adds a band below the schedule value. This functionality is intended to be used in combination with cuts, where the slack values define the area in which the cuts are valid.
Ramping#
Ramping limits how rapid the volume or head in a reservoir can change over time, for example, to avoid excessive wear of the shores of a reservoir. The ramping constraint can be set individually for both up and down direction. It can be set in terms of volume with volume_ramping_up and volume_ramping_down, or level with level_ramping_up and level_ramping_down.
Examples#
References#
Modelling overflow using mixed integer programming in short-term hydropower scheduling [21]
Attributes#
latitude#
Reserved for future use (xUnit: NO_UNIT, yUnit: NO_UNIT)
longitude#
Reserved for future use (xUnit: NO_UNIT, yUnit: NO_UNIT)
max_vol#
Maximum volume of the reservoir (xUnit: MM3, yUnit: MM3)
lrl#
Lowest Regulation Level (meter above sea level) of the reservoir (xUnit: METER, yUnit: METER)
hrl#
Highest Regulation Level (meter above sea level) of the reservoir (xUnit: METER, yUnit: METER)
vol_head#
The volume (Mm3) and water level (meter above sea level) relation of the reservoir. The list should cover all feasible reservoir level values so that the volume-head conversion is always successful. (xUnit: MM3, yUnit: METER)
head_area#
The water level (meter above sea level) and surface area (Km2) relation of the reservoir (xUnit: METER, yUnit: KM2)
elevation_adjustment#
Adjustment for the lowest regulation level (lrl), highest regulation level (hrl), and the volume (Mm3) and water level (meter above sea level) relation of the reservoir (xUnit: NO_UNIT, yUnit: METER)
start_vol#
Reservoir start volume. If start_vol and start_head are both defined, the value of the prefer_start_vol attribute on global_settings will decide which is used (xUnit: MM3, yUnit: MM3)
start_head#
Reservoir start water level (meter above sea level). If start_vol and start_head are both defined, the value of the prefer_start_vol attribute on global_settings will decide which is used (xUnit: METER, yUnit: METER)
inflow#
Natural inflow to reservoir (xUnit: NO_UNIT, yUnit: M3/S)
inflow_flag#
Flag determining whether the inflow to a reservoir should be used as input or calculated as output in the simulation: 0 = input; 1 = output (xUnit: NO_UNIT, yUnit: NO_UNIT)
sim_inflow_flag#
Flag determining whether inflow should be simulated to reservoir or not (xUnit: NO_UNIT, yUnit: NO_UNIT)
flow_descr#
The water level (meter above sea level) and overflow (m3/s) relation of the reservoir. Only used when a spill gate is connected, please see the overflow modelling example (xUnit: METER, yUnit: M3/S)
overflow_mip_flag#
Flag determining whether the binary variables should be used to prevent non-physical spill (xUnit: NO_UNIT, yUnit: NO_UNIT)
overflow_cost#
Overflow cost for the reservoir (xUnit: NO_UNIT, yUnit: NOK/MM3)
overflow_cost_flag#
Flag determining whether overflow cost for this reservoir should be included in the optimization model (xUnit: NO_UNIT, yUnit: NO_UNIT)
min_vol_constr#
Time-dependent minimum volume limit for the reservoir (xUnit: NO_UNIT, yUnit: MM3)
min_vol_constr_flag#
Flag determining whether the time-dependent minimum volume limit for the reservoir should be included in the optimization model (xUnit: NO_UNIT, yUnit: NO_UNIT)
max_vol_constr#
Time-dependent maximum volume limit for the reservoir (xUnit: NO_UNIT, yUnit: MM3)
max_vol_constr_flag#
Flag determining whether the time-dependent maximum volume limit for the reservoir should be included in the optimization model (xUnit: NO_UNIT, yUnit: NO_UNIT)
min_head_constr#
Time-dependent minimum water level limit for the reservoir. The min_vol_constr attribute is preferred if it is present for the same reservoir. (xUnit: NO_UNIT, yUnit: METER)
min_head_constr_flag#
Flag determining whether the time-dependent minimum water level limit for the reservoir should be included in the optimization model (xUnit: NO_UNIT, yUnit: NO_UNIT)
max_head_constr#
Time-dependent maximum water level limit for the reservoir. The max_vol_constr attribute is preferred if it is present for the same reservoir. (xUnit: NO_UNIT, yUnit: METER)
max_head_constr_flag#
Flag determining whether the time-dependent maximum water level limit for the reservoir should be included in the optimization model (xUnit: NO_UNIT, yUnit: NO_UNIT)
tactical_limit_min#
Tactical (soft) minimum volume limit for the reservoir (xUnit: NO_UNIT, yUnit: MM3)
tactical_limit_min_flag#
Flag determining whether the tactical minimum volume limit should be included in the optimization model (xUnit: NO_UNIT, yUnit: NO_UNIT)
tactical_cost_min#
Given penalty cost for violating the tactical minimum volume limit for the reservoir (xUnit: NO_UNIT, yUnit: NOK/MM3H)
tactical_cost_min_flag#
Flag determining whether the penalty cost for violating the tactical minimum volume limit should be included in the optimization model (xUnit: NO_UNIT, yUnit: NO_UNIT)
tactical_limit_max#
Tactical (soft) maximum volume limit for the reservoir (xUnit: NO_UNIT, yUnit: MM3)
tactical_limit_max_flag#
Flag determining whether the tactical maximum volume limit should be included in the optimization model (xUnit: NO_UNIT, yUnit: NO_UNIT)
tactical_cost_max#
Given penalty cost for violating the tactical maximum volume limit for the reservoir (xUnit: NO_UNIT, yUnit: NOK/MM3H)
tactical_cost_max_flag#
Flag determining whether the penalty cost for violating the tactical maximum volume limit should be included in the optimization model (xUnit: NO_UNIT, yUnit: NO_UNIT)
tactical_level_limit_min#
Tactical minimum level limit for the reservoir (xUnit: NO_UNIT, yUnit: METER)
tactical_level_limit_max#
Tactical maximum level limit for the reservoir (xUnit: NO_UNIT, yUnit: METER)
upper_slack#
Used to expand the upper reservoir limit when running with an active reservoir schedule so that the volume can be between the schedule and upper_slack. (xUnit: NO_UNIT, yUnit: MM3)
lower_slack#
Used to expand the lower reservoir limit when running with an active reservoir schedule so that the volume can be between the schedule and lower_slack. (xUnit: NO_UNIT, yUnit: MM3)
schedule#
Reservoir volume schedule used to specify the volume of the reservoir in each time step. Must be combined with a schedule_flag to be active. (xUnit: NO_UNIT, yUnit: MM3)
schedule_flag#
Flag determining whether the reservoir volume schedule should be included in the optimization model: 0 = no schedule; 1 = the endpoint interval upper_slack and lower_slack is valid; 2 = reservoir volume schedule is valid anywhere during the optimization period (xUnit: NO_UNIT, yUnit: NO_UNIT)
volume_schedule#
Reservoir volume schedule used in the SHOP simulator (xUnit: NO_UNIT, yUnit: MM3)
level_schedule#
Reservoir water level schedule used in the SHOP simulator (xUnit: NO_UNIT, yUnit: METER)
volume_ramping_up#
Maximum limit for increase in reservoir volume per hour (xUnit: NO_UNIT, yUnit: MM3/HOUR)
volume_ramping_down#
Maximum limit for decrease in reservoir volume per hour (xUnit: NO_UNIT, yUnit: MM3/HOUR)
level_ramping_up#
Maximum limit for increase in reservoir level per hour (xUnit: NO_UNIT, yUnit: METER/HOUR)
level_ramping_down#
Maximum limit for decrease in reservoir level per hour (xUnit: NO_UNIT, yUnit: METER/HOUR)
water_value_input#
The input water value description of water values referred to the sea. Can be a single constant value, a water value table (xy), or cut coefficients for a single or multiple price nodes. In the case of price dependent cut coefficients, the reference value of each xy in the xy_array should be the relevant price level. (xUnit: MM3, yUnit: NOK/MM3)
energy_value_input#
The input local energy value of the reservoir which will be converted to a global water value internally. (xUnit: NOK/MWH, yUnit: NOK/MWH)
peak_volume_cost_curve#
A piece-wise constant increasing cost which is applied to the highest reservoir volume reached in the optimization horizon (xUnit: MM3, yUnit: NOK/MM3)
flood_volume_cost_curve#
A piece-wise constant increasing cost curve which is used to penalize the reservoir volume level in each hour of the optimzation (xUnit: MM3, yUnit: NOK/MM3)
evaporation_rate#
Evaporation rate of water from the reservoir (xUnit: NO_UNIT, yUnit: METER/HOUR)
level_rolling_ramping_penalty_cost#
The penalty cost for breaking any rolling ramping constraint applied to the reservoir level (xUnit: NO_UNIT, yUnit: NOK/METER)
level_period_ramping_penalty_cost#
The penalty cost for breaking any period ramping constraint applied to the reservoir level (xUnit: NO_UNIT, yUnit: NOK/METER)
average_level_rolling_ramping_up#
Input to specify rolling ramping constraints that constrain the reservoir level upwards from the average reservoir level in a rolling time window. The x-values represent the length of the rolling time window and the y-values specify the number of meters the reservoir level can increase above the average rolling level. Each (x, y) point in each xy curve represents a rolling ramping constraint. (xUnit: MINUTE, yUnit: METER)
average_level_rolling_ramping_down#
Input to specify rolling ramping constraints that constrain the reservoir level downwards from the average reservoir level in a rolling time window. The x-values represent the length of the rolling time window and the y-values specify the number of meters the reservoir level can decrease below the average rolling level. Each (x, y) point in each xy curve represents a rolling ramping constraint. (xUnit: MINUTE, yUnit: METER)
limit_level_rolling_ramping_up#
Input to specify rolling ramping constraints that constrain the reservoir level upwards from the minimal reservoir level in a rolling time window. The x-values represent the length of the rolling time window and the y-values specify the number of meters the reservoir level can increase above the minimal rolling level. Each (x, y) point in each xy curve represents a rolling ramping constraint. (xUnit: MINUTE, yUnit: METER)
limit_level_rolling_ramping_down#
Input to specify rolling ramping constraints that constrain the reservoir level downwards from the maximal reservoir level in a rolling time window. The x-values represent the length of the rolling time window and the y-values specify the number of meters the reservoir level can decrease below the maximal rolling level. Each (x, y) point in each xy curve represents a rolling ramping constraint. (xUnit: MINUTE, yUnit: METER)
average_level_period_ramping_up#
Input to specify period ramping constraints that constrain the reservoir level upwards from the average reservoir level in a fixed time window. The x-values represent the length of the fixed time window and the y-values specify the number of meters the reservoir level can increase above the average level in the previous fixed time period. Each (x, y) point in each xy curve represents a period ramping constraint. (xUnit: MINUTE, yUnit: METER)
average_level_period_ramping_down#
Input to specify period ramping constraints that constrain the reservoir level downwards from the average reservoir level in a fixed time window. The x-values represent the length of the fixed time window and the y-values specify the number of meters the reservoir level can decrease below the average level in the previous fixed time period. Each (x, y) point in each xy curve represents a period ramping constraint. (xUnit: MINUTE, yUnit: METER)
limit_level_period_ramping_up#
Input to specify period ramping constraints that constrain the reservoir level upwards from the minimal reservoir level in a fixed time window. The x-values represent the length of the fixed time window and the y-values specify the number of meters the reservoir level can increase above the minimal level in the previous fixed time period. Each (x, y) point in each xy curve represents a period ramping constraint. (xUnit: MINUTE, yUnit: METER)
limit_level_period_ramping_down#
Input to specify period ramping constraints that constrain the reservoir level downwards from the maximal reservoir level in a fixed time window. The x-values represent the length of the fixed time window and the y-values specify the number of meters the reservoir level can decrease below the maximal level in the previous fixed time period. Each (x, y) point in each xy curve represents a period ramping constraint. (xUnit: MINUTE, yUnit: METER)
historical_level#
The reservoir level for times before the optimization start. The input start volume or start level of the reservoir will override any value in this time series that corresponds to the start time of the optimization, values inside the optimization horizon are ignored. The datatype of this attribute changed from xy to txy in version 15.3.1.0 (xUnit: NO_UNIT, yUnit: METER)
average_level_period_ramping_up_offset#
The y-values must be the same as the period lengths used in the average_level_period_ramping_up attribute, while the strings are timestamps that specify when the first whole ramping period starts for each of the average ramping up period constraints. (xUnit: MINUTE, yUnit: MINUTE)
average_level_period_ramping_down_offset#
The y-values must be the same as the period lengths used in the average_level_period_ramping_down attribute, while the strings are timestamps that specify when the first whole ramping period starts for each of the average ramping down period constraints. (xUnit: MINUTE, yUnit: MINUTE)
limit_level_period_ramping_up_offset#
The y-values must be the same as the period lengths used in the limit_level_period_ramping_up attribute, while the strings are timestamps that specify when the first whole ramping period starts for each of the limit ramping up period constraints. (xUnit: MINUTE, yUnit: MINUTE)
limit_level_period_ramping_down_offset#
The y-values must be the same as the period lengths used in the limit_level_period_ramping_down attribute, while the strings are timestamps that specify when the first whole ramping period starts for each of the limit ramping up period constraints. (xUnit: MINUTE, yUnit: MINUTE)
volume_nonseq_ramping_limit_up#
Limit volume ramping between two non-sequential time steps. Start time is given by time T, duration by X and ramping by Y. (xUnit: MINUTE, yUnit: MM3)
volume_nonseq_ramping_limit_down#
Limit volume ramping between two non-sequential time steps. Start time is given by time T, duration by X and ramping by Y. (xUnit: MINUTE, yUnit: MM3)
volume_amplitude_ramping_limit_up#
Limit volume ramping between in time interval. Start time is given by time T, duration by X and ramping by Y. (xUnit: MINUTE, yUnit: MM3)
volume_amplitude_ramping_limit_down#
Limit volume ramping between in time interval. Start time is given by time T, duration by X and ramping by Y. (xUnit: MINUTE, yUnit: MM3)
level_nonseq_ramping_limit_up#
Limit level ramping between two non-sequential time steps. Start time is given by time T, duration by X and ramping by Y. (xUnit: MINUTE, yUnit: METER)
level_nonseq_ramping_limit_down#
Limit level ramping between two non-sequential time steps. Start time is given by time T, duration by X and ramping by Y. (xUnit: MINUTE, yUnit: METER)
level_amplitude_ramping_limit_up#
Limit level ramping between in time interval. Start time is given by time T, duration by X and ramping by Y. (xUnit: MINUTE, yUnit: METER)
level_amplitude_ramping_limit_down#
Limit level ramping between in time interval. Start time is given by time T, duration by X and ramping by Y. (xUnit: MINUTE, yUnit: METER)
storage#
Resulting reservoir volume, includes both the start volume and the final end volume in the optimization (xUnit: NO_UNIT, yUnit: MM3)
sim_storage#
Simulated reservoir volume (xUnit: NO_UNIT, yUnit: MM3)
head#
Resulting reservoir water level (meter above sea level), calculated by converting the volume of the reservoir with the vol_head_curve (xUnit: NO_UNIT, yUnit: METER)
area#
Resulting reservoir surface area (km2), used to calculate evaporation (xUnit: NO_UNIT, yUnit: KM2)
sim_head#
Simulated reservoir water level (meter above sea level) (xUnit: NO_UNIT, yUnit: METER)
sim_inflow#
Simulated inflow to reservoir (xUnit: NO_UNIT, yUnit: M3/S)
endpoint_penalty#
Resulting penalty when the maximum or minimum volume limit for the reservoir at the end of the optimization period is violated (xUnit: MM3, yUnit: MM3)
penalty#
Resulting penalty when the maximum or minimum volume limit for the reservoir during the optimization period is violated (xUnit: NO_UNIT, yUnit: MM3)
tactical_penalty_up#
Resulting penalty when the tactical maximum volume limit for the reservoir is violated (xUnit: NO_UNIT, yUnit: MM3)
tactical_penalty_down#
Resulting penalty when the tactical minimum volume limit for the reservoir is violated (xUnit: NO_UNIT, yUnit: MM3)
end_penalty#
Resulting penalty cost when the maximum or minimum volume limit for the reservoir at the end of the optimization period is violated (xUnit: NO_UNIT, yUnit: NOK)
penalty_nok#
Resulting penalty cost when the maximum or minimum volume limit for the reservoir during the optimization period is violated (xUnit: NO_UNIT, yUnit: NOK)
tactical_penalty#
Resulting penalty cost when the tactical maximum or minimum volume limit for the reservoir is violated (xUnit: NO_UNIT, yUnit: NOK)
water_value_global_result#
Marginal cost of 1 Mm3 of the water in the reservoir calculated using the sum of the best efficiency point of all cascaded plants below this reservoir (xUnit: NO_UNIT, yUnit: NOK/MM3)
water_value_local_result#
Marginal cost of 1 Mm3 of the water discharged from the reservoir through the downstream plant (xUnit: NO_UNIT, yUnit: NOK/MM3)
energy_value_local_result#
Marginal cost of 1 MWh power that generated from the water in the reservoir through the downstream plant (xUnit: NO_UNIT, yUnit: NOK/MWH)
end_value#
Value of reservoir contents at the end of the optimization period (xUnit: NO_UNIT, yUnit: NOK)
change_in_end_value#
Relative change in value of reservoir contents between the start and the end of the optimization horizon (xUnit: NO_UNIT, yUnit: NOK)
vow_in_transit#
Value of delayed water on its way to this reservoir after the end of the optimization period (xUnit: NO_UNIT, yUnit: NOK)
calc_global_water_value#
The resulting global water value of the reservoir after the local energy value has been converted internally based on the energy_conversion_factor reservoir attribute. (xUnit: NOK/MM3, yUnit: NOK/MM3)
energy_conversion_factor#
The calculated conversion factor between MWh and Mm3 based on the first plant below the reservoir and initial start head. (xUnit: MWH/MM3, yUnit: MWH/MM3)
water_value_cut_result#
The resulting output water value cut coefficients when SHOP is used to create cuts. (xUnit: MM3, yUnit: NOK/MM3)
added_to_network#
Flag determining whether the model has determined that this reservoir is part of a tunnel network (xUnit: NO_UNIT, yUnit: NO_UNIT)
network_no#
Network identification number set by the model to indicate which tunnel network this reservoir is part of (xUnit: NO_UNIT, yUnit: NO_UNIT)
peak_volume_penalty#
The peak volume penalty incurred for the reservoir, zero in all time steps except for when the reservoir volume peak occurs (xUnit: NO_UNIT, yUnit: NOK)
flood_volume_penalty#
The penalty incurred for the reservoir based on the optimized reservoir volume and the flood_volume_cost_curve (xUnit: NO_UNIT, yUnit: NOK)