--- jupytext: text_representation: extension: .md format_name: myst format_version: 0.13 jupytext_version: 1.13.8 kernelspec: display_name: 'Python 3' name: python3 --- (plant)= # plant A hydropower plant which houses up to several hydropower generators and pumps | | | |---|---| |Input connections|{ref}`reservoir`, {ref}`generator`, {ref}`pump`, {ref}`junction`, {ref}`junction_gate`, {ref}`creek_intake`, {ref}`discharge_group`, {ref}`production_group`, {ref}`bid_group`, {ref}`tunnel`, {ref}`plant_reserve_capability`| |Output connections|{ref}`river`, {ref}`reservoir`, {ref}`tunnel`, {ref}`junction`, {ref}`discharge_group`, {ref}`production_group`, {ref}`bid_group`, {ref}`generator`, {ref}`pump`, {ref}`plant_reserve_capability`| |License|SHOP_OPEN| |Release version|13.0.0.a| ```{contents} :local: :depth: 1 ``` ## Introduction The hydropower plant object in SHOP is used to group [generators](generator) and [pumps](pump) that share a common tunnel and penstocks. The generator and pump objects are connected to the plant object, and the plant object is in turn connected to the rest of the system through rivers, tunnels, reservoirs, etc. ## Sum constraints The generator and pump objects are more fundamental building blocks compared to the plant object, but many sum constraints can be applied on the plant level, such as [max_q_constr](plant:max_q_constr) limiting the total discharge of all generators in the plant. Many of these constraints are also found on unit level (see the generator [max_q_constr](generator:max_q_constr)), and are handled more strictly in these cases. The plant sum constraints can usually be modelled as soft constraints that can be broken for a penalty. The plant object may also be connected to other "constraint" objects such as the [](discharge_group) and [](production_group), which will apply sum constraints on all plants and other objects connected to them. ## Marginal cost calculations Calculating marginal costs and finding the best way to regulate the total plant production up and down is important for bidding into several of the electricity markets. The best profit functionality in SHOP handles these calculations on the plant level, see the [tutorial](best-profit) and [example](best-profit-basic-example) for more details. ## Examples - [](best-profit) - [](best-profit-basic-example) - [](maintenance-example) - [](ramping) - [](plant-complex-ramping) - [](plant-reserve-strategy) ## References - An overview on formulations and optimization methods for the unit-based short-term hydro scheduling problem {cite}`Kong2020` - Dynamic incorporation of nonlinearity into MILP formulation for short-term hydro scheduling {cite}`Skjelbred2020` - A comparison of linear interpolation and spline interpolation for turbine efficiency curves in short-term hydropower scheduling problems {cite}`Zhang2019` - Calculation of power compensation for a pumped storage hydropower plant with hydraulic short-circuit operation {cite}`Skjelbred2017b` - Combining start-up costs with non-linear head optimization of hydro storage {cite}`Skjelbred2013` ## Attributes ```{code-cell} ipython3 :tags: ['remove-input', 'full-width'] from IPython.core.display import HTML HTML("""
""") ``` (plant:num_gen)= ### num_gen Number of generators in the plant (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:num_pump)= ### num_pump Number of pumps in the plant (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:less_distribution_eps)= ### less_distribution_eps The tolerance level for heuristically distributing discharge on generators (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:latitude)= ### latitude Reserved for future use (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:longitude)= ### longitude Reserved for future use (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:power_head_optimization_factor)= ### power_head_optimization_factor Individual scale factor for plant power head optimization. (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:ownership)= ### ownership Percentage of ownership of plant in case of shared ownership. Used to scale generator efficiency curves accordingly. (xUnit: %, yUnit: %) (plant:prod_area)= ### prod_area Future deprecation: use a busbar object per price area and connect the appropriate units and markets to the busbars. Production from this plant will be sold in markets connected to the given price area (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:prod_area_flag)= ### prod_area_flag Future deprecation: use a busbar object per price area and connect the appropriate units and markets to the busbars. Flag determining whether production area connection should be included in the optimization model (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:prod_factor)= ### prod_factor Optional fixed production factor for the plant in KWh/m3, which is used to convert between NOK/MWh and NOK/Mm3. If this is not specified (value of 0.0), SHOP will calculate a production factor for the plant based on best point operation given the initial plant head. (xUnit: KWH/MM3, yUnit: KWH/MM3) (plant:outlet_line)= ### outlet_line The level (meter above sea level) of the outlet tunnel from the plant (xUnit: METER, yUnit: METER) (plant:intake_line)= ### intake_line Minimum upper level used to calculate the height the pump must lift water to. The upper reservoir water level is used if it is above the value of intake_line (xUnit: NO_UNIT, yUnit: METER) (plant:main_loss)= ### main_loss The loss factor for the main tunnel of the plant. Loss is assumed to be a quadratic function of flow (xUnit: S2/M5, yUnit: S2/M5) (plant:penstock_loss)= ### penstock_loss The list of loss factors for the penstocks of the plant, multiple units may share a penstock. Loss is assumed to be a quadratic function of flow (xUnit: S2/M5, yUnit: S2/M5) (plant:tailrace_loss)= ### tailrace_loss The head loss curve for the tailrace of the plant which can be modelled as an additional head loss related to the discharge of the plant (and bypass if intake_loss_from_bypass_flag is active). Each XY curve is referred to a downstream level in masl (xUnit: M3/S, yUnit: METER) (plant:tailrace_loss_from_bypass_flag)= ### tailrace_loss_from_bypass_flag Flag determining whether bypass discharge should be included in the calculation of tailrace loss for the plant. If the flag is zero or not set, only plant discharge is used to calculate tailrace loss. If the flag is 1 and the plant is connected to a downstream reservoir, all bypass gates and all rivers that discharge into this reservoir are counted towards the tailrace loss calculation in addition to the plant discharge. If the flag is 1 and the plant is connected to a river downstream, the flow in this river is used for the tailrace loss calculation. (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:intake_loss)= ### intake_loss The head loss curve for the intake of the plant which can be modelled as an additional head loss related to the discharge of the plant (and bypass if intake_loss_from_bypass_flag is active). Each XY curve is referred to an upstream level in masl (xUnit: M3/S, yUnit: METER) (plant:intake_loss_from_bypass_flag)= ### intake_loss_from_bypass_flag Flag determining whether bypass discharge should be included in the calculation of intake loss for the plant. If the flag is zero or not set, only plant discharge is used to calculate intake loss. If the flag is 1 and the plant is connected to an upstream reservoir, all bypass gates and all rivers that discharge out of this reservoir is counted towards the intkae loss calculation in addition to the plant discharge. (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:tides)= ### tides The change of plant head related to tides (xUnit: NO_UNIT, yUnit: DELTA_METER) (plant:time_delay)= ### time_delay Future deprecation: All time delay should be modelled by using the river object (does not require additional license). The delay between the water leaving the plant and until it ends up in the downstream reservoir (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:shape_discharge)= ### shape_discharge Future deprecation: All time delay should be modelled by using the river object (does not require additional license). Describes the shape of the delayed discharge as a wave function of ratios per time step (xUnit: HOUR, yUnit: NO_UNIT) (plant:discharge_fee)= ### discharge_fee Extra cost for plant discharge referring to the time when it was discharged by the plant (xUnit: NO_UNIT, yUnit: NOK/MM3) (plant:discharge_fee_flag)= ### discharge_fee_flag Flag determining whether the discharge fee should be included in the optimization model (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:discharge_cost_curve)= ### discharge_cost_curve Extra cost depending on the discharge of the plant (xUnit: M3/S, yUnit: NOK/H/M3/S) (plant:feeding_fee)= ### feeding_fee Extra cost for feeding electricity into the grid. The feeding fee is added as an extra production cost in the objective function. (xUnit: NO_UNIT, yUnit: NOK/MWH) (plant:feeding_fee_flag)= ### feeding_fee_flag Flag determining whether the feed-in fee should be included in the optimization model (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:production_fee)= ### production_fee Fee that is used to reduce the sale price for energy delivered by this plant (xUnit: NO_UNIT, yUnit: NOK/MWH) (plant:production_fee_flag)= ### production_fee_flag Flag determining whether the production fee should be included in the optimization model (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:consumption_fee)= ### consumption_fee Fee that is used to increase the buy price for energy consumed by this plant (xUnit: NO_UNIT, yUnit: NOK/MWH) (plant:consumption_fee_flag)= ### consumption_fee_flag Flag determining whether the consumption fee should be included in the optimization model (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:linear_startup_flag)= ### linear_startup_flag Flag determining whether the plant should have linear startup costs when MIP is not active (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:maintenance_flag)= ### maintenance_flag Flag determining whether the plant is out for maintenance or not (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:mip_flag)= ### mip_flag Flag determining for which time steps to use binary variables to model generator startup and min production (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:mip_length)= ### mip_length Set the binary variable length to another value other than the default length of one time step (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:mip_length_flag)= ### mip_length_flag Flag determining whether the mip_length should be included in the optimization model (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:gen_priority)= ### gen_priority Prioritization for startup order of generators. If no generators have TXY priority, use this static generator priority. Use positive values to set priority. Value 0 means that no priority has been defined. (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:n_seg_down)= ### n_seg_down The number of segments below the best efficiency point of the unit in the building of original PQ curve in incremental mode (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:n_seg_up)= ### n_seg_up The number of segments above the best efficiency point of the unit in the building of original PQ curve in incremental mode (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:n_mip_seg_down)= ### n_mip_seg_down The number of segments below the best efficiency point of the unit in the building of original PQ curve in full mode (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:n_mip_seg_up)= ### n_mip_seg_up The number of segments below the best efficiency point of the unit in the building of original PQ curve in full mode (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:dyn_pq_seg_flag)= ### dyn_pq_seg_flag Flag determining whether dynamically define the segments in the building of the original PQ curve for all the units in this plant in incremental mode (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:dyn_mip_pq_seg_flag)= ### dyn_mip_pq_seg_flag Flag determining whether dynamically define the segments in the building of the original PQ curve for all the units in this plant in full mode (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:build_original_pq_curves_by_discharge_limits)= ### build_original_pq_curves_by_discharge_limits Flag determining whether the original PQ curve should only consider only discharge-related limits or take into account all the operating limits (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:min_p_constr)= ### min_p_constr Time-dependent minimum production limit for the plant (xUnit: NO_UNIT, yUnit: MW) (plant:min_p_constr_flag)= ### min_p_constr_flag Flag determining whether the time-dependent minimum production limit for the plant should be included in the optimization model. If the flag is set equal to 2, all downward FCR-N, FCR-D, FRR, and RR reserve capcity allocated on the generators in the plant is also included in the constraint (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:min_p_penalty_flag)= ### min_p_penalty_flag Flag determining whether the time-dependent minimum production limit for the plant should be a hard or soft constraint: 0 = hard; 1 = soft (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:min_p_penalty_cost)= ### min_p_penalty_cost Given penalty cost for violating the time-dependent minimum production limit for the plant (if min_p_penalty_flag is set as 1) (xUnit: NO_UNIT, yUnit: NOK/MWH) (plant:min_p_penalty_cost_flag)= ### min_p_penalty_cost_flag Flag determining whether the cost for violating the minimum production constraint should be included in the optimization model (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:max_p_constr)= ### max_p_constr Time-dependent maximum production limit for the plant (xUnit: NO_UNIT, yUnit: MW) (plant:max_p_constr_flag)= ### max_p_constr_flag Flag determining whether the time-dependent maximum production limit for the plant should be included in the optimization model. (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:max_p_penalty_flag)= ### max_p_penalty_flag Flag determining whether the time-dependent maximum production limit for the plant should be a hard or soft constraint: 0 = hard; 1 = soft (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:max_p_penalty_cost)= ### max_p_penalty_cost Given penalty cost for violating the time-dependent maximum production limit for the plant (if max_p_penalty_flag is set as 1) (xUnit: NO_UNIT, yUnit: NOK/MWH) (plant:max_p_penalty_cost_flag)= ### max_p_penalty_cost_flag Flag determining whether the cost for violating the maximum production constraint should be included in the optimization model (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:min_q_constr)= ### min_q_constr Time-dependent minimum discharge limit for the plant (xUnit: NO_UNIT, yUnit: M3/S) (plant:min_q_constr_flag)= ### min_q_constr_flag Flag determining whether the time-dependent minimum discharge limit for the plant should be included in the optimization (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:min_q_penalty_flag)= ### min_q_penalty_flag Flag determining whether the time-dependent minimum discharge limit for the plant should be a hard or soft constraint: 0 = hard; 1 = soft (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:min_q_penalty_cost)= ### min_q_penalty_cost Given penalty cost for violating the time-dependent minimum discharge limit for the plant (if min_q_penalty_flag is set as 1) (xUnit: NO_UNIT, yUnit: NOK/MM3) (plant:min_q_penalty_cost_flag)= ### min_q_penalty_cost_flag Flag determining whether the cost for violating the minimum discharge constraint should be included in the optimization model (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:max_q_constr)= ### max_q_constr Time-dependent maximum discharge limit for the plant (xUnit: NO_UNIT, yUnit: M3/S) (plant:max_q_constr_flag)= ### max_q_constr_flag Flag determining whether the time-dependent maximum discharge limit for the plant should be included in the optimization model (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:max_q_penalty_flag)= ### max_q_penalty_flag Flag determining whether the time-dependent maximum discharge limit for the plant should be a hard or soft constraint: 0 = hard; 1 = soft (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:max_q_penalty_cost)= ### max_q_penalty_cost Given penalty cost for violating the time-dependent maximum discharge limit for the plant by (if max_q_penalty_flag is set as 1) (xUnit: NO_UNIT, yUnit: NOK/MM3) (plant:max_q_penalty_cost_flag)= ### max_q_penalty_cost_flag Flag determining whether the cost for violating the maximum discharge constraint should be included in the optimization model (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:max_q_limit_rsv_up)= ### max_q_limit_rsv_up Maximum plant discharge limit (m3/s) and upstream reservoir water level (meter above sea level) relation (xUnit: METER, yUnit: M3/S) (plant:max_q_limit_rsv_down)= ### max_q_limit_rsv_down Maximum plant discharge limit (m3/s) and downstream reservoir water level (meter above sea level) relation (xUnit: METER, yUnit: M3/S) (plant:production_schedule)= ### production_schedule Plant production schedule (xUnit: NO_UNIT, yUnit: MW) (plant:production_schedule_flag)= ### production_schedule_flag Flag determining whether the plant production schedule should be included in the optimization model (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:discharge_schedule)= ### discharge_schedule Discharge schedule (xUnit: NO_UNIT, yUnit: M3/S) (plant:discharge_schedule_flag)= ### discharge_schedule_flag Flag determining whether the plant discharge schedule should be included in the optimization model (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:consumption_schedule)= ### consumption_schedule Plant consumption schedule (xUnit: NO_UNIT, yUnit: MW) (plant:consumption_schedule_flag)= ### consumption_schedule_flag Flag determining whether the plant consumption schedule should be included in the optimization model (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:upflow_schedule)= ### upflow_schedule Plant upflow schedule (xUnit: NO_UNIT, yUnit: M3/S) (plant:upflow_schedule_flag)= ### upflow_schedule_flag Flag determining whether the plant upflow schedule should be included in the optimization model (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:sched_penalty_cost_down)= ### sched_penalty_cost_down Given penalty cost for deviating below the plant schedule (xUnit: NOK, yUnit: NOK) (plant:sched_penalty_cost_up)= ### sched_penalty_cost_up Given penalty cost for deviating above the plant schedule (xUnit: NOK, yUnit: NOK) (plant:power_ramping_up)= ### power_ramping_up Maximum limit for increase in plant production per hour (xUnit: NO_UNIT, yUnit: MW_HOUR) (plant:power_ramping_down)= ### power_ramping_down Maximum limit for decrease in plant production per hour (xUnit: NO_UNIT, yUnit: MW_HOUR) (plant:discharge_ramping_up)= ### discharge_ramping_up Maximum limit for increase in plant discharge per hour (xUnit: NO_UNIT, yUnit: M3SEC_HOUR) (plant:discharge_ramping_down)= ### discharge_ramping_down Maximum limit for decrease in plant discharge per hour (xUnit: NO_UNIT, yUnit: M3SEC_HOUR) (plant:block_merge_tolerance)= ### block_merge_tolerance Maximum deviation in production between two time steps that allows SHOP to force these hours to have the same production in later iterations (xUnit: NO_UNIT, yUnit: MW) (plant:block_generation_mwh)= ### block_generation_mwh Gives a constant production for the plant in one or more blocks of time steps. The t-value denotes the time of the block start and the y-value the block length in minutes. The block length is repeated until a new t-value and corresponding y-value is given. (xUnit: NO_UNIT, yUnit: MINUTE) (plant:block_generation_m3s)= ### block_generation_m3s Gives a constant discharge for the plant in one or more blocks of time steps. The t-value denotes the time of the block start and the y-value the block length in minutes. The block length is repeated until a new t-value and corresponding y-value is given. (xUnit: NO_UNIT, yUnit: MINUTE) (plant:frr_up_min)= ### frr_up_min Minimum FRR_UP delivery for the plant (xUnit: NO_UNIT, yUnit: MW) (plant:frr_up_max)= ### frr_up_max Maximum FRR_UP delivery for the plant (xUnit: NO_UNIT, yUnit: MW) (plant:frr_down_min)= ### frr_down_min Minimum FRR_DOWN delivery for the plant (xUnit: NO_UNIT, yUnit: MW) (plant:frr_down_max)= ### frr_down_max Maximum FRR_DOWN delivery for the plant (xUnit: NO_UNIT, yUnit: MW) (plant:rr_up_min)= ### rr_up_min Minimum RR_UP delivery for the plant (xUnit: NO_UNIT, yUnit: MW) (plant:rr_down_min)= ### rr_down_min Minimum RR_DOWN delivery for the plant (xUnit: NO_UNIT, yUnit: MW) (plant:frr_symmetric_flag)= ### frr_symmetric_flag Flag determining whether all the generators in the plant should deliver both FRR_UP and FRR_DOWN as long as they are assigned for the FRR reserve (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:bp_dyn_wv_flag)= ### bp_dyn_wv_flag Flag determining whether water values in the best profit calculation should be based on dynamic results per time step from the optimization or the static end value description (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:ref_prod)= ### ref_prod Production of the plant indicating the planned operating point as starting point for the best profit calculation (xUnit: NO_UNIT, yUnit: MW) (plant:plant_unbalance_recommit)= ### plant_unbalance_recommit Flag determining whether the generators in the plant should be recommitted when the optimization model changes from full mode to incremental mode and the resulting plant discharge is smaller than the optimal discharge from solver (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:spinning_reserve_up_max)= ### spinning_reserve_up_max Sets a maximum limit for the sum of spinning reserves delivered in the upward direction for the plant. The sum ranges over reserves delivered on all generators and pumps in the plant (xUnit: NO_UNIT, yUnit: MW) (plant:spinning_reserve_down_max)= ### spinning_reserve_down_max Sets a maximum limit for the sum of spinning reserves delivered in the downward direction for the plant. The sum ranges over reserves delivered on all generators and pumps in the plant (xUnit: NO_UNIT, yUnit: MW) (plant:ramping_steps)= ### ramping_steps X-value: Production in previous timestep. Y-value: Maximum change in production in next timestep referenced production in previous timestep. Ref: Select which series to use based on input from ramping_step_reference_discharge. Changed from xy to xy_array from 15.3.4.0. (xUnit: MW, yUnit: MW) (plant:discharge_rolling_ramping_penalty_cost)= ### discharge_rolling_ramping_penalty_cost The penalty cost for breaking any rolling ramping constraint applied to the plant discharge (xUnit: NO_UNIT, yUnit: NOK/M3/S) (plant:discharge_period_ramping_penalty_cost)= ### discharge_period_ramping_penalty_cost The penalty cost for breaking any period ramping constraint applied to the plant discharge (xUnit: NO_UNIT, yUnit: NOK/M3/S) (plant:average_discharge_rolling_ramping_up)= ### average_discharge_rolling_ramping_up Input to specify rolling ramping constraints that constrain the plant discharge upwards from the average plant discharge 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 plant discharge can increase above the average rolling discharge. Each (x, y) point in each xy curve represents a rolling ramping constraint. (xUnit: MINUTE, yUnit: M3/S) (plant:average_discharge_rolling_ramping_down)= ### average_discharge_rolling_ramping_down Input to specify rolling ramping constraints that constrain the plant discharge downwards from the average plant discharge 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 plant discharge can decrease below the average rolling discharge. Each (x, y) point in each xy curve represents a rolling ramping constraint. (xUnit: MINUTE, yUnit: M3/S) (plant:limit_discharge_rolling_ramping_up)= ### limit_discharge_rolling_ramping_up Input to specify rolling ramping constraints that constrain the plant discharge upwards from the minimal plant discharge 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 plant discharge can increase above the minimal rolling discharge. Each (x, y) point in each xy curve represents a rolling ramping constraint. (xUnit: MINUTE, yUnit: M3/S) (plant:limit_discharge_rolling_ramping_down)= ### limit_discharge_rolling_ramping_down Input to specify rolling ramping constraints that constrain the plant discharge downwards from the maximal plant discharge 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 plant discharge can decrease below the maximal rolling discharge. Each (x, y) point in each xy curve represents a rolling ramping constraint. (xUnit: MINUTE, yUnit: M3/S) (plant:average_discharge_period_ramping_up)= ### average_discharge_period_ramping_up Input to specify period ramping constraints that constrain the plant discharge upwards from the average plant discharge 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 plant discharge can increase above the average discharge in the previous fixed time period. Each (x, y) point in each xy curve represents a period ramping constraint. (xUnit: MINUTE, yUnit: M3/S) (plant:average_discharge_period_ramping_down)= ### average_discharge_period_ramping_down Input to specify period ramping constraints that constrain the plant discharge downwards from the average plant discharge 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 plant discharge can decrease below the average discharge in the previous fixed time period. Each (x, y) point in each xy curve represents a period ramping constraint. (xUnit: MINUTE, yUnit: M3/S) (plant:limit_discharge_period_ramping_up)= ### limit_discharge_period_ramping_up Input to specify period ramping constraints that constrain the plant discharge upwards from the minimal plant discharge 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 plant discharge can increase above the minimal discharge in the previous fixed time period. Each (x, y) point in each xy curve represents a period ramping constraint. (xUnit: MINUTE, yUnit: M3/S) (plant:limit_discharge_period_ramping_down)= ### limit_discharge_period_ramping_down Input to specify period ramping constraints that constrain the plant discharge downwards from the maximal plant discharge 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 plant discharge can decrease below the maximal discharge in the previous fixed time period. Each (x, y) point in each xy curve represents a period ramping constraint. (xUnit: MINUTE, yUnit: M3/S) (plant:historical_discharge)= ### historical_discharge The plant discharge for times before the optimization start, values after the start time of the optimization are ignored. The datatype of this attribute changed from xy to txy in version 15.3.1.0 (xUnit: NO_UNIT, yUnit: M3/S) (plant:average_discharge_period_ramping_up_offset)= ### average_discharge_period_ramping_up_offset The y-values must be the same as the period lengths used in the average_discharge_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) (plant:average_discharge_period_ramping_down_offset)= ### average_discharge_period_ramping_down_offset The y-values must be the same as the period lengths used in the average_discharge_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) (plant:limit_discharge_period_ramping_up_offset)= ### limit_discharge_period_ramping_up_offset The y-values must be the same as the period lengths used in the limit_discharge_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) (plant:limit_discharge_period_ramping_down_offset)= ### limit_discharge_period_ramping_down_offset The y-values must be the same as the period lengths used in the limit_discharge_period_ramping_down attribute, while the strings are timestamps that specify when the first whole ramping period starts for each of the limit ramping down period constraints. (xUnit: MINUTE, yUnit: MINUTE) (plant:fcr_n_up_activation_time)= ### fcr_n_up_activation_time The number of hours that one expects the FCR-N up reserves allocated on the units of the plant to be activated. The default value of -1 will ignore the activation factor and instead use the activation factor on global_settings (xUnit: HOUR, yUnit: HOUR) (plant:fcr_n_down_activation_time)= ### fcr_n_down_activation_time The number of hours that one expects the FCR-N down reserves allocated on the units of the plant to be activated. The default value of -1 will ignore the activation factor and instead use the activation factor on global_settings (xUnit: HOUR, yUnit: HOUR) (plant:fcr_d_up_activation_time)= ### fcr_d_up_activation_time The number of hours that one expects the FCR-D up reserves allocated on the units of the plant to be activated. The default value of -1 will ignore the activation factor and instead use the activation factor on global_settings (xUnit: HOUR, yUnit: HOUR) (plant:fcr_d_down_activation_time)= ### fcr_d_down_activation_time The number of hours that one expects the FCR-D down reserves allocated on the units of the plant to be activated. The default value of -1 will ignore the activation factor and instead use the activation factor on global_settings (xUnit: HOUR, yUnit: HOUR) (plant:frr_up_activation_time)= ### frr_up_activation_time The number of hours that one expects the FRR up reserves allocated on the units of the plant to be activated. The default value of -1 will ignore the activation factor and instead use the activation factor on global_settings (xUnit: HOUR, yUnit: HOUR) (plant:frr_down_activation_time)= ### frr_down_activation_time The number of hours that one expects the FRR down reserves allocated on the units of the plant to be activated. The default value of -1 will ignore the activation factor and instead use the activation factor on global_settings (xUnit: HOUR, yUnit: HOUR) (plant:rr_up_activation_time)= ### rr_up_activation_time The number of hours that one expects the RR up reserves allocated on the units of the plant to be activated. The default value of -1 will ignore the activation factor and instead use the activation factor on global_settings (xUnit: HOUR, yUnit: HOUR) (plant:rr_down_activation_time)= ### rr_down_activation_time The number of hours that one expects the RR down reserves allocated on the units of the plant to be activated. The default value of -1 will ignore the activation factor and instead use the activation factor on global_settings (xUnit: HOUR, yUnit: HOUR) (plant:fcr_n_up_activation_factor)= ### fcr_n_up_activation_factor The fraction (between 0.0 and 1.0) of the allocated FCR-N up reserves on the units of the plant that is expected to be activated (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:fcr_n_down_activation_factor)= ### fcr_n_down_activation_factor The fraction (between 0.0 and 1.0) of the allocated FCR-N down reserves on the units of the plant that is expected to be activated (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:fcr_d_up_activation_factor)= ### fcr_d_up_activation_factor The fraction (between 0.0 and 1.0) of the allocated FCR-D up reserves on the units of the plant that is expected to be activated (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:fcr_d_down_activation_factor)= ### fcr_d_down_activation_factor The fraction (between 0.0 and 1.0) of the allocated FCR-D down reserves on the units of the plant that is expected to be activated (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:frr_up_activation_factor)= ### frr_up_activation_factor The fraction (between 0.0 and 1.0) of the allocated FRR up reserves on the units of the plant that is expected to be activated (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:frr_down_activation_factor)= ### frr_down_activation_factor The fraction (between 0.0 and 1.0) of the allocated FRR down reserves on the units of the plant that is expected to be activated (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:rr_up_activation_factor)= ### rr_up_activation_factor The fraction (between 0.0 and 1.0) of the allocated RR up reserves on the units of the plant that is expected to be activated (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:rr_down_activation_factor)= ### rr_down_activation_factor The fraction (between 0.0 and 1.0) of the allocated RR down reserves on the units of the plant that is expected to be activated (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:fcr_n_up_activation_penalty_cost)= ### fcr_n_up_activation_penalty_cost The penalty cost for violating the reserve activation constraints caused by FCR-N up reserves on this plant (xUnit: NO_UNIT, yUnit: NOK/MM3) (plant:fcr_n_down_activation_penalty_cost)= ### fcr_n_down_activation_penalty_cost The penalty cost for violating the reserve activation constraints caused by FCR-N down reserves on this plant (xUnit: NO_UNIT, yUnit: NOK/MM3) (plant:fcr_d_up_activation_penalty_cost)= ### fcr_d_up_activation_penalty_cost The penalty cost for violating the reserve activation constraints caused by FCR-D up reserves on this plant (xUnit: NO_UNIT, yUnit: NOK/MM3) (plant:fcr_d_down_activation_penalty_cost)= ### fcr_d_down_activation_penalty_cost The penalty cost for violating the reserve activation constraints caused by FCR-D down reserves on this plant (xUnit: NO_UNIT, yUnit: NOK/MM3) (plant:frr_up_activation_penalty_cost)= ### frr_up_activation_penalty_cost The penalty cost for violating the reserve activation constraints caused by FRR up reserves on this plant (xUnit: NO_UNIT, yUnit: NOK/MM3) (plant:frr_down_activation_penalty_cost)= ### frr_down_activation_penalty_cost The penalty cost for violating the reserve activation constraints caused by FRR down reserves on this plant (xUnit: NO_UNIT, yUnit: NOK/MM3) (plant:rr_up_activation_penalty_cost)= ### rr_up_activation_penalty_cost The penalty cost for violating the reserve activation constraints caused by RR up reserves on this plant (xUnit: NO_UNIT, yUnit: NOK/MM3) (plant:rr_down_activation_penalty_cost)= ### rr_down_activation_penalty_cost The penalty cost for violating the reserve activation constraints caused by RR down reserves on this plant (xUnit: NO_UNIT, yUnit: NOK/MM3) (plant:sum_reserve_up_max)= ### sum_reserve_up_max Sets a maximum limit for the sum of all upward reserve types delivered for the plant. The sum ranges over reserves delivered on all generators and pumps in the plant (xUnit: NO_UNIT, yUnit: MW) (plant:sum_reserve_down_max)= ### sum_reserve_down_max Sets a maximum limit for the sum of all downward reserve types delivered for the plant. The sum ranges over reserves delivered on all generators and pumps in the plant (xUnit: NO_UNIT, yUnit: MW) (plant:max_q_reserve_constr)= ### max_q_reserve_constr The maximal discharge allowed through the plant when potential upward reserve activation is considered in addition to the planned plant discharge (xUnit: NO_UNIT, yUnit: M3/S) (plant:min_q_reserve_constr)= ### min_q_reserve_constr The minimal discharge allowed through the plant when potential downward reserve activation is considered in addition to the planned plant discharge (xUnit: NO_UNIT, yUnit: M3/S) (plant:max_q_reserve_constr_penalty_cost)= ### max_q_reserve_constr_penalty_cost The penalty cost incurred for violating the max_q_reserve_constr constraint, the max_q_constr_penalty_cost is used otherwise (xUnit: NO_UNIT, yUnit: NOK/H/M3/S) (plant:min_q_reserve_constr_penalty_cost)= ### min_q_reserve_constr_penalty_cost The penalty cost incurred for violating the min_q_reserve_constr constraint, the min_q_constr_penalty_cost is used otherwise (xUnit: NO_UNIT, yUnit: NOK/H/M3/S) (plant:sum_reserve_up_max_penalty_cost)= ### sum_reserve_up_max_penalty_cost The penalty cost incurred for violating the sum_reserve_up_max constraint, the reserve_penalty_cost is used otherwise (xUnit: NO_UNIT, yUnit: NOK/MW) (plant:sum_reserve_down_max_penalty_cost)= ### sum_reserve_down_max_penalty_cost The penalty cost incurred for violating the sum_reserve_down_max constraint, the reserve_penalty_cost is used otherwise (xUnit: NO_UNIT, yUnit: NOK/MW) (plant:reserve_tactical_activation_cost_scaling)= ### reserve_tactical_activation_cost_scaling The penalty cost for violating the tactical reservoir volumes is decided by the reserve activation penalty cost scaled by this factor. If the default value of -1 is not changed, the reserve_tactical_activation_cost_scaling attribute on the global_settings object will be used instead (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:coupled_fcr_activation_flag)= ### coupled_fcr_activation_flag If this flag is set to 1, 100% of the FCR-N reserves will be considered activated when building FCR-D reserve activation constraints for the reservoirs around this power plant (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:ramping_step_reference_discharge)= ### ramping_step_reference_discharge If multiple ramping steps XY curves are given, this timeseries decides which curve is used. The curve with reference that is both smaller than and closest to the TXY value. If no curve references are smaller, the closest one will be used. (xUnit: M3/S, yUnit: NO_UNIT) (plant:min_uptime)= ### min_uptime Minimum up-time on plant level, given in whole minutes. (xUnit: MINUTE, yUnit: MINUTE) (plant:min_downtime)= ### min_downtime Minimum down-time on plant level, given in whole minutes. (xUnit: MINUTE, yUnit: MINUTE) (plant:min_uptime_flag)= ### min_uptime_flag Flag for turning on/off the minimum plant up-time constraints. (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:min_downtime_flag)= ### min_downtime_flag Flag for turning on/off the minimum plant down-time constraints. (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:historical_production)= ### historical_production The plant production for times before the optimization start. If not provided, historical production on generator level is checked. (xUnit: NO_UNIT, yUnit: MW) (plant:historical_consumption)= ### historical_consumption The plant consumption for times before the optimization start. If not provided, historical consumption on pump level is checked. (xUnit: NO_UNIT, yUnit: MW) (plant:simultanous_generating_pumping_flag)= ### simultanous_generating_pumping_flag Flag determining whether simultanously generating and pumping is allowed in the plant. Default setting is 0 (not allowed). (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:max_prod_reserve_strategy)= ### max_prod_reserve_strategy Overrides the global_setting attribute 'plant_max_prod_reserve_strategy' if set to a value other than 'NOT SET' (default), see the documentation for 'plant_max_prod_reserve_strategy' for a description of the different strategies (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:min_prod_reserve_strategy)= ### min_prod_reserve_strategy Overrides the global_setting attribute 'plant_min_prod_reserve_strategy' if set to a value other than 'NOT SET' (default), see the documentation for 'plant_min_prod_reserve_strategy' for a description of the different strategies (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:max_prod_reserve_penalty_cost)= ### max_prod_reserve_penalty_cost The penalty cost for violating the maximum limits for plant production including upward reserve capacity created by 'plant_max_prod_reserve_strategy'. If not specified, the penalty is the same as for violating the max_p_constr plant constraint (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:min_prod_reserve_penalty_cost)= ### min_prod_reserve_penalty_cost The penalty cost for violating the minimum limits for plant production including downward reserve capacity created by 'plant_min_prod_reserve_strategy'. If not specified, the penalty is the same as for violating the min_p_constr plant constraint (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:strict_pq_uploading_flag)= ### strict_pq_uploading_flag If this flag is set to 1 for a time step, strict uploading constraints using binary variables for each PQ curve segment can be built for all generators on the plant object. See the attribute description for strict_pq_uploading_upon_detection for more information about automatic selection of hours to build strict PQ curve uploading. No strict uploading constraints are built for time steps where the flag is set to zero, or if the flag is not defined (default) (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:strict_pq_uploading_upon_detection)= ### strict_pq_uploading_upon_detection Setting this attribute to 1 will turn on building of strict PQ curve uploading constraints for the genarators of the plant. These constraints will only be built if incorrrect uploading has been detected for the plant and time step in a previous iteration AND if the strict_pq_uploading_flag is set to 1. Building these constraints upon detection is turned off when this attribute is set to zero (default), which means that all hours where strict_pq_uploading_flag = 1 will include the constraints. (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:production)= ### production Resulting plant production, i.e. sum of resulting generator production (xUnit: NO_UNIT, yUnit: MW) (plant:solver_production)= ### solver_production Preliminary result for the sum of generator production that is returned by the linearized optimization problem (xUnit: NO_UNIT, yUnit: MW) (plant:sim_production)= ### sim_production Simulated plant production (xUnit: NO_UNIT, yUnit: MW) (plant:prod_unbalance)= ### prod_unbalance Difference between the result of the non-linear post-calculation (production) and the production determined by the linear optimization problem (solver_production) (xUnit: NO_UNIT, yUnit: MW) (plant:consumption)= ### consumption Resulting plant consumption, i.e. sum of resulting pump consumption (xUnit: NO_UNIT, yUnit: MW) (plant:sim_consumption)= ### sim_consumption Simulated plant consumption, i.e. sum of resulting pump consumption (xUnit: NO_UNIT, yUnit: MW) (plant:solver_consumption)= ### solver_consumption Preliminary result for the sum of pump consumption that is returned by the linearized optimization problem (xUnit: NO_UNIT, yUnit: MW) (plant:cons_unbalance)= ### cons_unbalance Difference between the result of the non-linear post-calculation (consumption) and the consumption determined by the linear optimization problem (solver_consumption) (xUnit: NO_UNIT, yUnit: MW) (plant:discharge)= ### discharge Resulting plant discharge, i.e. sum of resulting generator discharge (xUnit: NO_UNIT, yUnit: M3/S) (plant:solver_discharge)= ### solver_discharge Preliminary result for the sum of generator discharge that is returned by the linearized optimization problem (xUnit: NO_UNIT, yUnit: M3/S) (plant:sim_discharge)= ### sim_discharge Simulated plant discharge (xUnit: NO_UNIT, yUnit: M3/S) (plant:upflow)= ### upflow Resulting plant upflow, i.e. sum of resulting pump upflow (xUnit: NO_UNIT, yUnit: M3/S) (plant:sim_upflow)= ### sim_upflow Simulated plant upflow, i.e. sum of resulting pump upflow (xUnit: NO_UNIT, yUnit: M3/S) (plant:solver_upflow)= ### solver_upflow Preliminary result for the sum of pump upflow that is returned by the linearized optimization problem (xUnit: NO_UNIT, yUnit: M3/S) (plant:gross_head)= ### gross_head Plant gross head, i.e. the difference between upstream reservoir water level and max(plant outlet_line, downstream reservoir water level) (xUnit: NO_UNIT, yUnit: METER) (plant:eff_head)= ### eff_head Resulting plant effective head. If overall generating, effective plant head is defined as the lowest eff_head of the generators. If overall pumping, effective plant head is defined as the highest eff_head of the pumps. (xUnit: NO_UNIT, yUnit: METER) (plant:head_loss)= ### head_loss Plant head loss, i.e. the plant gross head minus the lowest effective head of the unit in the plant. If overall generating, plant head loss is positive. If overall pumping, plant head loss is negative. (xUnit: NO_UNIT, yUnit: METER) (plant:min_p_penalty)= ### min_p_penalty Resulting penalty when the time-dependent maximum production limit for the plant is violated (xUnit: NO_UNIT, yUnit: MW) (plant:max_p_penalty)= ### max_p_penalty Resulting penalty when the time-dependent maximum production limit for the plant is violated (xUnit: NO_UNIT, yUnit: MW) (plant:min_q_penalty)= ### min_q_penalty Resulting penalty when the time-dependent minimum discharge limit for the plant is violated (xUnit: NO_UNIT, yUnit: MM3) (plant:max_q_penalty)= ### max_q_penalty Resulting penalty when the time-dependent maximum discharge limit for the plant is violated (xUnit: NO_UNIT, yUnit: MM3) (plant:p_constr_penalty)= ### p_constr_penalty Resulting penalty cost when the time-dependent maximum or minimum production limit for the plant is violated (xUnit: NO_UNIT, yUnit: NOK) (plant:q_constr_penalty)= ### q_constr_penalty Resulting penalty cost when the time-dependent maximum or minimum discharge limit for the plant is violated (xUnit: NO_UNIT, yUnit: NOK) (plant:schedule_up_penalty)= ### schedule_up_penalty Resulting penalty when deviating above the plant schedule (xUnit: NO_UNIT, yUnit: NOK) (plant:schedule_down_penalty)= ### schedule_down_penalty Resulting penalty when deviating below the plant schedule (xUnit: NO_UNIT, yUnit: NOK) (plant:schedule_penalty)= ### schedule_penalty Resulting penalty cost for violation of the plant schedule (xUnit: NO_UNIT, yUnit: NOK) (plant:max_prod_all)= ### max_prod_all Maximum plant production if all generators not on maintenance in the plant are producing at maximum. (xUnit: MW, yUnit: MW) (plant:max_prod_available)= ### max_prod_available Maximum plant production if all generators not on maintenance or committed off in the plant are producing at maximum. (xUnit: MW, yUnit: MW) (plant:max_prod_spinning)= ### max_prod_spinning Maximum plant production if all the spinning generators in the plant are producing at maximum. (xUnit: MW, yUnit: MW) (plant:min_prod_spinning)= ### min_prod_spinning Minimum plant production if all the spinning generators in the plant are producing at minimum. (xUnit: MW, yUnit: MW) (plant:best_profit_q)= ### best_profit_q Plant discharge after changing the production of the plant from the current operating point to a new point in the best profit curve of the plant. Created after the command 'create bp_curves' has been performed (xUnit: MW, yUnit: M3/S) (plant:best_profit_mc)= ### best_profit_mc Marginal production cost after changing the production of the plant from the current operating point to a new point in the best profit curve of the plant. Created after the command 'create bp_curves' has been performed (xUnit: MW, yUnit: NOK/MW) (plant:best_profit_ac)= ### best_profit_ac Average production cost after changing the production of the plant from the current operating point to a new point in the best profit curve of the plant. Created after the command 'create bp_curves' has been performed (xUnit: MW, yUnit: NOK/MW) (plant:best_profit_commitment_cost)= ### best_profit_commitment_cost Sum of startup costs or shutdown costs after changing the production of the plant from the current operating point to a new point in the best profit curve of the plant. Created after the command 'create bp_curves' has been performed (xUnit: MW, yUnit: NOK) (plant:best_profit_bid_matrix)= ### best_profit_bid_matrix A plant bid matrix created by reducing the best_profit_mc curves when the command 'print bp_bid_matrix' is called. The maximum number of price columns in the bid matrix is set by the attribute bp_bid_matrix_points on the global_settings object. (xUnit: MW, yUnit: NOK/MW) (plant:times_of_wrong_pq_uploading)= ### times_of_wrong_pq_uploading How many times the unit PQ segments are wrongly uploaded, i.e. the latter segments are fulfilled first. (xUnit: NO_UNIT, yUnit: NO_UNIT) (plant:max_prod_reserve_violation)= ### max_prod_reserve_violation The violation of the maximum limit for plant production including upward reserve capacity that is created by choosing a plant_max_prod_reserve_strategy. (xUnit: MW, yUnit: MW) (plant:min_prod_reserve_violation)= ### min_prod_reserve_violation The violation of the minimum limit for plant production including downward reserve capacity that is created by choosing a plant_min_prod_reserve_strategy. (xUnit: MW, yUnit: MW)