Commit 06764291 authored by Ciara O'Dwyer's avatar Ciara O'Dwyer
Browse files

Offline Reserve Provision

parent 25758393
......@@ -28,7 +28,10 @@ Model invest /
// Unit Operation
q_maxDownward
q_maxUpward
q_maxUpward2
q_maxUpward3
q_reserveProvision
q_reserveProvision2
q_startshut
q_startuptype
q_onlineOnStartUp
......@@ -39,6 +42,7 @@ Model invest /
q_genRamp
q_rampUpLimit
q_rampDownLimit
q_rampUpLimit2
q_rampUpDown
q_rampSlack
q_outputRatioFixed
......
......@@ -28,6 +28,8 @@ Model schedule /
// Unit Operation
q_maxDownward
q_maxUpward
q_maxUpward2
q_maxUpward3
* q_reserveProvision
q_startshut
q_startuptype
......@@ -38,6 +40,7 @@ Model schedule /
* q_onlineCyclic
q_genRamp
q_rampUpLimit
q_rampUpLimit2
q_rampDownLimit
q_rampUpDown
q_rampSlack
......
......@@ -362,6 +362,7 @@ param_policy "Set of possible data parameters for grid, node, regulation" /
reserveReliability "Reliability parameter of reserve provisions"
reserve_increase_ratio "Unit output is multiplied by this factor to get the increase in reserve demand"
portion_of_infeed_to_reserve "Proportion of the generation of a tripping unit that needs to be covered by reserves from other units"
offlineReserveCapability "Proportion of an offline unit which can contribute to a category of reserve"
/
* --- Efficiency Approximation Related Sets -----------------------------------
......
......@@ -49,7 +49,7 @@ Sets
unit_investLP(unit) "Units with continuous investments allowed"
unit_investMIP(unit) "Units with integer investments allowed"
unit_timeseries(unit) "Units with time series enabled"
unit_incHRAdditionalConstraints(unit) "Units that use the two additional incremental heat rate constraints"
unit_incHRAdditionalConstraints(unit) "Units that use the two additional incremental heat rate constraints"
* --- Nodes -------------------------------------------------------------------
node_spill(node) "Nodes that can spill; used to remove v_spill variables where not relevant"
......@@ -80,7 +80,10 @@ Sets
restypeDirectionNode(restype, up_down, node) "Nodes with reserve requirements"
resTypeDirectionNodeNode(restype, up_down, node, node) "Node node connections that can transfer reserves"
nuRescapable(restype, up_down, node, unit) "Units capable and available to provide particular reserves"
nuOfflineRescapable(restype, node, unit) "Units capable and available to provide offline reserves"
restypeReleasedForRealization(restype) "Reserve types that are released for the realized time intervals"
offlineRes (restype) "Reserve types where offline reserve provision possible"
offlineResUnit (unit) "Units where offline reserve provision possible"
* --- Sets to define time, forecasts and samples ------------------------------
$$include '%input_dir%/timeAndSamples.inc'
......
......@@ -405,6 +405,24 @@ nuRescapable(restypeDirection(restype, up_down), nu(node, unit))
}
= yes;
// Units with offline reserve provision capabilities
nuOfflineRescapable(restype, nu(node, unit))
$ { p_nuReserves(node, unit, restype, 'offlineReserveCapability')
}
= yes;
// Restypes with offline reserve provision possibility
offlineRes(restype)
$ {sum(nu(node, unit), p_nuReserves(node, unit, restype, 'offlineReserveCapability'))
}
= yes;
// Units with offline reserve provision possibility
offlineResUnit(unit)
$ {sum((node, restype), p_nuReserves(node, unit, restype, 'offlineReserveCapability'))
}
= yes;
// Node-node connections with reserve transfer capabilities
restypeDirectionNodeNode(restypeDirection(restype, up_down), node, node_)
$ { p_nnReserves(node, node_, restype, up_down)
......@@ -431,6 +449,7 @@ p_nuReserves(nu(node, unit), restype, 'reserveReliability')
= 1;
// Reserve provision overlap decreases the capacity of the overlapping category
loop(restype,
p_nuReserves(nu(node, unit), restype, up_down)
${ nuRescapable(restype, up_down, node, unit) }
= p_nuReserves(node, unit, restype, up_down)
......@@ -438,6 +457,7 @@ p_nuReserves(nu(node, unit), restype, up_down)
+ p_nuReserves(node, unit, restype_, up_down)
* p_nuRes2Res(node, unit, restype_, up_down, restype)
); // END sum(restype_)
);
* =============================================================================
* --- Data Integrity Checks ---------------------------------------------------
......
......@@ -58,7 +58,10 @@ equations
// Unit Operation
q_maxDownward(grid, node, unit, mType, s, f, t) "Downward commitments will not undercut power plant minimum load constraints or maximum elec. consumption"
q_maxUpward(grid, node, unit, mType, s, f, t) "Upward commitments will not exceed maximum available capacity or consumed power"
q_maxUpward2(grid, node, unit, mType, s, f, t) "Upward commitments will not exceed maximum available capacity or consumed power - offline Res"
q_maxUpward3(grid, node, unit, mType, s, f, t) "Upward commitments will not exceed maximum available capacity or consumed power - offline Res"
q_reserveProvision(restype, up_down, node, unit, s, f, t) "Reserve provision limited for units"
q_reserveProvision2(restype, up_down, node, unit, s, f, t) "Reserve provision limited for units offline Res capable"
q_startshut(mType, s, unit, f, t) "Online capacity now minus online capacity in the previous interval is equal to started up minus shut down capacity"
q_startuptype(mType, s, starttype, unit, f, t) "Startup type depends on the time the unit has been non-operational"
q_onlineOnStartUp(s, unit, f, t) "Unit must be online after starting up"
......@@ -68,6 +71,7 @@ equations
q_onlineCyclic(unit, s, s, mType) "Cyclic online state bound for the first and the last states of samples"
q_genRamp(mType, s, grid, node, unit, f, t) "Record the ramps of units with ramp restricitions or costs"
q_rampUpLimit(mType, s, grid, node, unit, f, t) "Up ramping limited for units"
q_rampUpLimit2(mType, s, grid, node, unit, f, t) "Up ramping limited for units with offline reserve capability"
q_rampDownLimit(mType, s, grid, node, unit, f, t) "Down ramping limited for units"
q_rampUpDown(mType, s, grid, node, unit, f, t) "Ramping separated into possibly several upward and downward parts (for different cost levels)"
q_rampSlack(mType, s, grid, node, unit, slack, f, t) "Upward and downward ramps constrained by slack boundaries (for different cost levels)"
......
This diff is collapsed.
......@@ -67,7 +67,10 @@ Option clear = q_resDemand;
// Unit Operation
Option clear = q_maxDownward;
Option clear = q_maxUpward;
Option clear = q_maxUpward2;
Option clear = q_maxUpward3;
Option clear = q_reserveProvision;
Option clear = q_reserveProvision2;
Option clear = q_startshut;
Option clear = q_startuptype;
Option clear = q_onlineLimit;
......@@ -78,6 +81,7 @@ Option clear = q_offlineAfterShutdown;
Option clear = q_genRamp;
Option clear = q_rampUpLimit;
Option clear = q_rampDownLimit;
Option clear = q_rampUpLimit2;
Option clear = q_rampUpDown;
Option clear = q_rampSlack;
Option clear = q_outputRatioFixed;
......
......@@ -326,7 +326,7 @@ loop((restypeDirectionNode(restype, up_down, node), gn(grid, node), sft(s, f, t)
and not ft_reservesFixed(node, restype, f+df_reserves(node, restype, f, t), t)
}
= min ( p_nuReserves(node, unit, restype, up_down) * [ p_gnu(grid, node, unit, 'maxGen') + p_gnu(grid, node, unit, 'maxCons') ], // Generator + consuming unit res_range limit
v_gen.up(grid, node, unit, s, f, t) - v_gen.lo(grid, node, unit, s, f, t) // Generator + consuming unit available unit_elec. output delta
v_gen.up(grid, node, unit, s, f, t) - (v_gen.lo(grid, node, unit, s, f, t))${not nuOfflineRescapable(restype, node, unit)} // Generator + consuming unit available unit_elec. output delta
) // END min
;
......
  • Update to branch OfflineReserve New Equation q_maxUpward2. This equations is used for the units capable of offline reserve instead of q_maxUpward. The equations are the same apart from the new section //Capable Offline Generation. This section is the same as the //Generation units section except it uses p_unit(unit, 'unitCount') - v_online instead of v_online, and (v_invest_LP(unit, t_) - v_online instead of v_online to calculate the offline capacity available for the reserves.

    New Equation q_maxUpward3. This equation applies the online restriction to the reserve types that cannot be provided when the unit is offline. This was added in as otherwise all reserve types were being provided from offline state. There is probably a neater way to do this making changes to the other equations but this is how I was able to get it working.

    New equation q_rampUpLimit2. This equations is used for the units capable of offline reserve instead of q_rampUpLimit. The equations are the same apart from v_reserve is not added to v_genRamp for the offline reserve types.

    • (v_reserve(restype, 'up', node, unit, s, f+df_reserves(node, restype, f, t), t))${not offlineRes(restype)} Previous implementation replaced v_online with 1 or unitCount.

    New equation q_reserveProvision2. This equation limits the reserve capability for the non offline reserves by the online status. Changes made to 3d_setVariableLimits to the reserve provision boundaries as offline units can provide full capacity for some offline reserves and not restricted by min gen.

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