Newer
Older
*** | (C) 2006-2019 Potsdam Institute for Climate Impact Research (PIK)
*** | authors, and contributors see CITATION.cff file. This file is part
*** | of REMIND and licensed under AGPL-3.0-or-later. Under Section 7 of
*** | AGPL-3.0, you are granted additional permissions described in the
*** | REMIND License Exception, version 1.0 (see LICENSE file).
*** | Contact: remind@pik-potsdam.de
*** SOF ./core/datainput.gms
*AJS* technical. initialize parameters so that they are read from gdx
vm_co2eq.l(ttot,regi) = 0;
vm_emiAll.l(ttot,regi,enty) = 0;
*AJS* initialize parameter (avoid compilation errors)
* do this at the start of datainput to prevent accidental overwriting
pm_SolNonInfes(regi) = 1; !! assume the starting point came from a feasible solution
pm_capCum0(ttot,regi,teLearn)$( (ttot.val ge 2005) and (pm_SolNonInfes(regi) eq 1)) = 0;
pm_globalMeanTemperature(tall) = 0;
pm_globalMeanTemperatureZeroed1900(tall) = 0;
pm_temperatureImpulseResponseCO2(tall,tall) = 0;
pm_regionalTemperature(tall,regi) = 0;
pm_tempScaleGlob2Reg(tall,regi) = 1;
pm_damage(tall,regi) = 1;
pm_damageGrowthRate(tall,regi) = 0;
pm_damageMarginal(tall,regi) = 0;
*AL* Initialise to avoid compilation errors in presolve if variable not in input.gdx
vm_demFeForEs.L(t,regi,entyFe,esty,teEs) = 0;
vm_demFeForEs.L(t,regi,fe2es(entyFe,esty,teEs)) = 0.1;
if (cm_emiscen ne 8,
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
);
*------------------------------------------------------------------------------------
*** calculations based on sets
*------------------------------------------------------------------------------------
pm_ttot_val(ttot) = ttot.val;
p_tall_val(tall) = tall.val;
pm_ts(ttot) = (pm_ttot_val(ttot+1)-(pm_ttot_val(ttot-1)))/2;
pm_ts("1900") = 2.5;
$if setGlobal END2110 pm_ts(ttot)$(ord(ttot) eq card(ttot)-1) = pm_ts(ttot-1) ;
pm_ts(ttot)$(ord(ttot) eq card(ttot)) = 27;
pm_dt("1900") = 5;
pm_dt(ttot)$(ttot.val > 1900) = ttot.val - pm_ttot_val(ttot-1);
display pm_ts, pm_dt;
loop(ttot,
loop(tall$((ttot.val le tall.val) AND (pm_ttot_val(ttot+1) ge tall.val)),
pm_interpolWeight_ttot_tall(tall) = ( p_tall_val(tall) - pm_ttot_val(ttot) ) / ( pm_ttot_val(ttot+1) - pm_ttot_val(ttot) );
);
);
pm_tall_2_ttot(tall, ttot)$((ttot.val lt tall.val) AND (pm_ttot_val(ttot+1) gt tall.val)) = Yes;
pm_ttot_2_tall(ttot,tall)$((ttot.val = tall.val) ) = Yes;
*** define pm_prtp according to cm_prtpScen:
if(cm_prtpScen eq 1, pm_prtp(regi) = 0.01);
if(cm_prtpScen eq 3, pm_prtp(regi) = 0.03);
*------------------------------------------------------------------------------------
*------------------------------------------------------------------------------------
*** macro-economy
*------------------------------------------------------------------------------------
*------------------------------------------------------------------------------------
*** load population data
table f_pop(tall,all_regi,all_POPscen) "Population data"
$ondelim
$include "./core/input/f_pop.cs3r"
$offdelim
;
pm_pop(tall,all_regi) = f_pop(tall,all_regi,"%cm_POPscen%") / 1000; !! rescale unit from [million people] to [billion] people
*** load labour data
table f_lab(tall,all_regi,all_POPscen) "Labour data"
$ondelim
$include "./core/input/f_lab.cs3r"
$offdelim
;
pm_lab(tall,all_regi) = f_lab(tall,all_regi,"%cm_POPscen%") / 1000; !! rescale unit from [million people] to [billion] people
display pm_pop, pm_lab;
*** load PPP-MER conversion factor data
parameter pm_shPPPMER(all_regi) "PPP ratio for calculating GDP|PPP from GDP|MER"
/
$ondelim
$include "./core/input/pm_shPPPMER.cs4r"
$offdelim
/
;
*** load GDP data
table f_gdp(tall,all_regi,all_GDPscen) "GDP data"
$ondelim
$include "./core/input/f_gdp.cs3r"
$offdelim
;
pm_gdp(tall,all_regi) = f_gdp(tall,all_regi,"%cm_GDPscen%") * pm_shPPPMER(all_regi) / 1000000; !! rescale from million US$ to trillion US$
*** load level of development
table f_developmentState(tall,all_regi,all_GDPpcScen) "level of development based on GDP per capita"
$ondelim
$include "./core/input/f_developmentState.cs3r"
$offdelim
;
p_developmentState(tall,all_regi) = f_developmentState(tall,all_regi,"%c_GDPpcScen%");
*** Load information from BAU run
Execute_Loadpoint 'input' vm_cesIO, vm_invMacro;
pm_gdp_gdx(ttot,regi) = vm_cesIO.l(ttot,regi,"inco");
p_inv_gdx(ttot,regi) = vm_invMacro.l(ttot,regi,"kap");
*** permit price initilization
pm_pricePerm(ttot) = 0;
*------------------------------------------------------------------------------------
*------------------------------------------------------------------------------------
*** ESM
*------------------------------------------------------------------------------------
*------------------------------------------------------------------------------------
*** default conversion for energy services
pm_fe2es(ttot,regi,teEs) = 1;
pm_shFeCes(ttot,regi,enty,in,teEs) = 0;
***---------------------------------------------------------------------------
*** Import and set global data
***---------------------------------------------------------------------------
table fm_dataglob(char,all_te) "energy technology characteristics: investment costs, O&M costs, efficiency, learning rates ..."
$include "./core/input/generisdata_tech.prn";
parameter p_inco0(ttot,all_regi,all_te) "regionalized technology costs Unit: USD$/KW"
/
$ondelim
$include "./core/input/p_inco0.cs4r"
$offdelim
/
;
*JH* SSP energy technology scenario
table f_dataglob_SSP1(char,all_te) "Techno-economic assumptions consistent with SSP1"
$include "./core/input/generisdata_tech_SSP1.prn"
;
table f_dataglob_SSP5(char,all_te) "Techno-economic assumptions consistent with SSP5"
$include "./core/input/generisdata_tech_SSP5.prn"
;
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
if (cm_nucscen eq 6,
f_dataglob_SSP5("inco0","tnrs") = 6270; !! increased from 4000 to 6270 with the update of technology costs in REMIND 1.7 to keep the percentage increase between SSP2 and SSP5 constant
);
if (c_techAssumptScen eq 2,
fm_dataglob(char,te) = f_dataglob_SSP1(char,te)
);
if (c_techAssumptScen eq 3,
fm_dataglob(char,te) = f_dataglob_SSP5(char,te)
);
display fm_dataglob;
*RP* the new cost data in generisdata_tech is now in $2015. As long as the model runs in $2005, these values have first to be converted to D2005 by dividing by 1.2 downwards
fm_dataglob("inco0",te) = sm_D2015_2_D2005 * fm_dataglob("inco0",te);
fm_dataglob("incolearn",te) = sm_D2015_2_D2005 * fm_dataglob("incolearn",te);
fm_dataglob("omv",te) = sm_D2015_2_D2005 * fm_dataglob("omv",te);
p_inco0(ttot,regi,te) = sm_D2015_2_D2005 * p_inco0(ttot,regi,te);
*RP* rescale the global CSP investment costs in REMIND: Originally we assume a SM3/12h setup, while the cost data from IEA for the short term seems rather based on a SM2/6h setup (with 40% average CF)
*** Accordingly, also decrease long-term costs in REMIND to 0.7 of the current values
fm_dataglob("inco0","csp") = 0.7 * fm_dataglob("inco0","csp");
fm_dataglob("incolearn","csp") = 0.7 * fm_dataglob("incolearn","csp");
*JH* Determine CCS injection rates
*LP* for c_ccsinjecratescen =0 the storing variable vm_co2CCS will be fixed to 0 in bounds.gms, the sm_ccsinjecrate=0 will cause a division by 0 error in the 21_tax module
sm_ccsinjecrate = 0.005
if (c_ccsinjecratescen eq 2, sm_ccsinjecrate = sm_ccsinjecrate * 0.50 ); !! Lower estimate
if (c_ccsinjecratescen eq 3, sm_ccsinjecrate = sm_ccsinjecrate * 1.50 ); !! Upper estimate
if (c_ccsinjecratescen eq 4, sm_ccsinjecrate = sm_ccsinjecrate * 200 ); !! remove flow constraint for DAC runs
if (c_ccsinjecratescen eq 5, sm_ccsinjecrate = sm_ccsinjecrate * 0.20 ); !! sustainable estimate
$include "./core/input/generisdata_flexibility.prn"
fm_dataglob("inco0",te) = sm_DpKW_2_TDpTW * fm_dataglob("inco0",te);
fm_dataglob("incolearn",te) = sm_DpKW_2_TDpTW * fm_dataglob("incolearn",te);
fm_dataglob("omv",te) = s_DpKWa_2_TDpTWa * fm_dataglob("omv",te);
p_inco0(ttot,regi,te) = sm_DpKW_2_TDpTW * p_inco0(ttot,regi,te);
table fm_dataemiglob(all_enty,all_enty,all_te,all_enty) "read-in of emissions factors co2,cco2"
$include "./core/input/generisdata_emi.prn"
;
pm_esCapCost(tall,all_regi,all_teEs) = 0;
parameter pm_share_ind_fesos(tall,all_regi) "Share of coal solids (coaltr) used in the industry (rest is residential)"
/
$ondelim
$include "./core/input/p_share_ind_fesos.cs4r"
$offdelim
/
;
parameter pm_share_ind_fesos_bio(tall,all_regi) "Share of biomass solids (biotr) used in the industry (rest is residential)"
/
$ondelim
$include "./core/input/p_share_ind_fesos_bio.cs4r"
$offdelim
/
;
parameter pm_share_ind_fehos(tall,all_regi) "Share of heating oil used in the industry (rest is residential)"
/
$ondelim
$include "./core/input/p_share_ind_fehos.cs4r"
$offdelim
/
;
*** initialize pm_share_trans with the global value, will be updated after each negishi/nash iteration
pm_share_trans("2005",regi) = 0.617;
pm_share_trans("2010",regi) = 0.625;
pm_share_trans("2015",regi) = 0.626;
pm_share_trans("2020",regi) = 0.642;
pm_share_trans("2025",regi) = 0.684;
pm_share_trans("2030",regi) = 0.710;
pm_share_trans("2035",regi) = 0.727;
pm_share_trans("2040",regi) = 0.735;
pm_share_trans("2045",regi) = 0.735;
pm_share_trans("2050",regi) = 0.742;
pm_share_trans("2055",regi) = 0.736;
pm_share_trans("2060",regi) = 0.751;
pm_share_trans("2070",regi) = 0.774;
pm_share_trans("2080",regi) = 0.829;
pm_share_trans("2090",regi) = 0.810;
pm_share_trans("2100",regi) = 0.829;
pm_share_trans("2110",regi) = 0.818;
pm_share_trans("2130",regi) = 0.865;
pm_share_trans("2150",regi) = 0.872;
*JH* CO2 capture rate of CCS technologies (new SSP5 assumptions)
if (c_ccscapratescen eq 2,
fm_dataemiglob("pecoal","seel","igccc","co2") = 0.2;
fm_dataemiglob("pecoal","seel","igccc","cco2") = 25.9;
fm_dataemiglob("pecoal","seel","pcc","co2") = 0.2;
fm_dataemiglob("pecoal","seel","pcc","cco2") = 25.9;
fm_dataemiglob("pecoal","seel","coalh2c","co2") = 0.2;
fm_dataemiglob("pecoal","seel","coalh2c","cco2") = 25.9;
$ifthen "%c_SSP_forcing_adjust%" == "forcing_SSP5"
fm_dataemiglob("pegas","seel","ngccc","co2") = 0.1;
fm_dataemiglob("pegas","seel","ngccc","co2") = 0.1;
fm_dataemiglob("pegas","seel","ngccc","co2") = 0.1;
fm_dataemiglob("pegas","seel","ngccc","cco2") = 15.2;
fm_dataemiglob("pegas","seh2","gash2c","co2") = 0.1;
fm_dataemiglob("pegas","seh2","gash2c","cco2") = 15.2;
$endif
);
*nb* specific emissions of transformation technologies (co2 in gtc/zj -> conv. gtc/twyr):
fm_dataemiglob(enty,enty2,te,"co2")$pe2se(enty,enty2,te) = 1/s_zj_2_twa * fm_dataemiglob(enty,enty2,te,"co2");
fm_dataemiglob(enty,enty2,te,"cco2") = 1/s_zj_2_twa * fm_dataemiglob(enty,enty2,te,"cco2");
table f_datarenglob(char,rlf,*) "global nur and ren data"
$include "./core/input/generisdata_nur_ren.prn"
;
table f_dataetaglob(tall,all_te) "global eta data"
$include "./core/input/generisdata_varying_eta.prn"
;
Christoph Bertram
committed
* Read in mac historical emissions to calibrate MAC reference emissions
parameter p_histEmiMac(tall,all_regi,all_enty) "historical emissions per MAC"
/
$ondelim
$include "./core/input/p_histEmiMac.cs4r"
$offdelim
/
;
* Read in historical emissions per sector to calibrate MAC reference emissions
parameter p_histEmiSector(tall,all_regi,all_enty,emi_sectors,sector_types) "historical emissions per sector"
/
$ondelim
$include "./core/input/p_histEmiSector.cs4r"
$offdelim
/
;
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
***---------------------------------------------------------------------------
*** Import and set regional data
***---------------------------------------------------------------------------
*** Allocate emission factors to pm_emifac
pm_emifac(ttot,regi,enty,enty2,te,"co2")$emi2te(enty,enty2,te,"co2") = fm_dataemiglob(enty,enty2,te,"co2");
pm_emifac(ttot,regi,enty,enty2,te,"cco2")$emi2te(enty,enty2,te,"cco2") = fm_dataemiglob(enty,enty2,te,"cco2");
*JeS scale N2O energy emissions to EDGAR
pm_emifac(ttot,regi,enty,enty2,te,"n2o")$emi2te(enty,enty2,te,"n2o") = 0.905 * fm_dataemiglob(enty,enty2,te,"n2o");
*JeS from IPCC http://www.ipcc-nggip.iges.or.jp/public/gp/bgp/2_2_Non-CO2_Stationary_Combustion.pdf:
*JeS CH4: 300 kg/TJ = 0.3 Mt/EJ * 31.536 EJ/TWa = 9.46 Mt /TWa
*JeS N2O: 1 kg/TJ = 0.001 Mt/EJ * 31.536 EJ/TWa = 0.031536 Mt / TWa
*** coal 1.4 kg/TJ = 0.04415 Mt/TWa
*** gas 0.1 kg/TJ = 0.00315 Mt/TWa
*** oil 0.6 kg/TJ = 0.01892 Mt/TWa
*** biomass 4 kg/TJ = 0.12614 Mt/TWa;
*** EF for N2O are in generisdata_emi.prn
pm_emifac(t,regi,"pecoal","sesofos","coaltr","ch4") = 9.46 * (1-pm_share_ind_fesos("2005",regi));
pm_emifac(t,regi,"pebiolc","sesobio","biotr","ch4") = 9.46 * (1-pm_share_ind_fesos_bio("2005",regi));
display pm_emifac;
*RP* 2012-07-24: CO2-technologies don't have own emissions, but the pipeline leakage rate (s_co2pipe_leakage) is multiplied on the individual pe2se
s_co2pipe_leakage = 0.01;
loop(emi2te(enty,enty2,te,enty3)$teCCS(te),
fm_dataemiglob(enty,enty2,te,"co2") = fm_dataemiglob(enty,enty2,te,"co2") + fm_dataemiglob(enty,enty2,te,"cco2") * s_co2pipe_leakage ;
fm_dataemiglob(enty,enty2,te,"cco2") = fm_dataemiglob(enty,enty2,te,"cco2") * (1 - s_co2pipe_leakage );
);
*MLB* initialization needed as include file represents only parameters that are different from zero
p_boundtmp(ttot,all_regi,te,rlf)$(ttot.val ge 2005) = 0;
p_bound_cap(ttot,all_regi,te,rlf)$(ttot.val ge 2005) = 0;
*NB* include data and parameters for upper bounds on fossil fuel transport
parameter f_IO_trade(tall,all_regi,all_enty,char) "Energy trade bounds based on IEA data"
/
$ondelim
$include "./core/input/f_IO_trade.cs4r"
$offdelim
/
;
pm_IO_trade(ttot,regi,enty,char) = f_IO_trade(ttot,regi,enty,char) * sm_EJ_2_TWa;
*LB* use scaled data for export to guarantee net trade = 0 for each traded good
loop(tradePe,
loop(t,
if(sum(regi2, pm_IO_trade(t,regi2,tradePe,"Xport")) ne 0,
pm_IO_trade(t,regi,tradePe,"Xport") = pm_IO_trade(t,regi,tradePe,"Xport") * sum(regi2, pm_IO_trade(t,regi2,tradePe,"Mport")) / sum(regi2, pm_IO_trade(t,regi2,tradePe,"Xport"));
);
);
);
display pm_IO_trade;
***nicolasb*DOT* FILE produced from D:\projekte\rose\resources\fossilGrades_nico.m; 2011,12,16;12:14:44
***nicolasb*DOT* original data from literature (Brandt 2009, Charpentier 2009)
***nicolasb*DOT* data files are available at RD3 drive roseBob_finSSP.xls
***nicolasb*DOT* tbd the script is available in the common script folder
***nicolasb*DOT* The parameter describes the extra CO2 emissions from fuel extraction on top of the PE combustion emissions
***nicolasb*DOT* the units are: GtC per TWa
***nicolasb*DOT* ATTENTION: the data given here must crrespond with the mapping emi2fuelMine(enty,enty2,rlf)
p_cint(regi,"co2","peoil","4")=0.0475647000;
p_cint(regi,"co2","peoil","5")=0.1078133200;
p_cint(regi,"co2","peoil","6")=0.1775748800;
p_cint(regi,"co2","peoil","7")=0.2283105600;
p_cint(regi,"co2","peoil","8")=0.4153983800;
*** Use global data as standard for regionalized data:
pm_data(all_regi,char,te) = fm_dataglob(char,te);
*NB* display
*** historical installed capacity
*** read-in of p_histCap.cs3r
$Offlisting
table p_histCap(tall,all_regi,all_te) "historical installed capacity"
$ondelim
$include "./core/input/p_histCap.cs3r"
$offdelim
;
$Onlisting
*** historical PE installed capacity
*** read-in of p_PE_histCap.cs3r
table p_PE_histCap(tall,all_regi,all_enty,all_enty) "historical installed capacity"
$ondelim
$include "./core/input/p_PE_histCap.cs3r"
$offdelim
;
*** installed capacity availability
*** read-in of f_cf.cs3r
$Offlisting
table f_cf(tall,all_regi,all_te) "installed capacity availability"
$ondelim
$include "./core/input/f_cf.cs3r"
$offdelim
;
$Onlisting
pm_cf(ttot,regi,te) = f_cf(ttot,regi,te);
*RP short-term fix: set capacity factors here by hand, because the input data procudure won't be updated in time
pm_cf(ttot,regi,"apcardiefft") = 1;
pm_cf(ttot,regi,"apcardieffH2t") = 1;
pm_cf(ttot,regi,"h2turbVRE") = 0.15;
pm_cf(ttot,regi,"elh2VRE") = 0.6;
table p_earlyreti_adjRate(all_regi,all_te) "extra retirement rate for technologies in countries with relatively old fleet"
$ondelim
$include "./core/input/p_earlyRetirementAdjFactor.cs3r"
$offdelim
;
***---------------------------------------------------------------------------
*RP* calculate omegs and opTimeYr2te
***---------------------------------------------------------------------------
*RP* use new lifetimes defined in generisdata_tech.prn:
pm_omeg(regi,opTimeYr,te) = 0;
loop(regi,
p_aux_lifetime(regi,te) = 5/4 * pm_data(regi,"lifetime",te);
loop(te,
loop(opTimeYr,
pm_omeg(regi,opTimeYr,te) = 1 - ((opTimeYr.val-0.5) / p_aux_lifetime(regi,te))**4 ;
opTimeYr2te(te,opTimeYr)$(pm_omeg(regi,opTimeYr,te) > 0 ) = yes;
if( pm_omeg(regi,opTimeYr,te) <= 0,
pm_omeg(regi,opTimeYr,te) = 0;
opTimeYr2te(te,opTimeYr) = no;
);
)
);
);
*LB* calculate mapping tsu2opTimeYr
alias(ttot, tttot);
tsu2opTimeYr(ttot,opTimeYr) = no;
tsu2opTimeYr(ttot,"1") = yes;
loop(ttot,
loop(opTimeYr,
loop(tttot $(ord(tttot) le ord(ttot)),
if(opTimeYr.val = pm_ttot_val(ttot)-pm_ttot_val(tttot)+1,
tsu2opTimeYr(ttot,opTimeYr) = yes;
);
);
);
);
display pm_omeg,opTimeYr2te, tsu2opTimeYr;
p_tsu2opTimeYr_h(ttot,opTimeYr) = 0;
p_tsu2opTimeYr_h(ttot,opTimeYr) $tsu2opTimeYr(ttot,opTimeYr) = 1 ;
pm_tsu2opTimeYr(ttot,opTimeYr)$tsu2opTimeYr(ttot,opTimeYr)
= sum(opTimeYr2 $ (ord(opTimeYr2) le ord(opTimeYr)), p_tsu2opTimeYr_h(ttot,opTimeYr2));
display pm_tsu2opTimeYr;
file diagnosis_opTimeYr2te;
put diagnosis_opTimeYr2te;
put "mapping opTimeYr2te, automatically filled in generisdata.inc from the lifetimes given in generisdata.prn" //;
put "te", @15, "regi", @20, "opTimeYr", @27, "pm_data(regi,'lifetime',te)", @60, "p_aux_lifetime"//;
loop(regi,
loop(te,
loop(opTimeYr2te(te,opTimeYr),
p_aux_tlt(te) = ord(opTimeYr);
)
put te.tl, @ 15, regi.tl, @20, p_aux_tlt(te):3:0, @35, pm_data(regi,"lifetime",te):3:0 , @65, p_aux_lifetime(regi,te):3:0 /;
)
);
putclose diagnosis_opTimeYr2te;
*RP* safety check that no technology has zero life time - this should give a run-time error if omeg=0 for the first time step
*RP* also check the previous calculation that pm_omeg is not >0 for a opTimeYr value greater than contained in opTimeYr2te
*RP* for diagnosis, uncomment the putfile lines and you will find out which technologies have wrong inputs in generissets or generisdatadatacap
loop(regi,
loop(te,
p_aux_check_omeg(te) = 1/pm_omeg(regi,'1',te);
p_aux_tlt_max(te) = 0;
loop(opTimeYr$(opTimeYr2te(te,opTimeYr)),
p_aux_tlt_max(te) = p_aux_tlt_max(te) + 1
);
if(p_aux_tlt_max(te) < 20,
loop(opTimeYr$(ord(opTimeYr) = p_aux_tlt_max(te)),
if(pm_omeg(regi,opTimeYr+1,te) > 0,
p_aux_check_tlt(te) = 1/0;
);
);
);
);
);
*RP* calculate annuity of a technology
p_discountedLifetime(te) = sum(opTimeYr, (sum(regi, pm_omeg(regi,opTimeYr,te))/sum(regi,1)) / 1.06**opTimeYr.val );
p_teAnnuity(te) = 1/p_discountedLifetime(te) ;
display p_discountedLifetime, p_teAnnuity;
*** read in data on electric vehicles used as bound on vm_cap.up(t,regi,"apCarElT","1")
parameter pm_boundCapEV(tall,all_regi) "installed capacity of electric vehicles"
/
$ondelim
$include "./core/input/pm_boundCapEV.cs4r"
$offdelim
/
;
*** read in data on Nuclear capacities used as bound on vm_cap.fx("2015",regi,"tnrs","1"), vm_deltaCap.fx("2020",regi,"tnrs","1") and vm_deltaCap.up("2025" and "2030")
parameter pm_NuclearConstraint(ttot,all_regi,all_te) "parameter with the real-world capacities, construction and plans"
/
$ondelim
$include "./core/input/pm_NuclearConstraint.cs4r"
$offdelim
/
;
*** avoid negative additions requiremnet for 2020
loop(regi,
if(pm_NuclearConstraint("2020",regi,"tnrs")<0,
pm_NuclearConstraint("2020",regi,"tnrs")=0;
);
);
*** read in data on CCS capacities used as bound on vm_co2CCS.up("2020",regi,"cco2","ico2","ccsinje","1")
parameter pm_boundCapCCS(all_regi) "installed and planed capacity of CCS"
/
$ondelim
$include "./core/input/pm_boundCapCCS.cs4r"
$offdelim
/
;
*** read in indicators on whether CCS is used in 2025 and 2030 (0 = no)
parameter p_boundCapCCSindicator(all_regi) "CCS used in until 2030"
/
$ondelim
$include "./core/input/p_boundCapCCSindicator.cs4r"
$offdelim
/
;
*** read in CO2 emisisons for 2010, used to fix vm_emiTe.up("2010",regi,"co2")
parameter p_boundEmi(tall,all_regi) "domestic CO2 emissions that are allowed in 2010 Unit: GtC"
/
$ondelim
$include "./core/input/p_boundEmi.cs4r"
$offdelim
/
;
*** read in F-Gas emissions
parameter f_emiFgas(tall,all_regi,all_SSP_forcing_adjust,all_rcp_scen,all_delayPolicy,all_enty) "F-gas emissions by single gases from IMAGE"
/
$ondelim
$include "./core/input/f_emiFgas.cs4r"
$offdelim
/
;
parameter p_abatparam_CH4(tall,all_regi,all_enty,steps) "MAC costs for CH4 by source"
/
$ondelim
$include "./core/input/p_abatparam_CH4.cs4r"
$offdelim
/
;
parameter p_abatparam_N2O(tall,all_regi,all_enty,steps) "MAC costs for N2O by source"
/
$ondelim
$include "./core/input/p_abatparam_N2O.cs4r"
$offdelim
/
;
parameter p_abatparam_CO2(tall,all_enty,steps) "MAC costs for CO2 by source"
/
$ondelim
$include "./core/input/p_abatparam_CO2.cs4r"
$offdelim
/
;
p_abatparam_CH4(tall,all_regi,all_enty,steps)$(ord(steps) gt 201) = p_abatparam_CH4(tall,all_regi,all_enty,"201");
p_abatparam_N2O(tall,all_regi,all_enty,steps)$(ord(steps) gt 201) = p_abatparam_N2O(tall,all_regi,all_enty,"201");
parameter p_emiFossilFuelExtr(all_regi,all_enty) "methane emissions, needed for the calculation of p_efFossilFuelExtr"
/
$ondelim
$include "./core/input/p_emiFossilFuelExtr.cs4r"
$offdelim
/
;
$if %cm_LU_emi_scen% == "SSP1" p_efFossilFuelExtr(regi,"pebiolc","n2obio") = 0.0047/sm_EJ_2_TWa;
$if %cm_LU_emi_scen% == "SSP2" p_efFossilFuelExtr(regi,"pebiolc","n2obio") = 0.0079/sm_EJ_2_TWa;
$if %cm_LU_emi_scen% == "SSP5" p_efFossilFuelExtr(regi,"pebiolc","n2obio") = 0.0066/sm_EJ_2_TWa;
*BS* added SDP, copied SSP1 number
$if %cm_LU_emi_scen% == "SDP" p_efFossilFuelExtr(regi,"pebiolc","n2obio") = 0.0047/sm_EJ_2_TWa;
*DK* In case REMIND is coupled to MAgPIE emissions are obtained from the MAgPIE reporting. Thus, emission factors are set to zero
$if %cm_MAgPIE_coupling% == "on" p_efFossilFuelExtr(regi,"pebiolc","n2obio") = 0.0;
display p_efFossilFuelExtr;
pm_dataren(regi,"nur",rlf,te) = f_datarenglob("nur",rlf,te);
pm_dataren(regi,"maxprod",rlf,te) = sm_EJ_2_TWa * f_datarenglob("maxprod",rlf,te);
*RP* hydro, spv and csp get maxprod for all regions and grades from external file
table f_maxProdGradeRegiHydro(all_regi,char,rlf) "input of regionalized maximum from hydro [EJ/a]"
$ondelim
$include "./core/input/f_maxProdGradeRegiHydro.cs3r"
$offdelim
;
pm_dataren(all_regi,"maxprod",rlf,"hydro") = sm_EJ_2_TWa * f_maxProdGradeRegiHydro(all_regi,"maxprod",rlf);
pm_dataren(all_regi,"nur",rlf,"hydro") = f_maxProdGradeRegiHydro(all_regi,"nur",rlf);
table f_maxProdGradeRegiWind(all_regi,char,rlf) "input of regionalized maximum from wind [EJ/a]"
$ondelim
$include "./core/input/f_maxProdGradeRegiWind.cs3r"
$offdelim
;
pm_dataren(all_regi,"maxprod",rlf,"wind") = sm_EJ_2_TWa * f_maxProdGradeRegiWind(all_regi,"maxprod",rlf);
pm_dataren(all_regi,"nur",rlf,"wind") = f_maxProdGradeRegiWind(all_regi,"nur",rlf);
table f_dataRegiSolar(all_regi,char,all_te,rlf) "input of regionalized data for solar"
$ondelim
$include "./core/input/f_dataRegiSolar.cs3r"
$offdelim
;
pm_dataren(all_regi,"maxprod",rlf,"csp") = sm_EJ_2_TWa * f_dataRegiSolar(all_regi,"maxprod","csp",rlf);
pm_dataren(all_regi,"maxprod",rlf,"spv") = sm_EJ_2_TWa * f_dataRegiSolar(all_regi,"maxprod","spv",rlf);
pm_dataren(all_regi,"nur",rlf,"csp") = f_dataRegiSolar(all_regi,"nur","csp",rlf);
pm_dataren(all_regi,"nur",rlf,"spv") = f_dataRegiSolar(all_regi,"nur","spv",rlf);
p_datapot(all_regi,"limitGeopot",rlf,"pesol") = f_dataRegiSolar(all_regi,"limitGeopot","spv",rlf);
pm_data(all_regi,"luse","spv") = f_dataRegiSolar(all_regi,"luse","spv","1")/1000;
*mh* set 'nur' for all non renewable technologies to '1':
pm_dataren(regi,"nur",rlf,teNoRe) = 1;
display p_datapot, pm_dataren;
***---------------------------------------------------------------------------
*** calculate average capacity factors for renewables in 2015
*** --------------------------------------------------------------------------
loop(regi,
loop(teReNoBio(te),
p_aux_capToDistr(regi,te) = p_histCap("2015",regi,te)$(p_histCap("2015",regi,te) gt 1e-10);
s_aux_cap_remaining = p_aux_capToDistr(regi,te);
*RP* fill up the renewable grades to calculate the total capacity needed to produce the amount calculated in initialcap2, assuming the best grades are filled first (with 20% of each grade not yet used)
loop(teRe2rlfDetail(te,rlf)$(pm_dataren(regi,"nur",rlf,te) > 0),
if(s_aux_cap_remaining > 0,
p_aux_capThisGrade(regi,te,rlf) = min(s_aux_cap_remaining, ( (pm_dataren(regi,"maxprod",rlf,te) * 0.8) / pm_dataren(regi,"nur",rlf,te) ) );
s_aux_cap_remaining = s_aux_cap_remaining - p_aux_capThisGrade(regi,te,rlf);
);
); !! teRe2rlfDetail
p_avCapFac2015(regi,te) = sum(teRe2rlfDetail(te,rlf), p_aux_capThisGrade(regi,te,rlf) * pm_dataren(regi,"nur",rlf,te) )
/ ( sum(teRe2rlfDetail(te,rlf), p_aux_capThisGrade(regi,te,rlf) ) + 1e-10)
); !! teReNoBio
); !! regi
display p_aux_capToDistr, s_aux_cap_remaining, p_aux_capThisGrade, p_avCapFac2015, p_inco0;
parameter p_histCapFac(tall,all_regi,all_te) "Capacity factor (fraction of the year that a plant is running) of installed capacity in 2015"
/
$ondelim
$include "./core/input/p_histCapFac.cs4r"
$offdelim
/
;
*** RP rescale wind capacity factors in REMIND to account for very different real-world CF (potentially partially due to assumed low-wind turbine set-ups in the NREL data)
*** Because of the lag effect (turbines in the 2000s were much smaller and thus yielded lower CFs), only implement half of the calculated ratio of historic to REMIND capFac as rescaling for the new CFs - realised as (x+1)/2
p_aux_capacityFactorHistOverREMIND(regi,"wind")$p_avCapFac2015(regi,"wind") = p_histCapFac("2015",regi,"wind") / p_avCapFac2015(regi,"wind");
loop(te$sameas(te,"wind"),
pm_dataren(regi,"maxprod",rlf,te) = pm_dataren(regi,"maxprod",rlf,te) * ( p_aux_capacityFactorHistOverREMIND(regi,te) + 1) / 2 ;
pm_dataren(regi,"nur",rlf,te) = pm_dataren(regi,"nur",rlf,te) * ( p_aux_capacityFactorHistOverREMIND(regi,te) + 1) / 2 ;
);
p_aux_capacityFactorHistOverREMIND(regi,"spv")$p_avCapFac2015(regi,"spv") = p_histCapFac("2015",regi,"spv") / p_avCapFac2015(regi,"spv");
pm_cf("2015",regi,"spv") = pm_cf("2015",regi,"spv") * p_aux_capacityFactorHistOverREMIND(regi,"spv");
*** RP rescale CSP capacity factors in REMIND - in the DLR resource data input files, the numbers are based on a SM3/12h setup, while the cost data from IEA seems rather based on a SM2/6h setup (with 40% average CF)
*** Accordingly, decrease CF in REMIND to 2/3 of the DLR values (no need to correct maxprod, as here no miscalculation of total energy yield takes place, in contrast to wind)
loop(te$sameas(te,"csp"),
pm_dataren(regi,"nur",rlf,te) = pm_dataren(regi,"nur",rlf,te) * 2/3 ;
);
display p_aux_capacityFactorHistOverREMIND, pm_dataren;
*** -----------------------------------------------------------------
pm_dataeta(tall,regi,te) = f_dataetaglob(tall,te);
*RP* 20100620 adjust which technologies have time-varying etas
display f_dataetaglob;
display teEtaIncr;
loop(te,
teEtaIncr(te) = no;
teEtaIncr(te) = yes$(f_dataetaglob('1900',te) > 0);
);
display teEtaIncr;
*** import regionalized CCS constraints:
table pm_dataccs(all_regi,char,rlf) "maximum CO2 storage capacity using CCS technology. Unit: GtC"
$ondelim
$include "./core/input/pm_dataccs.cs3r"
$offdelim
;
***-----------------------------------------------------------------------------
*** adjustment cost parameter
***-----------------------------------------------------------------------------
***RP 20100531 import regional offset for adjustment cost calculations
parameter p_adj_deltacapoffset(tall,all_regi,all_te) "adjustment cost offset to prevent delay of capacity addition"
/
$ondelim
$include "./core/input/p_adj_deltacapoffset.cs4r"
$offdelim
/
;
p_adj_deltacapoffset("2015",regi,"tnrs")= 1;
*** share of PE2SE capacities in 2005 depends on GDP-MER
p_adj_seed_reg(t,regi) = pm_gdp(t,regi) * 1e-4;
loop(ttot$(ttot.val ge 2005),
p_adj_seed_te(ttot,regi,te) = 1.00;
p_adj_seed_te(ttot,regi,teCCS) = 0.25;
p_adj_seed_te(ttot,regi,"igcc") = 0.50;
p_adj_seed_te(ttot,regi,"tnrs") = 0.25;
p_adj_seed_te(ttot,regi,"hydro") = 0.25;
p_adj_seed_te(ttot,regi,"csp") = 0.25;
p_adj_seed_te(ttot,regi,"spv") = 2.00;
p_adj_seed_te(ttot,regi,"gasftrec") = 0.25;
p_adj_seed_te(ttot,regi,"gasftcrec") = 0.25;
p_adj_seed_te(ttot,regi,"coalftrec") = 0.25;
p_adj_seed_te(ttot,regi,"coalftcrec") = 0.25;
p_adj_seed_te(ttot,regi,"coaltr") = 4.00;
p_adj_seed_te(ttot,regi,'apCarH2T') = 1.00;
p_adj_seed_te(ttot,regi,'apCarElT') = 1.00;
p_adj_seed_te(ttot,regi,'apCarDiEffT') = 0.50;
p_adj_seed_te(ttot,regi,'apCarDiEffH2T') = 0.50;
p_adj_seed_te(ttot,regi,'dac') = 0.25;
*RP: for comparison of different technologies:
*** pm_conv_cap_2_MioLDV <- 650 # The world has slightly below 800million cars in 2005 (IEA TECO2), so with a global vm_cap of 1.2, this gives ~650
*** ==> 1TW power plant ~ 650 million LDV

Anastasis Giannousakis
committed
p_adj_coeff(ttot,regi,te) = 0.2;
p_adj_coeff(ttot,regi,"coaltr") = 0.1;
p_adj_coeff(ttot,regi,"tnrs") = 1.0;
p_adj_coeff(ttot,regi,"hydro") = 1.0;
p_adj_coeff(ttot,regi,teCCS) = 1.0;
p_adj_coeff(ttot,regi,"gasftrec") = 0.4;
p_adj_coeff(ttot,regi,"gasftcrec") = 0.8;
p_adj_coeff(ttot,regi,"coalftrec") = 0.6;
p_adj_coeff(ttot,regi,"coalftcrec") = 0.8;
Robert Pietzcker
committed
p_adj_coeff(ttot,regi,"spv") = 0.1;
p_adj_coeff(ttot,regi,"wind") = 0.1;
p_adj_coeff(ttot,regi,"dac") = 0.8;
p_adj_coeff(ttot,regi,'apCarH2T') = 1.0;
p_adj_coeff(ttot,regi,'apCarElT') = 1.0;
p_adj_coeff(ttot,regi,'apCarDiT') = 1.0;
p_adj_coeff(ttot,regi,'apCarDiEffT') = 2.0;
p_adj_coeff(ttot,regi,'apCarDiEffH2T') = 2.0;
p_adj_coeff(ttot,regi,teGrid) = 1.0;
p_adj_coeff(ttot,regi,teStor) = 0.05;
);
p_adj_coeff(ttot,regi,te) = 25 * p_adj_coeff(ttot,regi,te); !! Rescaling all adjustment cost coefficients

