--- jupytext: text_representation: extension: .md format_name: myst format_version: 0.13 jupytext_version: 1.13.8 kernelspec: display_name: 'Python 3' name: python3 --- (reserve_group)= # reserve_group Represents a group of generators, pumps, and batteries that collectively serve to fulfill a reserve capacity obligation. SHOP distinguishes between eight different types of reserve capacity products: FCR-N, FCR-D, FRR, and RR in both upward and downward directions. | | | |---|---| |Input connections|{ref}`generator`, {ref}`pump`, {ref}`market`, {ref}`battery`| |Output connections|{ref}`generator`, {ref}`pump`, {ref}`battery`, {ref}`market`| |License|SHOP_RESERVE_GROUP| |Release version|13.0.0.a| ```{contents} :local: :depth: 1 ``` ## Introduction The reserve_group object is used to optimally distribute reserve capacity among all [generators](generator), [pumps](pump), and [batteries](battery) that are connected to the reserve_group. The [reserve capacity tutorial](reserves) describes how different types of reserve capacity is modelled in SHOP. The reserve_group is used for mainly two purposes: to specify a fixed reserve capacity obligation to be optimally distributed, and to connect units to a reserve [](market) where reserve capacity can be traded. ## Distributing a reserve obligation The simplest use for a reserve_group is for optimal distribution of a reserve obligation among a set of eligible generators, pumps, and batteries. The reserve obligation is specified on the reserve_group, and is specific to a type of reserve capacity such as the [fcr_n_up_obligation](reserve_group:fcr_n_up_obligation). Several different types of reserve capacity obligations can be specified on the same reserve_group, but it is recommended to create separate reserve_groups for different reserve types. The units that are connected to the reserve_group will be able to deliver reserve capacity of the types that are specified in the obligation(s), and the sum of the reserve capacity allocated on the different units must meet the obligation to avoid taking a penalty. The [reserve allocation example](reserve-example) shows how several generators cooperate to cover the reserve obligations specified in the reserve_groups. ## Reserve capacity markets It is possible to create a reserve capacity market by connecting a reserve_group to a market object and setting the [market_type](market:market_type) of the market to be a reserve type, such as FRR_UP. The units connected to the reserve_group can now participate in the reserve market by selling reserve capacity to earn the [sale_price](market:sale_price), as long as the market depth [max_sale](market:max_sale) is set larger than zero. Note that reserve capacity also can be bought in the market if [max_buy](market:max_buy) is larger than zero. Any reserve obligation on the reserve_group will be handled as a load in the market, which means that the obligation must be covered before additional capacity can be sold. ## Examples - [](reserves) - [](reserve-example) - [](reserve-market-example) - [](battery_reserves) - [](plant-reserve-strategy) ## References - Opportunity-cost-pricing of reserves for a simple hydropower system {cite}`Aasgard2016a` - Operational hydropower scheduling with post-spot distribution of reserve obligations {cite}`Kong2017` - Accounting for reserve capacity activation when scheduling a hydropower dominated system {cite}`Naversen2020b` - Operational use of marginal cost curves for hydropower plants as decision support in real-time balancing markets {cite}`Skjelbred2017a` - Coordinated hydropower bidding in the day-ahead and balancing market {cite}`Aasgard2019a` - Hydropower bidding in a multi-market setting {cite}`Aasgard2019b` - The value of coordinated hydropower bidding in the Nordic day-ahead and balancing market {cite}`Aasgard2022` ## Attributes ```{code-cell} ipython3 :tags: ['remove-input', 'full-width'] from IPython.core.display import HTML HTML("""
""") ``` (reserve_group:fcr_n_up_obligation)= ### fcr_n_up_obligation The obligation of FCR_N_UP that should be fulfilled by the reserve group (xUnit: NO_UNIT, yUnit: MW) (reserve_group:fcr_n_down_obligation)= ### fcr_n_down_obligation The obligation of FCR_N_DOWN that should be fulfilled by the reserve group (xUnit: NO_UNIT, yUnit: MW) (reserve_group:fcr_d_up_obligation)= ### fcr_d_up_obligation The obligation of FCR_D_UP that should be fulfilled by the reserve group (xUnit: NO_UNIT, yUnit: MW) (reserve_group:fcr_d_down_obligation)= ### fcr_d_down_obligation The obligation of FCR_D_DOWN that should be fulfilled by the reserve group (xUnit: NO_UNIT, yUnit: MW) (reserve_group:frr_up_obligation)= ### frr_up_obligation The obligation of FRR_UP that should be fulfilled by the reserve group (xUnit: NO_UNIT, yUnit: MW) (reserve_group:frr_down_obligation)= ### frr_down_obligation The obligation of FRR_DOWN that should be fulfilled by the reserve group (xUnit: NO_UNIT, yUnit: MW) (reserve_group:rr_up_obligation)= ### rr_up_obligation The obligation of RR_UP that should be fulfilled by the reserve group (xUnit: NO_UNIT, yUnit: MW) (reserve_group:rr_down_obligation)= ### rr_down_obligation The obligation of RR_DOWN that should be fulfilled by the reserve group (xUnit: NO_UNIT, yUnit: MW) (reserve_group:fcr_n_penalty_cost)= ### fcr_n_penalty_cost Given penalty cost for deviating below the FCR_N_UP or FCR_N_DOWN obligation for the reserve group (xUnit: NO_UNIT, yUnit: NOK/MW) (reserve_group:fcr_d_penalty_cost)= ### fcr_d_penalty_cost Given penalty cost for deviating below the FCR_D_UP obligation for the reserve group (xUnit: NO_UNIT, yUnit: NOK/MW) (reserve_group:frr_penalty_cost)= ### frr_penalty_cost Given penalty cost for deviating below the FRR_UP or FRR_DOWN obligation for the reserve group (xUnit: NO_UNIT, yUnit: NOK/MW) (reserve_group:rr_penalty_cost)= ### rr_penalty_cost Given penalty cost for deviating below the RR_UP or RR_DOWN obligation for the reserve group (xUnit: NO_UNIT, yUnit: NOK/MW) (reserve_group:fcr_n_up_slack)= ### fcr_n_up_slack Resulting slack when deviating above the FCR_N_UP obligation (xUnit: NO_UNIT, yUnit: MW) (reserve_group:fcr_n_down_slack)= ### fcr_n_down_slack Resulting slack when deviating above the FCR_N_DOWN obligation (xUnit: NO_UNIT, yUnit: MW) (reserve_group:fcr_d_up_slack)= ### fcr_d_up_slack Resulting slack when deviating above the FCR_D_UP obligation (xUnit: NO_UNIT, yUnit: MW) (reserve_group:fcr_d_down_slack)= ### fcr_d_down_slack Resulting slack when deviating above the FCR_D_DOWN obligation (xUnit: NO_UNIT, yUnit: MW) (reserve_group:frr_up_slack)= ### frr_up_slack Resulting slack when deviating above the FRR_UP obligation (xUnit: NO_UNIT, yUnit: MW) (reserve_group:frr_down_slack)= ### frr_down_slack Resulting slack when deviating above the FRR_DOWN obligation (xUnit: NO_UNIT, yUnit: MW) (reserve_group:rr_up_slack)= ### rr_up_slack Resulting slack when deviating above the RR_UP obligation (xUnit: NO_UNIT, yUnit: MW) (reserve_group:rr_down_slack)= ### rr_down_slack Resulting slack when deviating above the RR_DOWN obligation (xUnit: NO_UNIT, yUnit: MW) (reserve_group:fcr_n_up_violation)= ### fcr_n_up_violation Resulting penalty when deviating below the FCR_N_UP obligation (xUnit: NO_UNIT, yUnit: MW) (reserve_group:fcr_n_down_violation)= ### fcr_n_down_violation Resulting penalty when deviating below the FCR_N_DOWN obligation (xUnit: NO_UNIT, yUnit: MW) (reserve_group:fcr_d_up_violation)= ### fcr_d_up_violation Resulting penalty when deviating below the FCR_D_UP obligation (xUnit: NO_UNIT, yUnit: MW) (reserve_group:fcr_d_down_violation)= ### fcr_d_down_violation Resulting penalty when deviating below the FCR_D_DOWN obligation (xUnit: NO_UNIT, yUnit: MW) (reserve_group:frr_up_violation)= ### frr_up_violation Resulting penalty when deviating below the FRR_UP obligation (xUnit: NO_UNIT, yUnit: MW) (reserve_group:frr_down_violation)= ### frr_down_violation Resulting penalty when deviating below the FRR_DOWN obligation (xUnit: NO_UNIT, yUnit: MW) (reserve_group:rr_up_violation)= ### rr_up_violation Resulting penalty when deviating below the RR_UP obligation (xUnit: NO_UNIT, yUnit: MW) (reserve_group:rr_down_violation)= ### rr_down_violation Resulting penalty when deviating belown the RR_DOWN obligation (xUnit: NO_UNIT, yUnit: MW)