# Startup costs | | | |---|---| |License|yes| |Release version|V99| ## Introduction The theory and user manual in this article is copied from {cite:ps}`Helseth_startup_2017`. Long- and medium-term scheduling models normally assume that the hydropower stations can be turned on and off without additional operational costs. In most context, this has been a reasonable assumption, since these costs are low compared to other cost components, and since such models are normally run with a coarse time resolution. However, selling both energy and reserve capacity impacts the strategic valuation of water (water values). Realistic valuation of the cost of committing reserve capacity calls for exact unit commitment. That is, the model should know the status (on/off) of each station/generating unit and be able to count the costs associated with starting/stopping units. This feature cannot be covered exactly in long- and medium term hydropower scheduling models that are based on linear programming (such as e.g. Prodrisk and the EMPS model). However, we can approximate the unit start-up costs by introducing linear constraints. To prepare ProdRisk for a future where model users want to apply a finer time resolution and perhaps evaluate the impact of selling reserve capacity in addition to energy, it was decided to implement linearized start-up costs in ProdRisk. ## Mathematical formulation ### Basic constraints Linearized start up-costs on thermal units are available in the EMPS model. The mathematical formulation presented here follows the method outlined in {cite:ps}`pump_wind_2013`. The user can define a set of modules for which start-up costs should apply. For each module the following set of constraints are added to the LP model. $$ u_L^kQ^{min}+u_H^k\left( Q^{max}-Q^{min} \right) - \sum_{s \in S}q_s^k+q_d^k=\hat{Q}^{min} \ \ \ \ (1.1)\\ u_L^k-u_H^k \geq 0 \ \ \ \ (1.2)\\ u_L^k-u_L^{k-1}-\delta^k \leq 0 \ \ \ \ (1.3) $$ Three new variables are introduced, namely $k_L^u$, $k_H^u$ and $k_{\delta}$. All of these are fractions, i.e. real numbers between 0.0 and 1.0. We use an illustration to explain the variables used above. The figure shows a PQ-curve for a hydropower module. ![](./PQ_curve.png)
The figure shows a PQ-curve and associated variables for a hydropower module.
**Point A** indicates the minimum discharge $\hat{Q}^{min}$ that can be defined for the module. In Prodrisk there is a penalty associated with violating the minimum discharge. This minimum discharge is represented as a parameter, and a variable $q_d^k$ is introduced giving the deviation from the minimum discharge. We penalize the use of $q_d^k$. This modeling trick was introduced to avoid excessively high values in the objective function of the LP problem. **Point B** indicates the minimum discharge $Q^{min}$ defined when entering the start-up cost data. The most intuitive would be to state a minimum power output, but the power output obtained from the PQ-curve is head dependent, so it is easier to work with a minimum discharge. **Point C** indicates the maximum discharge. This parameter is obtained from the PQ-curve. The variable $u_L^k$ gives the fraction of the minimum discharge being used. The variable $u_H^k$ gives the fraction between the minimum and maximum discharge being used. Equation **(1.1)** states the relationship between the lower and upper fractions and the discharge segments $q_s^k$ that represents the PQ-curve. Equation **(1.2)** ensures that the minimum discharge fraction always is at least as high as the maximum discharge. Note that the start-up cost is associated with $u_L^k$, so this constraint prevents loading all discharge on $u_H^k$. Equation **(1.3)** provides a coupling between time steps (denoted *k*). In case $u_L^k$ is higher than $u_L^{k−1}$, a (full or partial) start-up is registered by the variable $k_{\delta}$. The following objective function term keeps track of the start-up costs: $$ \sum_{h \in H}\sum_{k \in K}c_h^k \delta_h^k \ \ \ \ (1.4) $$ ### Cut contribution The minimum discharge fraction $u_L^k$ can be seen as a unit commitment or status variable, indicating "how much" the module has been started-up. If the station is running above $Q^{min}$ but not at maximum discharge, it will be beneficial to have $u_L^k=1.0$ so discharge increases in later periods comes at no additional costs. Prodrisk solves weekly decision (LP) problems where time-couplings to the next week are valuated through cuts. The time coupling in Equation **(1.3)** indicate that the variable $u_L^k$ carries information between weeks and should be included in the cuts. If not, the model will not see the benefit of passing a high value on $u_L^k$, where *K* is the last time step within the week, to the next week. If run with start-up cost, the new cut will take the following form: $$ \alpha_{t+1} + \pi^T\left( v-v^* \right) + \mu^T\left( z-z^* \right) + \gamma^T\left( u_L^K-u_L^{K,*} \right) \geq \alpha_{t+1}^* \ \ \ \ (1.5) $$ Here, $\gamma$ is a vector of cut coefficients giving the sensitivity on the objective function of marginally changing the commitment status $u_L^k$. ## Use of startup costs Start-up costs are defined in the input file *constraints.xml*. An example is shown below: ``` ... ... ... ``` where each group contains the following elements: ``` ``` The elements *NAME* and *VALUE* and the attribute *ModulNr* are required, while the element *COMMENT* and *ModulName* are optional and used for clarification. In the following subchapters, the XML-groups are described. *The start-up functionality is not yet available through the API.* ### Group *StartCostHPP* This is an overall controller of start-up cost on hydro power stations. This group can contain the following parameters (name, default values and description): |\ |\ |\ | |---------------|-----------|---------------------------------------------------| |USEStartCost | F |T is use start cost on hydro power plant, F is not | **SEStartCost** is a logical, and turn on and off start cost restrictions. If false (F) start cost is not use and true (T) is use start-up cost restriction. Default is false (F). ### Group *StartCostHPP ModulNr=""* and *StartCostHPump ModulNr=""* These two groups provide descriptions of each hydro power station described. To separate these group from the overall controller a module number most be given after *ModulNr*, e.g. *ModulNr=”101″*. There is no difference between the two groups in input variables. The only difference is *StartCostHPP*, which is used for production units, and *StartCostHPump*, which is used for pumps. If the station is a hydro pumped-storage plant, and there should be start-up cost for turbine, and pump both group must be defined. These groups can contain the following variables (name, default values and description): |\ |\ |\ | |---------------|---------------|-------------------------------| |StartCost |0.0 |Start-up cost in [kNOK or k€] | |InitalStart |0.0 |Initial start condition, 1=on, 0=off| |QMinProd |0.0 |Minimum discharge in [%] of max discharge| |PMinProd |0.0 |Minimum generation in [MW]| **StartCost** is a float number giving the cost for one start up. The currency (kNOK or k€) depends on the monetary unit used for the rest of the input. For example, if prices are in €c/kWh, then start-up costs should be stated in k€. The default value is zero. **InitialStart** is a float number giving the initial state of the station. The number 1 indicates that the station is running initially, and 0 indicates that the station is not running, and a fraction between 0 and 1 indicate a partial start-up. **QMinProd** is a float number giving the minimum discharge in percentage of maximum discharge for the station. If the value is zero, start-up costs will not be used. The default value is zero. **PMinProd** is a float number giving the minimum generation in MW. This variable is only used for pumps. In case both PMinProd and QMinProd are defined for a pump, QMinProd is used. If the value of PMinProd is zero, start-up costs will not be used. The default value is zero. ## Example The following text is an example of the content that can be put in the file “constraints.xml” to apply start-up costs on stations (generators and pumps). ``` USEStartCost T StartCost 50 QMinProd 80 InitalStart 1 StartCost 500 PMinProd 50 InitalStart 1 ``` ### Preparation To use start-up cost the file *Constrians.xml* must be defined and located on the data set folder. The interpreted input from the file *Constraints.xml* will be echoed to the file *Constraints-control.xml*, serving as a validity check of the input. **Using start-up costs requires the use of sequential time resolution.** For ProdRisk this means that the command line option **-SEKV** should be defined. Start-up costs will then be included in the period defined by **JSEKV_STARTUKE** and **JSEKV_SLUTTUKE**. These two parameters are defined in the file *prodrisk.CPAR*, see [](../../settings/cpar_control_parameters/cpar_control_parameters.md). If start-up costs are successfully included, the following line is written to the screen (or log if screen output are piped to a log) ![](./startup_log.png) ### Output If start-up costs are successfully included, a message is written to screen stating the average sum of start-up costs incurred for the simulation horizon in the final simulation. The average is taken over the inflow years and price scenarios (if there are multiple price scenarios per inflow year). ![](./startup_output.png) ProdRisk writes a separate file named *UC_verdi.dat* documenting the value on the "unit commitment" variable $u_L^k$ obtained in the final simulation. This file is primarily intended for debug and verification purposes. One can verify the reported average start-up costs by counting the starts reported in *UC_verdi.dat*. The file *UC_verdi.dat* will have the following format: ![](./startup_UC_verdi.png) Where column 1 gives the module number (from 1 to the number of modules with start-up costs) Column 2 gives the scenario index, column 3 the inflow year index, column 4 the week index. The next columns give the value of $u_L^k$ for each time step within the week. This value should be a fraction between 0.0 and 1.0. ### Practicalitites The start-up cost functionality can be run together with defined planned outages through the file **REVISJONSPLAN.STAS**. The commitment status (as written to *UC_verdi.dat*) will then refer to the remaining available discharge capacity. The start-up cost functionality does not work for modules where owner's share ("Eierandel") is set to zero. Initial day (Startdøgn) is not considered, the initial start state will refer to the beginning of the week. The start-up functionality is not yet available through the API.