Anastasis Giannousakis
committed
p_adj_coeff_Orig(ttot,regi,te) = p_adj_coeff(ttot,regi,te);
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
p_adj_seed_te_Orig(ttot,regi,te) = p_adj_seed_te(ttot,regi,te);
p_adj_coeff_glob(te) = 0.0;
p_adj_coeff_glob('tnrs') = 0.0;
*** Unit conversions
p_emi_quan_conv_ar4(enty) = 1;
p_emi_quan_conv_ar4(enty)$(emiMacMagpieCH4(enty)) = s_tgch4_2_pgc * (25/s_gwpCH4); !! need to use old GWP for MAC cost conversion as it only reverts what has been done in the calculation of the MACs
p_emi_quan_conv_ar4(enty)$(emiMacMagpieN2O(enty)) = s_tgn_2_pgc * (298/s_gwpN2O);
p_emi_quan_conv_ar4(enty)$(emiMacExoCH4(enty)) = s_tgch4_2_pgc * (25/s_gwpCH4);
p_emi_quan_conv_ar4(enty)$(emiMacExoN2O(enty)) = s_tgn_2_pgc * (298/s_gwpN2O);
p_emi_quan_conv_ar4("ch4coal") = s_tgch4_2_pgc * (25/s_gwpCH4);
p_emi_quan_conv_ar4("ch4gas") = s_tgch4_2_pgc * (25/s_gwpCH4);
p_emi_quan_conv_ar4("ch4oil") = s_tgch4_2_pgc * (25/s_gwpCH4);
p_emi_quan_conv_ar4("ch4wstl") = s_tgch4_2_pgc * (25/s_gwpCH4);
p_emi_quan_conv_ar4("ch4wsts") = s_tgch4_2_pgc * (25/s_gwpCH4);
p_emi_quan_conv_ar4("n2otrans") = s_tgn_2_pgc * (298/s_gwpN2O);
p_emi_quan_conv_ar4("n2oadac") = s_tgn_2_pgc * (298/s_gwpN2O);
p_emi_quan_conv_ar4("n2onitac") = s_tgn_2_pgc * (298/s_gwpN2O);
p_emi_quan_conv_ar4("n2owaste") = s_tgn_2_pgc * (298/s_gwpN2O);
*RP* Distribute ccap0 for all regions
pm_data(regi,"ccap0",te) = 1/card(regi)*fm_dataglob("ccap0",te);
*** --------------------------------------------------------------------------------
*** Adjust investment cost data
*** -------------------------------------------------------------------------------
*RP* calculate turnkey costs (which are the sum of the overnight costs in generisdata_tech and the "interest during construction” (IDC) )
*** in the version with regionalized technology costs, also use regionally differentiated financing costs
*** First read in the regional market risks:
parameter p_risk_premium_constr(all_regi) "risk premium during construction time. Use same values as pm_risk_premium used in module 23_capital markets"
*RP* 2 parameters needed because pm_risk_premium is set to 0 in module 23 realization perfect".
/
$ondelim
$include "./core/input/pm_risk_premium.cs4r"
$offdelim
/
;
*** then calculate the financing costs during construction
loop(te$(fm_dataglob("constrTme",te) > 0),
Lavinia Baumstark
committed
p_tkpremused(regi,te) = 1/fm_dataglob("constrTme",te)
* sum(integ$(integ.val <= fm_dataglob("constrTme",te)),
$if %cm_techcosts% == "REG" (1.03 + pm_prtp(regi) + p_risk_premium_constr(regi) ) ** (integ.val - 0.5) - 1
$if %cm_techcosts% == "GLO" (1.03 + pm_prtp(regi) ) ** (integ.val - 0.5) - 1
)
);
*** nuclear sees 3% higher interest rates during construction time due to higher construction time risk, see "The economic future of nuclear power - A study conducted at The University of Chicago" (2004)
loop(te$sameas(te,"tnrs"),
Lavinia Baumstark
committed
p_tkpremused(regi,te) = 1/fm_dataglob("constrTme",te)
* sum(integ$(integ.val <= fm_dataglob("constrTme",te)),
$if %cm_techcosts% == "REG" (1.03 + 0.03 + pm_prtp(regi) + p_risk_premium_constr(regi) ) ** (integ.val - 0.5) - 1
$if %cm_techcosts% == "GLO" (1.03 + 0.03 + pm_prtp(regi) ) ** (integ.val - 0.5) - 1
)
);
Lavinia Baumstark
committed
display p_tkpremused;
***for those technologies, for which differentiated costs are available for 2015-2040, use those
***$if %cm_techcosts% == "REG" loop(teRegTechCosts(te)$(not teLearn(te)),
***$if %cm_techcosts% == "REG" pm_inco0_t(ttot,regi,te)$(ttot.val ge 2015 AND ttot.val lt 2040) = p_inco0(ttot,regi,te);
***$if %cm_techcosts% == "REG" pm_inco0_t(ttot,regi,te)$(ttot.val ge 2040) = p_inco0("2040",regi,te);
***$if %cm_techcosts% == "REG" );
***$if %cm_techcosts% == "REG" pm_inco0_t(ttot,regi,te)$(ttot.val ge 2015 AND ttot.val lt 2040) = p_inco0(ttot,regi,te);
Lavinia Baumstark
committed
pm_data(regi,"inco0",te) = (1 + p_tkpremused(regi,te) ) * pm_data(regi,"inco0",te);
pm_data(regi,"incolearn",te) = (1 + p_tkpremused(regi,te) ) * pm_data(regi,"incolearn",te);
p_inco0(ttot,regi,teRegTechCosts) = (1 + p_tkpremused(regi,teRegTechCosts) ) * p_inco0(ttot,regi,teRegTechCosts);
*** take region average p_tkpremused for global convergence price
fm_dataglob("inco0",te) = (1 + sum(regi, p_tkpremused(regi,te))/sum(regi, 1)) * fm_dataglob("inco0",te);
if( cm_solwindenergyscen = 2,
loop(te$( sameas(te,"spv") OR sameas(te,"csp") OR sameas(te,"wind") ),
pm_data(regi,"learn",te) = 0.8 * pm_data(regi,"learn",te);
);
pm_data(regi,"incolearn","csp") = 0.7 * pm_data(regi,"incolearn","csp") ;
pm_data(regi,"incolearn","spv") = 0.6 * pm_data(regi,"incolearn","spv") ;
pm_data(regi,"incolearn","wind") = 0.3 * pm_data(regi,"incolearn","wind");
);
if( cm_solwindenergyscen = 3,
loop(te$( sameas(te,"spv") OR sameas(te,"csp") OR sameas(te,"wind") ),
pm_data(regi,"learn",te) = 0;
);
);
***calculate default floor costs for learning technologies
pm_data(regi,"floorcost",teLearn(te)) = pm_data(regi,"inco0",te) - pm_data(regi,"incolearn",te);
*** In case regionally differentiated investment costs should be used the corresponding entries are revised:
$if %cm_techcosts% == "REG" pm_data(regi,"inco0",teRegTechCosts) = p_inco0("2015",regi,teRegTechCosts);
Robert Pietzcker
committed
loop(teRegTechCosts$(sameas(teRegTechCosts,"spv") ),
$if %cm_techcosts% == "REG" pm_data(regi,"inco0",teRegTechCosts) = p_inco0("2020",regi,teRegTechCosts);
);
$if %cm_techcosts% == "REG" pm_data(regi,"incolearn",teLearn(te)) = pm_data(regi,"inco0",te) - pm_data(regi,"floorcost",te) ;
*** Calculate learning parameters:
pm_data(regi,"learnExp_woFC",teLearn(te)) = log(1-pm_data(regi,"learn", te))/log(2);
*RP* adjust exponent parameter learnExp_woFC to take floor costs into account
pm_data(regi,"learnExp_wFC",teLearn(te)) = pm_data(regi,"inco0",te) / pm_data(regi,"incolearn",te) * log(1-pm_data(regi,"learn", te))/log(2);
***parameter calculation for global level, that regional values can gradually converge to
fm_dataglob("learnExp_wFC",teLearn(te)) = fm_dataglob("inco0",te)/fm_dataglob("incolearn",te) * log(1-fm_dataglob("learn", te))/log(2);
*NB* read in vm_capCum(t0,regi,teLearn) from input.gdx to have info available for the recalibration of 2005 investment costs
Execute_Loadpoint 'input' p_capCum = vm_capCum.l;
*** in case the technologies did not exist in the gdx, set to a non-zero value
p_capCum(t,regi,te)$( NOT p_capCum(t,regi,te)) = sm_eps;
Robert Pietzcker
committed
display p_capCum;
*RP overwrite p_capCum by exogenous values for 2020
p_capCum("2020",regi,"spv") = 0.6 / card(regi2); !! roughly 600GW in 2020
display p_capCum;
pm_data(regi,"learnMult_woFC",teLearn(te)) = pm_data(regi,"incolearn",te)/sum(regi2,(pm_data(regi2,"ccap0",te))**(pm_data(regi,"learnExp_woFC",te)));
*RP* adjust parameter learnMult_woFC to take floor costs into account
$if %cm_techcosts% == "GLO" pm_data(regi,"learnMult_wFC",teLearn(te)) = pm_data(regi,"incolearn",te)/(sum(regi2,pm_data(regi2,"ccap0",te))**pm_data(regi,"learnExp_wFC",te));
*NB* this is the correction of the original parameter calibration
$if %cm_techcosts% == "REG" pm_data(regi,"learnMult_wFC",teLearn(te)) = pm_data(regi,"incolearn",te)/(sum(regi2,p_capCum("2015",regi2,te))**pm_data(regi,"learnExp_wFC",te));
Robert Pietzcker
committed
loop(teRegTechCosts$(sameas(teRegTechCosts,"spv") ),
$if %cm_techcosts% == "REG" pm_data(regi,"learnMult_wFC",teLearn(te)) = pm_data(regi,"incolearn",te)/(sum(regi2,p_capCum("2020",regi2,te))**pm_data(regi,"learnExp_wFC",te));
);
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
***parameter calculation for global level, that regional values can gradually converge to
fm_dataglob("learnMult_wFC",teLearn(te)) = fm_dataglob("incolearn",te)/(fm_dataglob("ccap0",te) **fm_dataglob("learnExp_wFC", te));
display pm_data;
*RP* 2012-03-07: Markup for advanced technologies
table p_costMarkupAdvTech(s_statusTe,tall) "Multiplicative investment cost markup for early time periods (until 2030) on advanced technologies (CCS, Hydrogen) that are not modeled through endogenous learning"
$include "./core/input/p_costMarkupAdvTech.prn"
;
loop(teNoLearn(te),
pm_inco0_t(ttot,regi,te) = pm_data(regi,"inco0",te);
loop(ttot$(ttot.val ge 2005 AND ttot.val < 2035 ),
pm_inco0_t(ttot,regi,te) = sum(s_statusTe$(s_statusTe.val eq pm_data(regi,"tech_stat",te) ), p_costMarkupAdvTech(s_statusTe,ttot) * pm_inco0_t(ttot,regi,te) );
);
);
display pm_inco0_t;
***for those technologies, for which differentiated costs are available for 2015-2040, use those
$if %cm_techcosts% == "REG" loop(teRegTechCosts(te)$(not teLearn(te)),
$if %cm_techcosts% == "REG" pm_inco0_t(ttot,regi,te)$(ttot.val ge 2015 AND ttot.val lt 2040) = p_inco0(ttot,regi,te);
$if %cm_techcosts% == "REG" pm_inco0_t(ttot,regi,te)$(ttot.val ge 2040) = p_inco0("2040",regi,te);
$if %cm_techcosts% == "REG" );
*** re-insert effect of costMarkupAdvTech for IGCC in the regionalized cost data, as the IEA numbers have unrealistically low IGCC costs in 2005-2020
$if %c_techcosts% == "REG" loop(teNoLearn(te)$(sameas(te,"igcc"),
$if %c_techcosts% == "REG" loop(ttot$(ttot.val ge 2005 AND ttot.val < 2035 ),
$if %c_techcosts% == "REG" pm_inco0_t(ttot,regi,te) = sum(s_statusTe$(s_statusTe.val eq pm_data(regi,"tech_stat",te) ), p_costMarkupAdvTech(s_statusTe,ttot) * pm_inco0_t(ttot,regi,te) );
$if %c_techcosts% == "REG" );
$if %c_techcosts% == "REG" );
***linear convergence of investment costs from 2025 on for non-learning technologies,
***so that in 2050 all regions again have the technology cost data that is given in generisdata.prn
$if %cm_techcosts% == "REG" loop(ttot$(ttot.val ge 2020 AND ttot.val le 2050),
$if %cm_techcosts% == "REG" pm_inco0_t(ttot,regi,teNoLearn(te)) = ((pm_ttot_val(ttot)-2020)*fm_dataglob("inco0",te)
$if %cm_techcosts% == "REG" + (2050-pm_ttot_val(ttot))*pm_inco0_t("2020",regi,te))/30;
$if %cm_techcosts% == "REG" );
$if %cm_techcosts% == "REG" loop(ttot$(ttot.val gt 2050),
$if %cm_techcosts% == "REG" pm_inco0_t(ttot,regi,teNoLearn(te)) = fm_dataglob("inco0",te);
$if %cm_techcosts% == "REG" );
*** rename f_datafecostsglob
* p_esCapCost(regi,in)$f_datafecostsglob("lifetime",in)
* = (f_datafecostsglob("inco0",in)
* + f_datafecostsglob("omf",in) * f_datafecostsglob("lifetime",in)
* ) * f_datafecostsglob("eta",in) !! from cost per UE power to cost per FE power
* / (f_datafecostsglob("lifetime",in) * f_datafecostsglob("usehr",in)) !! capital costs are levelled over the yearly use
* * sm_day_2_hour * sm_year_2_day !! from $/TWh to $/TWa.
* ;
*** -----------------------------------------------------------------------------
*** ------------ emission budgets and their time periods ------------------------
*** -----------------------------------------------------------------------------
*** definition of budgets on energy emissions in GtC and associated time period
s_t_start = 2005;
$IFTHEN.test setglobal test_TS
sm_endBudgetCO2eq = 2090;
$ELSE.test
sm_endBudgetCO2eq = 2110;
$ENDIF.test
*cb single budget should cover the full modeling time, as otherwise CO2 prices show strange behaviour around 2100 (and rest of behaviour is also biased by foresight of cap-free post 2100)
if (cm_emiscen eq 6,
sm_endBudgetCO2eq = 2150;
);
sm_budgetCO2eqGlob = 20000.0000;
*JeS values for multigasscen = 1 are only estimates which may not meet the forcing target, only those for multigasscen = 2 have already been tested.
if(cm_emiscen eq 6,
if(cm_multigasscen eq 1,
$if "%cm_rcp_scen%" == "rcp20" sm_budgetCO2eqGlob = 250.0000;
$if "%cm_rcp_scen%" == "rcp26" sm_budgetCO2eqGlob = 273.0000;
$if "%cm_rcp_scen%" == "rcp37" sm_budgetCO2eqGlob = 350.0000;
$if "%cm_rcp_scen%" == "rcp45" sm_budgetCO2eqGlob = 420.0000;
$if "%cm_rcp_scen%" == "rcp60" sm_budgetCO2eqGlob = 1000.0000;
$if "%cm_rcp_scen%" == "rcp85" sm_budgetCO2eqGlob = 20000.0000;
$if "%cm_rcp_scen%" == "none" sm_budgetCO2eqGlob = 20000.0000;
);
if(cm_multigasscen eq 2,
$if "%cm_rcp_scen%" == "rcp20" sm_budgetCO2eqGlob = 500.0000;
if(cm_ccapturescen eq 1,
$if "%cm_rcp_scen%" == "rcp26" sm_budgetCO2eqGlob = 530.0000;