diff --git a/core/bounds.gms b/core/bounds.gms index 9a7a2bcf6c..d20317cdb0 100755 --- a/core/bounds.gms +++ b/core/bounds.gms @@ -150,10 +150,6 @@ vm_deltaCap.lo(t,regi,"bioh2c","1") $ (t.val <= 2030) = 0; vm_costTeCapital.fx(ttot,regi,teNoLearn) = pm_inco0_t("2005",regi,teNoLearn); !! use 2005 value for the past vm_costTeCapital.fx(t, regi,teNoLearn) = pm_inco0_t(t,regi,teNoLearn); -*** RP: theoretically, floor costs represent the lower bound of investment costs for learnTe. However, with regional -*** variations of 2015 costs and long-term costs being high in SSP3/SSP5, this can be different -> set lower bound to 0.2 -vm_costTeCapital.lo(t,regi,teLearn) = 0.2 * pm_data(regi,"floorcost",teLearn); - *' No battery storage in 2010 vm_cap.up("2010",regi,teStor,"1") = 0; @@ -530,6 +526,8 @@ loop(all_te $ ( ); ); +*** remove legacy values for timesteps and technologies that are not required +vm_capCum(tall,all_regi,all_te).l $ (not (ttot(tall) and regi(all_regi) and te(all_te))) = 0; *** H2 Curtailment (TODO: RLDC removal) *** Fixing h2curt value to zero to avoid the model to generate SE out of nothing. diff --git a/core/datainput.gms b/core/datainput.gms index 5c75a75ffb..7bf8e07ac5 100644 --- a/core/datainput.gms +++ b/core/datainput.gms @@ -83,7 +83,7 @@ $offdelim /; *** load GDP data -table f_gdp(tall,all_regi,all_GDPpopScen) "GDP data" +table f_gdp(tall,all_regi,all_GDPpopScen) "GDP PPP data" $ondelim $include "./core/input/f_gdp.cs3r" $offdelim @@ -325,10 +325,19 @@ display fm_dataglob; *** initialize regionalized data using global data pm_data(all_regi,char,te) = fm_dataglob(char,te); -*** ------------------------------------------------------------------------------- -*** Regional risk premium during building time -*** ------------------------------------------------------------------------------- +$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"); + +*** 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 +$endif.REG_techcosts + +*** =============== Regional risk premium during building time ==================== 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". / @@ -344,8 +353,7 @@ loop(te $ (fm_dataglob("constrTme",te) > 0), (1 + 0.02 / pm_ies(regi) !! intertemporal elasticity of substitution + pm_prtp(regi) !! pure rate of time preference -*** if technology costs are regionalised, also use regionalised financing costs -$if not "%cm_techcosts%" == "GLO" + p_risk_premium_constr(regi) +$if not "%cm_techcosts%" == "GLO" + p_risk_premium_constr(regi) !! if technology costs are regionalised, also use regionalised financing costs *** 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) + 0.03 $ sameas(te,"tnrs") @@ -358,100 +366,86 @@ display p_tkpremused; *** modify regionalized cost data using cost premium during construction time pm_data(regi,"inco0",te) = (1 + p_tkpremused(regi,te) ) * pm_data(regi,"inco0",te); pm_data(regi,"floorcost",te) = (1 + p_tkpremused(regi,te) ) * pm_data(regi,"floorcost",te); -p_inco0(ttot,regi,teRegTechCosts) = (1 + p_tkpremused(regi,teRegTechCosts) ) * p_inco0(ttot,regi,teRegTechCosts); +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)) / card(regi)) * fm_dataglob("inco0",te); fm_dataglob("floorcost",te) = (1 + sum(regi, p_tkpremused(regi,te)) / card(regi)) * fm_dataglob("floorcost",te); + *** ====================== floor cost scenarios =========================== -*** report old floor costs pre manipulation in non-default scenario $ifthen.floorscen not %cm_floorCostScen% == "default" - p_oldFloorCostdata(regi,teLearn(te)) = pm_data(regi,"floorcost",te); +*** report old floor costs pre manipulation in non-default scenario + p_oldFloorCostdata(regi,teLearn(te)) = pm_data(regi,"floorcost",te); + display p_oldFloorCostdata; $endif.floorscen -*** calculate floor costs for learning technologies if historical price structure prevails $ifthen.floorscen %cm_floorCostScen% == "pricestruc" -*** compute maximum tech cost in 2015 for a given tech among regions - p_maxRegTechCost2015(teRegTechCosts) = SMax(regi, p_inco0("2015",regi,teRegTechCosts)); -*** take the ratio of the tech cost in 2015 and the maximum cost, and multiply with the global floor to get new floorcost that preserves the price structure - pm_data(regi,"floorcost",teLearn(te))$(p_maxRegTechCost2015(te) ne 0) = p_oldFloorCostdata(regi,te) * p_inco0("2015",regi,te) / p_maxRegTechCost2015(te); -*** for newer data than 2015, use these - p_maxRegTechCost2020(teRegTechCosts) = SMax(regi, p_inco0("2020",regi,teRegTechCosts)); - pm_data(regi,"floorcost",teLearn(te))$(p_maxRegTechCost2020(te) ne 0) = p_oldFloorCostdata(regi,te) * p_inco0("2020",regi,te) / p_maxRegTechCost2020(te); +*' Floor costs based on current price structure: for selected technologie, floor cost follows the historical price structure across regions. +*' The rescaling is relative to global average investment costs: if a region has twice higher costs than average at historical time steps +*' then it will also have a twice higher floor cost. + pm_data(regi,"floorcost",te) $ (teRegTechCosts(te) and teLearn(te)) = + fm_dataglob("floorcost",te) * p_inco0("2015",regi,te) + / (sum(regi2, p_inco0("2015",regi2,te)) / card(regi2)); + pm_data(regi,"floorcost",te) $ sameAs(te, "spv") = + fm_dataglob("floorcost",te) * p_inco0("2020",regi,te) + / (sum(regi2, p_inco0("2020",regi2,te)) / card(regi2)); + +$elseif.floorscen %cm_floorCostScen% == "gdpBased" +*' Floor costs for learning technologies based on GDP MER per capita in 2050: +*' - regions with average GDP have multiplier 1 +*' - regions with very low GDP have multiplier 0.5 +*' - regions with very high GDP have multiplier 1.5 +*' Compute GDP MER per capita in 2050 per region and the population-weighted global average [$/capita] + p_GDPpCap2050(regi) = pm_gdp("2050",regi) / pm_pop("2050",regi) * 1000; + p_GDPpCap2050_world = sum(regi, pm_gdp("2050",regi)) / sum(regi, pm_pop("2050",regi)) * 1000; +*' As CHA is a leader in novel technologies, we assume a floorcost that corresponds to countries with half its actual GDP/cap + p_GDPpCap2050(regi) $ (sameas(regi,"CHA")) = p_GDPpCap2050(regi) / 2; + +*' Apply sigmoid function (see shape on https://www.desmos.com/calculator/rbcjeoulgk): +*' floor cost = standard floor cost * (0.5 + 1 / (1 + exp(4 * (2050 global GDPpCap / 2050 regional GDPpCap - 1)))) + pm_data(regi,"floorcost",teLearn(te)) = + pm_data(regi,"floorcost",te) * (0.5 + 1 / (1 + exp(4 * (p_GDPpCap2050_world / p_GDPpCap2050(regi) - 1)))); $endif.floorscen -*** calculate floor costs for learning technologies if there is technology transfer -$ifthen.floorscen %cm_floorCostScen% == "techtrans" -*** compute maximum income GDP PPP per capita among regions in 2050 - p_gdppcap2050_PPP(regi) = pm_gdp("2050",regi) / pm_shPPPMER(regi) / pm_pop("2050",regi); - p_maxPPP2050 = SMax(regi, p_gdppcap2050_PPP(regi)); -*** take the ratio of the PPP income and the maximum income, and multiply with the global floor to get new floorcost that simulates tech transfer where costs are solely dependent on local wages, not on IP rent - pm_data(regi,"floorcost",teLearn(te))$(p_maxPPP2050 ne 0) = p_oldFloorCostdata(regi,te) * p_gdppcap2050_PPP(regi) / p_maxPPP2050; -$endif.floorscen - -*** In case regionally differentiated investment costs should be used the corresponding entries are revised: -$ifthen.REG_techcosts not "%cm_techcosts%" == "GLO" !! cm_techcosts is REG or REG2040 -*** calculate regional floor costs for learning technologies from ratio of global values -*** take the ratio of the global floorcost to global initial cost, and multiply with the new regional cost to get new floorcost that should create reasonable learning paths around 2020 - pm_data(regi,"floorcost",teLearn(te))$(teRegTechCosts(te) ) = p_inco0("2015",regi,te) * fm_dataglob("floorcost",te) / fm_dataglob("inco0",te); - pm_data(regi,"floorcost","spv") = p_inco0("2020",regi,"spv") * fm_dataglob("floorcost","spv") / fm_dataglob("inco0","spv") ; !! 2020 values are available for PV - - pm_data(regi,"inco0",teRegTechCosts) = p_inco0("2015",regi,teRegTechCosts); - pm_data(regi,"inco0","spv") = p_inco0("2020",regi,"spv"); -$endif.REG_techcosts - *** ------------------------------------------------------------------------------- *** Calculate learning parameters *** See equations.gms for documentation of learning equations and floor costs *** ------------------------------------------------------------------------------- +loop(teLearn(te), *** calculate default learnable costs for learning technologies -fm_dataglob("incolearn",teLearn(te)) = fm_dataglob("inco0",te) - fm_dataglob("floorcost",te); -pm_data(regi,"incolearn",teLearn(te)) = pm_data(regi,"inco0",te) - pm_data(regi,"floorcost",te); + fm_dataglob("incolearn",te) = fm_dataglob("inco0",te) - fm_dataglob("floorcost",te); + pm_data(regi,"incolearn",te) = pm_data(regi,"inco0",te) - pm_data(regi,"floorcost",te); *** global parameters: calculation for global level, that regional values can gradually converge to *** b' = \frac{I_0}{I_0 - F} b = \frac{I_0}{I_0 - F} \log_2(1-\lambda) -fm_dataglob("learnExp_wFC",teLearn(te)) = fm_dataglob("inco0",te) / fm_dataglob("incolearn",te) * log(1 - fm_dataglob("learn",te)) / log(2); + 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",teLearn(te)) = fm_dataglob("incolearn",te) / (fm_dataglob("ccap0",te) ** fm_dataglob("learnExp_wFC", te)); + fm_dataglob("learnMult_wFC",te) = fm_dataglob("incolearn",te) / (fm_dataglob("ccap0",te) ** fm_dataglob("learnExp_wFC", te)); *** regional parameters -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); + 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",teLearn(te)) = pm_data(regi,"incolearn",te) / (sum(regi2,pm_data(regi2,"ccap0",te)) ** pm_data(regi,"learnExp_wFC",te)); + 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 -*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; -*** FS: in case technologies did not exist in gdx, set intial capacities to global initial value - p_capCum(tall,regi,te)$(not p_capCum(tall,regi,te)) = fm_dataglob("ccap0",te) / card(regi); -*RP overwrite p_capCum by exogenous values for 2020 - p_capCum("2020",regi,"spv") = 0.6 / card(regi2); !! roughly 600GW in 2020 globally -*NB* this is the correction of the original parameter calibration - 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)); -*** initialize spv learning curve in 2020 - pm_data(regi,"learnMult_wFC","spv") = pm_data(regi,"incolearn","spv") / (sum(regi2,p_capCum("2020",regi2,"spv")) ** pm_data(regi,"learnExp_wFC","spv")); -display p_capCum; + 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 *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) eq 4 ) - = pm_data(regi,"incolearn",te) - / ( fm_dataglob("ccap0",te) - ** pm_data(regi,"learnExp_wFC",te) - ); - + 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); +); display pm_data; -*** ------------------------------------------------------------------------------- -*** end learning parameters -*** ------------------------------------------------------------------------------- -*** 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" + +*** =================== 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" ; @@ -459,63 +453,46 @@ $include "./core/input/p_costMarkupAdvTech.prn" p_costMarkupAdvTech("4",ttot) = p_costMarkupAdvTech("3",ttot); p_costMarkupAdvTech("5",ttot) = p_costMarkupAdvTech("3",ttot); -loop (teNoLearn(te), +loop(teNoLearn(te), pm_inco0_t(ttot,regi,te) = pm_data(regi,"inco0",te); - loop (ttot$( ttot.val ge 2005 AND ttot.val lt 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) - ); + loop(s_statusTe $ (s_statusTe.val = fm_dataglob("tech_stat",te)), + pm_inco0_t(ttot,regi,te) $ (ttot.val >= 2005 and ttot.val <= 2030) + = p_costMarkupAdvTech(s_statusTe,ttot) * pm_inco0_t(ttot,regi,te); ); ); + display pm_inco0_t; -*** regional differentiation and convergence of non-learning technologies costs + +*** ============== Convergence of non-learning technologies costs =================== $ifthen.REG2040_techcosts "%cm_techcosts%" == "REG2040" !! cm_techcosts REG2040 *** for 2015-2040, use differentiated costs when available for a specific non-learning technology - loop(te$( teNoLearn(te) AND teRegTechCosts(te) ), - pm_inco0_t(ttot,regi,te)$( ttot.val ge 2015 AND ttot.val lt 2045) - = p_inco0(ttot,regi,te); + loop(te $ (teNoLearn(te) and teRegTechCosts(te)), + pm_inco0_t(ttot,regi,te) $ (ttot.val >= 2015 and ttot.val < 2040) = p_inco0(ttot,regi,te); *** after 2040, keep the same regionally differentiated costs - pm_inco0_t(ttot,regi,te)$( ttot.val gt 2040 ) = p_inco0("2040",regi,te); - ); + pm_inco0_t(ttot,regi,te) $ (ttot.val >= 2040) = p_inco0("2040",regi,te); + ); $endif.REG2040_techcosts $ifthen.REG_techcosts "%cm_techcosts%" == "REG" !! cm_techcosts REG *** for 2015-2020, use differentiated costs when available for a specific non-learning technology - loop(te$( teNoLearn(te) AND teRegTechCosts(te) ), - pm_inco0_t(ttot,regi,te)$( ttot.val ge 2015 AND ttot.val lt 2025) - = p_inco0(ttot,regi,te); + loop(te $ (teNoLearn(te) and teRegTechCosts(te)), + pm_inco0_t(ttot,regi,te) $ (ttot.val >= 2015 and ttot.val <= 2020) = p_inco0(ttot,regi,te); -*** from 2025 to c_teNoLearngConvEndYr, apply linear convergence of investment costs so that +*** from 2025 to c_teNoLearnConvEndYr, apply linear convergence of investment costs so that *** all regions converge and stabilise at the technology cost data given in generisdata.prn - loop(ttot$( ttot.val ge 2020 AND ttot.val le c_teNoLearngConvEndYr ), - pm_inco0_t(ttot,regi,te) - = ( - (pm_ttot_val(ttot) - 2020) * fm_dataglob("inco0",te) - + (c_teNoLearngConvEndYr - pm_ttot_val(ttot)) * pm_inco0_t("2020",regi,te) - ) - / (c_teNoLearngConvEndYr - 2020); - ); - - pm_inco0_t(ttot,regi,te)$( ttot.val gt c_teNoLearngConvEndYr ) = fm_dataglob("inco0",te); + loop(ttot $ (ttot.val > 2020 and ttot.val < c_teNoLearnConvEndYr), + pm_inco0_t(ttot,regi,te) + = macro_interpolate(ttot.val, 2020, c_teNoLearnConvEndYr, p_inco0("2020",regi,te), fm_dataglob("inco0",te)) ); -*** re-insert effect of costMarkupAdvTech for IGCC in the regionalized cost -*** data, as the IEA numbers have unrealistically low IGCC costs in 2005-2020 - loop (teNoLearn(te)$( sameas(te,"igcc") ), - loop (ttot$( ttot.val ge 2005 AND ttot.val lt 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) - ); - ); - ); + pm_inco0_t(ttot,regi,te) $ (ttot.val >= c_teNoLearnConvEndYr) = fm_dataglob("inco0",te); + ); $endif.REG_techcosts + + *------------------------------------------------------------------------------------ *** Technology data input read-in and manipulation END *------------------------------------------------------------------------------------ @@ -564,15 +541,15 @@ $offdelim *** carbon intensities of coal, oil, and gas *** emissions factor of primary energy fossil fuels -pm_cintraw("pecoal") = 26.1 / s_zj_2_twa; -pm_cintraw("peoil") = 20.0 / s_zj_2_twa; -pm_cintraw("pegas") = 15.0 / s_zj_2_twa; +pm_cintraw("pecoal") = 26.1 / s_ZJ_2_TWa; +pm_cintraw("peoil") = 20.0 / s_ZJ_2_TWa; +pm_cintraw("pegas") = 15.0 / s_ZJ_2_TWa; $ifthen.tech_CO2capturerate not "%c_tech_CO2capturerate%" == "off" p_PECarriers_CarbonContent(peFos)=pm_cintraw(peFos); *** From conversation: 25 GtC/ZJ is the assumed carbon content of PE biomass (makes default bioh2c capture rate 90%) *** Convert to GtC/TWa -p_PECarriers_CarbonContent("pebiolc")=25 / s_zj_2_twa; +p_PECarriers_CarbonContent("pebiolc")=25 / s_ZJ_2_TWa; loop(pe2se(entyPe,entySe,te)$(p_tech_co2capturerate(te)), if(p_tech_co2capturerate(te) gt 0, if(p_tech_co2capturerate(te) ge 1, @@ -580,7 +557,7 @@ loop(pe2se(entyPe,entySe,te)$(p_tech_co2capturerate(te)), ); *** Alter CO2 capture rate in f_dataemiglob *** f_dataemiglob is given in GtC/ZJ - f_dataemiglob(entyPe,entySe,te,"cco2") = p_tech_co2capturerate(te) * p_PECarriers_CarbonContent(entyPe) * s_zj_2_twa; + f_dataemiglob(entyPe,entySe,te,"cco2") = p_tech_co2capturerate(te) * p_PECarriers_CarbonContent(entyPe) * s_ZJ_2_TWa; if(sameAs(entyPe,"pebiolc"), f_dataemiglob(entyPe,entySe,te,"co2") = -f_dataemiglob(entyPe,entySe,te,"cco2") ; else @@ -605,8 +582,8 @@ $ifthen "%c_SSP_forcing_adjust%" == "forcing_SSP5" $endif ); *nb* specific emissions of transformation technologies (co2 in gtc/zj -> conv. gtc/twyr): -f_dataemiglob(enty,enty2,te,"co2")$pe2se(enty,enty2,te) = 1/s_zj_2_twa * f_dataemiglob(enty,enty2,te,"co2"); -f_dataemiglob(enty,enty2,te,"cco2") = 1/s_zj_2_twa * f_dataemiglob(enty,enty2,te,"cco2"); +f_dataemiglob(enty,enty2,te,"co2")$pe2se(enty,enty2,te) = 1/s_ZJ_2_TWa * f_dataemiglob(enty,enty2,te,"co2"); +f_dataemiglob(enty,enty2,te,"cco2") = 1/s_ZJ_2_TWa * f_dataemiglob(enty,enty2,te,"cco2"); table f_dataetaglob(tall,all_te) "global eta data" $include "./core/input/generisdata_varying_eta.prn" @@ -1132,7 +1109,7 @@ display p_datapot, pm_dataren; *** -------------------------------------------------------------------------- loop(regi, loop(teReNoBio(te), - p_aux_capToDistr(regi,te) = pm_histCap("2015",regi,te) $ (pm_histCap("2015",regi,te) gt 1e-10); + p_aux_capToDistr(regi,te) = pm_histCap("2015",regi,te) $ (pm_histCap("2015",regi,te) gt sm_eps); *** Knowing the historical capacity (pm_histCap) in 2015, let us estimate on which grades this capacity was distributed. *** We assume that the best grades were filled first, but only up to 80% of their potential. @@ -1153,7 +1130,7 @@ loop(regi, p_aux_capThisGrade(regi,te,rlf) * pm_dataren(regi,"nur",rlf,te)) / (sum(teRe2rlfDetail(te,rlf), p_aux_capThisGrade(regi,te,rlf)) - + 1e-10) + + sm_eps) ); !! teReNoBio ); !! regi @@ -1596,9 +1573,9 @@ $include "./core/input/f_nechem_emissionFactors.cs4r" $offdelim /; -pm_emifacNonEnergy(ttot,regi,"sesofos", "fesos","indst","co2") = f_nechem_emissionFactors(ttot,regi,"solids") / s_zj_2_twa; -pm_emifacNonEnergy(ttot,regi,"seliqfos","fehos","indst","co2") = f_nechem_emissionFactors(ttot,regi,"liquids") / s_zj_2_twa; -pm_emifacNonEnergy(ttot,regi,"segafos", "fegas","indst","co2") = f_nechem_emissionFactors(ttot,regi,"gases") / s_zj_2_twa; +pm_emifacNonEnergy(ttot,regi,"sesofos", "fesos","indst","co2") = f_nechem_emissionFactors(ttot,regi,"solids") / s_ZJ_2_TWa; +pm_emifacNonEnergy(ttot,regi,"seliqfos","fehos","indst","co2") = f_nechem_emissionFactors(ttot,regi,"liquids") / s_ZJ_2_TWa; +pm_emifacNonEnergy(ttot,regi,"segafos", "fegas","indst","co2") = f_nechem_emissionFactors(ttot,regi,"gases") / s_ZJ_2_TWa; ***------ Read in projections for incineration rates of plastic waste--- *** "incineration rates [fraction]" diff --git a/core/declarations.gms b/core/declarations.gms index f74a293585..aa0db0432d 100644 --- a/core/declarations.gms +++ b/core/declarations.gms @@ -43,7 +43,7 @@ pm_taxCO2eq_anchor_iterationdiff(ttot) "difference in global ancho pm_cesdata(tall,all_regi,all_in,cesParameter) "parameters of the CES function: efficiency parameters (xi, eff, effgr) [unitless], target quantities of CES calibration (quantity) [unit of CES node, see set all_in], CES prices resulting from calibration (price) [T$/unit of CES node]" f_pop(tall,all_regi,all_GDPpopScen) "population data for all possible scenarios [million people]" pm_pop(tall,all_regi) "population data [bn people]" -pm_gdp(tall,all_regi) "GDP data [trn US$ 2005]" +pm_gdp(tall,all_regi) "GDP MER data [trn US$ 2005]" p_developmentState(tall,all_regi) "level of development based on GDP per capita, 0 is low income, 1 is high income" f_lab(tall,all_regi,all_GDPpopScen) "labour data for all possible scenarios [million people]" pm_lab(tall,all_regi) "data for labour [bn people]" @@ -210,8 +210,8 @@ pm_teAnnuity(all_te) "Annuity factor of a techno *** parameters used for floor costs calculation p_maxRegTechCost2015(all_te) "highest historical regional investment cost in 2015, used to calculate regionally-differentiated floor costs of learning technologies" p_maxRegTechCost2020(all_te) "highest historical regional investment cost in 2020, used to calculate regionally-differentiated floor costs of learning technologies" -p_gdppcap2050_PPP(all_regi) "regional GDP PPP per capita in 2050 [thousand $/capita]" -p_maxPPP2050 "maximum income GDP PPP among regions in 2050 [T$]" +p_GDPpCap2050(all_regi) "regional GDP per capita in 2050 [$/capita]" +p_GDPpCap2050_world "global average GDP per capita in 2050 [$/capita]" p_maxSpvCost "maximum spv investment cost among regions [T$/TW]" p_oldFloorCostdata(all_regi,all_te) "print old floor cost data [T$/TW]" @@ -219,8 +219,8 @@ p_oldFloorCostdata(all_regi,all_te) "print old floor cost data pm_tsu2opTimeYr(ttot,opTimeYr) "auxiliary parameter to map time steps to past time steps: counts the number of model timesteps between years ttot-opTimeYr and ttot, used for q_transPe2se and q_cap equations [unitless]" *** parameters used for endogenous technology learning implementation -pm_capCum0(tall,all_regi,all_te) "Total cumulated capacity of learning technologies from last iteration used for learning curves based on vm_capCum[TW]" -p_capCum(tall, all_regi,all_te) "Total cumulated capacity of learning technologies from input.gdx used for learning curves based on vm_capCum[TW]" +pm_capCum0(tall,all_regi,all_te) "Total cumulated capacity of learning technologies from last iteration used for learning curves based on vm_capCum [TW]" +p_capCum(tall, all_regi,all_te) "Total cumulated capacity of learning technologies from input.gdx used for learning curves based on vm_capCum [TW]" pm_capCumForeign(ttot,all_regi,all_te) "Total cumulated capacity of learning technologies of all other regions except regi [TW]" *** early retirement parameters @@ -635,19 +635,20 @@ sm_giga_2_non "giga to non" /1e+9/, sm_trillion_2_non "trillion to non" /1e+12/, *** energy units -pm_conv_TWa_EJ "conversion from TWa to EJ" /31.536/, -s_zj_2_twa "zeta joule to tw year" /31.7098/, -sm_EJ_2_TWa "multiplicative factor to convert from EJ to TWa" /31.71e-03/, -sm_GJ_2_TWa "multiplicative factor to convert from GJ to TWa" /31.71e-12/, -sm_TWa_2_TWh "tera Watt year to Tera Watt hour" /8.76e+3/, -sm_TWa_2_MWh "tera Watt year to Mega Watt hour" /8.76e+9/, -sm_TWa_2_kWh "tera Watt year to kilo Watt hour" /8.76e+12/, -sm_h2kg_2_h2kWh "convert kilogramme of hydrogen to kwh energy value." /32.5/, -sm_DptCO2_2_TDpGtC "Conversion multiplier to go from $/tCO2 to T$/GtC: 44/12/1000" /0.00366667/, -sm_tBC_2_TWa "t biochar to TWa biochar (28700 [MJ/tBC]*10^-12[EJ/MJ]/31.536[EJ/TWa])" /9.101e-10/, +s_ZJ_2_TWa "convert from Zeta Joule to Tera Watt annum" /31.71/, +sm_EJ_2_TWa "convert from Exa Joule to Tera Watt annum" /31.71e-03/, +sm_GJ_2_TWa "convert from Giga Joule to Tera Watt annum" /31.71e-12/, +sm_TWa_2_EJ "convert from Tera Watt annum to Exa Joule" /31.54/, +sm_DpGJ_2_TDpTWa "convert $/GJ to T$/TWa" /31.54e-03/ +sm_TWa_2_TWh "convert Tera Watt annum to Tera Wh" /8.76e+3/, +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/, +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 -sm_c_2_co2 "conversion from c to co2" /3.666666666667/, +sm_c_2_co2 "convert mass from carbon to CO2 (44/12)" /3.66667/, +sm_DptCO2_2_TDpGtC "convert $/tCO2 to T$/GtC: 44/12/1000" /0.00366667/, s_NO2_2_N "convert NO2 to N [14 / (14 + 2 * 16)]" / .304 / sm_tgn_2_pgc "conversion factor 100-yr GWP from TgN to PgCeq" sm_tgch4_2_pgc "conversion factor 100-yr GWP from TgCH4 to PgCeq" @@ -659,11 +660,10 @@ s_gwpCH4_AR4 "Global Warming Potentials of CH4 as in the AR4, us s_gwpN2O_AR4 "Global Warming Potentials of N2O as in the AR4, used in the MACCs" /298/ *** monetary units -s_DpKWa_2_TDpTWa "convert Dollar per kWa to TeraDollar per TeraWattYear" /0.001/ -s_DpKW_2_TDpTW "convert Dollar per kW to TeraDollar per TeraWatt" /0.001/ -sm_DpGJ_2_TDpTWa "multipl. factor to convert (Dollar per GJoule) to (TerraDollar per TWyear)" / 31.54e-03/ +s_DpKWa_2_TDpTWa "convert Dollar per kWa to Tera Dollar per TWa" /0.001/ +s_DpKW_2_TDpTW "convert Dollar per kW to Tera Dollar per TW" /0.001/ s_D2010_2_D2017 "Convert US$2010 to US$2017" /1.1491/ -sm_D2015_2_D2017 "Convert US$2015 to US$2017" /1.0292/ +sm_D2015_2_D2017 "Convert US$2015 to US$2017" /1.0292/ sm_D2005_2_D2017 "Convert US$2005 to US$2017" /1.231/ sm_D2020_2_D2017 "Convert US$2020 to US$2017" /0.9469/ sm_EURO2023_2_D2017 "Convert EURO 2023 to US$2017" /0.8915/ diff --git a/core/equations.gms b/core/equations.gms index ab33fb4a41..50ce8cc67e 100644 --- a/core/equations.gms +++ b/core/equations.gms @@ -375,7 +375,7 @@ qm_deltaCapCumNet(ttot,regi,teLearn)$(ord(ttot) lt card(ttot) AND pm_ttot_val(tt *' 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)$(NOT (pm_data(regi,"tech_stat",teLearn) eq 4)).. +q_capCumNet(t0,regi,teLearn)$(pm_data(regi,"tech_stat",teLearn) < 4).. vm_capCum(t0,regi,teLearn) =e= pm_data(regi,"ccap0",teLearn); @@ -455,92 +455,36 @@ q_limitGeopot(t,regi,peReComp(enty),rlf).. *' In equations.gms, the investment costs equation `q_costTeCapital` corresponds to $I = a'\times C^{b'} + F$, *' with variations depending on time period and floor cost scenarios. -q_costTeCapital(t,regi,teLearn)$(NOT (pm_data(regi,"tech_stat",teLearn) eq 4 AND t.val le 2020)) .. + +$macro macro_capCumGlob (sum(regi2, vm_capCum(t,regi2,teLearn)) + pm_capCumForeign(t,regi,teLearn)) +$macro macro_costRegi (pm_data(regi,"floorcost",teLearn) + pm_data(regi,"learnMult_wFC",teLearn) * macro_capCumGlob ** pm_data(regi,"learnExp_wFC",teLearn)) +$macro macro_costGlob (fm_dataglob("floorcost",teLearn) + fm_dataglob("learnMult_wFC",teLearn) * macro_capCumGlob ** fm_dataglob("learnExp_wFC",teLearn)) + +q_costTeCapital(t,regi,teLearn) $ (pm_data(regi,"tech_stat",teLearn) < 4 or t.val > 2020) .. vm_costTeCapital(t,regi,teLearn) =e= *** until 2005: using global estimates better matches historic values - + ( fm_dataglob("floorcost",teLearn) - + ( fm_dataglob("learnMult_wFC",teLearn) - * ( sum(regi2, vm_capCum(t,regi2,teLearn)) - + pm_capCumForeign(t,regi,teLearn) - ) ** fm_dataglob("learnExp_wFC",teLearn) - ) - )$( t.val le 2005 ) + macro_costGlob $ (t.val <= 2005) *** 2005 to 2020: linear transition from global 2005 to regional 2020 *** to phase-in the observed 2020 regional variation from input-data - + ( (2020 - t.val) / (2020-2005) - * ( fm_dataglob("floorcost",teLearn) - + fm_dataglob("learnMult_wFC",teLearn) - * ( sum(regi2, vm_capCum(t,regi2,teLearn)) - + pm_capCumForeign(t,regi,teLearn) - ) ** fm_dataglob("learnExp_wFC",teLearn) - ) + + macro_interpolate(t.val, 2005, 2020, macro_costGlob, macro_costRegi) $ (t.val > 2005 and t.val <= 2020) - + (t.val - 2005) / (2020-2005) - * ( pm_data(regi,"floorcost",teLearn) - + pm_data(regi,"learnMult_wFC",teLearn) - * ( sum(regi2, vm_capCum(t,regi2,teLearn)) - + pm_capCumForeign(t,regi,teLearn) - ) ** pm_data(regi,"learnExp_wFC",teLearn) - ) - )$( (t.val gt 2005) AND (t.val le 2020) ) - -$ifthen.floorscen %cm_floorCostScen% == "default" -*** from 2020 to c_LearnTeConvStartYear: use regional values - + ( pm_data(regi,"floorcost",teLearn) - + pm_data(regi,"learnMult_wFC",teLearn) - * ( sum(regi2, vm_capCum(t,regi2,teLearn)) - + pm_capCumForeign(t,regi,teLearn) - ) ** pm_data(regi,"learnExp_wFC",teLearn) - )$( (t.val gt 2020) AND (t.val lt c_LearnTeConvStartYear) ) - -*** c_LearnTeConvStartYear to c_LearnTeConvEndYear: assuming linear convergence of regional learning curves to global values - + ( (pm_ttot_val(t) - c_LearnTeConvStartYear) / (c_LearnTeConvEndYear-c_LearnTeConvStartYear) - * ( fm_dataglob("floorcost",teLearn) - + fm_dataglob("learnMult_wFC",teLearn) - * ( sum(regi2, vm_capCum(t,regi2,teLearn)) - + pm_capCumForeign(t,regi,teLearn) - ) ** fm_dataglob("learnExp_wFC",teLearn) - ) +*** after 2020 for specific cm_floorCostScen: regional capital costs +$if %cm_floorCostScen% == "pricestruc" + macro_costRegi $ (t.val > 2020) +$if %cm_floorCostScen% == "gdpBased" + macro_costRegi $ (t.val > 2020) + +$ifthen.default %cm_floorCostScen% == "default" +*** from 2020 to c_teLearnConvStartYr: regional capital costs + + macro_costRegi $ (t.val > 2020 and t.val <= c_teLearnConvStartYr) + +*** c_teLearnConvStartYr to c_teLearnConvEndYr: linear convergence from regional costs to global costs + + macro_interpolate(t.val, c_teLearnConvStartYr, c_teLearnConvEndYr, macro_costRegi, macro_costGlob) $ (t.val > c_teLearnConvStartYr and t.val < c_teLearnConvEndYr) + +*** after c_teLearnConvEndYr: global capital costs + + macro_costGlob $ (t.val >= c_teLearnConvEndYr) +$endif.default - + (c_LearnTeConvEndYear - pm_ttot_val(t)) / (c_LearnTeConvEndYear-c_LearnTeConvStartYear) - * ( pm_data(regi,"floorcost",teLearn) - + pm_data(regi,"learnMult_wFC",teLearn) - * ( sum(regi2, vm_capCum(t,regi2,teLearn)) - + pm_capCumForeign(t,regi,teLearn) - ) ** pm_data(regi,"learnExp_wFC",teLearn) - ) - )$( t.val ge c_LearnTeConvStartYear AND t.val le c_LearnTeConvEndYear ) -$endif.floorscen - -$ifthen.floorscen %cm_floorCostScen% == "pricestruc" - + ( pm_data(regi,"floorcost",teLearn) - + pm_data(regi,"learnMult_wFC",teLearn) - * ( sum(regi2, vm_capCum(t,regi2,teLearn)) - + pm_capCumForeign(t,regi,teLearn) - ) ** pm_data(regi,"learnExp_wFC",teLearn) - )$( t.val ge 2020 AND t.val le 2100 ) -$endif.floorscen - -$ifthen.floorscen %cm_floorCostScen% == "techtrans" - + ( pm_data(regi,"floorcost",teLearn) - + pm_data(regi,"learnMult_wFC",teLearn) - * ( sum(regi2, vm_capCum(t,regi2,teLearn)) - + pm_capCumForeign(t,regi,teLearn) - ) ** pm_data(regi,"learnExp_wFC",teLearn) - )$( t.val ge 2020 AND t.val le 2100 ) -$endif.floorscen - -$ifthen.floorscen %cm_floorCostScen% == "default" -*** after c_LearnTeConvEndYear: globally harmonized costs - + ( fm_dataglob("floorcost",teLearn) - + fm_dataglob("learnMult_wFC",teLearn) - * ( sum(regi2, vm_capCum(t,regi2,teLearn)) - + pm_capCumForeign(t,regi,teLearn) - ) **(fm_dataglob("learnExp_wFC",teLearn)) - )$(t.val gt c_LearnTeConvEndYear) -$endif.floorscen ; *' @stop diff --git a/core/loop.gms b/core/loop.gms index 7b2d541658..e15607c92d 100644 --- a/core/loop.gms +++ b/core/loop.gms @@ -97,7 +97,7 @@ putclose runtime gyear(jnow):0:0 "-" gmonth(jnow):0:0 "-" gday(jnow):0:0 " " gho *** Track of changes between iterations ***--------------------------------------------------------- loop(entyPe$(NOT sameas(entyPe,"peur")), - o_negitr_cumulative_peprod(iteration,entyPe) = 0.031536 + o_negitr_cumulative_peprod(iteration,entyPe) = sm_TWa_2_EJ / 1000 * sum(regi, sum(ttot$( (ttot.val lt 2100) AND (ttot.val gt 2005)), vm_prodPe.l(ttot,regi,entyPe) * pm_ts(ttot) ) + sum(ttot$(ttot.val eq 2005), vm_prodPe.l(ttot,regi,entyPe) * pm_ts(ttot) * 0.5 ) @@ -112,20 +112,20 @@ sum(regi, ); o_negitr_cumulative_CO2_emineg_co2luc(iteration) = sum(regi, - sum(ttot$( (ttot.val lt 2100) AND (ttot.val gt 2005)), 3.6667 * vm_emiMacSector.l(ttot,regi,"co2luc") * pm_ts(ttot) ) - + sum(ttot$(ttot.val eq 2005), 3.6667 * vm_emiMacSector.l(ttot,regi,"co2luc") * pm_ts(ttot) * 0.5 ) - + sum(ttot$(ttot.val eq 2100), 3.6667 * vm_emiMacSector.l(ttot,regi,"co2luc") * ( pm_ttot_val(ttot)- pm_ttot_val(ttot-1) ) * 0.5 ) + sum(ttot$( (ttot.val lt 2100) AND (ttot.val gt 2005)), sm_c_2_co2 * vm_emiMacSector.l(ttot,regi,"co2luc") * pm_ts(ttot) ) + + sum(ttot$(ttot.val eq 2005), sm_c_2_co2 * vm_emiMacSector.l(ttot,regi,"co2luc") * pm_ts(ttot) * 0.5 ) + + sum(ttot$(ttot.val eq 2100), sm_c_2_co2 * vm_emiMacSector.l(ttot,regi,"co2luc") * ( pm_ttot_val(ttot)- pm_ttot_val(ttot-1) ) * 0.5 ) ); o_negitr_cumulative_CO2_emineg_cement(iteration) = sum(regi, - sum(ttot$( (ttot.val lt 2100) AND (ttot.val gt 2005)), 3.6667 * vm_emiMacSector.l(ttot,regi,"co2cement_process") * pm_ts(ttot) ) - + sum(ttot$(ttot.val eq 2005), 3.6667 * vm_emiMacSector.l(ttot,regi,"co2cement_process") * pm_ts(ttot) * 0.5 ) - + sum(ttot$(ttot.val eq 2100), 3.6667 * vm_emiMacSector.l(ttot,regi,"co2cement_process") * ( pm_ttot_val(ttot)- pm_ttot_val(ttot-1) ) * 0.5 ) + sum(ttot$( (ttot.val lt 2100) AND (ttot.val gt 2005)), sm_c_2_co2 * vm_emiMacSector.l(ttot,regi,"co2cement_process") * pm_ts(ttot) ) + + sum(ttot$(ttot.val eq 2005), sm_c_2_co2 * vm_emiMacSector.l(ttot,regi,"co2cement_process") * pm_ts(ttot) * 0.5 ) + + sum(ttot$(ttot.val eq 2100), sm_c_2_co2 * vm_emiMacSector.l(ttot,regi,"co2cement_process") * ( pm_ttot_val(ttot)- pm_ttot_val(ttot-1) ) * 0.5 ) ); o_negitr_cumulative_CO2_emieng_seq(iteration) = - 3.6667 + sm_c_2_co2 * sum(regi, sum((ttot,emi2te(enty,enty2,te,"cco2"))$( ttot.val gt 2005 AND ttot.val lt 2100 ), vm_emiTeDetail.l(ttot,regi,enty,enty2,te,"cco2") diff --git a/main.gms b/main.gms index 038218b555..d621c8c7b9 100755 --- a/main.gms +++ b/main.gms @@ -1195,19 +1195,19 @@ parameter cm_H2InBuildOnlyAfter = 2150; !! def = 2150 (rule out H2 in buildings) *' For all years until the given year, FE demand for H2 in buildings is set to zero parameter - c_teNoLearngConvEndYr "Year at which regional costs of non-learning technologies converge" + c_teNoLearnConvEndYr "Year at which regional costs of non-learning technologies converge" ; - c_teNoLearngConvEndYr = 2070; !! def = 2070 + c_teNoLearnConvEndYr = 2070; !! def = 2070 *' parameter - c_LearnTeConvStartYear "start year of cost convergence of learning technologies" + c_teLearnConvStartYr "start year of cost convergence of learning technologies" ; -c_LearnTeConvStartYear = 2025; !! def = 2025 +c_teLearnConvStartYr = 2025; !! def = 2025 *' parameter - c_LearnTeConvEndYear "end year of cost convergence of learning technologies" + c_teLearnConvEndYr "end year of cost convergence of learning technologies" ; -c_LearnTeConvEndYear = 2080; !! def = 2080 +c_teLearnConvEndYr = 2080; !! def = 2080 *' parameter c_earlyRetiValidYr "Year before which the early retirement rate designated by c_tech_earlyreti_rate holds" @@ -1691,15 +1691,15 @@ $setglobal cm_in_limit_price_change "ue_steel_primary, kap_steel_primary" !! d *** cm_calibration_string "def = off, else = additional string to include in the calibration name to be used" label for your calibration run to keep calibration files with different setups apart (e.g. with low elasticities, high elasticities) $setglobal cm_calibration_string off !! def = off *** cm_techcosts - use regionalized or globally homogenous technology costs for certain technologies -*** (REG) regionalized technology costs with linear convergence between 2020 and year c_teNoLearngConvEndYr +*** (REG) regionalized technology costs with linear convergence between 2020 and year c_teNoLearnConvEndYr *** (REG2040) regionalized technology costs given by p_inco0 until 2040, then stable without convergence *** (GLO) globally homogenous technology costs $setglobal cm_techcosts REG !! def = REG !! regexp = REG|REG2040|GLO *** cm_floorCostScen regionally differentiated floor cost scenarios *** (default) uniform floor cost (almost no regional differentiation) *** (pricestruc) regionally differentiated floor costs, the differentiated costs have the same ratio between regions as the ratio between 2020 tech cost values -*** (techtrans) regionally differentiated floor costs, which are the universal global floor costs in the default case time the MER PPP price ratios. new floor cost = MER/PPP * old floor cost -$setglobal cm_floorCostScen default !! def = default +*** (gdpBased) regionally differentiated floor costs based on GDP per capita in 2050: regions with above-average GDP get higher floor costs (up to 1.5x), regions with below-average GDP get lower floor costs (down to 0.5x) +$setglobal cm_floorCostScen default !! def = default !! regexp = default|pricestruc|gdpBased *** cfg$gms$cm_EDGEtr_scen "the EDGE-T scenario" # def <- "Mix1". For calibration runs: Mix1. Mix2, Mix3, Mix4 also available - numbers after the "mix" denote policy strength, with 1 corresponding roughly to Baseline/NPI, 2= NDC, 3= Budg1500, 4 = Budg800 *** The following descriptions are based on scenario results for EUR in 2050 unless specified otherwise. *** Whenever we give numbers, please be aware that they are just there to estimate the ballpark. diff --git a/modules/47_regipol/regiCarbonPrice/bounds.gms b/modules/47_regipol/regiCarbonPrice/bounds.gms index bc1a517d46..0aaf0532bc 100644 --- a/modules/47_regipol/regiCarbonPrice/bounds.gms +++ b/modules/47_regipol/regiCarbonPrice/bounds.gms @@ -180,7 +180,7 @@ $endIf.ensec *' Policy in energy security scenario for Germany activated by cm_EnSecScen_limit: *' Limit PE gas demand from 2025 on to cm_EnSecScen_limit (in EJ/yr) gas imports + domestic gas in Germany. if (cm_EnSecScen_limit gt 0, - vm_prodPe.up(t,regi,"pegas")$((t.val ge 2025) AND (sameas(regi,"DEU"))) = cm_EnSecScen_limit/pm_conv_TWa_EJ; + vm_prodPe.up(t,regi,"pegas")$((t.val ge 2025) AND (sameas(regi,"DEU"))) = cm_EnSecScen_limit * sm_EJ_2_TWa; ); *' ##### Bounds for EU subregions diff --git a/modules/70_water/heat/output.gms b/modules/70_water/heat/output.gms index 9c04e3a4a3..f96c4092f1 100644 --- a/modules/70_water/heat/output.gms +++ b/modules/70_water/heat/output.gms @@ -79,7 +79,7 @@ display i70_losses, p70_heat, p70_water_con, p70_water_wtd; o70_se_production(ttot,regi,te_elcool70) = sum(enty, - vm_prodSe.l(ttot,regi,enty,"seel",te_elcool70) * pm_conv_TWa_EJ + vm_prodSe.l(ttot,regi,enty,"seel",te_elcool70) * sm_TWa_2_EJ ) ; @@ -123,7 +123,7 @@ p70_water_output(ttot,regi,"Secondary Energy|Electricity|Full; EJ/yr;") = vm_prodSe.l(ttot,regi,enty,"seel",te)) + sum(se2se(enty,"seel",te), vm_prodSe.l(ttot,regi,enty,"seel",te)) + sum(pc2te(enty,entySe(enty3),te,"seel"), max(0, pm_prodCouple(regi,enty,enty3,te,"seel")) * vm_prodSe.l(ttot,regi,enty,enty3,te)) - ) * pm_conv_TWa_EJ + ) * sm_TWa_2_EJ ; p70_water_output(ttot,regi,"Secondary Energy|Electricity|Part; EJ/yr;") = sum(te_elcool70, o70_se_production(ttot,regi,te_elcool70)); p70_water_output(ttot,regi,"Water Consumption|Electricity; km3/yr;") = sum(te_elcool70, o70_water_consumption(ttot,regi,te_elcool70));