Commit 397c2c96 authored by Niina Helistö's avatar Niina Helistö
Browse files

Removing the redundant t-dimension from the unit investment variables (#119)

parent 58ab0791
......@@ -13,13 +13,13 @@ loop(unit,
);
* Update the number of subunits in the child setups (rounded here to the nearest integer)
loop(unit${sum(t_invest, r_invest(unit, t_invest))},
tmp = round(sum(t_invest, r_invest(unit, t_invest)), 0)
loop(unit${r_invest(unit)},
tmp = round(r_invest(unit), 0)
put "p_unit('", unit.tl, "', 'unitCount') = p_unit('", unit.tl, "', 'unitCount') + ", tmp, ";"/;
);
* Update capacity values in the child setups
loop(gnu(grid, node, unit)${r_invest(unit)},
tmp = round(sum(t_invest, r_invest(unit, t_invest)), 0) * p_gnu(grid, node, unit, 'unitSize');
tmp = round(r_invest(unit), 0) * p_gnu(grid, node, unit, 'unitSize');
put "p_gnu('", grid.tl, "', '", node.tl, "', '", unit.tl, "', 'capacity') = p_gnu('", grid.tl, "', '", node.tl, "', '", unit.tl, "', 'capacity') + ", tmp, ";"/;);
* Do not allow investments in the child setups (commented out at the moment)
......
......@@ -152,7 +152,7 @@ Parameters
* --- Investment Results ------------------------------------------------------
// Interesting investment results
r_invest(unit, t) "Number/amount of invested sub-units"
r_invest(unit) "Number/amount of invested sub-units"
r_investTransfer(grid, node, node, t) "Amount of invested transfer link capacity"
* --- Dummy Variable Results --------------------------------------------------
......
......@@ -21,13 +21,13 @@ Free variables
v_state(grid, node, s, f, t) "State variable for nodes that maintain a state (MWh, unless modified by energyStoredPerUnitOfState and diffCoeff parameters)"
v_genRamp(grid, node, unit, s, f, t) "Change in energy generation or consumption over an interval (MW/h)"
v_transfer(grid, node, node, s, f, t) "Average electricity transmission level from node to node during an interval (MW)"
v_ICramp(grid, node, node, s, f, t) "Change in energy transfer over an interval (MW/h)"
v_ICramp(grid, node, node, s, f, t) "Change in energy transfer over an interval (MW/h)"
;
Integer variables
v_startup_MIP(unit, starttype, s, f, t) "Sub-units started up after/during an interval (p.u.), (MIP variant)"
v_shutdown_MIP(unit, s, f, t) "Sub-units shut down after/during an interval (p.u.) (MIP variant)"
v_online_MIP(unit, s, f, t) "Number of sub-units online for units with unit commitment restrictions"
v_invest_MIP(unit, t) "Number of invested sub-units"
v_invest_MIP(unit) "Number of invested sub-units"
v_investTransfer_MIP(grid, node, node, t) "Number of invested transfer links"
;
Binary variables
......@@ -48,7 +48,7 @@ Positive variables
v_reserve(restype, up_down, grid, node, unit, s, f, t) "Unit capacity reserved for providing reserve of specific type (MW)"
v_investTransfer_LP(grid, node, node, t) "Invested transfer capacity (MW)"
v_online_LP(unit, s, f, t) "Number of sub-units online for 'units' with unit commitment restrictions (LP variant)"
v_invest_LP(unit, t) "Number of invested 'sub-units' (LP variant)"
v_invest_LP(unit) "Number of invested 'sub-units' (LP variant)"
v_gen_inc(grid, node, unit, hr, s, f, t) "Energy generation in hr block in an interval (MW)"
;
......
......@@ -114,7 +114,7 @@ equations
q_instantaneousShareMax(group, s, f, t) "Maximum instantaneous share of generation and controlled import from a group of units and links"
q_constrainedOnlineMultiUnit(group, s, f, t) "Constrained number of online units for a group of units"
q_capacityMargin(grid, node, s, f, t) "There needs to be enough capacity to cover energy demand plus a margin"
q_constrainedCapMultiUnit(group, t) "Constrained unit number ratios and sums for a group of units"
q_constrainedCapMultiUnit(group) "Constrained unit number ratios and sums for a group of units"
q_emissioncap(group, emission) "Limit for emissions"
q_energyShareMax(group) "Maximum energy share of generation and import from a group of units"
q_energyShareMin(group) "Minimum energy share of generation and import from a group of units"
......
......@@ -30,6 +30,7 @@ q_obj ..
+ sum(msft(m, s, f, t),
// Probability (weight coefficient) of (s,f,t)
+ p_msft_probability(m, s, f, t)
* p_s_discountFactor(s) // Discount costs
* [
// Time step length dependent costs
+ p_stepLength(m, f, t)
......@@ -110,7 +111,6 @@ q_obj ..
] // END * p_sft_probability(s,f,t)
* p_s_discountFactor(s) // Discount costs
) // END sum over msft(m, s, f, t)
// Cost of energy storage change (note: not discounted)
......@@ -137,47 +137,49 @@ q_obj ..
// Investment Costs
+ sum(ms(m, s)${ sum(msft(m, s, f, t), 1) }, // consider ms only if it has active msft
+ sum(t_invest(t)${ord(t) <= msEnd(m, s)},
// Unit investment costs (including fixed operation and maintenance costs)
+ sum(gnu(grid, node, unit),
+ v_invest_LP(unit, t)${ unit_investLP(unit) and sum(msft(m, s, f, t_), uft(unit, f, t_))} // consider unit only if it is active in the sample
* p_gnu(grid, node, unit, 'unitSize')
* [
+ p_gnu(grid, node, unit, 'invCosts') * p_gnu(grid, node, unit, 'annuity')
+ p_gnu(grid, node, unit, 'fomCosts')
]
+ v_invest_MIP(unit, t)${ unit_investMIP(unit) and sum(msft(m, s, f, t_), uft(unit, f, t_))} // consider unit only if it is active in the sample
* p_gnu(grid, node, unit, 'unitSize')
* [
+ p_gnu(grid, node, unit, 'invCosts') * p_gnu(grid, node, unit, 'annuity')
+ p_gnu(grid, node, unit, 'fomCosts')
]
) // END sum(gnu)
// Transfer link investment costs
+ sum(gn2n_directional(grid, from_node, to_node),
+ v_investTransfer_LP(grid, from_node, to_node, t)${ gn2n_directional_investLP(grid, from_node, to_node) }
* [
+ p_gnn(grid, from_node, to_node, 'invCost')
* p_gnn(grid, from_node, to_node, 'annuity')
+ p_gnn(grid, to_node, from_node, 'invCost')
* p_gnn(grid, to_node, from_node, 'annuity')
] // END * v_investTransfer_LP
+ v_investTransfer_MIP(grid, from_node, to_node, t)${ gn2n_directional_investMIP(grid, from_node, to_node) }
* [
+ p_gnn(grid, from_node, to_node, 'unitSize')
* p_gnn(grid, from_node, to_node, 'invCost')
* p_gnn(grid, from_node, to_node, 'annuity')
+ p_gnn(grid, to_node, from_node, 'unitSize')
* p_gnn(grid, to_node, from_node, 'invCost')
* p_gnn(grid, to_node, from_node, 'annuity')
] // END * v_investTransfer_MIP
) // END sum(gn2n_directional)
) // END sum(t_invest)
* p_msAnnuityWeight(m, s) // Sample weighting to calculate annual costs
+ p_msAnnuityWeight(m, s) // Sample weighting to calculate annual costs
* p_s_discountFactor(s) // Discount costs
* [
// Unit investment costs (including fixed operation and maintenance costs)
+ sum(gnu(grid, node, unit),
+ v_invest_LP(unit)${ unit_investLP(unit) and sum(msft(m, s, f, t_), uft(unit, f, t_))} // consider unit only if it is active in the sample
* p_gnu(grid, node, unit, 'unitSize')
* [
+ p_gnu(grid, node, unit, 'invCosts') * p_gnu(grid, node, unit, 'annuity')
+ p_gnu(grid, node, unit, 'fomCosts')
]
+ v_invest_MIP(unit)${ unit_investMIP(unit) and sum(msft(m, s, f, t_), uft(unit, f, t_))} // consider unit only if it is active in the sample
* p_gnu(grid, node, unit, 'unitSize')
* [
+ p_gnu(grid, node, unit, 'invCosts') * p_gnu(grid, node, unit, 'annuity')
+ p_gnu(grid, node, unit, 'fomCosts')
]
) // END sum(gnu)
+ sum(t_invest(t)${ord(t) <= msEnd(m, s)},
// Transfer link investment costs
+ sum(gn2n_directional(grid, from_node, to_node),
+ v_investTransfer_LP(grid, from_node, to_node, t)${ gn2n_directional_investLP(grid, from_node, to_node) }
* [
+ p_gnn(grid, from_node, to_node, 'invCost')
* p_gnn(grid, from_node, to_node, 'annuity')
+ p_gnn(grid, to_node, from_node, 'invCost')
* p_gnn(grid, to_node, from_node, 'annuity')
] // END * v_investTransfer_LP
+ v_investTransfer_MIP(grid, from_node, to_node, t)${ gn2n_directional_investMIP(grid, from_node, to_node) }
* [
+ p_gnn(grid, from_node, to_node, 'unitSize')
* p_gnn(grid, from_node, to_node, 'invCost')
* p_gnn(grid, from_node, to_node, 'annuity')
+ p_gnn(grid, to_node, from_node, 'unitSize')
* p_gnn(grid, to_node, from_node, 'invCost')
* p_gnn(grid, to_node, from_node, 'annuity')
] // END * v_investTransfer_MIP
) // END sum(gn2n_directional)
) // END sum(t_invest)
] // END * p_s_discountFactor(s)
) // END sum(ms)
$ifthen.addterms exist '%input_dir%/2c_additional_objective_terms.gms'
......
......@@ -542,12 +542,8 @@ q_maxDownward(gnu(grid, node, unit), msft(m, s, f, t))
+ v_online_MIP(unit, s, f+df_central(f,t), t)${uft_onlineMIP(unit, f, t)}
// Investments to additional non-online capacity
+ sum(t_invest(t_)${ ord(t_)<=ord(t)
and not uft_online(unit, f, t)
},
+ v_invest_LP(unit, t_)${unit_investLP(unit)} // NOTE! v_invest_LP also for consuming units is positive
+ v_invest_MIP(unit, t_)${unit_investMIP(unit)} // NOTE! v_invest_MIP also for consuming units is positive
) // END sum(t_invest)
+ v_invest_LP(unit)${unit_investLP(unit) and not uft_online(unit, f, t)} // NOTE! v_invest_LP also for consuming units is positive
+ v_invest_MIP(unit)${unit_investMIP(unit) and not uft_online(unit, f, t)} // NOTE! v_invest_MIP also for consuming units is positive
] // END * p_gnu(unitSize)
] // END * p_unit(availability)
;
......@@ -595,11 +591,8 @@ q_maxDownwardOfflineReserve(gnu(grid, node, unit), msft(m, s, f, t))
+ p_gnu(grid, node, unit, 'unitSize')
]
* [
+ sum(t_invest(t_)${ ord(t_)<=ord(t)
},
+ v_invest_LP(unit, t_)${unit_investLP(unit)}
+ v_invest_MIP(unit, t_)${unit_investMIP(unit)}
) // END sum(t_invest)
+ v_invest_LP(unit)${unit_investLP(unit)}
+ v_invest_MIP(unit)${unit_investMIP(unit)}
] // END * p_gnu(unitSize)
] // END * p_unit(availability)
......@@ -672,12 +665,8 @@ q_maxUpward(gnu(grid, node, unit), msft(m, s, f, t))
+ v_online_MIP(unit, s, f+df_central(f,t), t)${uft_onlineMIP(unit, f, t)}
// Investments to non-online capacity
+ sum(t_invest(t_)${ ord(t_)<=ord(t)
and not uft_online(unit, f ,t)
},
+ v_invest_LP(unit, t_)${unit_investLP(unit)}
+ v_invest_MIP(unit, t_)${unit_investMIP(unit)}
) // END sum(t_invest)
+ v_invest_LP(unit)${unit_investLP(unit) and not uft_online(unit, f ,t)}
+ v_invest_MIP(unit)${unit_investMIP(unit) and not uft_online(unit, f ,t)}
] // END * p_gnu(unitSize)
] // END * p_unit(availability)
......@@ -751,11 +740,8 @@ q_maxUpwardOfflineReserve(gnu(grid, node, unit), msft(m, s, f, t))
+ p_unit(unit, 'unitCount')
// Investments to new capacity
+ sum(t_invest(t_)${ ord(t_)<=ord(t)
},
+ v_invest_LP(unit, t_)${unit_investLP(unit)}
+ v_invest_MIP(unit, t_)${unit_investMIP(unit)}
) // END sum(t_invest)
+ v_invest_LP(unit)${unit_investLP(unit)}
+ v_invest_MIP(unit)${unit_investMIP(unit)}
] // END * p_gnu(unitSize)
] // END * p_unit(availability)
;
......@@ -777,12 +763,10 @@ q_reserveProvision(gnuRescapable(restypeDirectionGridNode(restype, up_down, grid
+ p_gnuReserves(grid, node, unit, restype, up_down)
* [
+ p_gnu(grid, node, unit, 'capacity')
+ sum(t_invest(t_)${ ord(t_)<=ord(t) },
+ v_invest_LP(unit, t_)${unit_investLP(unit)}
* p_gnu(grid, node, unit, 'unitSize')
+ v_invest_MIP(unit, t_)${unit_investMIP(unit)}
* p_gnu(grid, node, unit, 'unitSize')
) // END sum(t_)
+ v_invest_LP(unit)${unit_investLP(unit)}
* p_gnu(grid, node, unit, 'unitSize')
+ v_invest_MIP(unit)${unit_investMIP(unit)}
* p_gnu(grid, node, unit, 'unitSize')
]
* p_unit(unit, 'availability') // Taking into account availability...
* [
......@@ -948,10 +932,8 @@ q_onlineLimit(ms(m, s), uft_online(unit, f, t))
)${unit_aggregator(unit)} // END sum(unit_)
// Investments into units
+ sum(t_invest(t_)${ord(t_)<=ord(t)},
+ v_invest_LP(unit, t_)${unit_investLP(unit)}
+ v_invest_MIP(unit, t_)${unit_investMIP(unit)}
) // END sum(t_invest)
+ v_invest_LP(unit)${unit_investLP(unit)}
+ v_invest_MIP(unit)${unit_investMIP(unit)}
;
*--- Both q_offlineAfterShutdown and q_onlineOnStartup work when there is only one unit.
......@@ -986,10 +968,8 @@ q_offlineAfterShutdown(s_active(s), uft_online(unit, f, t))
+ p_unit(unit, 'unitCount')
// Investments into units
+ sum(t_invest(t_)${ord(t_)<=ord(t)},
+ v_invest_LP(unit, t_)${unit_investLP(unit)}
+ v_invest_MIP(unit, t_)${unit_investMIP(unit)}
) // END sum(t_invest)
+ v_invest_LP(unit)${unit_investLP(unit)}
+ v_invest_MIP(unit)${unit_investMIP(unit)}
// Units currently online
- v_online_LP(unit, s, f+df_central(f,t), t)${uft_onlineLP(unit, f, t)}
......@@ -1121,12 +1101,10 @@ q_rampUpLimit(ms(m, s), gnuft_ramp(grid, node, unit, f, t))
// Ramping capability of units without an online variable
+ (
+ p_gnu(grid, node, unit, 'capacity')${not uft_online(unit, f, t)}
+ sum(t_invest(t_)${ ord(t_)<=ord(t) },
+ v_invest_LP(unit, t_)${not uft_online(unit, f, t) and unit_investLP(unit)}
* p_gnu(grid, node, unit, 'unitSize')
+ v_invest_MIP(unit, t_)${not uft_online(unit, f, t) and unit_investMIP(unit)}
* p_gnu(grid, node, unit, 'unitSize')
)
+ v_invest_LP(unit)${(not uft_online(unit, f, t)) and unit_investLP(unit)}
* p_gnu(grid, node, unit, 'unitSize')
+ v_invest_MIP(unit)${(not uft_online(unit, f, t)) and unit_investMIP(unit)}
* p_gnu(grid, node, unit, 'unitSize')
)
* p_gnu(grid, node, unit, 'maxRampUp')
* 60 // Unit conversion from [p.u./min] to [p.u./h]
......@@ -1257,14 +1235,10 @@ q_rampDownLimit(ms(m, s), gnuft_ramp(grid, node, unit, f, t))
// Ramping capability of units without online variable
- (
+ p_gnu(grid, node, unit, 'capacity')${not uft_online(unit, f, t)}
+ sum(t_invest(t_)${ ord(t_)<=ord(t) },
+ v_invest_LP(unit, t_)
${not uft_online(unit, f, t) and unit_investLP(unit)}
* p_gnu(grid, node, unit, 'unitSize')
+ v_invest_MIP(unit, t_)
${not uft_online(unit, f, t) and unit_investMIP(unit)}
* p_gnu(grid, node, unit, 'unitSize')
)
+ v_invest_LP(unit)${(not uft_online(unit, f, t)) and unit_investLP(unit)}
* p_gnu(grid, node, unit, 'unitSize')
+ v_invest_MIP(unit)${(not uft_online(unit, f, t)) and unit_investMIP(unit)}
* p_gnu(grid, node, unit, 'unitSize')
)
* p_gnu(grid, node, unit, 'maxRampDown')
* 60 // Unit conversion from [p.u./min] to [p.u./h]
......@@ -1538,12 +1512,10 @@ q_rampSlack(ms(m, s), gnuft_rampCost(grid, node, unit, slack, f, t))
// Ramping capability of units without an online variable
+ (
+ p_gnu(grid, node, unit, 'capacity')${not uft_online(unit, f, t)}
+ sum(t_invest(t_)${ ord(t_)<=ord(t) },
+ v_invest_LP(unit, t_)${not uft_online(unit, f, t) and unit_investLP(unit)}
* p_gnu(grid, node, unit, 'unitSize')
+ v_invest_MIP(unit, t_)${not uft_online(unit, f, t) and unit_investMIP(unit)}
* p_gnu(grid, node, unit, 'unitSize')
)
+ v_invest_LP(unit)${(not uft_online(unit, f, t)) and unit_investLP(unit)}
* p_gnu(grid, node, unit, 'unitSize')
+ v_invest_MIP(unit)${(not uft_online(unit, f, t)) and unit_investMIP(unit)}
* p_gnu(grid, node, unit, 'unitSize')
)
* p_gnuBoundaryProperties(grid, node, unit, slack, 'rampLimit')
* 60 // Unit conversion from [p.u./min] to [p.u./h]
......@@ -2286,10 +2258,10 @@ q_stateUpwardLimit(gn_state(grid, node), msft(m, s, f, t))
+ sum(gnu(grid, node, unit)${gnuft(grid, node, unit, f, t)},
+ p_gnu(grid, node, unit, 'upperLimitCapacityRatio')
* p_gnu(grid, node, unit, 'unitSize')
* sum(t_invest(t_)${ord(t_)<=ord(t)},
+ v_invest_LP(unit, t_)${unit_investLP(unit)}
+ v_invest_MIP(unit, t_)${unit_investMIP(unit)}
) // END sum(t_invest)
* [
+ v_invest_LP(unit)${unit_investLP(unit)}
+ v_invest_MIP(unit)${unit_investMIP(unit)}
]
) // END sum(gnu)
// Current state of the variable
......@@ -2710,10 +2682,10 @@ q_capacityMargin(gn(grid, node), sft(s, f, t))
// Output capacity investments
+ p_gnu(grid, node, unit, 'unitSize')
* sum(t_invest(t_)${ord(t_)<=ord(t)},
+ v_invest_LP(unit, t_)${unit_investLP(unit)}
+ v_invest_MIP(unit, t_)${unit_investMIP(unit)}
) // END sum(t_invest)
* [
+ v_invest_LP(unit)${unit_investLP(unit)}
+ v_invest_MIP(unit)${unit_investMIP(unit)}
] // END * p_gnu(unitSize)
] // END * p_unit(availability)
) // END sum(gnu_output)
......@@ -2732,10 +2704,10 @@ q_capacityMargin(gn(grid, node), sft(s, f, t))
// Output capacity investments
+ p_gnu(grid, node, unit, 'unitSize')
* sum(t_invest(t_)${ord(t_)<=ord(t)},
+ v_invest_LP(unit, t_)${unit_investLP(unit)}
+ v_invest_MIP(unit, t_)${unit_investMIP(unit)}
) // END sum(t_invest)
* [
+ v_invest_LP(unit)${unit_investLP(unit)}
+ v_invest_MIP(unit)${unit_investMIP(unit)}
] // END * p_gnu(unitSize)
] // END * p_unit(availability)
+ v_gen(grid, node, unit, s, f, t)${not unit_flow(unit)}
) // END sum(gnu_output)
......@@ -2785,7 +2757,7 @@ q_capacityMargin(gn(grid, node), sft(s, f, t))
*--- Constrained Investment Ratios and Sums For Groups of Units -----------
q_constrainedCapMultiUnit(group, t_invest(t))
q_constrainedCapMultiUnit(group)
${ p_groupPolicy(group, 'constrainedCapTotalMax')
or sum(uGroup(unit, group), abs(p_groupPolicy3D(group, 'constrainedCapMultiplier', unit)))
} ..
......@@ -2794,8 +2766,8 @@ q_constrainedCapMultiUnit(group, t_invest(t))
+ sum(uGroup(unit, group),
+ p_groupPolicy3D(group, 'constrainedCapMultiplier', unit)
* [
+ v_invest_LP(unit, t)${unit_investLP(unit)}
+ v_invest_MIP(unit, t)${unit_investMIP(unit)}
+ v_invest_LP(unit)${unit_investLP(unit)}
+ v_invest_MIP(unit)${unit_investMIP(unit)}
] // END * p_groupPolicy3D(group, 'constrainedCapMultiplier', unit)
) // END sum(unit)
......
......@@ -425,17 +425,17 @@ loop((restypeDirectionGridNode(restype, up_down, grid, node), sft(s, f, t))${ or
// Unit Investments
// LP variant
v_invest_LP.up(unit, t_invest)${ unit_investLP(unit) }
v_invest_LP.up(unit)${ unit_investLP(unit) }
= p_unit(unit, 'maxUnitCount')
;
v_invest_LP.lo(unit, t_invest)${ unit_investLP(unit) }
v_invest_LP.lo(unit)${ unit_investLP(unit) }
= p_unit(unit, 'minUnitCount')
;
// MIP variant
v_invest_MIP.up(unit, t_invest)${ unit_investMIP(unit) }
v_invest_MIP.up(unit)${ unit_investMIP(unit) }
= p_unit(unit, 'maxUnitCount')
;
v_invest_MIP.lo(unit, t_invest)${ unit_investMIP(unit) }
v_invest_MIP.lo(unit)${ unit_investMIP(unit) }
= p_unit(unit, 'minUnitCount')
;
......@@ -558,11 +558,11 @@ if( tSolveFirst <> mSettings(mSolve, 't_start'), // Avoid rewriting the fixes on
* --- Fix previously realized investment results ------------------------------
* =============================================================================
v_invest_LP.fx(unit_investLP(unit), t_invest(t))${ p_unit(unit, 'becomeAvailable') <= tSolveFirst }
= r_invest(unit, t)
v_invest_LP.fx(unit_investLP(unit))${ p_unit(unit, 'becomeAvailable') <= tSolveFirst }
= r_invest(unit)
;
v_invest_MIP.fx(unit_investMIP(unit), t_invest(t))${ p_unit(unit, 'becomeAvailable') <= tSolveFirst }
= r_invest(unit, t)
v_invest_MIP.fx(unit_investMIP(unit))${ p_unit(unit, 'becomeAvailable') <= tSolveFirst }
= r_invest(unit)
;
v_investTransfer_LP.fx(gn2n_directional(grid, node, node_), t_invest(t))${ not p_gnn(grid, node, node_, 'investMIP')
and p_gnn(grid, node, node_, 'transferCapInvLimit')
......
......@@ -150,10 +150,10 @@ loop(sft_realized(s, f, t),
;
);
// Unit investments
r_invest(unit, t_invest(t))${ (unit_investLP(unit) or unit_investMIP(unit))
and ord(t) <= tSolveFirst + mSettings(mSolve, 't_jump')
}
= v_invest_LP.l(unit, t) + v_invest_MIP.l(unit, t)
r_invest(unit)${ (unit_investLP(unit) or unit_investMIP(unit))
and p_unit(unit, 'becomeAvailable') <= tSolveFirst + mSettings(mSolve, 't_jump')
}
= v_invest_LP.l(unit) + v_invest_MIP.l(unit)
;
// Link investments
r_investTransfer(grid, node, node_, t_invest(t))${ p_gnn(grid, node, node_, 'transferCapInvLimit')
......
......@@ -127,9 +127,7 @@ loop(m,
* sum(ms(m, s)${ sum(msft_realizedNoReset(m, s, f, t_), 1) }, // consider ms only if it has active msft_realizedNoReset
+ [
+ p_gnu(grid, node, unit, 'capacity')$sum(msft_realizedNoReset(m, s, f, t_), uft(unit, f, t_)) // Not in v_obj; only units active in msft_realizedNoReset
+ sum(t_invest(t)${ord(t) <= msEnd(m, s)},
+ r_invest(unit, t)$sum(msft_realizedNoReset(m, s, f, t_), uft(unit, f, t_)) // only units active in msft_realizedNoReset
)
+ r_invest(unit)$sum(msft_realizedNoReset(m, s, f, t_), uft(unit, f, t_)) // only units active in msft_realizedNoReset
* p_gnu(grid, node, unit, 'unitSize')
]
* p_msAnnuityWeight(m, s) // Sample weighting to calculate annual costs
......@@ -141,9 +139,7 @@ loop(m,
r_gnuUnitInvestmentCost(gnu(grid, node, unit))
= 1e-6 // Scaling to MEUR
* sum(ms(m, s)${ sum(msft_realizedNoReset(m, s, f, t_), 1) }, // consider ms only if it has active msft_realizedNoReset
+ sum(t_invest(t)${ord(t) <= msEnd(m, s)},
+ r_invest(unit, t)$sum(msft_realizedNoReset(m, s, f, t_), uft(unit, f, t_)) // only units active in msft_realizedNoReset
)
+ r_invest(unit)$sum(msft_realizedNoReset(m, s, f, t_), uft(unit, f, t_)) // only units active in msft_realizedNoReset
* p_msAnnuityWeight(m, s) // Sample weighting to calculate annual costs
* p_s_discountFactor(s) // Discount costs
) // END * sum(ms)
......@@ -276,12 +272,12 @@ loop(m,
// Approximate utilization rates for gnus over the simulation
r_gnuUtilizationRate(gnu_output(grid, node, unit))${ r_gnuTotalGen(grid, node, unit)
and ( p_gnu(grid, node, unit, 'capacity')
or sum(t_invest, r_invest(unit, t_invest))
or r_invest(unit)
)
}
= r_gnuTotalGen(grid, node, unit)
/ [
+ (p_gnu(grid, node, unit, 'capacity') + sum(t_invest, r_invest(unit, t_invest))*p_gnu(grid, node, unit, 'unitSize'))
+ (p_gnu(grid, node, unit, 'capacity') + r_invest(unit)*p_gnu(grid, node, unit, 'unitSize'))
* (mSettings(m, 't_end') - (mSettings(m, 't_start') + mSettings(m, 't_initializationPeriod')) + 1)
* mSettings(m, 'stepLengthInHours')
]; // END division
......
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