diff --git a/core/bounds.gms b/core/bounds.gms index c3c739c18..308b72d45 100755 --- a/core/bounds.gms +++ b/core/bounds.gms @@ -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); ); @@ -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)); @@ -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 @@ -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); @@ -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 ------------------------------------------------ diff --git a/core/datainput.gms b/core/datainput.gms index 75a6d482b..4edb2cd7c 100644 --- a/core/datainput.gms +++ b/core/datainput.gms @@ -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 @@ -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; @@ -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 ------------------------ *** ----------------------------------------------------------------------------- diff --git a/core/declarations.gms b/core/declarations.gms index 4a5c027cf..0764422ff 100644 --- a/core/declarations.gms +++ b/core/declarations.gms @@ -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 @@ -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)" @@ -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 diff --git a/core/equations.gms b/core/equations.gms index 65c5434c3..3ccacd630 100644 --- a/core/equations.gms +++ b/core/equations.gms @@ -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: ***--------------------------------------------------------------------------- @@ -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'$). diff --git a/core/input/generisdata_tech.prn b/core/input/generisdata_tech.prn index d2e7911de..0223e1d71 100644 --- a/core/input/generisdata_tech.prn +++ b/core/input/generisdata_tech.prn @@ -2,6 +2,7 @@ $ontext tech_stat technology status: how close a technology is to market readiness. Scale: 0-3, with 0 'I can go out and build a GW plant today' to 3 'Still some research necessary' inco0 Initial investment costs given in $[2015] / kW[output] capacity; for dac/prc cc: $[2015] / (tC[captured]/a); for other industry prc: $[2015]/(t[output]/a); for weathering: $[2015]/(t rock/a) +inco0year Year in which inco0 holds (only given for learning technologies) floorcost Floor investment costs, given in $[2015] / kW[output]; for dac: $[2015] / (tC[captured]/a) constrTme Construction time in years, needed to calculate turn-key cost premium compared to overnight costs lifetime Average lifetime of a technology, given in years. Effective maximum lifetime is longer than that. @@ -9,7 +10,6 @@ mix0 Fraction of output that is produced by this technology in 2005. This eta Conversion efficieny, i.e. energy output divided by energy input (except for nuclear plants, where it is TW energy output over Mt Uranium input) omf Fixed operation and maintenace costs given as a fraction of investment costs omv Variable operation and maintenance costs given in $[2015] / (kW[output] * a) energy production -ccap0 Cumulated capacity in 2005 given in TW learn Learning rate given in percent cost reduction per doubling of cumulated capacity luse land use factor of solar technologies flexibility by RP (parameterization after simple algorithm) @@ -69,51 +69,51 @@ flexibility 0.7 0.75 0.7 + biopyronly biopyrhe biopyrchp biopyrliq biocharuse tech_stat 1 1 1 3 inco0 1080 1430 1750 3215 +inco0year 2025 2025 2025 floorcost 511 668 989 constrTme 4 4 4 4 eta 0.48 0.48 0.48 0.36 omf 0.04 0.04 0.04 0.05 omv 70 70 70 138 lifetime 30 30 30 40 1 -learn 0.10 0.10 0.10 -ccap0 0.001 0.001 0.001 +learn 0.10 0.10 0.10 *** hydrogen technologies + elh2 h2turb h2curt h2turbVRE h22ch4 MeOH tech_stat 3 5 5 5 3 3 inco0 3500 510 700 510 700 800 +inco0year 2020 floorcost 130 constrTme 2 2 2 2 2 2 lifetime 30 30 30 30 30 30 eta 0.73 0.40 0.62 0.40 0.8 0.7 omf 0.05 0.03 0.05 0.03 0.03 0.03 omv 3 24 0 24 12 12 -ccap0 0.00077 learn 0.15 flexibility 16 16 -*** variable relewable energy +*** variable renewable energy + windon windoff spv csp inco0 2400 5000 5160 7224 +inco0year 2005 2005 2005 2005 floorcost 500 750 50 1092 constrTme 1 4 1 3 eta 1.00 1.00 1.00 1.00 omf 0.02 0.03 0.02 0.025 lifetime 25 25 30 30 -ccap0 0.06 0.0007 0.005 0.0002 learn 0.17 0.16 0.25 0.103 luse 0.09 0.021 flexibility -1 -1 -1 -1 + storwindon storwindoff storspv storcsp gridwindon inco0 2940 2940 7720 2520 720 +inco0year 2005 2005 2005 2005 floorcost 850 850 2280 720 mix0 0.00 0.00 0.00 0.00 eta 0.85 0.85 0.74 0.79 1 omf 0.02 0.02 0.02 0.02 0.02 lifetime 25 25 25 25 45 -ccap0 0.00005 0.00005 0.00005 0.00005 learn 0.10 0.10 0.10 0.10 flexibility 1.86 1.93 1.85 1.85 @@ -156,14 +156,14 @@ lifetime 30 30 45 45 45 *** carbon management + ccsinjeon ccsinjeoff weathering dac oae_ng oae_el tech_stat 0 0 1 4 -inco0 350 525 43 18800 200 400 +inco0 350 525 43 18800 200 400 +inco0year 2025 floorcost 4800 constrTme 3 5 lifetime 40 40 20 20 25 25 mix0 1.00 1.00 eta 1.00 1.00 1.00 1.00 1.00 1.00 omf 0.06 0.12 0.59 0.025 0.35 0.17 -ccap0 0.0008 learn 0.15 @@ -202,7 +202,6 @@ Electrolysis - elh2 Initialize learning curve for electrolysis at 0.5 GW(el) installed globally at CAPEX of 2300 USD/kW(el) in 2020. Based on Ramboll 2023, https://energycentral.com/system/files/ece/nodes/658117/ghpp.pdf and IEA 2024 Hydrogen Review, https://www.iea.org/reports/global-hydrogen-review-2024 - 0.5 GW(el) * 0.65 (elh2 efficiency) * 1e-3 ~ 0.00077 TW(H2) = ccap0 (for 2020) 2300 USD/kW(el) / 0.65 (elh2 efficiency) ~ 3500 USD/kW(H2) = inco0 (for 2020) Assume floor cost: 100 USD/kW(el) 100 USD/kW(el) / 0.75 (long-term elh2 efficiency) ~ 133 USD/kW(H2) floorcost @@ -280,11 +279,9 @@ Hydropower - hydro Direct Air Capture - dac learning parameterization: - Assume that 3 MtCO2/yr DAC capacity installed gobally by 2025 (https://www.iea.org/reports/direct-air-capture) - that produce at (unit) cost of 400 USD/tCO2 (Climeworks). + Assume (unit) cost of 400 USD/tCO2 (Climeworks). Assume that all 400 USD/tCO2 are investment cost as current plants runs with waste energy. - 3 MtCO2/yr / 3.66 * / 1000 ~ 0.0008 GtC/yr = ccap0 400 USD/tCO2 * 0.9 (capacity factor) / (0.07 1/yr) (annuity factor, stretch cost over plant lifetime) * 3.66 (tCO2 to tC) ~ 18800 USD/(tC/yr) Assume floor cost 100 USD/tCO2. diff --git a/core/sets.gms b/core/sets.gms index b6ddef0be..9b437136d 100755 --- a/core/sets.gms +++ b/core/sets.gms @@ -2181,8 +2181,8 @@ numberEmiRCP "number of emission types" / 1 * 23 / char "characteristics of technologies" / mix0 "share in the production of v*_INIdemEn0, which is the energy demand in t0 minus the energy produced by couple production" - ccap0 "cumulated installed capacity in t0. Unit: TW" - inco0 "investment costs in t0. Unit: $/kW" + inco0 "investment costs at inco0year. Unit: $/kW" + inco0year "year where inco0 holds" inco0_d "Initial investment costs given in $(2015)/kW(output) capacity. Per 1000km." incolearn "Investment costs that can be reduced through learning = inco0 - floorcost. Unit: $/kW" floorcost "Floor investment costs for learning technologies. Unit: $/kW" @@ -2220,7 +2220,7 @@ char "characteristics of technologies" tkpremused "turn-key cost premium used in the model (with a discount rate of 3+ pure rate of time preference); in comparison to overnight costs)" lifetime "average lifetime of a technology (integral under the omeg-curve). Unit: years" flexibility "representing ramping constraints or additional costs for partial load of technologies in power sector" - tech_stat "technology status: how close a technology is to market readiness. Scale: 0-3, with 0 'I can go out and build a GW plant today' to 3 'Still some research necessary'" + tech_stat "technology status: how close a technology is to market readiness. Scale: 0-5, with 0 'I can go out and build a GW plant today' to 3 'Still some research necessary' to 5 'Further in the future'" Xport "exports" Mport "imports" use "financial trade costs for PE use [trl$US per TWa]"