-
Notifications
You must be signed in to change notification settings - Fork 43
/
Copy pathprepret.dsc
153 lines (144 loc) · 8.8 KB
/
prepret.dsc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
* Copyright (C) 2000-2024 Energy Technology Systems Analysis Programme (ETSAP)
* This file is part of the IEA-ETSAP TIMES model generator, licensed
* under the GNU General Public License v3.0 (see file NOTICE-GPLv3.txt).
*=============================================================================*
* PREPRET.dsc oversees pre-processing for retirements
*=============================================================================*
* Questions/Comments:
*-----------------------------------------------------------------------------
$SET MIP %SOLMIP%==YES
$GOTO %1
*-----------------------------------------------------------------------------
$LABEL PREP
$SET TST %2
$IF DEFINED PRC_REFIT SET %2 //; PARAMETER %3 //;
$IFI '%RETIRE%'==NO $KILL %2
$IF DEFINED %2 PARAMETER %3 //; %3(R,'0',P,'N')$(%3(R,'0',P,'N')=0)$=%2(R,P);
$IFI '%RETIRE%'==YES $SHIFT
PRC_REFIT(RP,P)$0=0;
$IF NOT DEFINED %2 $EXIT
* Declarations
SET VNRET(YEAR,LL); PARAMETER RP_RTF(R,P);
* Interpolate RCAP_BND
$IF %TST%==%1 OPTION %TST% < %2;
$ BATINCLUDE fillparm RCAP_BLK R 'P' ",'','','','',''" V 'RTP(R,V,P)' 'GE 0'
$ BATINCLUDE prepparm RCAP_BND R 'P,L' ",'','',''" V 'RTP(R,V,P)' 1
$IF DEFINED NCAP_OLIFE $BATINCLUDE fillparm NCAP_OLIFE R P ",'','','','',''" V 'RTP(R,V,P)' 'GE 0'
$IF DEFINED NCAP_OLIFE OPTION PRC_CAP < NCAP_ELIFE; NCAP_ELIFE(R,V,P)$(NOT PRC_CAP(R,P)) $= NCAP_OLIFE(R,V,P); PRC_CAP(R,P)=0;
* Preprocess refits
LOOP((RP(R,PRC),P)$(RP(R,P)$PRC_REFIT(RP,P)),
NCAP_ILED(RTP(R,V,P)) = -ABS(NCAP_ILED(RTP));
PRC_RCAP(RP)=YES; TRACKP(R,P)$(PRC_REFIT(RP,P)<0)=YES);
RTP_VARP(RTP(R,T,P)) $= PRC_RCAP(R,P);
PRC_RCAP(TRACKP)=YES; OPTION CLEAR=TRACKP;
* Activate MIP solution if requested
$IFI %DSC%==YES $SETGLOBAL SOLMIP %RETIRE%
$IFI %RETIRE%==MIP $SETGLOBAL SOLMIP YES
$EXIT
*-----------------------------------------------------------------------------
$LABEL DECL
$IF %MIP% INTEGER
VARIABLE %VAR%_DRCAP(R,ALLYEAR,LL,P%SWD%,J);
EQUATION %EQ%_DSCRET(R,ALLYEAR,ALLYEAR,P%SWTD%);
* Maps for refit vintages & types
PRC_RCAP(PRC_RCAP(RP)) = PRC_CAP(RP);
LOOP(PRC_RCAP(R,PRC), F=0; MY_F=0; CNT=EPS;
LOOP(P$PRC_REFIT(R,PRC,P),Z=PRC_REFIT(R,PRC,P); CNT$CNT=CNT+1;
IF(ABS(Z)>2, F=F+1); IF(MOD(Z,2)=0,MY_F$(ABS(Z)-4)=3);
IF(Z<0,RTP_TT(R,T,TT,PRC)$COEF_CPT(R,T,TT,P)=YES;
ELSE RTP_TT(R,T,T,PRC)$RTP(R,T,P)=YES; CNT=0;));
IF(CNT,Z=(-1+2$(F=CNT))*MAX(1,MY_F); ELSE Z=-2);
IF(NOT MAPVAL(CNT),RP_RTF(R,PRC) = Z);
IF(F,RCAP_BND(RTP(R,T,PRC),'UP')$(NOT SUM(P$PRC_REFIT(R,PRC,P),RTP(R,T,P)$(ABS(PRC_REFIT(R,PRC,P))>2)))=EPS));
* Force obj type 2a/2b
VNRET(VNT(V,T))$(NOT SAMEAS(V,T)) = YES;
RVPRL(RTP(R,V,P))$PRC_RCAP(R,P)=MAX(0,SMAX(RTP_CPTYR(R,VNRET(V,T),P),YEARVAL(T))-YEARVAL(V));
RVP(RTP) $= RVPRL(RTP);
NCAP_ILED(RVP) = NCAP_ILED(RVP)+EPS;
* Set bounds for continuous retirements
RCAP_BND(R,T,P,BDNEQ) $= RCAP_BND(R,T,P,'FX');
PASTSUM(RVP(R,V,P))$RCAP_BND(RVP,'N') = -(B(V)+NCAP_ILED(RVP)+ABS(RCAP_BND(RVP,'N')));
PASTSUM(RVP)$((RCAP_BND(RVP,'N')<0)+MAPVAL(RCAP_BLK(RVP))) = MAX(1,ABS(PASTSUM(RVP)));
LOOP(TT(T--1),Z=ORD(T)-1;
%VAR%_RCAP.LO(RTP_CPTYR(R,VNRET(V,T),P)%SOW%)$RVP(R,V,P) = RCAP_BND(R,T,P,'LO')$(NOT MAPVAL(RCAP_BLK(R,V,P)))+MIN(0,RTFORC(R,V,T,P)-RTFORC(R,V,TT,P)$Z);
%VAR%_RCAP.UP(RTP_CPTYR(R,VNRET(V,T),P)%SOW%)$RCAP_BND(R,T,P,'UP') =
MIN(SMIN(PASTMILE(V),NCAP_PASTI(R,V,P)),RCAP_BND(R,T,P,'UP')+MAX(0,RTFORC(R,V,T,P)-RTFORC(R,V,TT,P)$Z)));
%VAR%_SCAP.LO(RTP_CPTYR(R,VNRET(V,T),P)%SOW%)$RVP(R,V,P) = MAX(RCAP_BND(R,T,P,'LO'),RTFORC(R,V,T,P));
%VAR%_SCAP.UP(RTP_CPTYR(R,PASTMILE(V),T,P)%SOW%)$RVP(R,V,P) = MAX(RTFORC(R,V,T,P),NCAP_PASTI(R,V,P));
LOOP(RVP(R,V,P),Z=1;LOOP(RTP_CPTYR(R,VNRET(V,T),P)$Z,Z=0; %VAR%_SCAP.UP(R,V,T,P%SOW%)=MIN(%VAR%_RCAP.UP(R,V,T,P%SOW%),%VAR%_SCAP.UP(R,V,T,P%SOW%))));
%VAR%_SCAP.FX(RTP_CPTYR(R,V,T,P)%SOW%)$(((M(T) LT ABS(PASTSUM(R,V,P)))+((M(T)-LEAD(T))/PASTSUM(R,V,P) GE 1))$PASTSUM(R,V,P)) = RTFORC(R,V,T,P);
* Force refits = retirements on request
PRC_YMAX(PRC_RCAP(RP)) = MIN(0,SUM(P$PRC_REFIT(RP,P),MAX(EPS,3-ABS(PRC_REFIT(RP,P)))));
RVPRL(R,'0',P) $= PRC_YMAX(R,P);
%VAR%_RCAP.UP(RTP_TT(R,T(TT++1),T,P)%SOW%)$((RP_RTF(R,P)<3)$PRC_YMAX(R,P))=MAX(0,SUM(RTP(R,PYR_S(V),P),RTFORC(R,V,T,P)-RTFORC(R,V,TT,P))$VNT(TT,T)$(MOD(RP_RTF(R,P),2)=0));
OPTION CLEAR=PASTSUM,CLEAR=RVP;
$EXIT
*-----------------------------------------------------------------------------
$LABEL EQOBJ
$SETGLOBAL RCAPSUB -SUM(VNRET(V,T),%VART%_SCAP(R,V,T,P%SWS%))$PRC_RCAP(R,P)
$SETGLOBAL RCAPSBM -SUM(VNRET(MODLYEAR,T),%VART%_SCAP(R,MODLYEAR,T,P%SWS%))$PRC_RCAP(R,P)
*-------------------
* Allow retirements in integer multiples of a user-defined block-size or the full residual capacity
%EQ%_DSCRET(RTP_CPTYR(%R_V_T%,P)%SWT%)$(VNRET(V,T)$RCAP_BLK(R,V,P))..
%VAR%_SCAP(R,V,T,P%SOW%) - RTFORC(R,V,T,P) =E=
RCAP_BLK(R,V,P) * %VAR%_DRCAP(R,V,T,P%SOW%,'2') + (NCAP_PASTI(R,V,P)-RTFORC(R,V,T,P)) * %VAR%_DRCAP(R,V,T,P%SOW%,'1');
* Cumulative retirements
%EQ%_CUMRET(R,VNRET(V,K(T-(1-1$RP_RTF(R,P)))),P%SWT%)$(RTP_CPTYR(R,V,T,P)$PRC_RCAP(R,P))..
SUM(RTP_CPTYR(R,V,K,P),%VAR%_SCAP(R,V,T,P%SOW%) - %VAR%_RCAP(R,V,T,P%SOW%)) -
SUM(RTP_CPTYR(R,V,MODLYEAR(Y(T-1)),P)$VNRET(V,Y),%VARM%_SCAP(R,V,Y,P%SWS%))
=E= 0;
* Maximum salvage capacity
%EQ%L_SCAP(RTP(R,V(LL),P),IPS%SOW%)$(((OBJ_SUMS(RTP)+(NOT PRC_VINT(R,P))$T(V))$RVPRL(RTP)$L(IPS) OR NCAP_OLIFE(RTP)$IO(IPS))$PRC_RCAP(R,P))..
SUM(IO(IPS),SUM((RTP_CPTYR(R,V,TT,P),PRC_TS(R,P,S)),%VARTT%_ACT(R,V,TT,P,S%SWS%)*FPD(TT))/PRC_CAPACT(R,P)/NCAP_OLIFE(RTP)) +
SUM(VNRET(V,T(LL+RVPRL(RTP))),%VART%_SCAP(R,V,T,P%SWS%))$LIM(IPS)
=L= %VARV%_NCAP(R,V,P%SWS%)$T(V) + NCAP_PASTI(R,V,P) - %VAR%_SCAP(R,V,'0',P%SOW%)$OBJ_SUMS(R,V,P)$RVPRL(R,V,P);
* Retrofits and life-extensions
%EQ%L_REFIT(RTP_TT(R,TT,T,PRC),LNX(L)%SWT%)$((BD(L)+VNT(T,TT)$(RP_RTF(R,PRC)=3))$RT_PP(R,T))..
SUM((V(TT),P)$((VNT(T,V) OR PRC_REFIT(R,PRC,P)<0)$PRC_REFIT(R,PRC,P)),COEF_CPT(R,V,T,P)*(%VARV%_NCAP(R,V,P%SWS%)%RCAPSUB%))+%VAR%_RCAP(R,T,TT,PRC%SOW%)$(RP_RTF(R,PRC)$VNT(T,TT)$BD(L)<3)
=E=
SUM(RTP_CPTYR(R,VNRET(V,TT),PRC),COEF_CPT(R,V,T,PRC) * (%VARTT%_RCAP(R,V,TT,PRC%SWS%)-SUM(MODLYEAR(K(TT-1))$VNT(V,K),MIN(INF$MOD(RP_RTF(R,PRC),2),RTFORC(R,V,TT,PRC)-RTFORC(R,V,K,PRC)))))+
SUM(K(TT-1)$RTP_TT(R,K,T,PRC),%VAR%_RCAP(R,T,K,PRC%SOW%))$(RP_RTF(R,PRC)$BD(L)>0);
*-----------------------------------------------------------------------------
$IF %VARMAC% $SET VAR %VAS%
$IF NOT %MIP% OPTION CLEAR=RCAP_BLK;
* Set bounds for integer retirements
IF(CARD(RCAP_BLK), RCAP_BLK(RTP)$(RCAP_BLK(RTP) LE 0) = 0;
* Define upper bound of 1 for binary variable if past investments
COEF_CAP(RTP_CPTYR(R,V,T,P))$RCAP_BLK(R,V,P) = (NCAP_PASTI(R,V,P)-RTFORC(R,V,T,P))/RCAP_BLK(R,V,P);
%VAR%_DRCAP.UP(RTP_CPTYR(R,V,T,P)%SOW%,'1')$PRC_RCAP(R,P) = 1$(ABS(COEF_CAP(R,V,T,P)-MIN(10,ROUND(COEF_CAP(R,V,T,P)))) >1E-9);
* Define upper bound for integer multiples
%VAR%_DRCAP.UP(RTP_CPTYR(R,V,T,P)%SOW%,'2')$RCAP_BLK(R,V,P) = MIN(10,FLOOR(%VAR%_SCAP.UP(R,V,T,P%SOW%)/RCAP_BLK(R,V,P)+1E-8));
);
RVPRL(R,PYR_S,P)$PRC_RESID(R,'0',P)=NO; NCAP_OLIFE(R,T,P)$(NOT PRC_VINT(R,P))=NO;
OPTION CLEAR=COEF_CAP;
$EXIT
*-----------------------------------------------------------------------------
$LABEL OBJFIX
* Credit retired capacity for the avoided fixed costs
SUM((OBJ_SUMIV(K_EOH,R,V,P,JOT,LIFE),VNRET(V,T))$RVPRL(R,V,P),
SUM((INVSPRED(K_EOH,JOT,LL,K),KTYAGE(LL,T,Y_EOH,AGE))$OPYEAR(LIFE,AGE),
-OBJ_DISC(R,Y_EOH,CUR) * (1+RTP_CPX(R,V,P,T)$NCAP_CPX(R,V,P)) * %CAPWD%
(
OBJ_FOM(R,K,P,CUR) * (1+SUM(RTP_SHAPE(R,V,P,'1',J,JJ),SHAPE(J,AGE)*MULTI(JJ,Y_EOH)-1)) +
OBJ_FTX(R,K,P,CUR) * (1+SUM(RTP_SHAPE(R,V,P,'2',J,JJ),SHAPE(J,AGE)*MULTI(JJ,Y_EOH)-1)) -
OBJ_FSB(R,K,P,CUR) * (1+SUM(RTP_SHAPE(R,V,P,'3',J,JJ),SHAPE(J,AGE)*MULTI(JJ,Y_EOH)-1))
)
) *
%VART%_SCAP(R,V,T,P %SWS%) / OBJ_DIVIV(R,V,P)) +
* RESIDS require special handling
SUM(RTP_CPTYR(R,PYR_S(V(K)),T,P)$((NOT RVPRL(R,V,P))$PRC_RCAP(R,P)),
SUM(PERIODYR(T,Y_EOH), -OBJ_DISC(R,Y_EOH,CUR) *
(
OBJ_FOM(R,K,P,CUR) * (1+SUM(RTP_SHAPE(R,V,P,'1',J,JJ),MULTI(JJ,Y_EOH)-1)) +
OBJ_FTX(R,K,P,CUR) * (1+SUM(RTP_SHAPE(R,V,P,'2',J,JJ),MULTI(JJ,Y_EOH)-1)) -
OBJ_FSB(R,K,P,CUR) * (1+SUM(RTP_SHAPE(R,V,P,'3',J,JJ),MULTI(JJ,Y_EOH)-1))
)) *
%VART%_SCAP(R,V,T,P %SWS%)) +
$EXIT
*-----------------------------------------------------------------------------
$LABEL OBSALV
* Discredit salvage value for retired capacity
SUM(OBJ_SUMS(R,V,P)$((NOT NCAP_FDR(R,V,P)$RVPRL(R,'0',P))$RVPRL(R,V,P)),
OBJSCC(R,V,P,CUR) * OBJ_DCEOH(R,CUR) *
(%VAR%_SCAP(R,V,'0',P%SOW%)-%VARV%_NCAP(R,V,P%SWS%)$T(V)-NCAP_PASTI(R,V,P))) +