{ "cells": [ { "cell_type": "markdown", "id": "7a8817f0", "metadata": {}, "source": [ "(needle_combination)=\n", "# needle_combination\n", "A needle combination or isolated production zone of a generator with separate turbine efficiency curves. Can be used to model pelton turbines and other turbines with forbidden production zones\n", "\n", "| | |\n", "|---|---|\n", "|Input connections|{ref}`generator`, {ref}`needle_comb_reserve_capability`|\n", "|Output connections|{ref}`generator`, {ref}`needle_comb_reserve_capability`|\n", "|License|SHOP_PELTON|\n", "|Release version|13.0.0.a|\n", "\n", "```{contents}\n", ":local:\n", ":depth: 1\n", "```\n", "\n", "## Introduction\n", "The needle_combination object in SHOP is used to model both Pelton turbines and [generators](generator) with forbidden production and/or discharge zones. The SHOP_PELTON license is required to use the needle_combination object. \n", "\n", "## Pelton turbines\n", "When modelling a Pelton unit, the needle_combination represents the production and discharge characteristics of the unit when a specific combination of needles is controlling the flow of water through the nozzle. The attributes [p_min](needle_combination:p_min), [p_max](needle_combination:p_max), [p_nom](needle_combination:p_nom), and [turb_eff_curves](needle_combination:turb_eff_curves) are specified on the needle_combination object to describe its operating range and efficiency. Defining multiple needle_combinations and then connecting them to a generator object will enable SHOP to choose which of the needle_combinations (if any) should be used to generate power in each hour. \n", "\n", "## Turbine with forbidden operating regions\n", "Other turbine types, such as Francis turbines, is usually modelled as having a continuous operating range between [p_min](generator:p_min) and [p_max](generator:p_max) in SHOP. However, some turbines may experience vibration or other unwanted behaviour when discharging water or producing power in a region within its operating range. These forbidden production and/or discharge regions can be modelled by using the needle_combination object. Having needle_combinations without overlap in production and/or discharge ranges will force SHOP to not operate in the forbidden region(s). This is shown in more detail in [this example](pelton).\n", "\n", "## MIP\n", "Running SHOP without binary variables can lead to fractional commitment of generators and production below p_min. This problem can be more pronounced for generators modelled with needle_combinations, since it will be possible to fractionally operate on more than one needle_combination at the same time. The only way to ensure that this problem does not occur is to have an active [mip_flag](plant:mip_flag), which will force the optimization to pick only one needle_combination to operate on. Especially Pelton units delivering [reserves](reserves) may be \"tempted\" to operate a little bit on several needle_combinations to more easily deliver reserve capacity.\n", "\n", "## Input and output\n", "Most of the results for generators modelled with the use of needle_combinations are still found on the generator object, such as [production](generator:production) and [discharge](generator:discharge). A few output attributes are still saved on the needle_combination object, which can be seen in the attribute table below. The same is true for the input attributes, all input generator attributes are still used for Pelton turbines, except for p_min, p_max, p_nom, and turb_eff_curves on the needle_combination object. Some attributes exist on both the generator and needle_combination, such as [p_fcr_min (generator)](generator:p_fcr_min) and [p_fcr_min (needle_combination)](needle_combination:p_fcr_min). In these cases the needle_combination attribute is preferred over the generator attribute, but the generator attribute is still used if it is not present on the needle_combination.\n", "\n", "## Examples\n", " - [](pelton)\n", " \n", "\n", "\n", "\n", "## Attributes" ] }, { "cell_type": "code", "execution_count": 1, "id": "88732dda", "metadata": { "tags": [ "remove-input", "full-width" ] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.core.display import HTML\n", "HTML(\"\"\"
\n", "\n", "\"\"\")" ] }, { "cell_type": "markdown", "id": "61b61c7e", "metadata": {}, "source": [ "(needle_combination:p_max)=\n", "### p_max\n", "Static maximum production for the needle combination (xUnit: MW, yUnit: MW)\n", "\n", "\n", "(needle_combination:p_min)=\n", "### p_min\n", "Static minimum production for the needle combination (xUnit: MW, yUnit: MW)\n", "\n", "\n", "(needle_combination:p_nom)=\n", "### p_nom\n", "The nominal production that is the rated capacity of the needle combination, only used for droop calculations (xUnit: MW, yUnit: MW)\n", "\n", "\n", "(needle_combination:turb_eff_curves)=\n", "### turb_eff_curves\n", "The turbine efficiency curve(s) as a function of discharge through the turbine for this needle_combination. Several curves can be specified for different head levels (reference value in the XY) to make the efficiency head-dependent. (xUnit: M3/S, yUnit: %)\n", "\n", "\n", "(needle_combination:p_fcr_min)=\n", "### p_fcr_min\n", "Temporary minimum production allowed for the needle combination when delivering FCR. If this is not set, any p_fcr_min attribute defined on the generator object will be used instead. Note that the p_fcr_n_min and p_fcr_d_min attributes on the needle_combination will take precedence over this attribute if both are specified. (xUnit: NO_UNIT, yUnit: MW)\n", "\n", "\n", "(needle_combination:p_fcr_n_min)=\n", "### p_fcr_n_min\n", "Temporary minimum production allowed for the needle combination when delivering FCR-N. If this attribute is not specified, the p_fcr_min attribute on the needle_combination object will be used instead (xUnit: NO_UNIT, yUnit: MW)\n", "\n", "\n", "(needle_combination:p_fcr_d_min)=\n", "### p_fcr_d_min\n", "Temporary minimum production allowed for the needle combination when delivering FCR-D. If this attribute is not specified, the p_fcr_min attribute on the needle_combination object will be used instead (xUnit: NO_UNIT, yUnit: MW)\n", "\n", "\n", "(needle_combination:p_fcr_max)=\n", "### p_fcr_max\n", "Temporary maximum production allowed for the needle combination when delivering FCR. If this is not set, any p_fcr_max attribute defined on the generator object will be used instead. Note that the p_fcr_n_max and p_fcr_d_max attributes on the needle_combination will take precedence over this attribute if both are specified. (xUnit: NO_UNIT, yUnit: MW)\n", "\n", "\n", "(needle_combination:p_fcr_n_max)=\n", "### p_fcr_n_max\n", "Temporary maximum production allowed for the needle combination when delivering FCR-N. If this attribute is not specified, the p_fcr_max attribute on the needle_combination object will be used instead (xUnit: NO_UNIT, yUnit: MW)\n", "\n", "\n", "(needle_combination:p_fcr_d_max)=\n", "### p_fcr_d_max\n", "Temporary maximum production allowed for the needle combination when delivering FCR-D. If this attribute is not specified, the p_fcr_max attribute on the needle_combination object will be used instead (xUnit: NO_UNIT, yUnit: MW)\n", "\n", "\n", "(needle_combination:p_frr_min)=\n", "### p_frr_min\n", "Minimum production allowed for the needle combination when delivering FRR. If not specified, the head-dependent minimum production for the needle combination is used as lower bound for downward FRR. (xUnit: NO_UNIT, yUnit: MW)\n", "\n", "\n", "(needle_combination:p_frr_max)=\n", "### p_frr_max\n", "Maximum production allowed for the needle combination when delivering FRR. If not specified, the head-dependent maximum production for the needle combination is used as upper bound for upward FRR (xUnit: NO_UNIT, yUnit: MW)\n", "\n", "\n", "(needle_combination:production_cost)=\n", "### production_cost\n", "Production cost depending on the production of the needle combination (xUnit: MW, yUnit: NOK/MW)\n", "\n", "\n", "(needle_combination:min_discharge)=\n", "### min_discharge\n", "Minimum discharge as a function of net head (xUnit: NO_UNIT, yUnit: NO_UNIT)\n", "\n", "\n", "(needle_combination:max_discharge)=\n", "### max_discharge\n", "Maximum discharge as a function of net head (xUnit: NO_UNIT, yUnit: NO_UNIT)\n", "\n", "\n", "(needle_combination:original_pq_curves)=\n", "### original_pq_curves\n", "Original PQ-curve for the needle combination that includes non-convex regions (xUnit: M3/S, yUnit: MW)\n", "\n", "\n", "(needle_combination:convex_pq_curves)=\n", "### convex_pq_curves\n", "Convexified PQ-curve for the needle combination that includes all the time-dependent operating limits and remove all the nonconcave points of the original PQ curve. The slope of each segment is non-increasing. (xUnit: M3/S, yUnit: MW)\n", "\n", "\n", "(needle_combination:final_pq_curves)=\n", "### final_pq_curves\n", "Final PQ curve for the needle combination that is the final form included into the MILP optimization problem. The first point of the convex PQ curve is extended to Q=0. (xUnit: M3/S, yUnit: MW)\n", "\n", "\n", "(needle_combination:max_prod)=\n", "### max_prod\n", "The head dependent maximal production of the needle_combination, most accurate in incremental iterations (xUnit: NO_UNIT, yUnit: MW)\n", "\n", "\n", "(needle_combination:min_prod)=\n", "### min_prod\n", "The head dependent minimal production of the needle_combination, most accurate in incremental iterations (xUnit: NO_UNIT, yUnit: MW)" ] } ], "metadata": { "jupytext": { "text_representation": { "extension": ".md", "format_name": "myst", "format_version": 0.13, "jupytext_version": "1.13.8" } }, "kernelspec": { "display_name": "Python 3", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.9" }, "source_map": [ 11, 51, 63 ] }, "nbformat": 4, "nbformat_minor": 5 }