Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 26 additions & 16 deletions core/bounds.gms
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ loop(t $ (t.val >= 2015 and t.val <= 2025),
vm_cap.lo(t,regi,teVRE(te),"1") $ pm_histCap(t,regi,te) = 0.95 * pm_histCap(t,regi,te);
vm_cap.up(t,regi,teVRE(te),"1") $ pm_histCap(t,regi,te) = 1.05 * pm_histCap(t,regi,te);
*** broader bounds for renewables with lower data quality
loop(te $ (sameas(te, "hydro") or sameas(te, "geohdr")),
loop(te $ (sameas(te, "hydro") or sameas(te, "geohdr") or sameas(te, "elh2")),
vm_cap.lo(t,regi,te,"1") $ pm_histCap(t,regi,te) = 0.7 * pm_histCap(t,regi,te);
vm_cap.up(t,regi,te,"1") $ pm_histCap(t,regi,te) = 1.4 * pm_histCap(t,regi,te);
);
Expand Down Expand Up @@ -119,14 +119,6 @@ vm_deltaCap.lo("2030",regi,te,"1") = sum( project_status,
*' ##### Near-term capacity for electrolysis and hydrogen
*** ------------------------------------------------------------------

*' set lower and upper bounds for 2025 and 2030 based on projects annoucements from IEA Hydryogen project database:
*' https://www.iea.org/data-and-statistics/data-product/hydrogen-production-and-infrastructure-projects-database
*' distribute to regions via GDP share of 2025 (we do not use later time steps as they may have different GDPs depending on the scenario)
*' in future this should be differentiated by region based on regionalized input data of project announcements
*' 2 GW(el) at least globally in 2025, about operational capacity as of 2023
vm_cap.lo("2025",regi,"elh2","1") = 2e-3 * pm_eta_conv("2025",regi,"elh2") * pm_gdp("2025",regi) / sum(regi2,pm_gdp("2025",regi2));
*' 20 GW(el) at maximum globally in 2025 (be more generous to not overconstrain regions which scale-up fastest)
vm_cap.up("2025",regi,"elh2","1") = 20e-3 * pm_eta_conv("2025",regi,"elh2") * pm_gdp("2025",regi) / sum(regi2,pm_gdp("2025",regi2));
*' 100 GW(el) at maximum globally in 2030 (upper end of feasibility range in Odenweller et al. 2022, https://doi.org/10.1038/s41560-022-01097-4, Fig. 4)
vm_cap.up("2030",regi,"elh2","1") = 100e-3 * pm_eta_conv("2025",regi,"elh2") * pm_gdp("2025",regi) / sum(regi2,pm_gdp("2025",regi2));

Expand All @@ -151,10 +143,6 @@ vm_costTeCapital.fx(t, regi,teNoLearn) = pm_inco0_t(t,regi,teNoLearn);
*' No battery storage in 2010
vm_cap.up("2010",regi,teStor,"1") = 0;

*** NR: cumulated capacity never falls below initial cumulated capacity:
vm_capCum.lo(ttot,regi,teLearn) $ (ttot.val >= cm_startyear) = pm_data(regi,"ccap0",teLearn);
*** exception for tech_stat 4 technologies whose ccap0 refers to 2025 as these technologies don't exist in 2005
vm_capCum.lo(ttot,regi,teLearn) $ (pm_data(regi,"tech_stat",teLearn) = 4 and ttot.val <= 2020) = 0;


*' Advanced technologies shouldn't be built prior to 2015/2020
Expand All @@ -175,9 +163,7 @@ loop(regi,

*' no technologies with tech_stat 4 before 2025
vm_cap.fx(t,regi,te,rlf) $ (t.val <= 2020 and pm_data(regi,"tech_stat",te) = 4) = 0;
*** initialize cumulative capacity of tech_stat 4 technologies at 0
*** (not at ccap0 from generisdata_tech.prn which gives the cucmulative capacity
*** at the initial investment cost of the first year in which the technology can be built)
*** initialize cumulative capacity of tech_stat 4 technologies at 0
vm_capCum.fx(t0,regi,teLearn) $ (pm_data(regi,"tech_stat",teLearn) = 4) = 0;
*** tech_stat 4 technologies don't learn before 2025, so capital cost should be fixed
vm_costTeCapital.fx(t,regi,teLearn) $ (t.val <= 2020 and pm_data(regi,"tech_stat",teLearn) = 4) = fm_dataglob("inco0",teLearn);
Expand All @@ -186,6 +172,30 @@ vm_costTeCapital.fx(t,regi,teLearn) $ (t.val <= 2020 and pm_data(regi,"tech_stat
vm_deltaCap.fx(t,regi,te,rlf) $ (t.val <= 2025 and pm_data(regi,"tech_stat",te) = 5) = 0;



*** Assume no retirements before 2005 for more established learning techs
vm_capCum.fx("2005", regi, "windon") = pm_histCap("2005", regi, "windon");
vm_capCum.fx("2005", regi, "windoff") = pm_histCap("2005", regi, "windoff");
vm_capCum.fx("2005", regi, "spv") = pm_histCap("2005", regi, "spv");
vm_capCum.fx("2005", regi, "csp") = pm_histCap("2005", regi, "csp");
vm_capCum.fx("2005", regi, "elh2") = pm_histCap("2005", regi, "elh2");

*** these are guesses by Robert Pietzcker
vm_capCum.fx("2005",regi,"storwindon") = 0.00005 / card(regi);
vm_capCum.fx("2005",regi,"storwindoff") = 0.00005 / card(regi);
vm_capCum.fx("2005",regi,"storspv") = 0.00005 / card(regi);
vm_capCum.fx("2005",regi,"storcsp") = 0.00005 / card(regi);

*** Assume that 3 MtCO2/yr DAC capacity installed gobally by 2025 (https://www.iea.org/reports/direct-air-capture)
vm_capCum.fx("2025",regi,"dac") = 3 * sm_MtCO2_2_GtC / card(regi);

$ifthen.c_BCLearning not "%c_BCLearning%" == 0
*** these are guesses by Tabea Dorndorf
vm_capCum.fx("2015",regi,"biopyronly") = 0.001 / card(regi);
vm_capCum.fx("2015",regi,"biopyrhe") = 0.001 / card(regi);
vm_capCum.fx("2015",regi,"biopyrchp") = 0.001 / card(regi);
$endif.c_BCLearning

*** ------------------------------------------------------------------
*' ##### Capacity for nuclear energy
*** TODO: data update ------------------------------------------------
Expand Down
30 changes: 10 additions & 20 deletions core/datainput.gms
Original file line number Diff line number Diff line change
Expand Up @@ -328,12 +328,10 @@ pm_data(all_regi,char,te) = fm_dataglob(char,te);
$ifthen.REG_techcosts not "%cm_techcosts%" == "GLO" !! cm_techcosts is REG or REG2040
*** Initial investment costs differentiated by region:
pm_data(regi,"inco0",teRegTechCosts(te)) = p_inco0("2015",regi,te);
pm_data(regi,"inco0","spv") = p_inco0("2020",regi,"spv");
pm_data(regi,"inco0","spv") = p_inco0("2020",regi,"spv");

*** Initial capacity differentiated by region:
Execute_Loadpoint 'input' p_capCum = vm_capCum.l; !! read vm_capCum(t0,regi,teLearn) from input.gdx to have 2005 investment costs
p_capCum("2015",regi,te) $ (p_capCum("2015",regi,te) = 0) = fm_dataglob("ccap0",te) / card(regi); !! if technology not in gdx, default to global value
p_capCum("2020",regi,"spv") $ (p_capCum("2020",regi,"spv") = 0) = 0.6 / card(regi2); !! assume 600GW of solar PV in 2020 globally
Execute_Loadpoint 'input' p_capCum = vm_capCum.l; !! read vm_capCum(t0,regi,teLearn) from input.gdx
$endif.REG_techcosts


Expand Down Expand Up @@ -422,25 +420,21 @@ loop(teLearn(te),
*** b' = \frac{I_0}{I_0 - F} b = \frac{I_0}{I_0 - F} \log_2(1-\lambda)
fm_dataglob("learnExp_wFC",te) = fm_dataglob("inco0",te) / fm_dataglob("incolearn",te) * log(1 - fm_dataglob("learn",te)) / log(2);
*** a' = \frac{I_0 - F}{C_0^{b'}}
fm_dataglob("learnMult_wFC",te) = fm_dataglob("incolearn",te) / (fm_dataglob("ccap0",te) ** fm_dataglob("learnExp_wFC", te));

fm_dataglob("learnMult_wFC",te) = fm_dataglob("incolearn",te) / (sum((ttot, regi2)$(ttot.val = fm_dataglob("inco0year",te)), p_capCum(ttot,regi2,te)) ** fm_dataglob("learnExp_wFC", te));
*** regional parameters
pm_data(regi,"learnExp_wFC",te) = pm_data(regi,"inco0",te) / pm_data(regi,"incolearn",te) * log(1 - pm_data(regi,"learn",te)) / log(2);

$ifthen %cm_techcosts% == "GLO"
pm_data(regi,"learnMult_wFC",te) = pm_data(regi,"incolearn",te) / sum(regi2,pm_data(regi2,"ccap0",te)) ** pm_data(regi,"learnExp_wFC",te);

$else
!! cm_techcosts is REG or REG2040
pm_data(regi,"learnMult_wFC",te) = pm_data(regi,"incolearn",te) / sum(regi2,p_capCum("2015",regi2,te)) ** pm_data(regi,"learnExp_wFC",te);
pm_data(regi,"learnMult_wFC","spv") = pm_data(regi,"incolearn","spv") / sum(regi2,p_capCum("2020",regi2,"spv")) ** pm_data(regi,"learnExp_wFC","spv");
$endif

*** regional uses different years than global data
pm_data(regi,"learnMult_wFC",te) = pm_data(regi,"incolearn",te) / (sum((ttot, regi2)$(ttot.val = fm_dataglob("inco0year",te)), p_capCum(ttot,regi2,te)) ** pm_data(regi,"learnExp_wFC",te));
*FS* initialize learning curve for most advanced technologies as defined by tech_stat = 4 in generisdata_tech.prn (with very small real-world capacities in 2020)
*** equally for all regions based on global cumulative capacity of ccap0 and incolearn (difference between initial investment cost and floor cost)
pm_data(regi,"learnMult_wFC",te) $ (pm_data(regi,"tech_stat",te) = 4)
= pm_data(regi,"incolearn",te) / fm_dataglob("ccap0",te) ** pm_data(regi,"learnExp_wFC",te);
= pm_data(regi,"incolearn",te) / (sum((ttot, regi2)$(ttot.val = fm_dataglob("inco0year",te)), p_capCum(ttot,regi2,te)) ** pm_data(regi,"learnExp_wFC",te));
);
pm_data(regi,"learnMult_wFC","spv") = pm_data(regi,"incolearn","spv") / sum(regi2,p_capCum("2020",regi2,"spv")) ** pm_data(regi,"learnExp_wFC","spv");
pm_data(regi,"learnMult_wFC","windon") = pm_data(regi,"incolearn","windon") / sum(regi2,p_capCum("2015",regi2,"windon")) ** pm_data(regi,"learnExp_wFC","windon");
pm_data(regi,"learnMult_wFC","windoff") = pm_data(regi,"incolearn","windoff") / sum(regi2,p_capCum("2015",regi2,"windoff")) ** pm_data(regi,"learnExp_wFC","windoff");
pm_data(regi,"learnMult_wFC","csp") = pm_data(regi,"incolearn","csp") / sum(regi2,p_capCum("2015",regi2,"csp")) ** pm_data(regi,"learnExp_wFC","csp");
display pm_data;


Expand Down Expand Up @@ -1372,10 +1366,6 @@ p_emi_quan_conv_ar4("n2onitac") = sm_tgn_2_pgc * (298/s_gwpN2O);
p_emi_quan_conv_ar4("n2owaste") = sm_tgn_2_pgc * (298/s_gwpN2O);


*RP* Distribute ccap0 for all regions
pm_data(regi,"ccap0",te) = 1/card(regi)*fm_dataglob("ccap0",te);


*** -----------------------------------------------------------------------------
*** ------------ emission budgets and their time periods ------------------------
*** -----------------------------------------------------------------------------
Expand Down
4 changes: 2 additions & 2 deletions core/declarations.gms
Original file line number Diff line number Diff line change
Expand Up @@ -382,7 +382,7 @@ vm_cap(tall,all_regi,all_te,rlf) "net total capacities [TW]
v_capDistr(tall,all_regi,all_te,rlf) "net capacities, distributed to the different grades for renewables [TW]"
vm_capTotal(ttot,all_regi,all_enty,all_enty) "total capacity of pe2se conversion technologies without technology differentation [TW]"
vm_deltaCap(tall,all_regi,all_te,rlf) "capacity additions [TW/yr] for energy conversion technologies, [GtC/yr^2] for CCS chain in ccs2te (pipelines/injection)"
vm_capCum(tall,all_regi,all_te) "cumulated capactiy of learning technologies [TW]"
vm_capCum(tall,all_regi,all_te) "cumulated capacity of learning technologies [TW]"
vm_capEarlyReti(tall,all_regi,all_te) "fraction of early retired capacity from total standing capacity, can only be increased for technologies for which early retirement is switched on [share]"

*** technoeconomic parameters
Expand Down Expand Up @@ -466,7 +466,6 @@ q_smoothphaseoutCapEarlyReti(ttot,all_regi,all_te) "constraint to limit phase-
q_capH2BI(ttot,all_regi) "calculate hydrogen transmission and distribution capacities for buildings and industry, as total of stationary sector, needed to avoid switching behavior of H2 between both sectors"

*** technology learning equations
q_capCumNet(t0,all_regi,all_te) "set initial cumulated capacity of learning technologies (vm_capCum) in start year"
qm_deltaCapCumNet(ttot,all_regi,all_te) "calculate cumulated capacities of learning technologies (vm_capCum)"
q_costTeCapital(tall,all_regi,all_te) "calculate investment cost for learning technologies (learning curve)"

Expand Down Expand Up @@ -657,6 +656,7 @@ sm_TWa_2_TWh "convert Tera Watt annum to Tera Wh" /8.7
sm_TWa_2_MWh "convert Tera Watt annum to Mega Wh" /8.76e+9/,
sm_TWa_2_kWh "convert Tera Watt annum to kilo Wh" /8.76e+12/,
sm_h2kg_2_h2kWh "convert kg of hydrogen to kWh energy value" /32.5/,
s_GW_2_TW "convert GW to TW" /0.001/,
sm_tBC_2_TWa "t biochar to TWa biochar (28700 [MJ/tBC]*10^-12[EJ/MJ]/31.536[EJ/TWa])" /9.101e-10/,

*** emissions units
Expand Down
12 changes: 1 addition & 11 deletions core/equations.gms
Original file line number Diff line number Diff line change
Expand Up @@ -371,15 +371,6 @@ qm_deltaCapCumNet(ttot,regi,teLearn)$(ord(ttot) lt card(ttot) AND pm_ttot_val(tt
+
vm_capCum(ttot,regi,teLearn);

***---------------------------------------------------------------------------
*' Initial values for cumulated capacities (learning technologies only):
*' (except for tech_stat 4 technologies that have no standing capacities in 2005 and ccap0 refers to another year)
***---------------------------------------------------------------------------
q_capCumNet(t0,regi,teLearn)$(pm_data(regi,"tech_stat",teLearn) < 4)..
vm_capCum(t0,regi,teLearn)
=e=
pm_data(regi,"ccap0",teLearn);

***---------------------------------------------------------------------------
*' Additional equation for fuel shadow price calulation:
***---------------------------------------------------------------------------
Expand Down Expand Up @@ -447,8 +438,7 @@ q_limitGeopot(t,regi,peReComp(enty),rlf)..
*' $$ b' = \frac{I_0}{I_0-F}b $$

*' In datainput.gms, `fm_dataglob` external data provides the observed learning rate `learn` ($\lambda$),
*' the initial investment costs `inco0` ($I_0$), the floorcost ($F$) and
*' the cumulative capacity in 2015 `ccap0` ($C_0$).
*' the initial investment costs `inco0` ($I_0$) and the floorcost ($F$).
*' The other learning parameters are computed using the equations described above:
*' `learnExp_wFC` ($b'$), `learnMult_wFC` ($a'$).

Expand Down
Loading
Loading