Skip to content

Commit e162815

Browse files
authored
Merge pull request #99 from ESMAP-World-Bank-Group/feature/96-phase-out-max-power-output
Feature/96 phase out max power output
2 parents ffb02c1 + c4739db commit e162815

10 files changed

Lines changed: 33 additions & 150 deletions

File tree

.claude/commands/diagnose-model.md

Lines changed: 0 additions & 147 deletions
This file was deleted.

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@
2727
*.grib
2828
*.zip
2929

30+
# Claude working files
31+
.claude/work/
32+
3033
# IDE / Editor configs
3134
.vscode/
3235
!.vscode/launch.json.example
@@ -215,3 +218,4 @@ celerybeat.pid
215218
.dmypy.json
216219
dmypy.json
217220
.pyre/
221+
.claude/

epm/base.gms

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,7 @@ Parameters
203203
fEnableCapacityExpansion
204204
fApplyRampConstraint 'Enable ramping constraints'
205205
fApplyFuelConstraint 'Enable fuel availability limits'
206+
fApplyGenerationPhaseout 'Enable max generation by fuel constraint (phase-out)'
206207
fApplyCapitalConstraint 'Enable total capital constraint'
207208
fEnableCSP 'Enable CSP features'
208209
fEnableStorage 'Enable storage operations'
@@ -418,6 +419,7 @@ Equations
418419
* ------------------------------
419420
eFuel(z,f,y) 'Fuel consumption accounting'
420421
eFuelLimit(c,f,y) 'Fuel availability constraint'
422+
eMaxGenerationByFuel(z,tech,f,y) 'Maximum annual generation by zone-tech-fuel [GWh]'
421423

422424
* ------------------------------
423425
* Ramp and reserve constraints
@@ -778,6 +780,10 @@ eFuel(zfmap(z,f),y)..
778780
eFuelLimit(c,f,y)$(fApplyFuelConstraint and pMaxFuelLimit(c,f,y) > 0)..
779781
sum((zcmap(z,c),zfmap(z,f)), vFuel(z,f,y)) =l= pMaxFuelLimit(c,f,y)*1e6;
780782

783+
* Phase-out constraint: limits annual generation by zone-technology-fuel combination
784+
eMaxGenerationByFuel(z,tech,f,y)$(fApplyGenerationPhaseout and pMaxGenerationByFuel(z,tech,f,y))..
785+
sum((gzmap(g,z),gtechmap(g,tech),gfmap(g,f),q,d,t), vPwrOut(g,f,q,d,t,y)*pHours(q,d,t))/1e3 =l= pMaxGenerationByFuel(z,tech,f,y);
786+
781787
* Applies the minimum output requirement per capacity share.
782788
eMinGen(g,q,d,t,y)$((fApplyMinGenShareAllHours and pGenData(g,"MinGenShareAllHours") > 0) and FD(q,d,t))..
783789
sum(gfmap(g,f), vPwrOut(g,f,q,d,t,y)) =g= vCap(g,y)*pGenData(g,"MinGenShareAllHours");
@@ -1215,6 +1221,7 @@ Model PA /
12151221

12161222
eVREProfile
12171223
eFuelLimit
1224+
eMaxGenerationByFuel
12181225
eCapitalConstraint
12191226
eZonalEmissions
12201227
eEmissionsCountry

epm/input/data_test/config.csv

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ System-wide spinning reserve requirement (Unit: MW),pSpinningReserveReqSystem,re
3333
System-level annual emissions cap (Unit: tCO2),pEmissionsTotal,constraint/pEmissionsTotal.csv
3434
Country-level annual emissions caps (Unit: tCO2),pEmissionsCountry,constraint/pEmissionsCountry.csv
3535
Maximum fuel consumption limits by zone and fuel (Unit: MMBtu),pMaxFuellimit,constraint/pMaxFuellimit.csv
36+
Maximum generation by zone-tech-fuel for phase-out scenarios (Unit: GWh),pMaxGenerationByFuel,constraint/pMaxGenerationByFuel.csv
3637
Carbon pricing trajectory (Unit: USD/tCO2),pCarbonPrice,constraint/pCarbonPrice.csv
3738
,TRADE,
3839
External trading zones (Unit: unitless),zext,trade/zext.csv
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
z,tech,f,2025,2040
2+
Angola,CCGT,Gas,100,0.001
3+
Angola,OCGT,Gas,100,0.001

epm/input/data_test/pSettings.csv

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ Apply system CO2 constraints,fApplySystemCo2Constraint,0
5555
Minimum share of RE (%),sMinRenewableSharePct,0
5656
RE share target year,sRenewableTargetYear,
5757
Apply fuel constraints,fApplyFuelConstraint,0
58+
Apply generation phase-out constraint,fApplyGenerationPhaseout,0
5859
Apply max capital constraint,fApplyCapitalConstraint,0
5960
"Total maximum capital investments, $ billion",sMaxCapitalInvestment,
6061
,,

