Commit 1c4f17fb authored by Juha Kiviluoma's avatar Juha Kiviluoma
Browse files

Updating cold, warm and hot start parameter names (also minShutdownHours and minOperationHours)

parent 92b537bd
......@@ -283,16 +283,16 @@ param_unit "Set of possible data parameters for units" /
outputCapacityTotal "Output capacity of the unit, calculated by summing all the outputs together by default, unless defined in data"
availability "Availability of given energy conversion technology (p.u.)"
omCosts "Variable operation and maintenance costs (€/MWh)"
startCost "Variable start-up costs for cold starts excluding fuel costs (€/MW)"
startCostCold "Variable start-up costs for cold starts excluding fuel costs (€/MW)"
startCostWarm "Variable start-up costs for warm starts excluding fuel costs (€/MW)"
startCostHot "Variable start-up costs for hot starts excluding fuel costs (€/MW)"
startFuelCons "Consumption of start-up fuel per cold subunit started up (MWh_fuel/MW)"
startFuelConsCold "Consumption of start-up fuel per cold subunit started up (MWh_fuel/MW)"
startFuelConsWarm "Consumption of start-up fuel per warm subunit started up (MWh_fuel/MW)"
startFuelConsHot "Consumption of start-up fuel per hot subunit started up (MWh_fuel/MW)"
startCold "Offline hours after which the start-up will be a cold start (h)"
startWarm "Offline hours after which the start-up will be a warm start (h)"
minOperationTime "Minimum operation time (h), prevents shutdown after startup until the defined amount of time has passed"
minShutDownTime "Minimum shut down time (h), prevents starting up again after the defined amount of time has passed"
startColdAfterXhours "Offline hours after which the start-up will be a cold start (h)"
startWarmAfterXhours "Offline hours after which the start-up will be a warm start (h)"
minOperationHours "Minimum operation time (h), prevents shutdown after startup until the defined amount of time has passed"
minShutdownHours "Minimum shut down time (h), prevents starting up again after the defined amount of time has passed"
SO2 "SO2 emissions (tonne per MWh_fuel)"
NOx "NOx emissions (tonne per MWh_fuel)"
CH4 "CH4 emissions (tonne per MWh_fuel)"
......
......@@ -153,12 +153,12 @@ unit_fuel(unit)${ sum(fuel, uFuel(unit, 'main', fuel)) }
// All units can cold start (default start category)
unitStarttype(unit, starttype('cold')) = yes;
// Units with parameters regarding hot/warm starts
unitStarttype(unit, starttypeConstrained)${ p_unit(unit, 'startWarm')
unitStarttype(unit, starttypeConstrained)${ p_unit(unit, 'startWarmAfterXhours')
or p_unit(unit, 'startCostHot')
or p_unit(unit, 'startFuelConsHot')
or p_unit(unit, 'startCostWarm')
or p_unit(unit, 'startFuelConsWarm')
or p_unit(unit, 'startCold')
or p_unit(unit, 'startColdAfterXhours')
}
= yes;
......@@ -208,9 +208,9 @@ p_gnu(grid, node, unit, 'unitSizeGenNet')
// Determine unit startup parameters based on data
// Hot startup parameters
p_uNonoperational(unitStarttype(unit, 'hot'), 'min')
= p_unit(unit, 'minShutDownTime');
= p_unit(unit, 'minShutdownHours');
p_uNonoperational(unitStarttype(unit, 'hot'), 'max')
= p_unit(unit, 'startWarm');
= p_unit(unit, 'startWarmAfterXhours');
p_uStartup(unitStarttype(unit, 'hot'), 'cost', 'unit')
= p_unit(unit, 'startCostHot')
* sum(gnu_output(grid, node, unit), p_gnu(grid, node, unit, 'unitSizeGen'));
......@@ -220,9 +220,9 @@ p_uStartup(unitStarttype(unit, 'hot'), 'consumption', 'unit')
// Warm startup parameters
p_uNonoperational(unitStarttype(unit, 'warm'), 'min')
= p_unit(unit, 'startWarm');
= p_unit(unit, 'startWarmAfterXhours');
p_uNonoperational(unitStarttype(unit, 'warm'), 'max')
= p_unit(unit, 'startCold');
= p_unit(unit, 'startColdAfterXhours');
p_uStartup(unitStarttype(unit, 'warm'), 'cost', 'unit')
= p_unit(unit, 'startCostWarm')
* sum(gnu_output(grid, node, unit), p_gnu(grid, node, unit, 'unitSizeGen'));
......@@ -231,11 +231,13 @@ p_uStartup(unitStarttype(unit, 'warm'), 'consumption', 'unit')
* sum(gnu_output(grid, node, unit), p_gnu(grid, node, unit, 'unitSizeGen'));
// Cold startup parameters
p_uNonoperational(unitStarttype(unit, 'cold'), 'min')
= p_unit(unit, 'startColdAfterXhours');
p_uStartup(unit, 'cold', 'cost', 'unit')
= p_unit(unit, 'startCost')
= p_unit(unit, 'startCostCold')
* sum(gnu_output(grid, node, unit), p_gnu(grid, node, unit, 'unitSizeGen'));
p_uStartup(unit, 'cold', 'consumption', 'unit')
= p_unit(unit, 'startFuelCons')
= p_unit(unit, 'startFuelConsCold')
* sum(gnu_output(grid, node, unit), p_gnu(grid, node, unit, 'unitSizeGen'));
// Determine unit emission costs
......
......@@ -47,8 +47,8 @@ equations
q_startup(mType, unit, f, t) "Capacity started up is greater than the difference of online cap. now and in the previous time step"
q_startuptype(mType, starttype, unit, f, t) "Startup type depends on the time the unit has been non-operational"
q_onlineLimit(mType, unit, f, t) "Number of online units limited for units with startup constraints and investment possibility"
q_onlineMinUptime(mType, unit, f, t) "Unit must stay operational if it has started up during the previous minOperationTime hours"
* q_minDown(mType, unit, f, t) "Unit must stay non-operational if it has shut down during the previous minShutDownTime hours"
q_onlineMinUptime(mType, unit, f, t) "Unit must stay operational if it has started up during the previous minOperationHours hours"
* q_minDown(mType, unit, f, t) "Unit must stay non-operational if it has shut down during the previous minShutdownHours hours"
* q_genRamp(grid, node, mType, s, unit, f, t) "Record the ramps of units with ramp restricitions or costs"
* q_genRampChange(grid, node, mType, s, unit, f, t) "Record the ramp rates of units with ramping costs"
* q_rampUpLimit(grid, node, mType, s, unit, f, t) "Up ramping limited for units"
......@@ -570,7 +570,7 @@ q_startuptype(m, starttypeConstrained(starttype), uft_online(unit, f, t))${ unit
*--- Online Limits with Startup Type Constraints and Investments --------------
q_onlineLimit(m, uft_online(unit, f, t))${ p_unit(unit, 'minShutDownTime')
q_onlineLimit(m, uft_online(unit, f, t))${ p_unit(unit, 'minShutdownHours')
or unit_investLP(unit)
or unit_investMIP(unit)
} ..
......@@ -597,7 +597,7 @@ q_onlineLimit(m, uft_online(unit, f, t))${ p_unit(unit, 'minShutDownTime')
*--- Minimum Unit Uptime ------------------------------------------------------
q_onlineMinUptime(m, uft_online(unit, f, t))${ p_unit(unit, 'minOperationTime')
q_onlineMinUptime(m, uft_online(unit, f, t))${ p_unit(unit, 'minOperationHours')
} ..
// Units currently online
......
......@@ -299,13 +299,13 @@ loop(m,
// Find the time step displacements needed to define the downtime requirements
Option clear = cc;
cc(counter)${ ord(counter) <= p_unit(unit, 'minShutDownTime') / mSettings(m, 'intervalInHours') }
cc(counter)${ ord(counter) <= p_unit(unit, 'minShutdownHours') / mSettings(m, 'intervalInHours') }
= yes;
dt_downtimeUnitCounter(unit, cc(counter)) = - ord(counter);
// Find the time step displacements needed to define the uptime requirements
Option clear = cc;
cc(counter)${ ord(counter) <= p_unit(unit, 'minOperationTime') / mSettings(m, 'intervalInHours')}
cc(counter)${ ord(counter) <= p_unit(unit, 'minOperationHours') / mSettings(m, 'intervalInHours')}
= yes;
dt_uptimeUnitCounter(unit, cc(counter)) = - ord(counter);
); // END loop(effLevelGroupUnit)
......
......@@ -68,7 +68,7 @@ $$iftheni.debug NOT '%debug%' == 'yes'
Option clear = q_startuptype;
Option clear = q_onlineLimit;
Option clear = q_onlineMinUptime;
* q_minDown(mType, unit, f, t) "Unit must stay non-operational if it has shut down during the previous minShutDownTime hours"
* q_minDown(mType, unit, f, t) "Unit must stay non-operational if it has shut down during the previous minShutdownHours hours"
* q_genRamp(grid, node, mType, s, unit, f, t) "Record the ramps of units with ramp restricitions or costs"
* q_genRampChange(grid, node, mType, s, unit, f, t) "Record the ramp rates of units with ramping costs"
* q_rampUpLimit(grid, node, mType, s, unit, f, t) "Up ramping limited for units"
......
......@@ -380,8 +380,8 @@ v_investTransfer_MIP.up(gn2n_directional(grid, from_node, to_node), t_invest)${
// !!! NOTE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// These should not be necessary,as if the time window is not defined, warm and
// hot starts should be impossible according to q_startuptype
*v_startup.fx(unit, 'hot', ft_dynamic(f, t))${not p_unit(unit, 'startWarm')} = 0;
*v_startup.fx(unit, 'warm', ft_dynamic(f, t))${not p_unit(unit, 'startCold')} = 0;
*v_startup.fx(unit, 'hot', ft_dynamic(f, t))${not p_unit(unit, 'startWarmAfterXhours')} = 0;
*v_startup.fx(unit, 'warm', ft_dynamic(f, t))${not p_unit(unit, 'startColdAfterXhours')} = 0;
* =============================================================================
* --- Bounds for the first timestep -------------------------------------------
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment