From 8f70a9f41943aef0076dc17fdecf8010a5bb260c Mon Sep 17 00:00:00 2001 From: amerfort Date: Fri, 26 Apr 2024 17:41:12 +0200 Subject: [PATCH 1/7] add separate 2050 CO2 targets for emissions and removals --- core/declarations.gms | 24 ++++++ core/equations.gms | 77 ++++++++++++++++--- core/postsolve.gms | 57 ++++++++++++++ core/sets.gms | 32 ++++++++ modules/21_tax/on/declarations.gms | 4 + modules/21_tax/on/equations.gms | 11 ++- modules/21_tax/on/postsolve.gms | 5 +- modules/21_tax/on/preloop.gms | 3 + modules/21_tax/on/presolve.gms | 1 + modules/37_industry/subsectors/equations.gms | 16 +++- .../SeparateMarketsExpo2Const/datainput.gms | 32 ++++++++ .../SeparateMarketsExpo2Const/not_used.txt | 29 +++++++ .../SeparateMarketsExpo2Const/realization.gms | 13 ++++ modules/45_carbonprice/module.gms | 1 + 14 files changed, 291 insertions(+), 14 deletions(-) create mode 100644 modules/45_carbonprice/SeparateMarketsExpo2Const/datainput.gms create mode 100644 modules/45_carbonprice/SeparateMarketsExpo2Const/not_used.txt create mode 100644 modules/45_carbonprice/SeparateMarketsExpo2Const/realization.gms diff --git a/core/declarations.gms b/core/declarations.gms index 754128dc8e..646ba96b7a 100644 --- a/core/declarations.gms +++ b/core/declarations.gms @@ -33,6 +33,11 @@ p_taxCO2eq_iteration(iteration,ttot,all_regi) "save CO2eq tax used in iter pm_taxCO2eq_iterationdiff(ttot,all_regi) "help parameter for iterative adjustment of taxes" pm_taxCO2eq_iterationdiff_tmp(ttot,all_regi) "help parameter for iterative adjustment of taxes" o_taxCO2eq_iterDiff_Itr(iteration,all_regi) "track p_taxCO2eq_iterationdiff over iterations" +*ACM* parameters for separate markets on emissions and removals +pm_taxCDR(ttot,all_regi) "CDR tax path in T$/GtC = $/kgC. To get $/tCO2, multiply with 272 [T$/GtC]" +p_taxcdr_iterationdiff(ttot,all_regi) "helper parameter for cdr revenue level adjustment" +o_taxCDR_iterDiff_Itr(iteration,all_regi) "output parameter for manual checking of CDR revenue development" + pm_taxemiMkt(ttot,all_regi,all_emiMkt) "CO2 or CO2eq region and emission market specific emission tax" pm_taxemiMkt_iteration(iteration,ttot,all_regi,all_emiMkt) "CO2 or CO2eq region and emission market specific emission tax per iteration" pm_emissionsForeign(tall,all_regi,all_enty) "total emissions of other regions (nash relevant)" @@ -122,6 +127,8 @@ pm_dataeta(tall,all_regi,all_te) "regional eta data" p_emi_quan_conv_ar4(all_enty) "conversion factor for various gases to GtCeq" pm_emifac(tall,all_regi,all_enty,all_enty,all_te,all_enty) "emission factor by technology for all types of emissions in emiTe" pm_emifacNonEnergy(ttot,all_regi,all_enty,all_enty,emi_sectors,all_enty) "emission factor for non-energy fedstocks. For now only for Chemicals Industry [GtC per TWa]" +*** ACM tail pipe emission factor for industry emissions +pm_emifac_tailpipe(tall,all_regi,all_enty,all_enty) "tail pipe emissions in industry fuel combustion, necessary to calculate industry cdr" pm_incinerationRate(ttot,all_regi) "share of plastic waste that gets incinerated [fraction]" pm_omeg (all_regi,opTimeYr,all_te) "technical depreciation parameter, gives the share of a capacity that is still usable after tlt. [none/share, value between 0 and 1]" p_aux_lifetime(all_regi,all_te) "auxiliary parameter for calculating life times, calculated externally in excel sheet" @@ -434,6 +441,13 @@ v_priceOfSpecificGoods(ttot, all_regi,all_te) "Price in in tril$/TWa for vm_revenueFromSpecificGoods(ttot, all_regi) "Revenue in tril$ from products modelled that are not yet demanded elsewhere in the model, e.g. biochar, carbon fibre products" +*** Variables needed to calculate Industry CDR +vm_IndCDR(ttot,all_regi) "Industry CDR" +vm_IndstShareco2neutrcarbs(ttot,all_regi,entyFE) "Share of hydrocarbon fuels with atmospheric carbon in Industry FE demand" +vm_FracCCS(ttot,all_regi) "share of geologically stored co2 from captured co2" +v_shareAtmCO2inSynfuels(ttot,all_regi) "Share of atmospheric co2 from all captured co2" + + ; ***---------------------------------------------------------------------------------------- *** EQUATIONS @@ -558,6 +572,11 @@ q_demSpecificGoodsCalculation(ttot,all_regi,all_enty,all_te) "derivation for the q_priceOfSpecificGoods(ttot, all_regi, all_enty,all_te) "e" qm_revenueOfSpecificGoods(ttot,all_regi) "e" +* equations needed to calculate Industry CDR +q_IndstShareco2neutrcarbs(ttot,all_regi,entyFE) "Share of hydrocarbon fuels with atmospheric carbon in Industry FE demand" +q_FracCCS(ttot,all_regi) "share of geologically stored co2 from captured co2" +q_shareAtmCO2inSynfuels(ttot,all_regi) "Share of atmospheric co2 from all captured co2" + ***---------------------------------------------------------------------------------------- ***----------------------------------------------trade module------------------------------ @@ -618,6 +637,11 @@ p_emi_budget1_gdx "budget for global energy- s_actualbudgetco2 "actual level of 2020-2100 cumulated emissions, including all CO2 for last iteration" s_actualbudgetco2_last "actual level of 2020-2100 cumulated emissions for previous iteration" /0/ + +s_actual2050co2 "current iterations actual global co2 emissions in 2050 needed to adjust co2 tax until 2050" +s_actual2050cdr "current iterations actual global cdr amount in 2050 needed to adjust cdr revenues until 2050" + + sm_globalBudget_dev "actual level of global cumulated emissions budget divided by target budget" sm_eps "small number: 1e-9 " /1e-9/ diff --git a/core/equations.gms b/core/equations.gms index 4bbd3bfff2..1217326343 100644 --- a/core/equations.gms +++ b/core/equations.gms @@ -760,26 +760,81 @@ q_emiMac(t,regi,emiMac) .. ) ; +*** Equations for separate carbon markets on emissions and removals ***-------------------------------------------------- -*' All CDR emissions summed up +*' Share of atmospheric carbon in captured carbon +***-------------------------------------------------- +q_ShareAtmCO2inSynfuels(t,regi).. + v_shareAtmCO2inSynfuels(t,regi) + =e= + !!Atmospheric CO2 (TODO: actually slightly higher, to be accurate atmospheric Industry carbon capture has to be added) + (sum(emiBECCS2te(enty,enty2,te,enty3),vm_emiTeDetail(t,regi,enty,enty2,te,enty3)) !!BECC + + sum(teCCS2rlf(te,rlf), vm_ccs_cdr(t,regi,"cco2","ico2","ccsinje",rlf)) !!DACC + OAE + !! - excluding carbon from fossil and synthetic fegas from DAC heating + - 0.9 * pm_emifac(t,regi,"segafos","fegas","tdfosgas","co2") * vm_demFeSector_afterTax(t,regi,"segafos","fegas","CDR","ETS") + - 0.9 * pm_emifac(t,regi,"segafos","fegas","tdfosgas","co2") * vm_demFeSector_afterTax(t,regi,"segasyn","fegas","CDR","ETS")) + / + !! Divided by all captured CO2 (TODO: To be accurate exclude captured carbon from synfuels in DAC and Industry) + (sum(teCCS2rlf(te,rlf), + vm_co2capture(t,regi,"cco2","ico2","ccsinje",rlf))+sm_eps + ) + ; + +***-------------------------------------------------- +*' Share of atmospheric carbon in industry fuels +***-------------------------------------------------- +q_IndstShareco2neutrcarbs(t,regi,entyFE).. + vm_IndstShareco2neutrcarbs(t,regi,entyFE) + =e= + (sum(entySeBio(entySE), + sum(emiMkt$(sector2emiMkt("indst",emiMkt)), vm_demFeSector_afterTax(t,regi,entySE,entyFE,"indst",emiMkt)) * pm_emifac_tailpipe(t,regi,entySE,entyFE)) + + sum(entySeSyn(entySE), + sum(emiMkt$(sector2emiMkt("indst",emiMkt)), vm_demFeSector_afterTax(t,regi,entySE,entyFE,"indst",emiMkt)) * pm_emifac_tailpipe(t,regi,entySE,entyFE) * v_shareAtmCO2inSynfuels(t,regi)$((sameas(entySE,"seliqsyn")) OR (sameas(entySE,"segasyn"))))) + / + sum(se_carbs(entySE), + sum(emiMkt$(sector2emiMkt("indst",emiMkt)), vm_demFeSector_afterTax(t,regi,entySE,entyFE,"indst",emiMkt)) * pm_emifac_tailpipe(t,regi,entySE,entyFE) + + sm_eps) +; + +***-------------------------------------------------- +*' Fraction of captured emissions that get stored geologically +***-------------------------------------------------- +q_FracCCS(t,regi).. + vm_FracCCS(t,regi) + =e= + (sum(teCCS2rlf(te,rlf), + vm_co2CCS(t,regi,"cco2","ico2",te,rlf)) / + (sum(teCCS2rlf(te,rlf), + vm_co2capture(t,regi,"cco2","ico2","ccsinje",rlf))+sm_eps)) +; + + +***-------------------------------------------------- +*' All novel CDR emissions summed up, negative land-use-change emissions are not included ***-------------------------------------------------- q_emiCdrAll(t,regi).. vm_emiCdrAll(t,regi) - =e= !! BECC + DACC + =e= !! BECC (sum(emiBECCS2te(enty,enty2,te,enty3),vm_emiTeDetail(t,regi,enty,enty2,te,enty3)) - + sum(teCCS2rlf(te,rlf), vm_ccs_cdr(t,regi,"cco2","ico2","ccsinje",rlf))) + !! + DACC + OAE process calcination emissions (that are carbon neutral as they are overcompensated by ocean uptake) + + sum(teCCS2rlf(te,rlf), vm_ccs_cdr(t,regi,"cco2","ico2","ccsinje",rlf)) + !! - fossil CCS from DAC with fegas + - 0.9 * pm_emifac(t,regi,"segafos","fegas","tdfosgas","co2") * vm_demFeSector_afterTax(t,regi,"segafos","fegas","CDR","ETS")) !! scaled by the fraction that gets stored geologically - * (sum(teCCS2rlf(te,rlf), - vm_co2CCS(t,regi,"cco2","ico2",te,rlf)) / - (sum(teCCS2rlf(te,rlf), - vm_co2capture(t,regi,"cco2","ico2","ccsinje",rlf))+sm_eps)) - !! net negative emissions from co2luc - - p_macBaseMagpieNegCo2(t,regi) - !! negative emissions from the cdr module that are not stored geologically - - (vm_emiCdr(t,regi,"co2") + sum(teCCS2rlf(te,rlf), vm_ccs_cdr(t,regi,"cco2","ico2","ccsinje",rlf))) + * vm_FracCCS(t,regi) + !! OAE net ocean + + (1 - s33_OAE_chem_decomposition) * vm_emiCdrTeDetail(t, regi, "oae") + !! CDR from enhanced weathering + + vm_emiCdrTeDetail(t, regi, "weathering") + !! Biochar + + !! negative emissions from biochar + - sum(emiBiochar2te(enty,enty2,te,enty3), vm_emiTeDetail(t,regi,enty,enty2,te,enty3)) + !! Industry CDR (CCS from carbon neutral fuels) + + vm_IndCDR(t,regi) ; + ***------------------------------------------------------ *' Total regional emissions are the sum of emissions from technologies, MAC-curves, CDR-technologies and emissions that are exogenously given for REMIND. ***------------------------------------------------------ diff --git a/core/postsolve.gms b/core/postsolve.gms index bef3e33997..3c795645ad 100644 --- a/core/postsolve.gms +++ b/core/postsolve.gms @@ -493,6 +493,63 @@ if (cm_iterative_target_adj eq 9, ); !! if cm_emiscen eq 9, ); !! if cm_iterative_target_adj eq 9, + + +*Anne* Seperate CO2 emissions and CDR removal prices with seperate year targets (c_peakBudgYr), exponential hotelling prices with adjusted starting points until target year and constant prices afterwards. +if(cm_iterative_target_adj eq 13, + if(cm_emiscen eq 9, +*last iteration's emissions + s_actual2050co2 = sum(ttot$(ttot.val eq c_peakBudgYr),sum(regi,(vm_emiAll.l(ttot,regi,"co2") + vm_emiCdrAll.l(ttot,regi))))*sm_c_2_co2; !! Gross CO2 + if(s_actual2050co2 < 0, s_actual2050co2 = sm_eps); + s_actual2050cdr = sum(ttot$(ttot.val eq c_peakBudgYr),sum(regi, vm_emiCdrAll.l(ttot,regi))) *sm_c_2_co2; !! CDR +*** budget calculated as 2015-2095 + 2100*5.5 + 2010*2 in Gt CO2; +s_actualbudgetco2 = sum(ttot$(ttot.val < 2100 AND ttot.val > 2010), (sum(regi, (vm_emiTe.l(ttot,regi,"co2") + vm_emiCdr.l(ttot,regi,"co2") + vm_emiMac.l(ttot,regi,"co2"))) * sm_c_2_co2 * pm_ts(ttot))) +$if not setglobal test_TS + sum(regi, (vm_emiTe.l("2100",regi,"co2") + vm_emiCdr.l("2100",regi,"co2") + vm_emiMac.l("2100",regi,"co2")))*sm_c_2_co2 * 5.5 + + sum(regi, (vm_emiTe.l("2010",regi,"co2") + vm_emiCdr.l("2010",regi,"co2") + vm_emiMac.l("2010",regi,"co2")))*sm_c_2_co2 * 2; +*** calculation of peak budget for diagnostics + p_actualbudgetco2(ttot)$(ttot.val > 2020) = sum(ttot2$(ttot2.val < ttot.val AND ttot2.val > 2020), (sum(regi, (vm_emiTe.l(ttot2,regi,"co2") + vm_emiCdr.l(ttot2,regi,"co2") + vm_emiMac.l(ttot2,regi,"co2"))) * sm_c_2_co2 * pm_ts(ttot2))) + + sum(regi, (vm_emiTe.l(ttot,regi,"co2") + vm_emiCdr.l(ttot,regi,"co2") + vm_emiMac.l(ttot,regi,"co2"))) * sm_c_2_co2 * ((pm_ttot_val(ttot)-pm_ttot_val(ttot-1))/2 + 0.5) + + sum(regi, (vm_emiTe.l("2020",regi,"co2") + vm_emiCdr.l("2020",regi,"co2") + vm_emiMac.l("2020",regi,"co2"))) * sm_c_2_co2 * (pm_ts("2020")/2 + 0.5); + s_actualbudgetco2 = smax(t$(t.val le c_peakBudgYr),p_actualbudgetco2(t)); +display s_actualbudgetco2; + display s_actualbudgetco2, s_actual2050co2, s_actual2050cdr; + !! Target 2050 CO2 + if(o_modelstat eq 2 AND ord(iteration) Date: Fri, 26 Apr 2024 19:20:01 +0200 Subject: [PATCH 2/7] add more code for separate markets and bug fixes --- core/datainput.gms | 12 ++++++++++++ core/equations.gms | 3 +-- core/postsolve.gms | 2 +- main.gms | 16 +++++++++++++++- modules/37_industry/subsectors/declarations.gms | 1 + modules/37_industry/subsectors/equations.gms | 2 +- modules/45_carbonprice/NPi/datainput.gms | 2 ++ .../diffCurvPhaseIn2Lin/datainput.gms | 2 ++ modules/45_carbonprice/module.gms | 2 +- modules/45_carbonprice/none/datainput.gms | 2 ++ scripts/input/exoGAINSAirpollutants.R | 2 +- scripts/input/prepare_NDC.R | 4 ++-- scripts/output/single/reporting.R | 2 +- scripts/start/prepare.R | 2 +- 14 files changed, 43 insertions(+), 11 deletions(-) diff --git a/core/datainput.gms b/core/datainput.gms index db8d3e334c..9af95d5d50 100644 --- a/core/datainput.gms +++ b/core/datainput.gms @@ -1450,6 +1450,18 @@ pm_emifac(ttot,regi,"seliqfos","fepet","tdfospet","co2") = p_ef_dem(regi,"fepet" pm_emifac(ttot,regi,"seliqfos","fedie","tdfosdie","co2") = p_ef_dem(regi,"fedie") / (sm_c_2_co2*1000*sm_EJ_2_TWa); !! GtC/TWa pm_emifac(ttot,regi,"segafos","fegat","tdfosgat","co2") = p_ef_dem(regi,"fegas") / (sm_c_2_co2*1000*sm_EJ_2_TWa); !! GtC/TWa +pm_emifac_tailpipe(t,regi,"seliqfos","fehos") = p_ef_dem(regi,"fehos") / (sm_c_2_co2*1000*sm_EJ_2_TWa); !! GtC/TWa +pm_emifac_tailpipe(t,regi,"seliqbio","fehos") = p_ef_dem(regi,"fehos") / (sm_c_2_co2*1000*sm_EJ_2_TWa); !! GtC/TWa +pm_emifac_tailpipe(t,regi,"seliqsyn","fehos") = p_ef_dem(regi,"fehos") / (sm_c_2_co2*1000*sm_EJ_2_TWa); !! GtC/TWa + +pm_emifac_tailpipe(t,regi,"segafos","fegas") = p_ef_dem(regi,"fegas") / (sm_c_2_co2*1000*sm_EJ_2_TWa); !! GtC/TWa +pm_emifac_tailpipe(t,regi,"segabio","fegas") = p_ef_dem(regi,"fegas") / (sm_c_2_co2*1000*sm_EJ_2_TWa); !! GtC/TWa +pm_emifac_tailpipe(t,regi,"segasyn","fegas") = p_ef_dem(regi,"fegas") / (sm_c_2_co2*1000*sm_EJ_2_TWa); !! GtC/TWa + +pm_emifac_tailpipe(t,regi,"sesofos","fesos") = p_ef_dem(regi,"fesos") / (sm_c_2_co2*1000*sm_EJ_2_TWa); !! GtC/TWa +pm_emifac_tailpipe(t,regi,"sesobio","fesos") = p_ef_dem(regi,"fesos") / (sm_c_2_co2*1000*sm_EJ_2_TWa); !! GtC/TWa + + ***------ Read in emission factors for process emissions in chemicals sector--- *** calculated using IEA data on feedstocks flows and UNFCCC data on chem sector process emissions *** these emission factors are for the chemical industry only diff --git a/core/equations.gms b/core/equations.gms index 1217326343..97170a4e84 100644 --- a/core/equations.gms +++ b/core/equations.gms @@ -826,8 +826,7 @@ q_emiCdrAll(t,regi).. + (1 - s33_OAE_chem_decomposition) * vm_emiCdrTeDetail(t, regi, "oae") !! CDR from enhanced weathering + vm_emiCdrTeDetail(t, regi, "weathering") - !! Biochar - + !! negative emissions from biochar + !! negative emissions from biochar - sum(emiBiochar2te(enty,enty2,te,enty3), vm_emiTeDetail(t,regi,enty,enty2,te,enty3)) !! Industry CDR (CCS from carbon neutral fuels) + vm_IndCDR(t,regi) diff --git a/core/postsolve.gms b/core/postsolve.gms index 3c795645ad..42e1309611 100644 --- a/core/postsolve.gms +++ b/core/postsolve.gms @@ -528,7 +528,7 @@ display s_actualbudgetco2; ); !! Target at net-zero CDR (in target year c_peakBudgYr) if(o_modelstat eq 2 AND ord(iteration) Date: Tue, 30 Apr 2024 14:18:27 +0200 Subject: [PATCH 3/7] Add separate EUR specific GHG neutrality targets for 2050 and differentiated separate C-prices --- core/datainput.gms | 29 ++++++++ core/declarations.gms | 4 +- core/postsolve.gms | 39 ++++++++++- main.gms | 8 +++ modules/21_tax/on/postsolve.gms | 2 +- modules/21_tax/on/presolve.gms | 2 +- .../SepMarkdiffCurv2const/datainput.gms | 69 +++++++++++++++++++ .../SepMarkdiffCurv2const/declarations.gms | 22 ++++++ .../SepMarkdiffCurv2const/not_used.txt | 25 +++++++ .../SepMarkdiffCurv2const/postsolve.gms | 41 +++++++++++ .../SepMarkdiffCurv2const/realization.gms | 15 ++++ .../SeparateMarketsExpo2Const/datainput.gms | 2 +- modules/45_carbonprice/module.gms | 1 + .../47_regipol/regiCarbonPrice/datainput.gms | 22 ------ .../regiCarbonPrice/declarations.gms | 2 +- .../47_regipol/regiCarbonPrice/postsolve.gms | 12 ++-- 16 files changed, 261 insertions(+), 34 deletions(-) create mode 100644 modules/45_carbonprice/SepMarkdiffCurv2const/datainput.gms create mode 100644 modules/45_carbonprice/SepMarkdiffCurv2const/declarations.gms create mode 100644 modules/45_carbonprice/SepMarkdiffCurv2const/not_used.txt create mode 100644 modules/45_carbonprice/SepMarkdiffCurv2const/postsolve.gms create mode 100644 modules/45_carbonprice/SepMarkdiffCurv2const/realization.gms diff --git a/core/datainput.gms b/core/datainput.gms index 9af95d5d50..8c57af9806 100644 --- a/core/datainput.gms +++ b/core/datainput.gms @@ -6,6 +6,8 @@ *** | 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; @@ -1604,5 +1606,32 @@ p_prodAllReference(t,regi,te) = *' initialize vm_changeProdStartyearCost for tax calculation vm_changeProdStartyearCost.l(t,regi,te) = 0; + + +*** p_EmiLULUCFCountryAcc contains historic LULUCF emissions from UNFCCC, +*** used for rescaling land-use change emissions for emissions targets based on national accounting +parameter pm_EmiLULUCFCountryAcc(tall,all_regi) "historic co2 emissions from landuse change based on country accounting [Mt CO2/yr]" +/ +$ondelim +$include "./modules/47_regipol/regiCarbonPrice/input/p_EmiLULUCFCountryAcc.cs4r" +$offdelim +/ +; + +*** difference between 2020 land-use change emissions from Magpie and UNFCCC 2015 and 2020 moving average land-use change emissions +pm_LULUCFEmi_GrassiShift(t,regi)$(pm_EmiLULUCFCountryAcc("2020",regi)) = + pm_macBaseMagpie("2020",regi,"co2luc") + - + ( + ( + ((pm_EmiLULUCFCountryAcc("2013",regi) + pm_EmiLULUCFCountryAcc("2014",regi) + pm_EmiLULUCFCountryAcc("2015",regi) + pm_EmiLULUCFCountryAcc("2016",regi) + pm_EmiLULUCFCountryAcc("2017",regi))/5) + + + ((pm_EmiLULUCFCountryAcc("2018",regi) + pm_EmiLULUCFCountryAcc("2019",regi) + pm_EmiLULUCFCountryAcc("2020",regi) + pm_EmiLULUCFCountryAcc("2021",regi))/4) + )/2 + * 1e-3/sm_c_2_co2 + ) +; + + *** EOF ./core/datainput.gms diff --git a/core/declarations.gms b/core/declarations.gms index 646ba96b7a..d7c8e43824 100644 --- a/core/declarations.gms +++ b/core/declarations.gms @@ -101,6 +101,7 @@ p_adj_coeff(ttot,all_regi,all_te) "coefficient for adjustment p_adj_coeff_glob(all_te) "coefficient for adjustment costs - global scale" p_switch_cement(ttot,all_regi) "describes an s-curve to provide a smooth switching from the short-term behavior (depending on per capita capital investments) to the long-term behavior (constant per capita emissions) of CO2 emissions from cement production" p_cint(all_regi,all_enty,all_enty,rlf) "additional emissions of GHG from mining, on top of emissions from combustion" +pm_LULUCFEmi_GrassiShift(ttot,all_regi) "difference between Magpie land-use change emissions and UNFCCC emissions in 2015 to correct for national accounting in emissions targets" $IFTHEN.agricult_base_shift not "%c_agricult_base_shift%" == "off" p_agricult_base_shift(ext_regi) "fraction by which to scale agricultural emissions of baseline up or down, positive values increase emissions, negative values decrease emissions" / %c_agricult_base_shift% / @@ -640,7 +641,8 @@ s_actualbudgetco2_last "actual level of 2020-2100 s_actual2050co2 "current iterations actual global co2 emissions in 2050 needed to adjust co2 tax until 2050" s_actual2050cdr "current iterations actual global cdr amount in 2050 needed to adjust cdr revenues until 2050" - +s_actual2050ghgEUR "current iterations actual EUR ghg emissions including land-use cdr in 2050 needed to adjust co2 tax until 2050" +s_actual2050cdrEUR "current iterations actual EUR novel cdr amount in 2050 needed to adjust cdr revenues until 2050" sm_globalBudget_dev "actual level of global cumulated emissions budget divided by target budget" diff --git a/core/postsolve.gms b/core/postsolve.gms index 42e1309611..eecead20c5 100644 --- a/core/postsolve.gms +++ b/core/postsolve.gms @@ -542,6 +542,44 @@ display s_actualbudgetco2; if((c_target2050co2 eq 0 AND c_target2050cdr gt 0), pm_taxCO2eq(t,regi) = 0; ); +***----------------------------------------------- +*AM* Additional targets for EUR +***----------------------------------------------- + if(c_target2050cdrEUR > 0, + s_actual2050ghgEUR = sum(ttot$(ttot.val eq c_peakBudgYr),sum(regi$sameas(regi,"EUR"), + !! Gross CO2 emissions excluding novel CDR in GtCO2 but including land use and managed forests (with Grassi shift) + ((vm_emiAll.l(ttot,regi,"co2") + vm_emiCdrAll.l(ttot,regi) - pm_LULUCFEmi_GrassiShift(ttot,regi)) * sm_c_2_co2 + !! CH4 emissions in GtCO2eq with GWP100 + +vm_emiAll.l(ttot,regi,"ch4") * s_gwpCH4 + !! N"O emissions in GtCO2eq with GWP100 + +vm_emiAll.l(ttot,regi,"n2o") * s_gwpN2O + ))); + s_actual2050cdrEUR = sum(ttot$(ttot.val eq c_peakBudgYr),sum(regi$(sameas(regi,"EUR")), vm_emiCdrAll.l(ttot,regi))) *sm_c_2_co2; !! CDR + !! Target 2050 GHG in Europe + display s_actual2050ghgEUR, s_actual2050cdrEUR; + if(o_modelstat eq 2 AND ord(iteration)2100)=p21_tau_so2_tax("2100",regi); *JH* !!Warning!! The same allocation block exists in postsolve.gms. *** Do not forget to update the other file. *** save level value of all taxes -pm_taxrevGHG0(t,regi) = pm_taxCO2eqSum(t,regi) * (vm_co2eq.l(t,regi) - vm_emiMacSector.l(t,regi,"co2luc")$(cm_multigasscen ne 3)); +pm_taxrevGHG0(t,regi) = pm_taxCO2eqSum(t,regi) * (vm_co2eq.l(t,regi) + vm_emiCdrAll.l(t,regi)$(cm_iterative_target_adj eq 13) - vm_emiMacSector.l(t,regi,"co2luc")$(cm_multigasscen ne 3)); pm_taxrevCO2Sector0(ttot,regi,emi_sectors) = p21_CO2TaxSectorMarkup(ttot,regi,emi_sectors) * pm_taxCO2eqSum(ttot,regi) * vm_emiCO2Sector.l(ttot,regi,emi_sectors); pm_taxrevCO2LUC0(t,regi) = pm_taxCO2eqSum(t,regi) * vm_emiMacSector.l(t,regi,"co2luc")$(cm_multigasscen ne 3); p21_taxrevCCS0(ttot,regi) = cm_frac_CCS * pm_data(regi,"omf","ccsinje") * pm_inco0_t(ttot,regi,"ccsinje") diff --git a/modules/45_carbonprice/SepMarkdiffCurv2const/datainput.gms b/modules/45_carbonprice/SepMarkdiffCurv2const/datainput.gms new file mode 100644 index 0000000000..35718c02be --- /dev/null +++ b/modules/45_carbonprice/SepMarkdiffCurv2const/datainput.gms @@ -0,0 +1,69 @@ +*** | (C) 2006-2023 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 ./modules/45_carbonprice/diffCurvPhaseIn2Lin/datainput.gms +***------------------------------------------------------------------------------------------------------------------------ +*** *BS* 20190930 linear convergence with starting points differentiated by GDP/capita, global price from 2040 +***----------------------------------------------------------------------------------------------------------------------- + + +*** convergence to global CO2 price depends on GDP per capita (in 1e3 $ PPP 2005). +p45_gdppcap2015_PPP(regi) = pm_gdp("2015",regi)/pm_shPPPMER(regi) / pm_pop("2015",regi); +display p45_gdppcap2015_PPP; + +p45_phasein_2025ratio(regi)$(p45_gdppcap2015_PPP(regi) le 3) = 0.1; +p45_phasein_2025ratio(regi)$(p45_gdppcap2015_PPP(regi) gt 3 and p45_gdppcap2015_PPP(regi) le 5) = 0.2; +p45_phasein_2025ratio(regi)$(p45_gdppcap2015_PPP(regi) gt 5 and p45_gdppcap2015_PPP(regi) le 8) = 0.3; +p45_phasein_2025ratio(regi)$(p45_gdppcap2015_PPP(regi) gt 8 and p45_gdppcap2015_PPP(regi) le 11) = 0.5; +p45_phasein_2025ratio(regi)$(p45_gdppcap2015_PPP(regi) gt 11 and p45_gdppcap2015_PPP(regi) le 14) = 0.65; +p45_phasein_2025ratio(regi)$(p45_gdppcap2015_PPP(regi) gt 14 and p45_gdppcap2015_PPP(regi) le 19) = 0.8; +p45_phasein_2025ratio(regi)$(p45_gdppcap2015_PPP(regi) gt 19 and p45_gdppcap2015_PPP(regi) le 24) = 0.9; +p45_phasein_2025ratio(regi)$(p45_gdppcap2015_PPP(regi) gt 24) = 1; +display p45_phasein_2025ratio; + + +*** for the current implementation, use the following trajectory for rich countries: +*** global price is linear from 2010 until the pkBudgYr, then increases with c_taxCO2inc_after_peakBudgYr +if(cm_co2_tax_2020 lt 0, + abort "please choose a valid cm_co2_tax_2020" +elseif cm_co2_tax_2020 ge 0, +*** convert tax value from $/t CO2eq to T$/GtC + p45_CO2priceTrajDeveloped("2040")= 3 * cm_co2_tax_2020 * sm_DptCO2_2_TDpGtC; !! shifted to 2040 to make sure that even in delay scenarios the fixpoint of the linear price path is inside the "t" range, otherwise the CO2 prices from reference run may be overwritten +*** The factor 3 comes from shifting the 2020 value 20 years into the future at linear increase of 10% of 2020 value per year. +); + + + +p45_CO2priceTrajDeveloped(ttot)$((ttot.val gt 2005) AND (ttot.val ge cm_startyear)) = p45_CO2priceTrajDeveloped("2040")*( 1 + 0.1/3 * (ttot.val-2040)); !! no CO2 price in 2005 and only change CO2 prices after ; +*** annual increase by (10/3)% of the 2040 value is the same as a 10% increase of the 2020 value is the same as a linear increase from 0 in 2010 to the 2020/2040 value + + +*** Then create regional phase-in: +loop(ttot$((ttot.val ge cm_startyear) AND (ttot.val le cm_CO2priceRegConvEndYr) ), + p45_regCO2priceFactor(ttot,regi) = + min(1, + max(0, + p45_phasein_2025ratio(regi) + (1 - p45_phasein_2025ratio(regi)) + * Power( + ( (ttot.val - 2025) + (cm_CO2priceRegConvEndYr - 2025) * 0.1 ) + / ( (cm_CO2priceRegConvEndYr - 2025) * 1.1 ) + , 2 + ) !! use Power instead of ** to allow ttot be smaller than 2025, and thus the base to be negative + ) + ); +); +p45_regCO2priceFactor(ttot,regi)$(ttot.val ge cm_CO2priceRegConvEndYr) = 1; + + +*** transition to global price - starting point depends on GDP/cap +pm_taxCO2eq(t,regi) = p45_regCO2priceFactor(t,regi) * p45_CO2priceTrajDeveloped(t); + +pm_taxCDR(ttot,regi) = pm_taxCO2eq(ttot,regi); + + +display p45_regCO2priceFactor, p45_CO2priceTrajDeveloped, pm_taxCO2eq; + +*** EOF ./modules/45_carbonprice/diffCurvPhaseIn2Lin/datainput.gms diff --git a/modules/45_carbonprice/SepMarkdiffCurv2const/declarations.gms b/modules/45_carbonprice/SepMarkdiffCurv2const/declarations.gms new file mode 100644 index 0000000000..c953139446 --- /dev/null +++ b/modules/45_carbonprice/SepMarkdiffCurv2const/declarations.gms @@ -0,0 +1,22 @@ +*** | (C) 2006-2023 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 ./modules/45_carbonprice/diffCurvPhaseIn2Lin/declarations.gms +***------------------------------------------------------------------------------------------------------------------------ +*** *BS* 20190930 linear convergence with starting points differentiated by GDP/capita, global price from 2040 +***----------------------------------------------------------------------------------------------------------------------- + +parameters +p45_tauCO2_ref(ttot, all_regi) "CO2 tax path of reference policy (NDC)" +p45_gdppcap2015_PPP(all_regi) "2015 GDP per capita (k $ PPP 2005)" +p45_phasein_2025ratio(all_regi) "ratio of CO2 price to that of developed region in 2025" + +p45_regCO2priceFactor(ttot,all_regi) "regional multiplicative factor to the CO2 price of the developed countries" +p45_CO2priceTrajDeveloped(ttot) "CO2 price trajectory for developed/rich countries" +; + + +*** EOF ./modules/45_carbonprice/diffCurvPhaseIn2Lin/declarations.gms diff --git a/modules/45_carbonprice/SepMarkdiffCurv2const/not_used.txt b/modules/45_carbonprice/SepMarkdiffCurv2const/not_used.txt new file mode 100644 index 0000000000..6d7ccb5555 --- /dev/null +++ b/modules/45_carbonprice/SepMarkdiffCurv2const/not_used.txt @@ -0,0 +1,25 @@ +# | (C) 2006-2023 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 +name,type,reason +sm_c_2_co2,input,questionnaire +vm_co2eq,input,questionnaire +vm_emiFgas,input,questionnaire +pm_globalMeanTemperature,input,questionnaire +pm_temperatureImpulseResponseCO2,input,questionnaire +pm_GDPGross,input,questionnaire +pm_ttot_val,input,questionnaire +pm_ttot_2_tall,input,questionnaire +cm_emiscen,input,questionnaire +cm_co2_tax_growth,input,questionnaire +cm_iterative_target_adj,input,questionnaire +cm_expoLinear_yearStart,input,questionnaire +cm_carbonprice_temperatureLimit,input,questionnaire +cm_NDC_divergentScenario,input,questionnaire +pm_consPC,input,questionnaire +pm_prtp,input,questionnaire +vm_demFeSector,input,questionnaire +pm_emifac,input,questionnaire diff --git a/modules/45_carbonprice/SepMarkdiffCurv2const/postsolve.gms b/modules/45_carbonprice/SepMarkdiffCurv2const/postsolve.gms new file mode 100644 index 0000000000..c730453354 --- /dev/null +++ b/modules/45_carbonprice/SepMarkdiffCurv2const/postsolve.gms @@ -0,0 +1,41 @@ +*** | (C) 2006-2023 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 ./modules/45_carbonprice/diffCurvPhaseIn2Lin/postsolve.gms +***------------------------------------------------------------------------------------------------------------------------ +*** *BS* 20190930 linear convergence with starting points differentiated by GDP/capita, global price from 2040 +***----------------------------------------------------------------------------------------------------------------------- + +*** *** updated constant global price as scalar (regional prices are the same anyway) +*** s45_constantCO2price = sum((ttot,regi)$(ttot.val eq s45_stageend), pm_taxCO2eq(ttot,regi))/card(regi) ; +*** *** entire path has been shifted in update, so have to set these again +*** pm_taxCO2eq(ttot,regi)$(ttot.val le s45_stagestart) = p45_tauCO2_ref(ttot, regi); +*** pm_taxCO2eq(ttot,regi)$(ttot.val gt s45_stagestart and ttot.val lt s45_stageend) +*** = s45_constantCO2price * (ttot.val - p45_phasein_zeroyear(regi))/(s45_stageend - p45_phasein_zeroyear(regi)); +*** *** price trajectory should be constant anyway but let's be explicit here +*** pm_taxCO2eq(ttot,regi)$(ttot.val ge s45_stageend) = s45_constantCO2price; + + +*** re-create the regional differentation, use path from developed countries as the basis. +*** This doesn't need to be a loop, but it will be correct for any cycle of the loop, so also for the last cycle. +loop(regi$(p45_gdppcap2015_PPP(regi) gt 30), + p45_CO2priceTrajDeveloped(t) = pm_taxCO2eq(t,regi); +); + +*** linear transition to global price - starting point depends on GDP/cap +pm_taxCO2eq(t,regi) = p45_regCO2priceFactor(t,regi) * p45_CO2priceTrajDeveloped(t); + + +*** same procedure for CDR subsidy (shamelessly reusing the CO2 price helper parameter for temporary storage) +loop(regi$(p45_gdppcap2015_PPP(regi) gt 30), + p45_CO2priceTrajDeveloped(t) = pm_taxCDR(t,regi); +); + +*** linear transition to global price - starting point depends on GDP/cap +pm_taxCDR(t,regi) = p45_regCO2priceFactor(t,regi) * p45_CO2priceTrajDeveloped(t); + +display pm_taxCO2eq, pm_taxCDR; +*** EOF ./modules/45_carbonprice/diffCurvPhaseIn2Lin/postsolve.gms diff --git a/modules/45_carbonprice/SepMarkdiffCurv2const/realization.gms b/modules/45_carbonprice/SepMarkdiffCurv2const/realization.gms new file mode 100644 index 0000000000..ca62d0101e --- /dev/null +++ b/modules/45_carbonprice/SepMarkdiffCurv2const/realization.gms @@ -0,0 +1,15 @@ +*** | (C) 2006-2023 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 ./modules/45_carbonprice/diffCurvPhaseIn2Lin/realization.gms + +*####################### R SECTION START (PHASES) ############################## +$Ifi "%phase%" == "declarations" $include "./modules/45_carbonprice/SepMarkdiffCurv2const/declarations.gms" +$Ifi "%phase%" == "datainput" $include "./modules/45_carbonprice/SepMarkdiffCurv2const/datainput.gms" +$Ifi "%phase%" == "postsolve" $include "./modules/45_carbonprice/SepMarkdiffCurv2const/postsolve.gms" +*######################## R SECTION END (PHASES) ############################### + +*** EOF ./modules/45_carbonprice/diffCurvPhaseIn2Lin/realization.gms diff --git a/modules/45_carbonprice/SeparateMarketsExpo2Const/datainput.gms b/modules/45_carbonprice/SeparateMarketsExpo2Const/datainput.gms index 032f3d7c3c..61997a351d 100644 --- a/modules/45_carbonprice/SeparateMarketsExpo2Const/datainput.gms +++ b/modules/45_carbonprice/SeparateMarketsExpo2Const/datainput.gms @@ -24,7 +24,7 @@ pm_taxCO2eq("2025",regi)= cm_co2_tax_2020 * sm_DptCO2_2_TDpGtC; pm_taxCO2eq(ttot,regi)$(ttot.val ge 2025 AND ttot.val le c_peakBudgYr) = pm_taxCO2eq("2025",regi)*cm_co2_tax_growth**(ttot.val-2025); pm_taxCO2eq(ttot,regi)$(ttot.val gt c_peakBudgYr) =sum(t$(t.val eq c_peakBudgYr),pm_taxCO2eq(t,regi)); !! keep taxes constant after cm_peakBudgYr -pm_taxCDR(ttot,regi) = pm_taxCO2eq(ttot,regi) +pm_taxCDR(ttot,regi) = pm_taxCO2eq(ttot,regi); display pm_taxCDR, pm_taxCO2eq; diff --git a/modules/45_carbonprice/module.gms b/modules/45_carbonprice/module.gms index 31672fab9e..0cdeb1d077 100644 --- a/modules/45_carbonprice/module.gms +++ b/modules/45_carbonprice/module.gms @@ -23,6 +23,7 @@ *###################### R SECTION START (MODULETYPES) ########################## $Ifi "%carbonprice%" == "NDC" $include "./modules/45_carbonprice/NDC/realization.gms" $Ifi "%carbonprice%" == "NPi" $include "./modules/45_carbonprice/NPi/realization.gms" +$Ifi "%carbonprice%" == "SepMarkdiffCurv2const" $include "./modules/45_carbonprice/SepMarkdiffCurv2const/realization.gms" $Ifi "%carbonprice%" == "SeparateMarketsExpo2Const" $include "./modules/45_carbonprice/SeparateMarketsExpo2Const/realization.gms" $Ifi "%carbonprice%" == "diffCurvPhaseIn2Lin" $include "./modules/45_carbonprice/diffCurvPhaseIn2Lin/realization.gms" $Ifi "%carbonprice%" == "exogenous" $include "./modules/45_carbonprice/exogenous/realization.gms" diff --git a/modules/47_regipol/regiCarbonPrice/datainput.gms b/modules/47_regipol/regiCarbonPrice/datainput.gms index 08942b838c..d5b03fcd68 100644 --- a/modules/47_regipol/regiCarbonPrice/datainput.gms +++ b/modules/47_regipol/regiCarbonPrice/datainput.gms @@ -239,29 +239,7 @@ loop(te$sameas(te,"spv"), ); -*** p_EmiLULUCFCountryAcc contains historic LULUCF emissions from UNFCCC, -*** used for rescaling land-use change emissions for emissions targets based on national accounting -parameter p47_EmiLULUCFCountryAcc(tall,all_regi) "historic co2 emissions from landuse change based on country accounting [Mt CO2/yr]" -/ -$ondelim -$include "./modules/47_regipol/regiCarbonPrice/input/p_EmiLULUCFCountryAcc.cs4r" -$offdelim -/ -; -*** difference between 2020 land-use change emissions from Magpie and UNFCCC 2015 and 2020 moving average land-use change emissions -p47_LULUCFEmi_GrassiShift(t,regi)$(p47_EmiLULUCFCountryAcc("2020",regi)) = - pm_macBaseMagpie("2020",regi,"co2luc") - - - ( - ( - ((p47_EmiLULUCFCountryAcc("2013",regi) + p47_EmiLULUCFCountryAcc("2014",regi) + p47_EmiLULUCFCountryAcc("2015",regi) + p47_EmiLULUCFCountryAcc("2016",regi) + p47_EmiLULUCFCountryAcc("2017",regi))/5) - + - ((p47_EmiLULUCFCountryAcc("2018",regi) + p47_EmiLULUCFCountryAcc("2019",regi) + p47_EmiLULUCFCountryAcc("2020",regi) + p47_EmiLULUCFCountryAcc("2021",regi))/4) - )/2 - * 1e-3/sm_c_2_co2 - ) -; *** -------------------------Primary Energy Tax-------------------------- diff --git a/modules/47_regipol/regiCarbonPrice/declarations.gms b/modules/47_regipol/regiCarbonPrice/declarations.gms index f788051086..cb802e84c8 100644 --- a/modules/47_regipol/regiCarbonPrice/declarations.gms +++ b/modules/47_regipol/regiCarbonPrice/declarations.gms @@ -13,7 +13,7 @@ Parameter s47_firstFreeYear "value of first free year for the carbon price trajectory" s47_prefreeYear "value of the last non-free year for the carbon price trajectory" - p47_LULUCFEmi_GrassiShift(ttot,all_regi) "difference between Magpie land-use change emissions and UNFCCC emissions in 2015 to correct for national accounting in emissions targets" + !!p47_LULUCFEmi_GrassiShift(ttot,all_regi) "difference between Magpie land-use change emissions and UNFCCC emissions in 2015 to correct for national accounting in emissions targets" pm_emiMktTarget_dev(ttot,ttot2,ext_regi,emiMktExt) "deviation of emissions of current iteration from target emissions, for budget target this is the difference normalized by target emissions, while for year targets this is the difference normalized by 2005 emissions [%]" *** RR this should be replaced as soon as non-energy is treated endogenously in the model diff --git a/modules/47_regipol/regiCarbonPrice/postsolve.gms b/modules/47_regipol/regiCarbonPrice/postsolve.gms index b13fda54ac..e6d999b62a 100644 --- a/modules/47_regipol/regiCarbonPrice/postsolve.gms +++ b/modules/47_regipol/regiCarbonPrice/postsolve.gms @@ -96,27 +96,27 @@ p47_emiTargetMkt(ttot,regi, emiMktExt,"netGHG_noLULUCF_noBunkers") = *** net CO2 per Mkt with Grassi LULUCF shift p47_emiTargetMkt(ttot,regi, emiMktExt,"netCO2_LULUCFGrassi") = p47_emiTargetMkt(ttot,regi, emiMktExt,"netCO2") - - ( p47_LULUCFEmi_GrassiShift(ttot,regi) )$(sameas(emiMktExt,"other") or sameas(emiMktExt,"all")); + - ( pm_LULUCFEmi_GrassiShift(ttot,regi) )$(sameas(emiMktExt,"other") or sameas(emiMktExt,"all")); *** net CO2 per Mkt without bunkers and with Grassi LULUCF shift p47_emiTargetMkt(ttot,regi, emiMktExt,"netCO2_LULUCFGrassi_noBunkers") = p47_emiTargetMkt(ttot,regi, emiMktExt,"netCO2_noBunkers") - - ( p47_LULUCFEmi_GrassiShift(ttot,regi) )$(sameas(emiMktExt,"other") or sameas(emiMktExt,"all")); + - ( pm_LULUCFEmi_GrassiShift(ttot,regi) )$(sameas(emiMktExt,"other") or sameas(emiMktExt,"all")); *** net GHG per Mkt with Grassi LULUCF shift p47_emiTargetMkt(ttot,regi, emiMktExt,"netGHG_LULUCFGrassi") = p47_emiTargetMkt(ttot,regi, emiMktExt,"netGHG") - - ( p47_LULUCFEmi_GrassiShift(ttot,regi) )$(sameas(emiMktExt,"other") or sameas(emiMktExt,"all")); + - ( pm_LULUCFEmi_GrassiShift(ttot,regi) )$(sameas(emiMktExt,"other") or sameas(emiMktExt,"all")); *** net GHG per Mkt without bunkers and with Grassi LULUCF shift p47_emiTargetMkt(ttot,regi, emiMktExt,"netGHG_LULUCFGrassi_noBunkers") = p47_emiTargetMkt(ttot,regi, emiMktExt,"netGHG_noBunkers") - - ( p47_LULUCFEmi_GrassiShift(ttot,regi) )$(sameas(emiMktExt,"other") or sameas(emiMktExt,"all")); + - ( pm_LULUCFEmi_GrassiShift(ttot,regi) )$(sameas(emiMktExt,"other") or sameas(emiMktExt,"all")); *** net CO2 per Mkt without bunkers and with Grassi LULUCF shift p47_emiTargetMkt(ttot,regi, emiMktExt,"netCO2_LULUCFGrassi_intraRegBunker") = p47_emiTargetMkt(ttot,regi, emiMktExt,"netCO2_noBunkers") - - ( p47_LULUCFEmi_GrassiShift(ttot,regi) )$(sameas(emiMktExt,"other") or sameas(emiMktExt,"all")) + - ( pm_LULUCFEmi_GrassiShift(ttot,regi) )$(sameas(emiMktExt,"other") or sameas(emiMktExt,"all")) + ( sum(se2fe(enty,enty2,te), pm_emifac(ttot,regi,enty,enty2,te,"co2") @@ -127,7 +127,7 @@ p47_emiTargetMkt(ttot,regi, emiMktExt,"netCO2_LULUCFGrassi_intraRegBunker") = *** net GHG per Mkt without bunkers and with Grassi LULUCF shift p47_emiTargetMkt(ttot,regi, emiMktExt,"netGHG_LULUCFGrassi_intraRegBunker") = p47_emiTargetMkt(ttot,regi, emiMktExt,"netGHG_noBunkers") - - ( p47_LULUCFEmi_GrassiShift(ttot,regi) )$(sameas(emiMktExt,"other") or sameas(emiMktExt,"all")) + - ( pm_LULUCFEmi_GrassiShift(ttot,regi) )$(sameas(emiMktExt,"other") or sameas(emiMktExt,"all")) + ( sum(se2fe(enty,enty2,te), pm_emifac(ttot,regi,enty,enty2,te,"co2") From ace54f92dc792c1b41f3f8cebb094b8c6e53a953 Mon Sep 17 00:00:00 2001 From: amerfort Date: Tue, 30 Apr 2024 17:16:01 +0200 Subject: [PATCH 4/7] bug fix on dedicated EUR tax --- .../SepMarkdiffCurv2const/postsolve.gms | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/modules/45_carbonprice/SepMarkdiffCurv2const/postsolve.gms b/modules/45_carbonprice/SepMarkdiffCurv2const/postsolve.gms index c730453354..f80076f488 100644 --- a/modules/45_carbonprice/SepMarkdiffCurv2const/postsolve.gms +++ b/modules/45_carbonprice/SepMarkdiffCurv2const/postsolve.gms @@ -21,21 +21,27 @@ *** re-create the regional differentation, use path from developed countries as the basis. *** This doesn't need to be a loop, but it will be correct for any cycle of the loop, so also for the last cycle. -loop(regi$(p45_gdppcap2015_PPP(regi) gt 30), +loop(regi$(p45_gdppcap2015_PPP(regi) gt 30 AND (not(sameas (regi,"EUR")))), p45_CO2priceTrajDeveloped(t) = pm_taxCO2eq(t,regi); ); -*** linear transition to global price - starting point depends on GDP/cap -pm_taxCO2eq(t,regi) = p45_regCO2priceFactor(t,regi) * p45_CO2priceTrajDeveloped(t); +*** linear transition to global price - starting point depends on GDP/cap +pm_taxCO2eq(t,regi)$(not(sameas (regi,"EUR"))) = p45_regCO2priceFactor(t,regi)(not(sameas (regi,"EUR"))) * p45_CO2priceTrajDeveloped(t); +if(c_target2050cdrEUR < 0, + pm_taxCO2eq(t,regi)$(sameas (regi,"EUR")) = p45_regCO2priceFactor(t,regi)$(sameas (regi,"USA")) * p45_CO2priceTrajDeveloped(t); +) *** same procedure for CDR subsidy (shamelessly reusing the CO2 price helper parameter for temporary storage) -loop(regi$(p45_gdppcap2015_PPP(regi) gt 30), +loop(regi$(p45_gdppcap2015_PPP(regi) gt 30AND (not(sameas (regi,"EUR")))), p45_CO2priceTrajDeveloped(t) = pm_taxCDR(t,regi); ); *** linear transition to global price - starting point depends on GDP/cap -pm_taxCDR(t,regi) = p45_regCO2priceFactor(t,regi) * p45_CO2priceTrajDeveloped(t); +pm_taxCDR(t,regi)$(not(sameas (regi,"EUR"))) = p45_regCO2priceFactor(t,regi)(not(sameas (regi,"EUR"))) * p45_CO2priceTrajDeveloped(t); +if(c_target2050cdrEUR < 0, + pm_taxCDR(t,regi)$(sameas (regi,"EUR")) = p45_regCO2priceFactor(t,regi)$(sameas (regi,"USA")) * p45_CO2priceTrajDeveloped(t); +) display pm_taxCO2eq, pm_taxCDR; *** EOF ./modules/45_carbonprice/diffCurvPhaseIn2Lin/postsolve.gms From 7d92b65cbcd24c04b05aeac0825c14da3b55ef53 Mon Sep 17 00:00:00 2001 From: amerfort Date: Tue, 30 Apr 2024 17:26:43 +0200 Subject: [PATCH 5/7] another bug fix --- core/postsolve.gms | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/postsolve.gms b/core/postsolve.gms index eecead20c5..640d597689 100644 --- a/core/postsolve.gms +++ b/core/postsolve.gms @@ -570,7 +570,7 @@ display s_actualbudgetco2; !!); ); !! Target at net-zero CDR (in target year c_peakBudgYr) - if(o_modelstat eq 2 AND ord(iteration) Date: Tue, 30 Apr 2024 17:42:56 +0200 Subject: [PATCH 6/7] one more bug --- modules/45_carbonprice/SepMarkdiffCurv2const/postsolve.gms | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/45_carbonprice/SepMarkdiffCurv2const/postsolve.gms b/modules/45_carbonprice/SepMarkdiffCurv2const/postsolve.gms index f80076f488..06e46415d5 100644 --- a/modules/45_carbonprice/SepMarkdiffCurv2const/postsolve.gms +++ b/modules/45_carbonprice/SepMarkdiffCurv2const/postsolve.gms @@ -27,18 +27,18 @@ loop(regi$(p45_gdppcap2015_PPP(regi) gt 30 AND (not(sameas (regi,"EUR")))), *** linear transition to global price - starting point depends on GDP/cap -pm_taxCO2eq(t,regi)$(not(sameas (regi,"EUR"))) = p45_regCO2priceFactor(t,regi)(not(sameas (regi,"EUR"))) * p45_CO2priceTrajDeveloped(t); +pm_taxCO2eq(t,regi)$(not(sameas (regi,"EUR"))) = p45_regCO2priceFactor(t,regi)$(not(sameas (regi,"EUR"))) * p45_CO2priceTrajDeveloped(t); if(c_target2050cdrEUR < 0, pm_taxCO2eq(t,regi)$(sameas (regi,"EUR")) = p45_regCO2priceFactor(t,regi)$(sameas (regi,"USA")) * p45_CO2priceTrajDeveloped(t); ) *** same procedure for CDR subsidy (shamelessly reusing the CO2 price helper parameter for temporary storage) -loop(regi$(p45_gdppcap2015_PPP(regi) gt 30AND (not(sameas (regi,"EUR")))), +loop(regi$(p45_gdppcap2015_PPP(regi) gt 30 AND (not(sameas (regi,"EUR")))), p45_CO2priceTrajDeveloped(t) = pm_taxCDR(t,regi); ); *** linear transition to global price - starting point depends on GDP/cap -pm_taxCDR(t,regi)$(not(sameas (regi,"EUR"))) = p45_regCO2priceFactor(t,regi)(not(sameas (regi,"EUR"))) * p45_CO2priceTrajDeveloped(t); +pm_taxCDR(t,regi)$(not(sameas (regi,"EUR"))) = p45_regCO2priceFactor(t,regi)$(not(sameas (regi,"EUR"))) * p45_CO2priceTrajDeveloped(t); if(c_target2050cdrEUR < 0, pm_taxCDR(t,regi)$(sameas (regi,"EUR")) = p45_regCO2priceFactor(t,regi)$(sameas (regi,"USA")) * p45_CO2priceTrajDeveloped(t); ) From 2ccfb45063fdc9d3ee9398631a9e07dcef5354ed Mon Sep 17 00:00:00 2001 From: amerfort Date: Thu, 2 May 2024 16:27:24 +0200 Subject: [PATCH 7/7] bug fix in unit conversion --- core/postsolve.gms | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/core/postsolve.gms b/core/postsolve.gms index 640d597689..6cd36d998b 100644 --- a/core/postsolve.gms +++ b/core/postsolve.gms @@ -547,14 +547,15 @@ display s_actualbudgetco2; ***----------------------------------------------- if(c_target2050cdrEUR > 0, s_actual2050ghgEUR = sum(ttot$(ttot.val eq c_peakBudgYr),sum(regi$sameas(regi,"EUR"), - !! Gross CO2 emissions excluding novel CDR in GtCO2 but including land use and managed forests (with Grassi shift) - ((vm_emiAll.l(ttot,regi,"co2") + vm_emiCdrAll.l(ttot,regi) - pm_LULUCFEmi_GrassiShift(ttot,regi)) * sm_c_2_co2 - !! CH4 emissions in GtCO2eq with GWP100 - +vm_emiAll.l(ttot,regi,"ch4") * s_gwpCH4 - !! N"O emissions in GtCO2eq with GWP100 - +vm_emiAll.l(ttot,regi,"n2o") * s_gwpN2O - ))); - s_actual2050cdrEUR = sum(ttot$(ttot.val eq c_peakBudgYr),sum(regi$(sameas(regi,"EUR")), vm_emiCdrAll.l(ttot,regi))) *sm_c_2_co2; !! CDR + !! Gross CO2 emissions excluding novel CDR in GtC but including land use and managed forests (with Grassi shift) + ((vm_emiAll.l(ttot,regi,"co2") + vm_emiCdrAll.l(ttot,regi) - pm_LULUCFEmi_GrassiShift(ttot,regi)) + !! CH4 emissions in GtCeq with GWP100 + +vm_emiAll.l(ttot,regi,"ch4") * sm_tgch4_2_pgc + !! N2O emissions in GtCeq with GWP100 + +vm_emiAll.l(ttot,regi,"n2o") * sm_tgn_2_pgc + !! Conversion to GtCO2eq + ))) * sm_c_2_co2; + s_actual2050cdrEUR = sum(ttot$(ttot.val eq c_peakBudgYr),sum(regi$(sameas(regi,"EUR")), vm_emiCdrAll.l(ttot,regi))) *sm_c_2_co2; !! CDR in GtCO2 !! Target 2050 GHG in Europe display s_actual2050ghgEUR, s_actual2050cdrEUR; if(o_modelstat eq 2 AND ord(iteration)