epm/input_readers.gms

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ $if not set pCarbonPrice $set pCarbonPrice %FOLDER_INPUT%/constraint/pCarbonPric
103103
$if not set pEmissionsCountry $set pEmissionsCountry %FOLDER_INPUT%/constraint/pEmissionsCountry.csv
104104
$if not set pEmissionsTotal $set pEmissionsTotal %FOLDER_INPUT%/constraint/pEmissionsTotal.csv
105105
$if not set pMaxFuellimit $set pMaxFuellimit %FOLDER_INPUT%/constraint/pMaxFuellimit.csv
106+
$if not set pMaxGenerationByFuel $set pMaxGenerationByFuel %FOLDER_INPUT%/constraint/pMaxGenerationByFuel.csv
106107

107108
* H2 RELATED
108109
$if not set pH2DataExcel $set pH2DataExcel %FOLDER_INPUT%/h2/pH2DataExcel.csv
@@ -610,6 +611,15 @@ $onEmbeddedCode Connect:
610611
header: [1]
611612
type: par
612613

614+
- CSVReader:
615+
trace: %TRACE%
616+
file: %pMaxGenerationByFuel%
617+
name: pMaxGenerationByFuel
618+
indexSubstitutions: {.nan: ""}
619+
indexColumns: [1, 2, 3]
620+
header: [1]
621+
type: par
622+
613623

614624
# H2 RELATED
615625

epm/input_treatment.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,9 @@
5151
'pDemandForecast',
5252
'pCapexTrajectories',
5353
'pExtTransferLimit',
54-
'pTransferLimit',
55-
'pFuelPrice'
54+
'pTransferLimit',
55+
'pFuelPrice',
56+
'pMaxGenerationByFuel'
5657
]
5758

5859
ZONE_RESTRICTED_PARAMS = {

epm/main.gms

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,7 @@ Parameter
185185
* Fuel data
186186
pFuelCarbonContent(f) 'Carbon content by fuel (tCO2/MMBtu)'
187187
pMaxFuellimit(c,f,y) 'Fuel limit in MMBTU*1e6 (million) by country'
188+
pMaxGenerationByFuel(z,tech,f,y) 'Max annual generation by zone-tech-fuel [GWh]'
188189
pFuelPrice(c,f,y) 'Fuel price forecasts'
189190

190191
* Storage and transmission
@@ -266,7 +267,7 @@ $load pDemandData pDemandForecast pDemandProfile pEnergyEfficiencyFactor sReleva
266267
$load pFuelCarbonContent pCarbonPrice pEmissionsCountry pEmissionsTotal pFuelPrice
267268

268269
* Load constraints and technical data
269-
$load pMaxFuellimit pTransferLimit pLossFactorInternal pVREProfile pVREgenProfile pAvailabilityInput pEvolutionAvailability
270+
$load pMaxFuellimit pMaxGenerationByFuel pTransferLimit pLossFactorInternal pVREProfile pVREgenProfile pAvailabilityInput pEvolutionAvailability
270271
* Use $loadM to merge storage units into set g (first dimension of pStorageDataInput)
271272
$loadM g<pStorageDataInput.Dim1
272273
$load pStorageDataInput pStorageDataInputDefault pStorageDataInputGeneric pCSPData pCapexTrajectories pSpinningReserveReqCountry pSpinningReserveReqSystem
@@ -468,6 +469,7 @@ fCountIntercoForReserves = pSettings("fCountIntercoForReserves");
468469
* --- Settings: Policy and operational switches
469470
fApplyMinGenShareAllHours = pSettings("fApplyMinGenShareAllHours");
470471
fApplyFuelConstraint = pSettings("fApplyFuelConstraint");
472+
fApplyGenerationPhaseout = pSettings("fApplyGenerationPhaseout");
471473
fApplyCapitalConstraint = pSettings("fApplyCapitalConstraint");
472474
fEnableCSP = pSettings("fEnableCSP");
473475
fEnableCapacityExpansion = pSettings("fEnableCapacityExpansion");

epm/resources/headers/pSettingsHeader.csv

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ fApplySystemCo2Constraint
3737
sMinRenewableSharePct
3838
sRenewableTargetYear
3939
fApplyFuelConstraint
40+
fApplyGenerationPhaseout
4041
fApplyCapitalConstraint
4142
sMaxCapitalInvestment
4243
fApplyMinGenShareAllHours

0 commit comments

Comments
 (0)