From c099373f345942c3f7252690bf9cfb087cd004cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laurin=20K=C3=B6hler-Schindler?= Date: Fri, 1 Nov 2024 16:11:04 +0100 Subject: [PATCH 1/3] First attempt to restructure 45_carbonprice --- core/datainput.gms | 5 - core/declarations.gms | 23 - core/postsolve.gms | 477 +----------------- core/preloop.gms | 13 - main.gms | 105 ++-- .../45_carbonprice/diffExp2Lin/datainput.gms | 98 ---- .../diffExp2Lin/declarations.gms | 32 -- .../45_carbonprice/diffExp2Lin/not_used.txt | 25 - .../45_carbonprice/diffExp2Lin/postsolve.gms | 33 -- .../diffExp2Lin/realization.gms | 28 - .../45_carbonprice/diffLin2Lin/datainput.gms | 139 ----- .../diffLin2Lin/declarations.gms | 37 -- .../45_carbonprice/diffLin2Lin/postsolve.gms | 47 -- .../diffLin2Lin/realization.gms | 29 -- .../45_carbonprice/expoLinear/datainput.gms | 5 + .../45_carbonprice/expoLinear/realization.gms | 1 + .../functionalForm/datainput.gms | 225 +++++++++ .../functionalForm/declarations.gms | 89 ++++ .../not_used.txt | 1 - .../functionalForm/postsolve.gms | 452 +++++++++++++++++ .../functionalForm/realization.gms | 45 ++ modules/45_carbonprice/module.gms | 17 +- 22 files changed, 884 insertions(+), 1042 deletions(-) delete mode 100644 modules/45_carbonprice/diffExp2Lin/datainput.gms delete mode 100644 modules/45_carbonprice/diffExp2Lin/declarations.gms delete mode 100644 modules/45_carbonprice/diffExp2Lin/not_used.txt delete mode 100644 modules/45_carbonprice/diffExp2Lin/postsolve.gms delete mode 100644 modules/45_carbonprice/diffExp2Lin/realization.gms delete mode 100644 modules/45_carbonprice/diffLin2Lin/datainput.gms delete mode 100644 modules/45_carbonprice/diffLin2Lin/declarations.gms delete mode 100644 modules/45_carbonprice/diffLin2Lin/postsolve.gms delete mode 100644 modules/45_carbonprice/diffLin2Lin/realization.gms create mode 100644 modules/45_carbonprice/functionalForm/datainput.gms create mode 100644 modules/45_carbonprice/functionalForm/declarations.gms rename modules/45_carbonprice/{diffLin2Lin => functionalForm}/not_used.txt (96%) create mode 100644 modules/45_carbonprice/functionalForm/postsolve.gms create mode 100644 modules/45_carbonprice/functionalForm/realization.gms diff --git a/core/datainput.gms b/core/datainput.gms index 65785bd47..f27060b6a 100644 --- a/core/datainput.gms +++ b/core/datainput.gms @@ -25,9 +25,6 @@ pm_temperatureImpulseResponseCO2(tall,tall) = 0; vm_demFeForEs.L(t,regi,entyFe,esty,teEs) = 0; vm_demFeForEs.L(t,regi,fe2es(entyFe,esty,teEs)) = 0.1; -pm_taxCO2eq_iterationdiff(t,regi) = 0; -pm_taxCO2eq_iterationdiff_tmp(t,regi) = 0; - *------------------------------------------------------------------------------------ *** calculations based on sets *------------------------------------------------------------------------------------ @@ -1556,8 +1553,6 @@ loop(te, ); -*** -------- initial declaration of parameters for iterative target adjustment -o_reached_until2150pricepath(iteration) = 0; *** ---- FE demand trajectories for calibration ------------------------------- *** also used for limiting secondary steel demand in baseline and policy diff --git a/core/declarations.gms b/core/declarations.gms index ca4253635..b98a22e21 100644 --- a/core/declarations.gms +++ b/core/declarations.gms @@ -29,10 +29,6 @@ p_inv_gdx(tall,all_regi) "macro-investments path fro pm_taxCO2eq(ttot,all_regi) "CO2 tax path in T$/GtC = $/kgC. To get $/tCO2, multiply with 272 [T$/GtC]" pm_taxCO2eqRegi(tall,all_regi) "additional regional CO2 tax path in T$/GtC = $/kgC. To get $/tCO2, multiply with 272 [T$/GtC]" pm_taxCO2eqSum(tall,all_regi) "sum of pm_taxCO2eq, pm_taxCO2eqRegi, pm_taxCO2eqSCC in T$/GtC = $/kgC. To get $/tCO2, multiply with 272 [T$/GtC]" -p_taxCO2eq_iteration(iteration,ttot,all_regi) "save CO2eq tax used in iteration" -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" 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)" @@ -51,21 +47,6 @@ pm_esCapCost(tall,all_regi,all_teEs) "Capital energy cost per un pm_cesdata_sigma(ttot,all_in) "elasticities of substitution." p_r(ttot,all_regi) "calculating capital interest rate" -o_diff_to_Budg(iteration) "Difference between actual CO2 budget and target CO2 budget" -o_totCO2emi_peakBudgYr(iteration) "Total CO2 emissions in the peakBudgYr" -o_peakBudgYr_Itr(iteration) "Year in which the CO2 budget is supposed to peak. Is changed in iterative_target_adjust = 9" -o_factorRescale_taxCO2_afterPeakBudgYr(iteration) "Multiplicative factor for rescaling the CO2 price in the year after peakBudgYr - only needed if flip-flopping of peakBudgYr occurs" -o_delay_increase_peakBudgYear(iteration) "Counter that tracks if flip-flopping of peakBudgYr happened. Starts an inner loop to try and overcome this" -o_reached_until2150pricepath(iteration) "Counter that tracks if the inner loop of increasing the CO2 price AFTER peakBudgYr goes beyond the initial trajectory" -p_taxCO2eq_until2150(ttot,all_regi) "CO2 price trajectory continued until 2150 - as if there was no change in trajectory after peakBudgYr. Needed to recalculate CO2 price trajectory after peakBudgYr was shifted right" -o_totCO2emi_allYrs(ttot,iteration) "Global CO2 emissions over time and iterations. Needed to check the procedure to find the peakBudgYr" -o_change_totCO2emi_peakBudgYr "Measure for how much the CO2 emissions change around the peakBudgYr" -p_factorRescale_taxCO2(iteration) "Multiplicative factor for rescaling the CO2 price to reach the target" -p_factorRescale_taxCO2_Funneled(iteration) "Multiplicative factor for rescaling the CO2 price to reach the target - limited by an iteration-dependent funnel" -o_taxCO2eq_Itr_1regi(ttot,iteration) "CO2 taxed in the last region, tracked over iterations for debugging" -o_pkBudgYr_flipflop(iteration) "Counter that tracks if flipfloping of cm_peakBudgYr occured in the last iterations" -o_taxCO2eq_afterPeakShiftLoop_Itr_1regi(ttot, iteration) "CO2 taxed in the last region, after the loop that shifts peakBudgYr, tracked over iterations for debugging" - ***---------------------------------------------------------------------------------------- ***-----------------------------------------------ESM module------------------------------- pm_emiExog(tall,all_regi,all_enty) "exogenous emissions" @@ -126,7 +107,6 @@ $endif.tech_CO2capturerate pm_EN_demand_from_initialcap2(all_regi,all_enty) "PE demand resulting from the initialcap routine. [EJ, Uranium: MT U3O8]" pm_budgetCO2eq(all_regi) "budget for regional energy-emissions in period 1" -p_actualbudgetco2(tall) "actual level of cumulated emissions starting from 2020 [GtCO2]" pm_dataccs(all_regi,char,rlf) "maximum CO2 storage capacity using CCS technology. [GtC]" pm_ccsinjecrate(all_regi) "Regional CCS injection rate factor. 1/a." @@ -621,9 +601,6 @@ sm_endBudgetCO2eq "end time step of emission sm_budgetCO2eqGlob "budget for global energy-emissions in period 1" p_emi_budget1_gdx "budget for global energy-emissions in period 1 from gdx, may overwrite default values" -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/ - 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/postsolve.gms b/core/postsolve.gms index 12a35b130..0cf67cf39 100644 --- a/core/postsolve.gms +++ b/core/postsolve.gms @@ -8,8 +8,7 @@ *-------------------------------calculate regional permit prices----------------------------------- -*** saving CO2 tax used in this iteration -p_taxCO2eq_iteration(iteration,ttot,regi) = pm_taxCO2eq(ttot,regi); +*** saving pm_taxemiMkt used in this iteration pm_taxemiMkt_iteration(iteration,ttot,regi,emiMkt) = pm_taxemiMkt(ttot,regi,emiMkt); if( (cm_emiscen eq 6), @@ -22,480 +21,6 @@ $endif.neg pm_taxCO2eqSum(ttot,regi)$(ttot.val < 2025) = pm_taxCO2eq(ttot,regi); ); -if(cm_iterative_target_adj eq 4, -*JeS* Iteratively update regional CO2 tax trajectories / regional CO2 budget to reach the FF&I budget target (s_actualbudgetco2 runs from 2020-2100, not peak budget) -*KK* for a time step of 5 years, the budget is calculated as 3 * 2020 + ts(2025-2090) + 8 * 2100; -*** 10-pm_ts("2090")/2 and pm_ts("2020")/2 are the time periods that haven't been taken into account in the sum over ttot. -*** 0.5 year of emissions is added for the two boundaries, such that the budget is calculated for 81 years. -s_actualbudgetco2 = sum(ttot$(ttot.val le 2090 AND ttot.val > 2020), (sum(regi, vm_emiTe.l(ttot,regi,"co2") + vm_emiMacSector.l(ttot,regi,"co2cement_process")) * sm_c_2_co2 * pm_ts(ttot))) - + sum(regi, vm_emiTe.l("2100",regi,"co2") + vm_emiMacSector.l("2100",regi,"co2cement_process")) * sm_c_2_co2 * (10 - pm_ts("2090")/2 + 0.5) - + sum(regi, vm_emiTe.l("2020",regi,"co2") + vm_emiMacSector.l("2020",regi,"co2cement_process")) * sm_c_2_co2 * (pm_ts("2020")/2 + 0.5); -display s_actualbudgetco2; - - if (cm_emiscen eq 6, - if(o_modelstat eq 2 AND ord(iteration) 2020), (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))) - + sum(regi, vm_emiTe.l("2100",regi,"co2") + vm_emiCdr.l("2100",regi,"co2") + vm_emiMac.l("2100",regi,"co2")) * sm_c_2_co2 * (10 - pm_ts("2090")/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); - -display s_actualbudgetco2; - - if (cm_emiscen eq 6, - if(o_modelstat eq 2 AND ord(iteration) 0 AND abs(c_budgetCO2from2020 - s_actualbudgetco2) ge 0.5, !!only for optimal iterations, and not after the last one, and only if budget still possitive, and only if target not yet reached - sm_globalBudget_dev = s_actualbudgetco2 / c_budgetCO2from2020; -*** make sure that iteration converges: -*** use multiplicative for budgets higher than 1200 Gt; for lower budgets, use multiplicative adjustment only for first 3 iterations, - if(ord(iteration) lt 3 or c_budgetCO2from2020 > 1200, - !! change in CO2 price through adjustment: new price - old price; needed for adjustment option 2 - pm_taxCO2eq_iterationdiff(t,regi) = pm_taxCO2eq(t,regi) * min(max((s_actualbudgetco2/c_budgetCO2from2020)** (25/(2 * iteration.val + 23)),0.5+iteration.val/208),2 - iteration.val/102) - pm_taxCO2eq(t,regi); - pm_taxCO2eq(t,regi) = pm_taxCO2eq(t,regi) + pm_taxCO2eq_iterationdiff(t,regi) ; -*** then switch to triangle-approximation based on last two iteration data points - else - !! change in CO2 price through adjustment: new price - old price; the two instances of "pm_taxCO2eq" cancel out -> only the difference term - pm_taxCO2eq_iterationdiff_tmp(t,regi) = - max(pm_taxCO2eq_iterationdiff(t,regi) * min(max((c_budgetCO2from2020 - s_actualbudgetco2)/(s_actualbudgetco2 - s_actualbudgetco2_last),-2),2),-pm_taxCO2eq(t,regi)/2); - pm_taxCO2eq(t,regi) = pm_taxCO2eq(t,regi) + - max(pm_taxCO2eq_iterationdiff(t,regi) * min(max((c_budgetCO2from2020 - s_actualbudgetco2)/(s_actualbudgetco2 - s_actualbudgetco2_last),-2),2),-pm_taxCO2eq(t,regi)/2); - pm_taxCO2eq_iterationdiff(t,regi) = pm_taxCO2eq_iterationdiff_tmp(t,regi); - ); - o_taxCO2eq_iterDiff_Itr(iteration,regi) = pm_taxCO2eq_iterationdiff("2030",regi); - else - if(s_actualbudgetco2 > 0 or abs(c_budgetCO2from2020 - s_actualbudgetco2) < 2, !! if model was not optimal, or if budget already reached, keep tax constant - pm_taxCO2eq(t,regi) = pm_taxCO2eq(t,regi); - o_taxCO2eq_iterDiff_Itr(iteration,regi) = 0; - else -*** if budget has turned negative, reduce CO2 price by 20% - pm_taxCO2eq_iterationdiff(t,regi) = -0.2*pm_taxCO2eq(t,regi); - pm_taxCO2eq(t,regi) = pm_taxCO2eq(t,regi) + pm_taxCO2eq_iterationdiff(t,regi); - o_taxCO2eq_iterDiff_Itr(iteration,regi) = pm_taxCO2eq_iterationdiff("2030",regi); - ); - ); - display o_taxCO2eq_iterDiff_Itr; - - pm_taxCO2eq(t,regi)$(t.val gt 2110) = pm_taxCO2eq("2110",regi); !! to prevent huge taxes after 2110 and the resulting convergence problems, set taxes after 2110 equal to 2110 value - display pm_taxCO2eq; - ); -); - -if(cm_iterative_target_adj eq 6, -*JeS* Iteratively update regional CO2 tax trajectories / regional CO2 budget to reach the target for global peak budget - -*KK* p_actualbudgetco2 for ttot > 2020. It includes emissions from 2020 to ttot (including ttot). -*** (ttot.val - (ttot - 1).val)/2 and pm_ts("2020")/2 are the time periods that haven't been taken into account in the sum over ttot2. -*** 0.5 year of emissions is added for the two boundaries, such that the budget includes emissions in ttot. -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,p_actualbudgetco2(t)); -display s_actualbudgetco2; - - if (cm_emiscen eq 6, - if(o_modelstat eq 2 AND ord(iteration) 0 AND abs(c_budgetCO2from2020 - s_actualbudgetco2) ge 0.5, !!only for optimal iterations, and not after the last one, and only if budget still possitive, and only if target not yet reached -*** make sure that iteration converges: -*** use multiplicative for budgets higher than 1200 Gt; for lower budgets, use multiplicative adjustment only for first 3 iterations, - if(ord(iteration) lt 3 or c_budgetCO2from2020 > 1200, - !! change in CO2 price through adjustment: new price - old price; needed for adjustment option 2 - pm_taxCO2eq_iterationdiff(t,regi) = pm_taxCO2eq(t,regi) * min(max((s_actualbudgetco2/c_budgetCO2from2020)** (25/(2 * iteration.val + 23)),0.5+iteration.val/208),2 - iteration.val/102) - pm_taxCO2eq(t,regi); - pm_taxCO2eq(t,regi) = pm_taxCO2eq(t,regi) + pm_taxCO2eq_iterationdiff(t,regi) ; -*** then switch to triangle-approximation based on last two iteration data points - else - !! change in CO2 price through adjustment: new price - old price; the two instances of "pm_taxCO2eq" cancel out -> only the difference term - pm_taxCO2eq_iterationdiff_tmp(t,regi) = - max(pm_taxCO2eq_iterationdiff(t,regi) * min(max((c_budgetCO2from2020 - s_actualbudgetco2)/(s_actualbudgetco2 - s_actualbudgetco2_last),-2),2),-pm_taxCO2eq(t,regi)/2); - pm_taxCO2eq(t,regi) = pm_taxCO2eq(t,regi) + - max(pm_taxCO2eq_iterationdiff(t,regi) * min(max((c_budgetCO2from2020 - s_actualbudgetco2)/(s_actualbudgetco2 - s_actualbudgetco2_last),-2),2),-pm_taxCO2eq(t,regi)/2); - pm_taxCO2eq_iterationdiff(t,regi) = pm_taxCO2eq_iterationdiff_tmp(t,regi); - ); - o_taxCO2eq_iterDiff_Itr(iteration,regi) = pm_taxCO2eq_iterationdiff("2030",regi); - else - if(s_actualbudgetco2 > 0 or abs(c_budgetCO2from2020 - s_actualbudgetco2) < 2, !! if model was not optimal, or if budget already reached, keep tax constant - pm_taxCO2eq(t,regi) = pm_taxCO2eq(t,regi); - o_taxCO2eq_iterDiff_Itr(iteration,regi) = 0; - else -*** if budget has turned negative, reduce CO2 price by 20% - pm_taxCO2eq_iterationdiff(t,regi) = -0.2*pm_taxCO2eq(t,regi); - pm_taxCO2eq(t,regi) = pm_taxCO2eq(t,regi) + pm_taxCO2eq_iterationdiff(t,regi); - o_taxCO2eq_iterDiff_Itr(iteration,regi) = pm_taxCO2eq_iterationdiff("2030",regi); - ); - ); - display o_taxCO2eq_iterDiff_Itr; - - pm_taxCO2eq(t,regi)$(t.val gt 2110) = pm_taxCO2eq("2110",regi); !! to prevent huge taxes after 2110 and the resulting convergence problems, set taxes after 2110 equal to 2110 value - display pm_taxCO2eq; - ); -); - -*** --------------------------------------------------------------------------------------------------------------- -*** ENGAGE peakBudg formulation that works with several CO2 price path realizations of module 45 --------------------- -*** it results in a peak budget with zero net CO2 emissions afterwards -*** --------------------------------------------------------------------------------------------------------------- -if(cm_iterative_target_adj eq 7, -*JeS/CB* Iteratively update regional CO2 tax trajectories / regional CO2 budget to reach the target for global peak budget, but make sure CO2 emissions afterward are close to zero on the global level - -*** Save the original functional form of the CO2 price trajectory so values for all times can be accessed even if the peakBudgYr is shifted. - if( iteration.val eq 1, - p_taxCO2eq_until2150(t,regi) = pm_taxCO2eq(t,regi); - ); - -*KK* p_actualbudgetco2 for ttot > 2020. It includes emissions from 2020 to ttot (including ttot). -*** (ttot.val - (ttot - 1).val)/2 and pm_ts("2020")/2 are the time periods that haven't been taken into account in the sum over ttot2. -*** 0.5 year of emissions is added for the two boundaries, such that the budget includes emissions in ttot. -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 cm_peakBudgYr AND t.val le 2100),p_actualbudgetco2(t)); - - - o_peakBudgYr_Itr(iteration) = cm_peakBudgYr; - -display s_actualbudgetco2; -display p_actualbudgetco2; - - if (cm_emiscen eq 9, - if(o_modelstat eq 2 AND ord(iteration) 0 AND abs(c_budgetCO2from2020 - s_actualbudgetco2) ge 0.5, !!only for optimal iterations, and not after the last one, and only if budget still possitive, and only if target not yet reached - display pm_taxCO2eq; -*** make sure that iteration converges: -*** use multiplicative for budgets higher than 1600 Gt; for lower budgets, use multiplicative adjustment only for first 3 iterations, - if(ord(iteration) lt 3 or c_budgetCO2from2020 > 1600, - !! change in CO2 price through adjustment: new price - old price; needed for adjustment option 2 - pm_taxCO2eq_iterationdiff(t,regi) = pm_taxCO2eq(t,regi) * min(max((s_actualbudgetco2/c_budgetCO2from2020)** (25/(2 * iteration.val + 23)),0.5+iteration.val/208),2 - iteration.val/102) - pm_taxCO2eq(t,regi); - pm_taxCO2eq(t,regi)$(t.val le cm_peakBudgYr) = pm_taxCO2eq(t,regi) + pm_taxCO2eq_iterationdiff(t,regi) ; - p_taxCO2eq_until2150(t,regi) = p_taxCO2eq_until2150(t,regi) + pm_taxCO2eq_iterationdiff(t,regi) ; -*** then switch to triangle-approximation based on last two iteration data points - else - !! change in CO2 price through adjustment: new price - old price; the two instances of "pm_taxCO2eq" cancel out -> only the difference term - !! until cm_peakBudgYr: expolinear price trajectory - pm_taxCO2eq_iterationdiff_tmp(t,regi) = - max(pm_taxCO2eq_iterationdiff(t,regi) * min(max((c_budgetCO2from2020 - s_actualbudgetco2)/(s_actualbudgetco2 - s_actualbudgetco2_last),-2),2),-pm_taxCO2eq(t,regi)/2); - pm_taxCO2eq(t,regi)$(t.val le cm_peakBudgYr) = pm_taxCO2eq(t,regi) + - max(pm_taxCO2eq_iterationdiff(t,regi) * min(max((c_budgetCO2from2020 - s_actualbudgetco2)/(s_actualbudgetco2 - s_actualbudgetco2_last),-2),2),-pm_taxCO2eq(t,regi)/2); - p_taxCO2eq_until2150(t,regi) = p_taxCO2eq_until2150(t,regi) + - max(pm_taxCO2eq_iterationdiff(t,regi) * min(max((c_budgetCO2from2020 - s_actualbudgetco2)/(s_actualbudgetco2 - s_actualbudgetco2_last),-2),2),-p_taxCO2eq_until2150(t,regi)/2); - pm_taxCO2eq_iterationdiff(t,regi) = pm_taxCO2eq_iterationdiff_tmp(t,regi); - !! after cm_peakBudgYr: adjustment so that emissions become zero: increase/decrease tax in each time step after cm_peakBudgYr by percentage of that year's total CO2 emissions of 2015 emissions - ); - o_taxCO2eq_iterDiff_Itr(iteration,regi) = pm_taxCO2eq_iterationdiff("2030",regi); - display o_taxCO2eq_iterDiff_Itr; - else - if(s_actualbudgetco2 > 0 or abs(c_budgetCO2from2020 - s_actualbudgetco2) < 2, !! if model was not optimal, or if budget already reached, keep tax constant - pm_taxCO2eq(t,regi) = pm_taxCO2eq(t,regi); - else -*** if budget has turned negative, reduce CO2 price by 20% - pm_taxCO2eq(t,regi) = 0.8*pm_taxCO2eq(t,regi); - p_taxCO2eq_until2150(t,regi) = 0.8*p_taxCO2eq_until2150(t,regi); - ); - ); -*** after cm_peakBudgYr: always adjust to bring emissions close to zero - pm_taxCO2eq(t,regi)$(t.val gt cm_peakBudgYr) = pm_taxCO2eq(t,regi) + pm_taxCO2eq(t,regi)*max(sum(regi2,vm_emiAll.l(t,regi2,"co2"))/sum(regi2,vm_emiAll.l("2015",regi2,"co2")),-0.75); - -*** check if cm_peakBudgYr is correct: if global emissions already negative, move cm_peakBudgYr forward -*** similar code block as used in iterative-adjust 9 below (credit to RP) - o_diff_to_Budg(iteration) = (c_budgetCO2from2020 - s_actualbudgetco2); - o_totCO2emi_peakBudgYr(iteration) = sum(t$(t.val = cm_peakBudgYr), sum(regi2, vm_emiAll.l(t,regi2,"co2")) ); - o_totCO2emi_allYrs(t,iteration) = sum(regi2, vm_emiAll.l(t,regi2,"co2") ); - o_change_totCO2emi_peakBudgYr(iteration) = sum(ttot$(ttot.val = cm_peakBudgYr), (o_totCO2emi_allYrs(ttot-1,iteration) - o_totCO2emi_allYrs(ttot+1,iteration) )/4 ); !! Only gives a tolerance range, exact value not important. Division by 4 somewhat arbitrary - could be 3 or 5 as well. - - display cm_peakBudgYr, o_diff_to_Budg, o_peakBudgYr_Itr, o_totCO2emi_allYrs, o_totCO2emi_peakBudgYr, o_change_totCO2emi_peakBudgYr; - -***if( sum(t,sum(regi2,vm_emiAll.l(t,regi2,"co2")$(t.val = cm_peakBudgYr))) < -0.1, -*** cm_peakBudgYr = tt.val(t - 1)$(t.val = cm_peakBudgYr); -***); - - if( abs(o_diff_to_Budg(iteration)) < 20, !! only think about shifting peakBudgYr if the budget is close enough to target budget - display "close enough to target budget to check timing of peak year"; - loop(ttot$(ttot.val = cm_peakBudgYr), !! look at the peak timing -*** if( ( (o_totCO2emi_peakBudgYr(iteration) < -(0.1 + o_change_totCO2emi_peakBudgYr(iteration)) ) AND (cm_peakBudgYr > 2040) ), !! no peaking time before 2040 - if( ( (o_totCO2emi_peakBudgYr(iteration) < -(0.1) ) AND (cm_peakBudgYr > 2040) ), !! no peaking time before 2040 - display "shift peakBudgYr left"; - o_peakBudgYr_Itr(iteration+1) = pm_ttot_val(ttot - 1); -*** pm_taxCO2eq(t,regi)$(t.val gt pm_ttot_val(ttot - 1)) = p_taxCO2eq_until2150(ttot-1,regi) + (t.val - pm_ttot_val(ttot - 1)) * cm_taxCO2inc_after_peakBudgYr * sm_DptCO2_2_TDpGtC; !! increase by cm_taxCO2inc_after_peakBudgYr per year after peakBudgYr -*** if tax after cm_peakBudgYr is higher than normal increase rate (exceeding a 20% tolerance): shift right - elseif( ( sum(regi, sum(t2$(t2.val = pm_ttot_val(ttot+1)),pm_taxCO2eq(t2,regi))) > sum(regi,sum(t2$(t2.val = pm_ttot_val(ttot+1)),p_taxCO2eq_until2150(t2,regi)))*1.2 ) AND (cm_peakBudgYr < 2100) ), !! if peaking time would be after 2100, keep 2100 budget year - if( (iteration.val > 2) AND ( o_peakBudgYr_Itr(iteration - 1) > o_peakBudgYr_Itr(iteration) ) AND ( o_peakBudgYr_Itr(iteration - 2) = o_peakBudgYr_Itr(iteration) ) , !! if the target year was just shifted left after being shifted right - o_peakBudgYr_Itr(iteration+1) = o_peakBudgYr_Itr(iteration); !! don't shift right again immediately - else - display "shift peakBudgYr right"; - o_peakBudgYr_Itr(iteration+1) = pm_ttot_val(ttot + 1); !! ttot+1 is the new peakBudgYr - loop(t$(t.val ge pm_ttot_val(ttot + 1)), - pm_taxCO2eq(t,regi) = p_taxCO2eq_until2150(t,regi); - ); - ); - - else !! don't do anything if the peakBudgYr is already at the corner values (2040, 2100) or if the emissions in the peakBudgYr are close to 0 - o_peakBudgYr_Itr(iteration+1) = o_peakBudgYr_Itr(iteration) - ); - ); - cm_peakBudgYr = o_peakBudgYr_Itr(iteration+1); - display cm_peakBudgYr; - ); - - - - - - pm_taxCO2eq(t,regi)$(t.val gt 2110) = pm_taxCO2eq("2110",regi); !! to prevent huge taxes after 2110 and the resulting convergence problems, set taxes after 2110 equal to 2110 value - display pm_taxCO2eq; - ); -); - - -*** --------------------------------------------------------------------------------------------------------------- -*** new peakBudg formulation that works with several CO2 price path realizations of module 45 --------------------- -*** it results in a peak budget with linear increase by 2$/yr afterwards -*** --------------------------------------------------------------------------------------------------------------- - -if (cm_iterative_target_adj eq 9, -*' Update Iteratively update regional CO2 tax trajectories / regional CO2 budget to reach the target for global peak budget, with a linear increase afterwards given by `cm_taxCO2inc_after_peakBudgYr`. The -*' peak budget year is determined automatically (within the time window 2040--2100) - -*' `p_actualbudgetco2(ttot)` includes emissions from 2020 to `ttot` (inclusive). - p_actualbudgetco2(ttot)$( 2020 lt ttot.val ) - = sum((regi,ttot2)$( 2020 le ttot2.val AND ttot2.val le ttot.val ), - ( vm_emiTe.l(ttot2,regi,"co2") - + vm_emiCdr.l(ttot2,regi,"co2") - + vm_emiMac.l(ttot2,regi,"co2") - ) - * ( !! second half of the 2020 period: 2020-22 - (pm_ts(ttot2) / 2 + 0.5)$( ttot2.val eq 2020 ) - !! entire middle periods - + (pm_ts(ttot2))$( 2020 lt ttot2.val AND ttot2.val lt ttot.val ) - !! first half of the final period, until the end of the middle year - + ((pm_ttot_val(ttot) - pm_ttot_val(ttot-1)) / 2 + 0.5)$( - ttot2.val eq ttot.val ) - ) - ) - * sm_c_2_co2; - - s_actualbudgetco2 = smax(t$( t.val le cm_peakBudgYr ), p_actualbudgetco2(t)); - - o_peakBudgYr_Itr(iteration) = cm_peakBudgYr; - - display s_actualbudgetco2, p_actualbudgetco2; - - if(cm_emiscen eq 9, - -*** --------A: calculate the new CO2 price path, the CO2 tax rescale factor---------------------------------------------------------- - - if(o_modelstat eq 2 AND ord(iteration) < cm_iteration_max AND s_actualbudgetco2 > 0 AND abs(c_budgetCO2from2020 - s_actualbudgetco2) ge 2, !!only for optimal iterations, and not after the last one, and only if budget still possitive, and only if target not yet reached - display pm_taxCO2eq; - - if( ( ( p_actualbudgetco2("2100") > 1.1 * s_actualbudgetco2 ) AND ( abs(c_budgetCO2from2020 - s_actualbudgetco2) < 50 ) AND (iteration.val < 12) ), - display iteration; -*** if end-of-century budget is higher than budget at peak point, AND end-of-century budget is already in the range of the target budget (+/- 50 GtC), treat as end-of-century budget -*** for this iteration. Only do this rough approach (jump to 2100) for the first iterations - at later iterations the slower adjustment of the peaking time should work better - display "this is likely an end-of-century budget with no net negative emissions at all. Shift cm_peakBudgYr to 2100"; - s_actualbudgetco2 = 0.5 * (p_actualbudgetco2("2100") + s_actualbudgetco2); !! due to the potential strong jump in cm_peakBudgYr, which implies that the CO2 price -*** will increase over a longer time horizon, take the average of the budget at the old peak time and the new peak time - cm_peakBudgYr = 2100; - ); - -*** --------A1: for that, calculate the CO2 tax rescale factor--- - - if(iteration.val lt 10, - p_factorRescale_taxCO2(iteration) = max(0.1, (s_actualbudgetco2/c_budgetCO2from2020) ) ** 3; - else - p_factorRescale_taxCO2(iteration) = max(0.1, (s_actualbudgetco2/c_budgetCO2from2020) ) ** 2; - ); - p_factorRescale_taxCO2_Funneled(iteration) = - max(min( 2 * EXP( -0.15 * iteration.val ) + 1.01 ,p_factorRescale_taxCO2(iteration)), - 1/ ( 2 * EXP( -0.15 * iteration.val ) + 1.01) - ); - - pm_taxCO2eq_iterationdiff(t,regi) = max(1* sm_DptCO2_2_TDpGtC, pm_taxCO2eq(t,regi) * p_factorRescale_taxCO2_Funneled(iteration) ) - pm_taxCO2eq(t,regi); - p_taxCO2eq_until2150(t,regi) = max(1* sm_DptCO2_2_TDpGtC, p_taxCO2eq_until2150(t,regi) * p_factorRescale_taxCO2_Funneled(iteration) ); - pm_taxCO2eq(t,regi) = max(1* sm_DptCO2_2_TDpGtC, pm_taxCO2eq(t,regi) * p_factorRescale_taxCO2_Funneled(iteration) ); !! rescale co2tax - loop(t2$(t2.val eq cm_peakBudgYr), - pm_taxCO2eq(t,regi)$(t.val gt cm_peakBudgYr) = p_taxCO2eq_until2150(t2,regi) + (t.val - t2.val) * cm_taxCO2inc_after_peakBudgYr * sm_DptCO2_2_TDpGtC; !! increase by cm_taxCO2inc_after_peakBudgYr per year - ); - - display p_factorRescale_taxCO2, p_factorRescale_taxCO2_Funneled; - - o_taxCO2eq_iterDiff_Itr(iteration,regi) = pm_taxCO2eq_iterationdiff("2030",regi); - loop(regi, !! not a nice solution to having only the price of one regi display (for better visibility), but this way it overwrites again and again until the value from the last regi remain - o_taxCO2eq_Itr_1regi(t,iteration+1) = pm_taxCO2eq(t,regi); - ); - - display o_taxCO2eq_iterDiff_Itr, o_taxCO2eq_Itr_1regi; - - - else !! if(o_modelstat eq 2 AND ord(iteration) 0 AND abs(c_budgetCO2from2020 )) - if(s_actualbudgetco2 > 0 or abs(c_budgetCO2from2020 - s_actualbudgetco2) < 2, !! if model was not optimal, or if budget already reached, keep tax constant - p_factorRescale_taxCO2(iteration) = 1; - p_factorRescale_taxCO2_Funneled(iteration) = 1; - p_taxCO2eq_until2150(t,regi) = p_taxCO2eq_until2150(t,regi); !! nothing changes - else -*** if budget has turned negative, reduce CO2 price by 20% - p_factorRescale_taxCO2(iteration) = 0.8; - p_factorRescale_taxCO2_Funneled(iteration) = p_factorRescale_taxCO2(iteration); - - p_taxCO2eq_until2150(t,regi) = p_factorRescale_taxCO2(iteration) * p_taxCO2eq_until2150(t,regi); - pm_taxCO2eq(t,regi) = p_factorRescale_taxCO2(iteration) * pm_taxCO2eq(t,regi); - ); - ); !! if(o_modelstat eq 2 AND ord(iteration) 0 AND abs(c_budgetCO2from2020 - s_actualbudgetco2) ge 2, - - display pm_taxCO2eq, p_taxCO2eq_until2150; - - -*** -------B: checking the peak timing, if cm_peakBudgYr is still correct or needs to be shifted----------------------- - - o_diff_to_Budg(iteration) = (c_budgetCO2from2020 - s_actualbudgetco2); - o_totCO2emi_peakBudgYr(iteration) = sum(t$(t.val = cm_peakBudgYr), sum(regi2, vm_emiAll.l(t,regi2,"co2")) ); - o_totCO2emi_allYrs(t,iteration) = sum(regi2, vm_emiAll.l(t,regi2,"co2") ); - -*RP* calculate how fast emissions are changing around the peaking time to get an idea how close it is possible to get to 0 due to the 5(10) year time steps - o_change_totCO2emi_peakBudgYr(iteration) = sum(ttot$(ttot.val = cm_peakBudgYr), (o_totCO2emi_allYrs(ttot-1,iteration) - o_totCO2emi_allYrs(ttot+1,iteration) )/4 ); !! Only gives a tolerance range, exact value not important. Division by 4 somewhat arbitrary - could be 3 or 5 as well. - - display cm_peakBudgYr, o_diff_to_Budg, o_peakBudgYr_Itr, o_totCO2emi_allYrs, o_totCO2emi_peakBudgYr, o_change_totCO2emi_peakBudgYr; - - -*** ----B1: check if cm_peakBudgYr should be shifted left or right: - if( abs(o_diff_to_Budg(iteration)) < 20, !! only think about shifting peakBudgYr if the budget is close enough to target budget - display "close enough to target budget to check timing of peak year"; - - !! check if the target year was just shifted back left after being shifted right before - if ( (iteration.val > 2) AND ( o_peakBudgYr_Itr(iteration - 1) > o_peakBudgYr_Itr(iteration) ) AND ( o_peakBudgYr_Itr(iteration - 2) = o_peakBudgYr_Itr(iteration) ), - o_pkBudgYr_flipflop(iteration) = 1; - display "flipflop observed (before loop)"; - ); - - loop(ttot$(ttot.val = cm_peakBudgYr), !! look at the peak timing - if( ( (o_totCO2emi_peakBudgYr(iteration) < -(0.1 + o_change_totCO2emi_peakBudgYr(iteration)) ) AND (cm_peakBudgYr > 2040) ), !! no peaking time before 2040 - display "shift peakBudgYr left"; - o_peakBudgYr_Itr(iteration+1) = pm_ttot_val(ttot - 1); - pm_taxCO2eq(t,regi)$(t.val gt pm_ttot_val(ttot - 1)) = p_taxCO2eq_until2150(ttot-1,regi) + (t.val - pm_ttot_val(ttot - 1)) * cm_taxCO2inc_after_peakBudgYr * sm_DptCO2_2_TDpGtC; !! increase by cm_taxCO2inc_after_peakBudgYr per year after peakBudgYr - - elseif ( ( o_totCO2emi_peakBudgYr(iteration) > (0.1 + o_change_totCO2emi_peakBudgYr(iteration)) ) AND (cm_peakBudgYr < 2100) ), !! if peaking time would be after 2100, keep 2100 budget year - if( (o_pkBudgYr_flipflop(iteration) eq 1), !! if the target year was just shifted left after being shifted right, and would now be shifted right again - display "peakBudgYr was left, right, left and is now supposed to be shifted right again -> flipflop, thus go into separate loop"; - o_peakBudgYr_Itr(iteration+1) = o_peakBudgYr_Itr(iteration); !! don't shift right again immediately, but go into a different loop: - o_delay_increase_peakBudgYear(iteration) = 1; - elseif ( o_delay_increase_peakBudgYear(iteration) eq 1 ), - display "still in separate loop trying to resolve flip-flop behavior"; - o_peakBudgYr_Itr(iteration+1) = o_peakBudgYr_Itr(iteration); !! keep current peakBudgYr, - else - display "shift peakBudgYr right"; - o_peakBudgYr_Itr(iteration+1) = pm_ttot_val(ttot + 1); !! ttot+1 is the new peakBudgYr - loop(t$(t.val ge pm_ttot_val(ttot + 1)), - pm_taxCO2eq(t,regi) = p_taxCO2eq_until2150(ttot+1,regi) - + (t.val - pm_ttot_val(ttot + 1)) * cm_taxCO2inc_after_peakBudgYr * sm_DptCO2_2_TDpGtC; !! increase by cm_taxCO2inc_after_peakBudgYr per year - ); - ); - - else !! don't do anything if the peakBudgYr is already at the corner values (2040, 2100) or if the emissions in the peakBudgYr are close enough to 0 (within the range of +/- o_change_totCO2emi_peakBudgYr) - o_peakBudgYr_Itr(iteration+1) = o_peakBudgYr_Itr(iteration) - ); - ); - cm_peakBudgYr = o_peakBudgYr_Itr(iteration+1); - display cm_peakBudgYr; - ); - - pm_taxCO2eq(t,regi)$(t.val le cm_peakBudgYr) = p_taxCO2eq_until2150(t,regi); !! until peakBudgYr, take the contiuous price trajectory - -*** -----B2: if there was a flip-floping of cm_peakBudgYr in the previous iterations, try to overome this by adjusting the CO2 price path after the peaking year - if (o_delay_increase_peakBudgYear(iteration) = 1, - display "not shifting peakBudgYr right, instead adjusting CO2 price for following year"; - loop(ttot$(ttot.val eq cm_peakBudgYr), !! set ttot to the current peakBudgYr - loop(t2$(t2.val eq pm_ttot_val(ttot+1)), !! set t2 to the following time step - o_factorRescale_taxCO2_afterPeakBudgYr(iteration) = 1 + max(sum(regi2,vm_emiAll.l(ttot,regi2,"co2"))/sum(regi2,vm_emiAll.l("2015",regi2,"co2")),-0.75) ; - !! this was inspired by Christoph's approach. This value is 1 if emissions in the peakBudgYr are 0; goes down to 0.25 if emissions are <0 and approaching the size of 2015 emissions, and > 1 if emissions > 0. - - !! in case the normal linear extension still is not enough to get emissions to 0 after the peakBudgYr, shift peakBudgYr right again: - if( ( o_reached_until2150pricepath(iteration-1) eq 1 ) AND ( o_totCO2emi_peakBudgYr(iteration) > (0.1 + o_change_totCO2emi_peakBudgYr(iteration)) ), - display "price in following year reached original path in previous iteration and is still not enough -> shift peakBudgYr to right"; - o_delay_increase_peakBudgYear(iteration+1) = 0; !! probably is not necessary - o_reached_until2150pricepath(iteration) = 0; - o_peakBudgYr_Itr(iteration+1) = t2.val; !! shift PeakBudgYear to the following time step - pm_taxCO2eq(t2,regi) = p_taxCO2eq_until2150(t2,regi) ; !! set CO2 price in t2 to value in the "continuous path" - - elseif ( ( o_reached_until2150pricepath(iteration-1) eq 1 ) AND ( o_totCO2emi_peakBudgYr(iteration) < (0.1 + o_change_totCO2emi_peakBudgYr(iteration)) ) ), - display "New intermediate price in timestep after cm_peakBudgYr is sufficient to stabilize peaking year - go back to normal loop"; - o_delay_increase_peakBudgYear(iteration+1) = 0; !! probably is not necessary - o_reached_until2150pricepath(iteration) = 0; - o_peakBudgYr_Itr(iteration+1) = o_peakBudgYr_Itr(iteration); - else !! either didn't reach the continued "until2150"-price path in last iteration, or the increase was high enough to get emissions to 0. - !! in this case, keep PeakBudgYr, and adjust the price in the year after the peakBudgYr to get emissions close to 0, - o_delay_increase_peakBudgYear(iteration+1) = 1; !! make sure next iteration peakBudgYr is not shifted right again - o_peakBudgYr_Itr(iteration+1) = o_peakBudgYr_Itr(iteration); - pm_taxCO2eq(t2,regi) = max(pm_taxCO2eq(ttot,regi), !! at least as high as the price in the peakBudgYr - pm_taxCO2eq(t2,regi) * (o_factorRescale_taxCO2_afterPeakBudgYr(iteration) / p_factorRescale_taxCO2_Funneled(iteration) ) !! the full path was already rescaled by p_factorRescale_taxCO2_Funneled, so adjust the second rescaling - ); - loop(regi, !! this loop is necessary to allow the <-comparison in the next if statement - if( p_taxCO2eq_until2150(t2,regi) < pm_taxCO2eq(t2,regi) , !! check if new price would be higher than the price if the peakBudgYr would be one timestep later - display "price increase reached price from path with cm_peakBudgYr one timestep later - downscale to 99%"; - pm_taxCO2eq(t2,regi) = 0.99 * p_taxCO2eq_until2150(t2,regi); !! reduce the new CO2 price to 99% of the price that it would be if the peaking year was one timestep later. The next iteration will show if this is enough, otherwise cm_peakBudgYr will be shifted right - o_reached_until2150pricepath(iteration) = 1; !! upward CO2 price correction reached the continued price path - check in next iteration if this is high enough. - ); - ); - ); - - display o_factorRescale_taxCO2_afterPeakBudgYr; - pm_taxCO2eq(t,regi)$(t.val gt t2.val) = pm_taxCO2eq(t2,regi) + (t.val - t2.val) * cm_taxCO2inc_after_peakBudgYr * sm_DptCO2_2_TDpGtC; !! increase by cm_taxCO2inc_after_peakBudgYr per year - - ); !! loop t2$(t2.val eq pm_ttot_val(ttot+1)), !! set t2 to the following time step - ); !! loop ttot$(ttot.val eq cm_peakBudgYr), !! set ttot to the current peakBudgYr - cm_peakBudgYr = o_peakBudgYr_Itr(iteration+1); !! this has to happen outside the loop, otherwise the loop condition might be true twice - ); !! if o_delay_increase_peakBudgYear(iteration) = 1, !! if there was a flip-floping in the previous iterations, try to solve this - - - loop(regi, !! not a nice solution to having only the price of one regi display (for better visibility), but this way it overwrites again and again until the value from the last regi remain - o_taxCO2eq_afterPeakShiftLoop_Itr_1regi(t,iteration+1) = pm_taxCO2eq(t,regi); - ); - - display o_delay_increase_peakBudgYear, o_reached_until2150pricepath, pm_taxCO2eq, o_peakBudgYr_Itr, o_taxCO2eq_afterPeakShiftLoop_Itr_1regi, o_pkBudgYr_flipflop, cm_peakBudgYr; - ); !! if cm_emiscen eq 9, -); !! if cm_iterative_target_adj eq 9, - -***------ end of "cm_iterative_target_adj" variants----------------------------------------- - - -*** for having it available in next iteration, too: -s_actualbudgetco2_last = s_actualbudgetco2; - ***----------------------------------------------- *RP* calculate shares of SE used for different FEs ***----------------------------------------------- diff --git a/core/preloop.gms b/core/preloop.gms index 4a5f07e1f..4f3e70d49 100644 --- a/core/preloop.gms +++ b/core/preloop.gms @@ -75,19 +75,6 @@ pm_vintage_in(regi,"1",te) = pm_vintage_in(regi,"1",te) * max((pm_histfegrowth(r pm_vintage_in(regi,"6",te) = pm_vintage_in(regi,"6",te) * max(((pm_histfegrowth(regi,entyFe)- 0.005 + 1/fm_dataglob("lifetime",te))/(1/fm_dataglob("lifetime",te)) + 1)* 0.75, 0.2); ); -*RP -*** First adjustment of CO2 price path for peakBudget runs (set by cm_iterative_target_adj eq 9) -if(cm_iterative_target_adj eq 9, -*** Save the original functional form of the CO2 price trajectory so values for all times can be accessed even if the peakBudgYr is shifted. -*** Then change to linear increasing CO2 price after peaking time - p_taxCO2eq_until2150(t,regi) = pm_taxCO2eq(t,regi); - loop(t2$(t2.val eq cm_peakBudgYr), - pm_taxCO2eq(t,regi)$(t.val gt cm_peakBudgYr) = p_taxCO2eq_until2150(t2,regi) + (t.val - t2.val) * cm_taxCO2inc_after_peakBudgYr * sm_DptCO2_2_TDpGtC; !! increase by cm_taxCO2inc_after_peakBudgYr per year - ); -); - -display p_taxCO2eq_until2150, pm_taxCO2eq; - *** The N2O emissions generated during biomass production in agriculture (in MAgPIE) *** are represented in REMIND by applying the n2obio emission factor (zero in coupled runs) diff --git a/main.gms b/main.gms index 77e381b79..be89b39b3 100755 --- a/main.gms +++ b/main.gms @@ -268,7 +268,7 @@ $setGlobal climate off !! def = off *'--------------------- 16_downscaleTemperature -------------------------- *' *' * (off) -*' * (CMIP5): downscale GMT to regional temperature based on CMIP5 data (between iterations, no runtime impact). [Requires climate = off, cm_rcp_scen = none, iterative_target_adj = 9] curved convergence of CO2 prices between regions until cm_CO2priceRegConvEndYr; developed countries have linear path through (cm_year_co2_tax_hist, cm_co2_tax_hist) and (cm_startyear, cm_co2_tax_startyear); +*' * (CMIP5): downscale GMT to regional temperature based on CMIP5 data (between iterations, no runtime impact). [Requires climate = off, cm_rcp_scen = none, iterative_target_adj = 9] curved convergence of CO2 prices between regions until cm_taxCO2_regiDiff_endYr; developed countries have linear path through (cm_taxCO2_historicalYr, cm_taxCO2_historical) and (cm_startyear, cm_taxCO2_startyear); $setGlobal downscaleTemperature off !! def = off *'--------------------- 20_growth ------------------------------------------ *' @@ -373,24 +373,24 @@ $setglobal emicapregi none !! def = none *' *' * (diffExp2Lin) and (diffLin2Lin): standard carbonprice realizations for ambitious climate policy scenarios [REMIND default for peak budget runs: diffLin2Lin in combination with iterative_target_adj = 9], *' * three main design choices: -*' * [diff]: level of regional carbonprice differentiation in 2030 determined by cm_co2_tax_spread (default = 10); quadratic phase-in to reach globally uniform carbonprices in cm_CO2priceRegConvEndYr +*' * [diff]: level of regional carbonprice differentiation in 2030 determined by cm_co2_tax_spread (default = 10); quadratic phase-in to reach globally uniform carbonprices in cm_taxCO2_regiDiff_endYr *' * [Exp or Lin]: functional form of carbonprice path for developed regions: -*' * [Exp]: exponential increase with rate given by cm_co2_tax_growth, (initial) value in cm_startyear is given by cm_co2_tax_startyear -*' * [Lin]: linear increase starting at historical level given by cm_co2_tax_hist in year cm_year_co2_tax_hist, (initial) value in cm_startyear set by cm_co2_tax_startyear +*' * [Exp]: exponential increase with rate given by cm_taxCO2_expGrowth, (initial) value in cm_startyear is given by cm_taxCO2_startyear +*' * [Lin]: linear increase starting at historical level given by cm_taxCO2_historical in year cm_taxCO2_historicalYr, (initial) value in cm_startyear set by cm_taxCO2_startyear *' * [2Lin]: post-peak behaviour depending on cm_iterative_target_adj -*' * [9]: after the (endogenously adjusted) peak year, carbonprice path increases linearly with fixed annual increase given by cm_taxCO2inc_after_peakBudgYr (default = 0, i.e. constant) +*' * [9]: after the (endogenously adjusted) peak year, carbonprice path increases linearly with fixed annual increase given by cm_taxCO2_IncAfterPeakBudgYr (default = 0, i.e. constant) *' * [5]: no adaptation of carbonprice path after peak year -*' * [0]: after the (exogenously fixed) peak year, carbonprice path increases linearly with fixed annual increase given by cm_taxCO2inc_after_peakBudgYr (default = 0, i.e. constant); +*' * [0]: after the (exogenously fixed) peak year, carbonprice path increases linearly with fixed annual increase given by cm_taxCO2_IncAfterPeakBudgYr (default = 0, i.e. constant); *' * choose cm_peakBudgYr = 2110 for no adaptation of carbonprice path until end of century *' * (expoLinear): 4.5% exponential increase until cm_expoLinear_yearStart, transitioning into linear increase thereafter *' * (exogenous): carbon price is specified using an external input file or using the switch cm_regiExoPrice. Requires cm_emiscen = 9 and cm_iterative_target_adj = 0 -*' * (temperatureNotToExceed): [test and verify before using it!] Find the optimal carbon carbon tax (set cm_emiscen = 1, iterative_target_adj = 9] curved convergence of CO2 prices between regions until cm_CO2priceRegConvEndYr; developed countries have linear path through (cm_year_co2_tax_hist, cm_co2_tax_hist) and (cm_startyear, cm_co2_tax_startyear); +*' * (temperatureNotToExceed): [test and verify before using it!] Find the optimal carbon carbon tax (set cm_emiscen = 1, iterative_target_adj = 9] curved convergence of CO2 prices between regions until cm_taxCO2_regiDiff_endYr; developed countries have linear path through (cm_taxCO2_historicalYr, cm_taxCO2_historical) and (cm_startyear, cm_taxCO2_startyear); *' * (NDC): implements a carbon price trajectory consistent with the NDC targets (up to 2030) and a trajectory of comparable ambition post 2030 (1.25%/yr price increase and regional convergence of carbon price). Choose version using cm_NDC_version "2023_cond", "2023_uncond", or replace 2023 by 2022, 2021 or 2018 to get all NDC published until end of these years. *' * (NPi): National Policies Implemented, extrapolation of historical (until 2020) carbon prices *' * (none): no tax policy (combined with all emiscens except emiscen = 9) -*** (exponential) is superseded by (diffExp2Lin): For a globally uniform, exponentially increasing carbonprice path until end of century [in combination with cm_iterative_target_adj = 0 or 5], set cm_co2_tax_spread = 1, set cm_peakBudgYr = 2110, and choose the initial carbonprice in cm_startyear via cm_co2_tax_startyear. -*** (linear) is superseded by (diffLin2Lin): For a globally uniform, linearly increasing carbonprice path until end of century [in combination with cm_iterative_target_adj = 0 or 5], set cm_co2_tax_spread = 1, set cm_peakBudgYr = 2110, and choose the initial carbonprice in cm_startyear via cm_co2_tax_startyear. [Adjust historical reference point (cm_year_co2_tax_hist, cm_co2_tax_hist) if needed.] +*** (exponential) is superseded by (diffExp2Lin): For a globally uniform, exponentially increasing carbonprice path until end of century [in combination with cm_iterative_target_adj = 0 or 5], set cm_co2_tax_spread = 1, set cm_peakBudgYr = 2110, and choose the initial carbonprice in cm_startyear via cm_taxCO2_startyear. +*** (linear) is superseded by (diffLin2Lin): For a globally uniform, linearly increasing carbonprice path until end of century [in combination with cm_iterative_target_adj = 0 or 5], set cm_co2_tax_spread = 1, set cm_peakBudgYr = 2110, and choose the initial carbonprice in cm_startyear via cm_taxCO2_startyear. [Adjust historical reference point (cm_taxCO2_historicalYr, cm_taxCO2_historical) if needed.] $setglobal carbonprice none !! def = none *'--------------------- 46_carbonpriceRegi --------------------------------- @@ -507,23 +507,24 @@ parameter *' * (1): BAU *' * (4): emission time path *' * (6): budget -*' * (9): tax scenario (requires running module 21_tax "on"), tax level controlled by module 45_carbonprice and cm_co2_tax_startyear, other GHG etc. controlled by cm_rcp_scen +*' * (9): tax scenario (requires running module 21_tax "on"), tax level controlled by module 45_carbonprice and cm_taxCO2_startyear, other GHG etc. controlled by cm_rcp_scen *' * (10): used for cost-benefit analysis *' *JeS* WARNING: data for cm_emiscen 4 only exists for multigas_scen 2 bau scenarios and for multigas_scen 1 *' parameter - cm_co2_tax_startyear "level of co2 tax in start year in $ per t CO2eq" + cm_taxCO2_startyear "level of co2 tax in start year in $ per t CO2eq" ; - cm_co2_tax_startyear = -1; !! def = -1 !! regexp = -1|is.nonnegative + cm_taxCO2_startyear = -1; !! def = -1 !! regexp = -1|is.nonnegative *' * (-1): default setting equivalent to no carbon tax -*' * (any number >= 0): co2 tax in start year [if cm_iterative_target_adj eq 0]; -*' * initialization of co2 tax in start year [if cm_iterative_target_adj ne 0] +*' * (any number >= 0): CO2 tax in start year [if cm_iterative_target_adj eq 0]; +*' * initialization of CO2 tax in start year [if cm_iterative_target_adj ne 0] *' parameter - cm_co2_tax_growth "growth rate of carbon tax" + cm_taxCO2_expGrowth "growth rate of carbon tax" ; - cm_co2_tax_growth = 1.045; !! def = 1.045 !! regexp = is.numeric + cm_taxCO2_expGrowth = 1.045; !! def = 1.045 !! regexp = is.numeric *' (any number >= 0): rate of exponential increase over time, default value chosen to be consistent with interest rate +*' parameter c_macscen "scenario switch on whether or not to use MAC (Marginal Abatement Cost) for certain sectors not related to direct combustion of fossil fuel, e.g. fugitive emissions from old mines, forestry, agriculture and cement" ; @@ -825,15 +826,13 @@ parameter parameter cm_iterative_target_adj "settings on iterative adjustment for CO2 tax based on in-iteration emission or forcing level. Allow iteratively generated endogenous global CO2 tax under peak budget constraint or end-of-century budget constraint." ; - cm_iterative_target_adj = 0; !! def = 0 !! regexp = 0|2|3|4|5|6|7|9 + cm_iterative_target_adj = 0; !! def = 0 !! regexp = 0|2|3|5|7|9 *' * (0): no iterative adjustment of CO2 tax (terminology: CO2 price and CO2 tax in REMIND is used interchangeably) *' * (2): iterative adjustment of CO2 tax or cumulative emission based on climate forcing calculated by climate model magicc, for runs with budget or CO2 tax constraints. See ./modules/45_carbonprice/NDC/postsolve.gms for direct algorithm *' * (3): [requires 45_carbonprice = NDC and emiscen = 9] iterative adjustment of CO2 tax based on 2025 or 2030 regionally differentiated emissions, for runs with emission budget or CO2 tax constraints. See ./modules/45_carbonprice/NDC/postsolve.gms for direct algorithm -*' * (4): iterative adjustment of CO2 tax based on CO2 FF&I cumulative emission budget (i.e. without landuse emissions) (2020-2100), for runs with emission budget or CO2 tax constraints. See core/postsolve.gms for direct algorithms for runs with budget or CO2 tax constraints -*' * (5): iterative adjustment of CO2 tax based on economy-wide CO2 cumulative emission budget(2020-2100), for runs with emission budget or CO2 tax constraints. See core/postsolve.gms for direct algorithms -*' * (6): iterative adjustment of CO2 tax based on economy-wide CO2 cumulative emission peak budget, for runs with emission budget or CO2 tax constraints. See core/postsolve.gms for direct algorithms -*' * (7): iterative adjustment of CO2 tax based on economy-wide CO2 cumulative emission peak budget, for runs with emission budget or CO2 tax constraints. Features: results in a peak budget with zero net CO2 emissions after peak budget is reached. See core/postsolve.gms for direct algorithms -*' * (9): [require the right settings in 45_carbonprice] iterative adjustment of CO2 tax based on economy-wide CO2 cumulative emission peak budget, for runs with emission budget or CO2 tax constraints. Features: 1) after the year when budget peaks, CO2 tax has an annual increase by cm_taxCO2inc_after_peakBudgYr, 2) automatically shifts cm_peakBudgYr to find the correct year of budget peaking for a given budget. For REMIND version v2.1 or above. +*' * (5): [requires 45_carbonprice = functionalForm and emiscen = 9 - TBC] iterative adjustment of CO2 tax based on economy-wide CO2 cumulative emission budget(2020-2100), for runs with emission budget or CO2 tax constraints. [see 45_carbonprice/functionalForm/postsolve.gms for direct algorithm] +*' * (7): [requires 45_carbonprice = functionalForm and emiscen = 9 - TBC] iterative adjustment of CO2 tax based on economy-wide CO2 cumulative emission peak budget, for runs with emission budget or CO2 tax constraints. Features: results in a peak budget with zero net CO2 emissions after peak budget is reached. See core/postsolve.gms for direct algorithms [see 45_carbonprice/functionalForm/postsolve.gms for direct algorithm] +*' * (9): [requires 45_carbonprice = functionalForm and emiscen = 9 - TBC] iterative adjustment of CO2 tax based on economy-wide CO2 cumulative emission peak budget, for runs with emission budget or CO2 tax constraints. Features: 1) after the year when budget peaks, CO2 tax has an annual increase by cm_taxCO2_IncAfterPeakBudgYr, 2) automatically shifts cm_peakBudgYr to find the correct year of budget peaking for a given budget. [see 45_carbonprice/functionalForm/postsolve.gms for direct algorithm] *' parameter cm_NDC_divergentScenario "choose scenario about convergence of CO2eq prices [45_carbonprice = NDC]" @@ -1023,26 +1022,12 @@ parameter ; cm_peakBudgYr = 2050; !! def = 2050 *' time of net-zero CO2 emissions (peak budget) -*' endogenous adjustment by algorithms in core/postsolve.gms requires (emiscen = 9) and (cm_iterative_target_adj = 7 or 9) -parameter - cm_taxCO2inc_after_peakBudgYr "annual increase of CO2 tax after the Peak Budget Year in $ per tCO2" -; - cm_taxCO2inc_after_peakBudgYr = 0; !! def = 0 . For weak targets (higher than 1100 Peak Budget), this value might need to increased to prevent continually increasing temperatures -*' +*' endogenous adjustment by algorithms in 45_carbonprice/functionalForm/postsolve.gms [requires emiscen = 9 and cm_iterative_target_adj = 7 or 9] parameter - cm_CO2priceRegConvEndYr "Year at which regional CO2 taxes converge in module 45 for realizations with differentiated carbon prices" + cm_taxCO2_IncAfterPeakBudgYr "annual increase of CO2 tax after cm_peakBudgYr in $ per tCO2" ; - cm_CO2priceRegConvEndYr = 2050; !! def = 2050 + cm_taxCO2_IncAfterPeakBudgYr = 0; !! def = 0 . For weak targets (higher than 1100 Peak Budget), this value might need to increased to prevent continually increasing temperatures *' -parameter - cm_co2_tax_spread "spread of carbon prices in 2030 given as a factor" -; - cm_co2_tax_spread = 10; !! def = 10 !! regexp = 1|10|20 -*' Initial spread of carbon prices (in 2030) between the regions with highest respectively lowest GDP per capita (PPP) -*' * (1 - uniform) Uniform carbon pricing, i.e. no differentiation -*' * (10 - medium) Spread of carbon prices in 2025 is equal to 10 -*' * (20 - strong) Spread of carbon prices in 2025 is equal to 20 - parameter c_teNoLearngConvEndYr "Year at which regional costs of non-learning technologies converge" ; @@ -1688,14 +1673,40 @@ $setGlobal cm_CESMkup_ind_data "" !! def = "" $setGlobal cm_fxIndUe off !! def = off !! regexp = off|on $setGlobal cm_fxIndUeReg "" !! def = "" -*' * cm_co2_tax_hist "switch for setting historical level of CO2 tax (in $ per t CO2eq) that is used as starting point in diffLin2Lin of 45_carbonprice" -*' * (gdx_ref): level of CO2 tax (defined as maximum of pm_taxCO2eq over all regions) from path_gdx_ref in cm_year_co2_tax_hist -*' * (any number >= 0): level of co2 tax in cm_co2_tax_hist_year -$setglobal cm_co2_tax_hist gdx_ref !! def = "gdx_ref" !! regexp = gdx_ref|is.nonnegative -*' * cm_year_co2_tax_hist "switch for setting the year of cm_co2_tax_hist" -*' * (last): last time period before start year (e.g. 2025 if start year is 2030) -*' * (any number >= 2005 and < cm_startyear): year for which historical level of CO2 tax (cm_co2_tax_hist) is provided (e.g. 2024) -$setglobal cm_year_co2_tax_hist last !! def = "last" !! regexp = last|is.nonnegative +*** cm_taxCO2_functionalForm "switch for choosing the functional form of the global anchor trajectory in 45_carbonprice/functionalForm" +*** (linear): The linear curve is determined by the two points (cm_taxCO2_historicalYr, cm_taxCO2_historical) and (cm_startyear, cm_taxCO2_startyear). +*** (exponential): The exponential curve is determined by the point (cm_startyear, cm_taxCO2_startyear) and the exponential growth rate (cm_taxCO2_expGrowth). +$setglobal cm_taxCO2_functionalForm linear !! def = "linear" !! regexp = linear|exponential +*** cm_taxCO2_historical "switch for setting historical level of CO2 tax (in $ per t CO2eq) that is used if functional form is linear" +*** (gdx_ref): level of CO2 tax (defined as maximum of pm_taxCO2eq over all regions) from path_gdx_ref in cm_taxCO2_historicalYr +*** (any number >= 0): level of co2 tax in cm_taxCO2_historicalYr +$setglobal cm_taxCO2_historical gdx_ref !! def = "gdx_ref" !! regexp = gdx_ref|is.nonnegative +*** cm_taxCO2_historicalYr "switch for setting the year of cm_taxCO2_historical" +*** (last): last time period before start year (e.g. 2025 if start year is 2030) +*** (any number >= 2005 and < cm_startyear): year for which historical level of CO2 tax (cm_taxCO2_historical) is provided (e.g. 2024) +$setglobal cm_taxCO2_historicalYr last !! def = "last" !! regexp = last|is.nonnegative +*** cm_taxCO2_regiDiff "switch for choosing the regional carbon price differentiation scheme in 45_carbonprice/functionalForm" +*** (none): No regional differetiation, i.e. uniform carbon pricing +*** (initialSpread10): Maximal initial spread of carbon prices in 2030 between OECD regions and poorest region is equal to 10. Initial spread for each region determined based on GDP per capita (PPP) in 2015. Carbon prices converge using quadratic phase-in until cm_taxCO2_regiDiff_endYr (default = 2050). +*** (initialSpread20): Maximal initial spread of carbon prices in 2030 between OECD regions and poorest region is equal to 20. Initial spread for each region determined based on GDP per capita (PPP) in 2015. Carbon prices converge using quadratic phase-in until cm_taxCO2_regiDiff_endYr (default = 2050). +*** (gdpSpread): Regional differentiation based on GDP per capita (PPP) throughout the century. Uses current GDP per capita (PPP) of OECD countries - around 50'000 US$2017 - as threshold for application of full carbon price. +$setglobal cm_taxCO2_regiDiff initialSpread10 !! def = "initialSpread10" !! regexp = none|initialSpread10|initialSpread20|gdpSpread +*** cm_taxCO2_regiDiff_endYr "switch for choosing convergence year of regionally differentiated carbon prices when using initialSpread10 or initialSpread20 in 45_carbonprice/functionalForm" +*** Setting cm_taxCO2_regiDiff_endYr to GLO 2050, IND 2070, SSA 2100 means that convergence year is delayed for IND to 2070 and for SSA to 2100 +$setglobal cm_taxCO2_regiDiff_endYr "GLO 2050" !! def = "GLO 2050" +*** cm_co2_tax_interpolation "switch for interpolation between (a) carbonprice trajectory given by path_gdx_ref and (b) carbonprice trajectory defined in 45_carbonprice" +*** (off): no interpolation, i.e. (b) is used from cm_startyear onward +*** (one_step): linear interpolation within 10 years between (a) and (b). For example, if cm_startyear = 2030, it uses (a) until 2025, the average of (a) and (b) in 2030, and (b) from 2035. +*** (two_steps): linear interpolation within 15 years between (a) and (b). For example, if cm_startyear = 2030, it uses (a) until 2025, weighted averages of (a) and (b) in 2030 and 2035, and (b) from 2040. +*** Setting cm_co2_tax_interpolation to GLO.2025.2050 2, EUR.2025.2040 1 means that interpolation between (a) and (b) in quadratic [exponent = 2], starts in 2025, and ends in 2050 for all regions, except for Europe that has linear interpolation [exponent = 1] starting in 2025 and ending in 2040 +$setglobal cm_taxCO2_interpolation one_step !! def = "one_step" +*** cm_taxCO2_lowerBound_path_gdx_ref "switch for choosing if carbon price trajectories from path_gdx_ref are used as lower bound" +*** (off): no interpolation, i.e. (b) is used from cm_startyear onward +*** (one_step): linear interpolation within 10 years between (a) and (b). For example, if cm_startyear = 2030, it uses (a) until 2025, the average of (a) and (b) in 2030, and (b) from 2035. +*** (two_steps): linear interpolation within 15 years between (a) and (b). For example, if cm_startyear = 2030, it uses (a) until 2025, weighted averages of (a) and (b) in 2030 and 2035, and (b) from 2040. +*** Setting cm_co2_tax_interpolation to GLO.2025.2050 2, EUR.2025.2040 1 means that interpolation between (a) and (b) in quadratic [exponent = 2], starts in 2025, and ends in 2050 for all regions, except for Europe that has linear interpolation [exponent = 1] starting in 2025 and ending in 2040 +$setglobal cm_taxCO2_lowerBound_path_gdx_ref on !! def = "on" !! regexp = on|off + *** cm_ind_energy_limit Switch for setting upper limits on industry energy *** efficiency improvements. See ./modules/37_subsectors/datainput.gms for diff --git a/modules/45_carbonprice/diffExp2Lin/datainput.gms b/modules/45_carbonprice/diffExp2Lin/datainput.gms deleted file mode 100644 index 1405c4445..000000000 --- a/modules/45_carbonprice/diffExp2Lin/datainput.gms +++ /dev/null @@ -1,98 +0,0 @@ -*** | (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/diffExp2Lin/datainput.gms -***-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -*** diff: regional prices are initially differentiated by GDP/capita and converge using quadratic phase-in until cm_CO2priceRegConvEndYr (default = 2050), globally uniform price thereafter, -*** level of regional carbon price differentiation (uniform, medium, strong) can be chosen via cm_co2_tax_spread -*** Exp: carbon price of developed regions increases exponentially with rate given by cm_co2_tax_growth (default = 4.5 percent), -*** initial value in cm_startyear is given by cm_co2_tax_startyear (if iterative_target_adj != 0, this value will be adjusted to meet prescribed CO2 budget) -*** 2Lin: (with iterative_target_adj = 9): after the peak year (initial value given by cm_peakBudgYr, will be adjusted by algorithm in core/postsolve.gms), -*** carbon price of developed countries increases linearly with fixed annual increase given by cm_taxCO2inc_after_peakBudgYr (default = 0, i.e. constant) -*** (with iterative_target_adj = 5): carbon price of developed countries keeps increasing exponentially until end of century, i.e. no change after peak year -*** (with iterative_target_adj = 0): after year given by cm_peakBudgYr (default = 2050), carbon price of developed countries increases linearly with fixed annual increase given by cm_taxCO2inc_after_peakBudgYr (default = 0, i.e. constant), -*** for exponentially increasing carbon price until end of century, set cm_peakBudgYr = 2110 -***-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - - -*** Step 1: Define regional multiplicative factors between regional CO2 price and CO2 price of the developed countries -*** Warning regarding code changes: This first step also appears in diffLin2Lin and should be changed simultaneously. - -*** Step 1.1: Define initial regional multiplicative CO2 price factors - -*** based on GDP per capita (in 1e3 $ PPP 2005) in 2015 (benchmark year kept at 2015 since 2020 not suitable) -p45_gdppcap2015_PPP(regi) = pm_gdp("2015",regi)/pm_shPPPMER(regi) / pm_pop("2015",regi); - -*** Selection of differentiation scheme via cm_co2_tax_spread -if(cm_co2_tax_spread eq 1, -p45_phasein_ratio(regi) = 1; !! all regions -); - -if(cm_co2_tax_spread eq 10, -p45_phasein_ratio(regi)$(p45_gdppcap2015_PPP(regi) le 3.5) = 0.1; !! SSA -p45_phasein_ratio(regi)$(p45_gdppcap2015_PPP(regi) gt 3.5 and p45_gdppcap2015_PPP(regi) le 5) = 0.2; !! IND -p45_phasein_ratio(regi)$(p45_gdppcap2015_PPP(regi) gt 5 and p45_gdppcap2015_PPP(regi) le 10) = 0.3; !! OAS -p45_phasein_ratio(regi)$(p45_gdppcap2015_PPP(regi) gt 10 and p45_gdppcap2015_PPP(regi) le 15) = 0.5; !! CHA, LAM, MEA -p45_phasein_ratio(regi)$(p45_gdppcap2015_PPP(regi) gt 15 and p45_gdppcap2015_PPP(regi) le 20) = 0.7; !! REF -p45_phasein_ratio(regi)$(p45_gdppcap2015_PPP(regi) gt 20) = 1; !! EUR, JPN, USA, CAZ, NEU -); - -if(cm_co2_tax_spread eq 20, -p45_phasein_ratio(regi)$(p45_gdppcap2015_PPP(regi) le 3.5) = 0.05; !! SSA -p45_phasein_ratio(regi)$(p45_gdppcap2015_PPP(regi) gt 3.5 and p45_gdppcap2015_PPP(regi) le 5) = 0.1; !! IND -p45_phasein_ratio(regi)$(p45_gdppcap2015_PPP(regi) gt 5 and p45_gdppcap2015_PPP(regi) le 10) = 0.2; !! OAS -p45_phasein_ratio(regi)$(p45_gdppcap2015_PPP(regi) gt 10 and p45_gdppcap2015_PPP(regi) le 15) = 0.4; !! CHA, LAM, MEA -p45_phasein_ratio(regi)$(p45_gdppcap2015_PPP(regi) gt 15 and p45_gdppcap2015_PPP(regi) le 20) = 0.6; !! REF -p45_phasein_ratio(regi)$(p45_gdppcap2015_PPP(regi) gt 20) = 1; !! EUR, JPN, USA, CAZ, NEU -); - -*** Step 1.2: Create regional multiplicative CO2 price factors for quadratic convergence between s45_CO2priceRegConvStartYr and cm_CO2priceRegConvEndYr - -*** Set year until which initial ratios of CO2 prices are applied and after which convergence starts to 2030 -s45_CO2priceRegConvStartYr = 2030; -*** Set regional CO2 price factor equal to p45_phasein_ratio until s45_CO2priceRegConvStartYr: -p45_regCO2priceFactor(t,regi)$(t.val le s45_CO2priceRegConvStartYr) = p45_phasein_ratio(regi); -*** Create quadratic phase-in between s45_CO2priceRegConvStartYr and cm_CO2priceRegConvEndYr: -loop(t$((t.val gt s45_CO2priceRegConvStartYr) and (t.val le cm_CO2priceRegConvEndYr)), - p45_regCO2priceFactor(t,regi) = - min(1, - max(0, - p45_phasein_ratio(regi) + (1 - p45_phasein_ratio(regi)) * Power( (t.val - s45_CO2priceRegConvStartYr) / (cm_CO2priceRegConvEndYr - s45_CO2priceRegConvStartYr), 2) - ) - ); -); -*** Set regional CO2 price factor equal to 1 after cm_CO2priceRegConvEndYr: -p45_regCO2priceFactor(t,regi)$(t.val gt cm_CO2priceRegConvEndYr) = 1; - -display p45_gdppcap2015_PPP, p45_phasein_ratio, p45_regCO2priceFactor; - -*** Step 2: Create CO2 price trajectory for developed countries - -if(cm_co2_tax_startyear gt 0, -*** convert tax value in start year from $/t CO2eq to T$/GtC - s45_co2_tax_startyear = cm_co2_tax_startyear * sm_DptCO2_2_TDpGtC; -else - abort "please initialize cm_co2_tax_startyear by setting it to a positive value" -); - -*** price increases exponentially with growth rate cm_co2_tax_growth from s45_co2_tax_startyear in startyear -p45_CO2priceTrajDeveloped(t) = s45_co2_tax_startyear * cm_co2_tax_growth**(t.val-cm_startyear); -*** for peak budget runs (if cm_iterative_target_adj = 6|7|9), the adjustment of the CO2 price trajectory after the peak year is made in core/postsolve.gms -*** for runs without iterative carbon price adjustment (if cm_iterative_target_adj = 0), price increases linearly after year given by cm_peakBudgYr (for exponentially increasing carbon price until end of century, set cm_peakBudgYr = 2110) -if((cm_iterative_target_adj eq 0), - p45_CO2priceTrajDeveloped(t)$(t.val gt cm_peakBudgYr) - = sum(t2$(t2.val eq cm_peakBudgYr), p45_CO2priceTrajDeveloped(t2)) - + (t.val - cm_peakBudgYr) * cm_taxCO2inc_after_peakBudgYr * sm_DptCO2_2_TDpGtC; !! increase by cm_taxCO2inc_after_peakBudgYr per year -); -*** set taxes constant after 2110 to prevent huge taxes after 2110 and the resulting convergence problems, -p45_CO2priceTrajDeveloped(t)$(t.val gt 2110) = p45_CO2priceTrajDeveloped("2110"); -display p45_CO2priceTrajDeveloped; - -*** Step 3: Create regional CO2 price trajectories using 1) regional multiplicative CO2 price factors and 2) CO2 price trajectory for developed countries -pm_taxCO2eq(t,regi) = p45_regCO2priceFactor(t,regi) * p45_CO2priceTrajDeveloped(t); -display pm_taxCO2eq; - -*** EOF ./modules/45_carbonprice/diffExp2Lin/datainput.gms diff --git a/modules/45_carbonprice/diffExp2Lin/declarations.gms b/modules/45_carbonprice/diffExp2Lin/declarations.gms deleted file mode 100644 index 14caa13ea..000000000 --- a/modules/45_carbonprice/diffExp2Lin/declarations.gms +++ /dev/null @@ -1,32 +0,0 @@ -*** | (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/diffExp2Lin/declarations.gms -***-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -*** diff: regional prices are initially differentiated by GDP/capita and converge using quadratic phase-in until cm_CO2priceRegConvEndYr (default = 2050), globally uniform price thereafter, -*** level of regional carbon price differentiation (uniform, medium, strong) can be chosen via cm_co2_tax_spread -*** Exp: carbon price of developed regions increases exponentially with rate given by cm_co2_tax_growth (default = 4.5 percent), -*** initial value in cm_startyear is given by cm_co2_tax_startyear (if iterative_target_adj != 0, this value will be adjusted to meet prescribed CO2 budget) -*** 2Lin: (with iterative_target_adj = 9): after the peak year (initial value given by cm_peakBudgYr, will be adjusted by algorithm in core/postsolve.gms), -*** carbon price of developed countries increases linearly with fixed annual increase given by cm_taxCO2inc_after_peakBudgYr (default = 0, i.e. constant) -*** (with iterative_target_adj = 5): carbon price of developed countries keeps increasing exponentially until end of century, i.e. no change after peak year -*** (with iterative_target_adj = 0): after year given by cm_peakBudgYr (default = 2050), carbon price of developed countries increases linearly with fixed annual increase given by cm_taxCO2inc_after_peakBudgYr (default = 0, i.e. constant), -*** for exponentially increasing carbon price until end of century, set cm_peakBudgYr = 2110 -***-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -parameters -p45_gdppcap2015_PPP(all_regi) "2015 GDP per capita (k $ PPP 2005)" -p45_phasein_ratio(all_regi) "inital ratio of CO2 price to that of developed region" - -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" -; - -scalars -s45_co2_tax_startyear "level of CO2 tax in start year converted from $/t CO2eq to T$/GtC" -s45_CO2priceRegConvStartYr "year until which initial ratios of CO2 prices are applied and after which convergence starts" -; - -*** EOF ./modules/45_carbonprice/diffExp2Lin/declarations.gms diff --git a/modules/45_carbonprice/diffExp2Lin/not_used.txt b/modules/45_carbonprice/diffExp2Lin/not_used.txt deleted file mode 100644 index d347aa06e..000000000 --- a/modules/45_carbonprice/diffExp2Lin/not_used.txt +++ /dev/null @@ -1,25 +0,0 @@ -# | (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 -cm_emiscen, switch, ??? -sm_c_2_co2,switch, ??? -pm_ttot_val,parameter,??? -cm_expoLinear_yearStart,switch,??? -vm_co2eq,variable,??? -vm_emiFgas,input,questionnaire -pm_globalMeanTemperature,input,questionnaire -pm_temperatureImpulseResponseCO2,input,questionnaire -pm_consPC,input,questionnaire -pm_GDPGross,input,questionnaire -pm_prtp,input,questionnaire -cm_carbonprice_temperatureLimit,input,questionnaire -pm_ttot_2_tall,input,questionnaire -cm_NDC_divergentScenario,input,questionnaire -vm_demFeSector,input,questionnaire -pm_emifac,input,questionnaire -sm_D2005_2_D2017,input,not needed -fm_taxCO2eqHist,input,not needed diff --git a/modules/45_carbonprice/diffExp2Lin/postsolve.gms b/modules/45_carbonprice/diffExp2Lin/postsolve.gms deleted file mode 100644 index 934ecdb15..000000000 --- a/modules/45_carbonprice/diffExp2Lin/postsolve.gms +++ /dev/null @@ -1,33 +0,0 @@ -*** | (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/diffExp2Lin/postsolve.gms -***-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -*** diff: regional prices are initially differentiated by GDP/capita and converge using quadratic phase-in until cm_CO2priceRegConvEndYr (default = 2050), globally uniform price thereafter, -*** level of regional carbon price differentiation (uniform, medium, strong) can be chosen via cm_co2_tax_spread -*** Exp: carbon price of developed regions increases exponentially with rate given by cm_co2_tax_growth (default = 4.5 percent), -*** initial value in cm_startyear is given by cm_co2_tax_startyear (if iterative_target_adj != 0, this value will be adjusted to meet prescribed CO2 budget) -*** 2Lin: (with iterative_target_adj = 9): after the peak year (initial value given by cm_peakBudgYr, will be adjusted by algorithm in core/postsolve.gms), -*** carbon price of developed countries increases linearly with fixed annual increase given by cm_taxCO2inc_after_peakBudgYr (default = 0, i.e. constant) -*** (with iterative_target_adj = 5): carbon price of developed countries keeps increasing exponentially until end of century, i.e. no change after peak year -*** (with iterative_target_adj = 0): after year given by cm_peakBudgYr (default = 2050), carbon price of developed countries increases linearly with fixed annual increase given by cm_taxCO2inc_after_peakBudgYr (default = 0, i.e. constant), -*** for exponentially increasing carbon price until end of century, set cm_peakBudgYr = 2110 -***-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - -*** if CO2 price is iteratively adjusted (i.e. cm_iterative_target_adj != 0), -if((cm_iterative_target_adj ne 0), -*** re-create the regional differentation using 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 20), - p45_CO2priceTrajDeveloped(t) = pm_taxCO2eq(t,regi); - ); - -*** quadratic transition to global price - starting point depends on GDP/cap -pm_taxCO2eq(t,regi) = p45_regCO2priceFactor(t,regi) * p45_CO2priceTrajDeveloped(t); - -display pm_taxCO2eq; -); -*** EOF ./modules/45_carbonprice/diffExp2Lin/postsolve.gms diff --git a/modules/45_carbonprice/diffExp2Lin/realization.gms b/modules/45_carbonprice/diffExp2Lin/realization.gms deleted file mode 100644 index 877ddbc4c..000000000 --- a/modules/45_carbonprice/diffExp2Lin/realization.gms +++ /dev/null @@ -1,28 +0,0 @@ -*** | (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/diffExp2Lin/realization.gms - -*' @description: This realization implements exponentially increasing carbon price - either until end of century or until peak year (constant or linear thereafter). Optional carbon price differentiation and quadratic phase-in can be activated via switch cm_co2_tax_spread. - -***-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -*** diff: regional prices are initially differentiated by GDP/capita and converge using quadratic phase-in until cm_CO2priceRegConvEndYr (default = 2050), globally uniform price thereafter, -*** level of regional carbon price differentiation (uniform, medium, strong) can be chosen via cm_co2_tax_spread -*** Exp: carbon price of developed regions increases exponentially with rate given by cm_co2_tax_growth (default = 4.5 percent), -*** initial value in cm_startyear is given by cm_co2_tax_startyear (if iterative_target_adj != 0, this value will be adjusted to meet prescribed CO2 budget) -*** 2Lin: (with iterative_target_adj = 9): after the peak year (initial value given by cm_peakBudgYr, will be adjusted by algorithm in core/postsolve.gms), -*** carbon price of developed countries increases linearly with fixed annual increase given by cm_taxCO2inc_after_peakBudgYr (default = 0, i.e. constant) -*** (with iterative_target_adj = 5): carbon price of developed countries keeps increasing exponentially until end of century, i.e. no change after peak year -*** (with iterative_target_adj = 0): after year given by cm_peakBudgYr (default = 2050), carbon price of developed countries increases linearly with fixed annual increase given by cm_taxCO2inc_after_peakBudgYr (default = 0, i.e. constant), -*** for exponentially increasing carbon price until end of century, set cm_peakBudgYr = 2110 -***-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - -*####################### R SECTION START (PHASES) ############################## -$Ifi "%phase%" == "declarations" $include "./modules/45_carbonprice/diffExp2Lin/declarations.gms" -$Ifi "%phase%" == "datainput" $include "./modules/45_carbonprice/diffExp2Lin/datainput.gms" -$Ifi "%phase%" == "postsolve" $include "./modules/45_carbonprice/diffExp2Lin/postsolve.gms" -*######################## R SECTION END (PHASES) ############################### -*** EOF ./modules/45_carbonprice/diffExp2Lin/realization.gms diff --git a/modules/45_carbonprice/diffLin2Lin/datainput.gms b/modules/45_carbonprice/diffLin2Lin/datainput.gms deleted file mode 100644 index a2d7cb26b..000000000 --- a/modules/45_carbonprice/diffLin2Lin/datainput.gms +++ /dev/null @@ -1,139 +0,0 @@ -*** | (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/diffLin2Lin/datainput.gms -***-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -*** diff: regional prices are initially differentiated by GDP/capita and converge using quadratic phase-in until cm_CO2priceRegConvEndYr (default = 2050), globally uniform price thereafter, -*** level of regional carbon price differentiation (uniform, medium, strong) can be chosen via cm_co2_tax_spread -*** Lin: carbon price of developed regions increases linearly starting at historical level given by cm_co2_tax_hist in year cm_year_co2_tax_hist -*** initial value in cm_startyear is given by cm_co2_tax_startyear (if iterative_target_adj != 0, this value will be adjusted to meet prescribed CO2 budget) -*** 2Lin: (with iterative_target_adj = 9): after the peak year (initial value given by cm_peakBudgYr, will be adjusted by algorithm in core/postsolve.gms), -*** carbon price of developed countries increases linearly with fixed annual increase given by cm_taxCO2inc_after_peakBudgYr (default = 0, i.e. constant) -*** (with iterative_target_adj = 5): carbon price of developed countries keeps increasing linearly (with same slope) until end of century, i.e. no change after peak year -*** (with iterative_target_adj = 0): after year given by cm_peakBudgYr (default = 2050), carbon price of developed countries increases linearly with fixed annual increase given by cm_taxCO2inc_after_peakBudgYr (default = 0, i.e. constant), -*** for linearly increasing carbon price (with same slope) until end of century, set cm_peakBudgYr = 2110 -***-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - -*** Step 1: Define regional multiplicative factors between regional CO2 price and CO2 price of the developed countries -*** Warning regarding code changes: This first step also appears in diffLin2Lin and should be changed simultaneously. - -*** Step 1.1: Define initial regional multiplicative CO2 price factors - -*** based on GDP per capita (in 1e3 $ PPP 2005) in 2015 (benchmark year kept at 2015 since 2020 not suitable) -p45_gdppcap2015_PPP(regi) = pm_gdp("2015",regi)/pm_shPPPMER(regi) / pm_pop("2015",regi); - -*** Selection of differentiation scheme via cm_co2_tax_spread -if(cm_co2_tax_spread eq 1, -p45_phasein_ratio(regi) = 1; !! all regions -); - -if(cm_co2_tax_spread eq 10, -p45_phasein_ratio(regi)$(p45_gdppcap2015_PPP(regi) le 3.5) = 0.1; !! SSA -p45_phasein_ratio(regi)$(p45_gdppcap2015_PPP(regi) gt 3.5 and p45_gdppcap2015_PPP(regi) le 5) = 0.2; !! IND -p45_phasein_ratio(regi)$(p45_gdppcap2015_PPP(regi) gt 5 and p45_gdppcap2015_PPP(regi) le 10) = 0.3; !! OAS -p45_phasein_ratio(regi)$(p45_gdppcap2015_PPP(regi) gt 10 and p45_gdppcap2015_PPP(regi) le 15) = 0.5; !! CHA, LAM, MEA -p45_phasein_ratio(regi)$(p45_gdppcap2015_PPP(regi) gt 15 and p45_gdppcap2015_PPP(regi) le 20) = 0.7; !! REF -p45_phasein_ratio(regi)$(p45_gdppcap2015_PPP(regi) gt 20) = 1; !! EUR, JPN, USA, CAZ, NEU -); - -if(cm_co2_tax_spread eq 20, -p45_phasein_ratio(regi)$(p45_gdppcap2015_PPP(regi) le 3.5) = 0.05; !! SSA -p45_phasein_ratio(regi)$(p45_gdppcap2015_PPP(regi) gt 3.5 and p45_gdppcap2015_PPP(regi) le 5) = 0.1; !! IND -p45_phasein_ratio(regi)$(p45_gdppcap2015_PPP(regi) gt 5 and p45_gdppcap2015_PPP(regi) le 10) = 0.2; !! OAS -p45_phasein_ratio(regi)$(p45_gdppcap2015_PPP(regi) gt 10 and p45_gdppcap2015_PPP(regi) le 15) = 0.4; !! CHA, LAM, MEA -p45_phasein_ratio(regi)$(p45_gdppcap2015_PPP(regi) gt 15 and p45_gdppcap2015_PPP(regi) le 20) = 0.6; !! REF -p45_phasein_ratio(regi)$(p45_gdppcap2015_PPP(regi) gt 20) = 1; !! EUR, JPN, USA, CAZ, NEU -); - -*** Step 1.2: Create regional multiplicative CO2 price factors for quadratic convergence between s45_CO2priceRegConvStartYr and cm_CO2priceRegConvEndYr - -*** Set year until which initial ratios of CO2 prices are applied and after which convergence starts to 2030 -s45_CO2priceRegConvStartYr = 2030; -*** Set regional CO2 price factor equal to p45_phasein_ratio until s45_CO2priceRegConvStartYr: -p45_regCO2priceFactor(t,regi)$(t.val le s45_CO2priceRegConvStartYr) = p45_phasein_ratio(regi); -*** Create quadratic phase-in between s45_CO2priceRegConvStartYr and cm_CO2priceRegConvEndYr: -loop(t$((t.val gt s45_CO2priceRegConvStartYr) and (t.val le cm_CO2priceRegConvEndYr)), - p45_regCO2priceFactor(t,regi) = - min(1, - max(0, - p45_phasein_ratio(regi) + (1 - p45_phasein_ratio(regi)) * Power( (t.val - s45_CO2priceRegConvStartYr) / (cm_CO2priceRegConvEndYr - s45_CO2priceRegConvStartYr), 2) - ) - ); -); -*** Set regional CO2 price factor equal to 1 after cm_CO2priceRegConvEndYr: -p45_regCO2priceFactor(t,regi)$(t.val gt cm_CO2priceRegConvEndYr) = 1; - -display p45_gdppcap2015_PPP, p45_phasein_ratio, p45_regCO2priceFactor; - - -*** Step 2: Define CO2 price trajectory for developed countries - -*** Step 2.1: Determine starting point for linear CO2 price trajectory: (s45_year_co2_tax_hist,s45_co2_tax_hist) -*** Set s45_year_co2_tax_hist based on the switch cm_year_co2_tax_hist -$ifthen "%cm_year_co2_tax_hist%" == "last" -*** Choose s45_year_co2_tax_hist to be the last time period before start year -s45_year_co2_tax_hist = smax(ttot$( ttot.val lt cm_startyear ), ttot.val); -$else -*** Set s45_year_co2_tax_hist to be the value provided by the switch -s45_year_co2_tax_hist = %cm_year_co2_tax_hist%; -$endif -*** Check validity of s45_year_co2_tax_hist -if((s45_year_co2_tax_hist lt 2005) or (s45_year_co2_tax_hist ge cm_startyear), - abort "please choose cm_year_co2_tax_hist to be at least 2005 and strictly smaller than cm_startyear" -); -display s45_year_co2_tax_hist; - -*** Set s45_co2_tax_hist based on the switch cm_co2_tax_hist -$ifthen "%cm_co2_tax_hist%" == "gdx_ref" -*** Check that s45_year_co2_tax_hist is an element of ttot -if(sum(ttot$(ttot.val eq s45_year_co2_tax_hist),1)=0, - abort "please choose cm_year_co2_tax_hist to be last or an element of ttot" -); -*** Read pm_taxCO2eq from path_gdx_ref -Execute_Loadpoint 'input_ref' p45_tau_CO2_tax_gdx_ref = pm_taxCO2eq; -*** Extract level of co2 tax in cm_year_co2_tax_hist (defined as maximum of pm_taxCO2eq over all regions) -s45_co2_tax_hist = smax( regi , sum ( ttot$(ttot.val eq s45_year_co2_tax_hist) , p45_tau_CO2_tax_gdx_ref(ttot,regi) ) ); -$else -*** Set s45_co2_tax_hist to be the value provided by the switch, converted from $/t CO2eq to T$/GtC -s45_co2_tax_hist = %cm_co2_tax_hist% * sm_DptCO2_2_TDpGtC; -$endif -display s45_co2_tax_hist; - -*** Step 2.2: Create CO2 price trajectory for developed countries - -if(cm_co2_tax_startyear gt 0, -*** convert tax value in start year from $/t CO2eq to T$/GtC - s45_co2_tax_startyear = cm_co2_tax_startyear * sm_DptCO2_2_TDpGtC; -else - abort "please initialize cm_co2_tax_startyear by setting it to a positive value" -); -*** make sure that the initial CO2 price trajectory is increasing -if(s45_co2_tax_startyear lt s45_co2_tax_hist, - abort "please choose a value for cm_co2_tax_startyear that is larger than the value provided by cm_co2_tax_hist" -); -display s45_co2_tax_startyear; - -*** price increases linearly from s45_co2_tax_hist in s45_year_co2_tax_hist until peak budget year (if cm_iterative_target_adj = 6|7|9) or until end of century (otherwise) -*** define linear curve through the points (s45_year_co2_tax_hist, s45_co2_tax_hist) and (cm_startyear, s45_co2_tax_startyear) -p45_CO2priceTrajDeveloped(t) = s45_co2_tax_hist - + (s45_co2_tax_startyear - s45_co2_tax_hist) / (cm_startyear - s45_year_co2_tax_hist) !! Yearly increase of CO2 price - * (t.val - s45_year_co2_tax_hist) ; -*** for peak budget runs (if cm_iterative_target_adj = 6|7|9), the adjustment of the CO2 price trajectory after the peak year is made in core/postsolve.gms -*** for runs without iterative carbon price adjustment (if cm_iterative_target_adj = 0), price increases linearly with fixed annual increase given by cm_taxCO2inc_after_peakBudgYr after year given by cm_peakBudgYr (for linearly increasing carbon price (with same slope) until end of century, set cm_peakBudgYr = 2110) -if((cm_iterative_target_adj eq 0), - p45_CO2priceTrajDeveloped(t)$(t.val gt cm_peakBudgYr) - = sum(t2$(t2.val eq cm_peakBudgYr), p45_CO2priceTrajDeveloped(t2)) - + (t.val - cm_peakBudgYr) * cm_taxCO2inc_after_peakBudgYr * sm_DptCO2_2_TDpGtC; !! increase by cm_taxCO2inc_after_peakBudgYr per year -); -*** set taxes after 2110 equal to 2110 value -p45_CO2priceTrajDeveloped(t)$(t.val gt 2110) = p45_CO2priceTrajDeveloped("2110"); -display p45_CO2priceTrajDeveloped; - -*** Step 3: Create regional CO2 price trajectories using 1) regional multiplicative CO2 price factors and 2) CO2 price trajectory for developed countries -pm_taxCO2eq(t,regi) = p45_regCO2priceFactor(t,regi) * p45_CO2priceTrajDeveloped(t); -display pm_taxCO2eq; - -*** EOF ./modules/45_carbonprice/diffLin2Lin/datainput.gms diff --git a/modules/45_carbonprice/diffLin2Lin/declarations.gms b/modules/45_carbonprice/diffLin2Lin/declarations.gms deleted file mode 100644 index 5f20c2004..000000000 --- a/modules/45_carbonprice/diffLin2Lin/declarations.gms +++ /dev/null @@ -1,37 +0,0 @@ -*** | (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/diffLin2Lin/declarations.gms -***-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -*** diff: regional prices are initially differentiated by GDP/capita and converge using quadratic phase-in until cm_CO2priceRegConvEndYr (default = 2050), globally uniform price thereafter, -*** level of regional carbon price differentiation (uniform, medium, strong) can be chosen via cm_co2_tax_spread -*** Lin: carbon price of developed regions increases linearly starting at historical level given by cm_co2_tax_hist in year cm_year_co2_tax_hist -*** initial value in cm_startyear is given by cm_co2_tax_startyear (if iterative_target_adj != 0, this value will be adjusted to meet prescribed CO2 budget) -*** 2Lin: (with iterative_target_adj = 9): after the peak year (initial value given by cm_peakBudgYr, will be adjusted by algorithm in core/postsolve.gms), -*** carbon price of developed countries increases linearly with fixed annual increase given by cm_taxCO2inc_after_peakBudgYr (default = 0, i.e. constant) -*** (with iterative_target_adj = 5): carbon price of developed countries keeps increasing linearly (with same slope) until end of century, i.e. no change after peak year -*** (with iterative_target_adj = 0): after year given by cm_peakBudgYr (default = 2050), carbon price of developed countries increases linearly with fixed annual increase given by cm_taxCO2inc_after_peakBudgYr (default = 0, i.e. constant), -*** for linearly increasing carbon price (with same slope) until end of century, set cm_peakBudgYr = 2110 -***-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - -parameters -p45_gdppcap2015_PPP(all_regi) "2015 GDP per capita (k $ PPP 2005)" -p45_phasein_ratio(all_regi) "inital ratio of CO2 price to that of developed region" - -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" - -p45_tau_CO2_tax_gdx_ref(ttot,all_regi) "tax path from path_gdx_ref" -; - -scalars -s45_year_co2_tax_hist "year of s45_co2_tax_hist" -s45_co2_tax_hist "historical level of CO2 tax converted from $/t CO2eq to T$/GtC" -s45_co2_tax_startyear "level of CO2 tax in start year converted from $/t CO2eq to T$/GtC" -s45_CO2priceRegConvStartYr "year until which initial ratios of CO2 prices are applied and after which convergence starts" -; - -*** EOF ./modules/45_carbonprice/diffLin2Lin/declarations.gms diff --git a/modules/45_carbonprice/diffLin2Lin/postsolve.gms b/modules/45_carbonprice/diffLin2Lin/postsolve.gms deleted file mode 100644 index 0e7835767..000000000 --- a/modules/45_carbonprice/diffLin2Lin/postsolve.gms +++ /dev/null @@ -1,47 +0,0 @@ -*** | (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/diffLin2Lin/postsolve.gms -***-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -*** diff: regional prices are initially differentiated by GDP/capita and converge using quadratic phase-in until cm_CO2priceRegConvEndYr (default = 2050), globally uniform price thereafter, -*** level of regional carbon price differentiation (uniform, medium, strong) can be chosen via cm_co2_tax_spread -*** Lin: carbon price of developed regions increases linearly starting at historical level given by cm_co2_tax_hist in year cm_year_co2_tax_hist -*** initial value in cm_startyear is given by cm_co2_tax_startyear (if iterative_target_adj != 0, this value will be adjusted to meet prescribed CO2 budget) -*** 2Lin: (with iterative_target_adj = 9): after the peak year (initial value given by cm_peakBudgYr, will be adjusted by algorithm in core/postsolve.gms), -*** carbon price of developed countries increases linearly with fixed annual increase given by cm_taxCO2inc_after_peakBudgYr (default = 0, i.e. constant) -*** (with iterative_target_adj = 5): carbon price of developed countries keeps increasing linearly (with same slope) until end of century, i.e. no change after peak year -*** (with iterative_target_adj = 0): after year given by cm_peakBudgYr (default = 2050), carbon price of developed countries increases linearly with fixed annual increase given by cm_taxCO2inc_after_peakBudgYr (default = 0, i.e. constant), -*** for linearly increasing carbon price (with same slope) until end of century, set cm_peakBudgYr = 2110 -***-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - -*** if CO2 price is iteratively adjusted (i.e. cm_iterative_target_adj != 0), -if((cm_iterative_target_adj ne 0), -*** re-create the linear carbon price trajectory for developed countries to ensure that it -*** starts at historical level given by cm_co2_tax_hist in year cm_year_co2_tax_hist, and -*** ends at the endogenously adjusted tax level in the peak year (with iterative_target_adj = 6|7|9) or in 2110 (otherwise) -if((cm_iterative_target_adj eq 6) or (cm_iterative_target_adj eq 7) or (cm_iterative_target_adj eq 9), - loop(regi$(p45_gdppcap2015_PPP(regi) gt 20), !! 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. - p45_CO2priceTrajDeveloped(t)$(t.val le cm_peakBudgYr) - = s45_co2_tax_hist - + (sum(t2$(t2.val eq cm_peakBudgYr), pm_taxCO2eq(t2,regi)) - s45_co2_tax_hist) / (cm_peakBudgYr - s45_year_co2_tax_hist) !! Yearly increase of CO2 price that interpolates between s45_co2_tax_hist in s45_year_co2_tax_hist and pm_taxCO2eq in peak year - * (t.val - s45_year_co2_tax_hist) ; - p45_CO2priceTrajDeveloped(t)$(t.val gt cm_peakBudgYr) = pm_taxCO2eq(t,regi); - ); - else - loop(regi$(p45_gdppcap2015_PPP(regi) gt 20), !! 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. - p45_CO2priceTrajDeveloped(t)$(t.val le 2110) - = s45_co2_tax_hist - + (pm_taxCO2eq("2110",regi) - s45_co2_tax_hist) / (2110 - s45_year_co2_tax_hist) !! Yearly increase of CO2 price that interpolates between s45_co2_tax_hist in s45_year_co2_tax_hist and pm_taxCO2eq in 2110 - * (t.val - s45_year_co2_tax_hist) ; - p45_CO2priceTrajDeveloped(t)$(t.val gt 2110) = pm_taxCO2eq(t,regi); - ); -); - -*** Re-create the regional CO2 price trajectories using 1) regional multiplicative CO2 price factors and 2) CO2 price trajectory for developped countries -pm_taxCO2eq(t,regi) = p45_regCO2priceFactor(t,regi) * p45_CO2priceTrajDeveloped(t); -display pm_taxCO2eq; -); -*** EOF ./modules/45_carbonprice/diffLin2Lin/postsolve.gms diff --git a/modules/45_carbonprice/diffLin2Lin/realization.gms b/modules/45_carbonprice/diffLin2Lin/realization.gms deleted file mode 100644 index 24a9ba102..000000000 --- a/modules/45_carbonprice/diffLin2Lin/realization.gms +++ /dev/null @@ -1,29 +0,0 @@ -*** | (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/diffLin2Lin/realization.gms - -*' @description: This realization implements linearly increasing carbon price - either until end of century or until peak year (constant or linear thereafter). Optional carbon price differentiation and quadratic phase-in can be activated via switch cm_co2_tax_spread. - -***-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -*** diff: regional prices are initially differentiated by GDP/capita and converge using quadratic phase-in until cm_CO2priceRegConvEndYr (default = 2050), globally uniform price thereafter, -*** level of regional carbon price differentiation (uniform, medium, strong) can be chosen via cm_co2_tax_spread -*** Lin: carbon price of developed regions increases linearly starting at historical level given by cm_co2_tax_hist in year cm_year_co2_tax_hist -*** initial value in cm_startyear is given by cm_co2_tax_startyear (if iterative_target_adj != 0, this value will be adjusted to meet prescribed CO2 budget) -*** 2Lin: (with iterative_target_adj = 9): after the peak year (initial value given by cm_peakBudgYr, will be adjusted by algorithm in core/postsolve.gms), -*** carbon price of developed countries increases linearly with fixed annual increase given by cm_taxCO2inc_after_peakBudgYr (default = 0, i.e. constant) -*** (with iterative_target_adj = 5): carbon price of developed countries keeps increasing linearly (with same slope) until end of century, i.e. no change after peak year -*** (with iterative_target_adj = 0): after year given by cm_peakBudgYr (default = 2050), carbon price of developed countries increases linearly with fixed annual increase given by cm_taxCO2inc_after_peakBudgYr (default = 0, i.e. constant), -*** for linearly increasing carbon price (with same slope) until end of century, set cm_peakBudgYr = 2110 -***-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - -*####################### R SECTION START (PHASES) ############################## -$Ifi "%phase%" == "declarations" $include "./modules/45_carbonprice/diffLin2Lin/declarations.gms" -$Ifi "%phase%" == "datainput" $include "./modules/45_carbonprice/diffLin2Lin/datainput.gms" -$Ifi "%phase%" == "postsolve" $include "./modules/45_carbonprice/diffLin2Lin/postsolve.gms" -*######################## R SECTION END (PHASES) ############################### - -*** EOF ./modules/45_carbonprice/diffLin2Lin/realization.gms diff --git a/modules/45_carbonprice/expoLinear/datainput.gms b/modules/45_carbonprice/expoLinear/datainput.gms index 56a34c881..5d4cfd6d7 100644 --- a/modules/45_carbonprice/expoLinear/datainput.gms +++ b/modules/45_carbonprice/expoLinear/datainput.gms @@ -8,7 +8,12 @@ *** Carbon price increases exponentially with rate given by cm_co2_tax_growth (default = 4.5%) %) until cm_expoLinear_yearStart (defaults to 2060) *** and then transitions into linear growth (with slope given by last timestep before cm_expoLinear_yearStart). +*** Not compatible with iterative adjustment of CO2 tax [i.e. requires cm_iterative_target_adj = 0] +*** Check that cm_iterative_target_adj is equal to 0 +if( cm_iterative_target_adj ne 0, + abort "The realization 45_carbonprice/expoLinear is only compatible with cm_iterative_target_adj = 0. Please adjust config file accordingly" +); if(cm_co2_tax_startyear le 0, abort "please choose a valid cm_co2_tax_startyear" diff --git a/modules/45_carbonprice/expoLinear/realization.gms b/modules/45_carbonprice/expoLinear/realization.gms index dd65eb081..ee18e258e 100644 --- a/modules/45_carbonprice/expoLinear/realization.gms +++ b/modules/45_carbonprice/expoLinear/realization.gms @@ -15,6 +15,7 @@ *' A Hotelling price path can only be considered optimal until the time of net-zero emissions. *' Afterwards, a moderate carbon price increase is sufficient to avoid a return of fossil fuels. *' Therefore, we choose an exponentially increasing carbon price until the expected time of net-zero emissions and a linear increase at the rate of 2050 or 2060 afterwards. +*** Not compatible with iterative adjustment of CO2 tax [i.e. requires cm_iterative_target_adj = 0] *####################### R SECTION START (PHASES) ############################## $Ifi "%phase%" == "declarations" $include "./modules/45_carbonprice/expoLinear/declarations.gms" diff --git a/modules/45_carbonprice/functionalForm/datainput.gms b/modules/45_carbonprice/functionalForm/datainput.gms new file mode 100644 index 000000000..59d1fcabf --- /dev/null +++ b/modules/45_carbonprice/functionalForm/datainput.gms @@ -0,0 +1,225 @@ +*** | (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/functionalForm/datainput.gms + +*** Check that cm_iterative_target_adj is equal to 0, 5, 7, or 9 +if( not ((cm_iterative_target_adj = 0) or (cm_iterative_target_adj eq 5) or (cm_iterative_target_adj eq 7) or (cm_iterative_target_adj eq 9) ), + abort "The realization 45_carbonprice/functionalForm is only compatible with cm_iterative_target_adj = 0, 5, 7 or 9. Please adjust config file accordingly" +); + +*** Read pm_taxCO2eq from path_gdx_ref +Execute_Loadpoint 'input_ref' p45_taxCO2eq_path_gdx_ref = pm_taxCO2eq; +display p45_taxCO2eq_path_gdx_ref; + +*** -------- initial declaration of parameters for iterative target adjustment +o45_reached_until2150pricepath(iteration) = 0; +p45_taxCO2eq_anchor_iterationdiff(t) = 0; +p45_taxCO2eq_anchor_iterationdiff_tmp(t) = 0; + +***----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +*** Part I (Global anchor trajectory): The functional form (linear/exponential) of the global anchor trajectory is chosen via cm_taxCO2_functionalForm. +*** The (initial) carbon price in cm_startyear is chosen via cm_taxCO2_startyear. This value is endogenously adjusted to meet CO2 budget targets if cm_iterative_target_adj is set to 5, 7, or 9. +*** (linear): The linear curve is determined by the two points (cm_taxCO2_historicalYr, cm_taxCO2_historical) and (cm_startyear, cm_taxCO2_startyear). +*** By default, cm_taxCO2_historicalYr is the last timestep before cm_startyear, and cm_taxCO2_historical is the carbon price in that timestep in the reference run (path_gdx_ref) - computed as the maximum of pm_taxCO2eq over all regions. +*** (exponential): The exponential curve is determined by exponential growth rate (cm_taxCO2_expGrowth). +***----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +*** Convert tax value in start year from $/t CO2eq to T$/GtC +s45_taxCO2_startyear = cm_taxCO2_startyear * sm_DptCO2_2_TDpGtC; +*** Check that tax value in start year is strictly positive +if(s45_taxCO2_startyear le 0, + abort "please initialize cm_taxCO2_startyear by setting it to a positive value" +); + +$ifThen.taxCO2globalAnchor "%cm_taxCO2_functionalForm%" == "exponential" +*** price increases exponentially with growth rate cm_taxCO2_expGrowth from s45_taxCO2_startyear in startyear +p45_taxCO2eq_anchor(t) = s45_taxCO2_startyear * cm_taxCO2_expGrowth**(t.val - cm_startyear); +$elseIf.taxCO2globalAnchor "%cm_taxCO2_functionalForm%" == "linear" +*** Step I.1: Determine the point (s45_taxCO2_historicalYr, s45_taxCO2_historical) + +*** Set s45_taxCO2_historicalYr based on the switch cm_taxCO2_historicalYr +$ifthen.taxCO2historicalYr "%cm_taxCO2_historicalYr%" == "last" +*** Choose s45_taxCO2_historicalYr to be the last time period before start year +s45_taxCO2_historicalYr = smax(ttot$( ttot.val lt cm_startyear ), ttot.val); +$else.taxCO2historicalYr +*** Set s45_taxCO2_historicalYr to be the value provided by the switch +s45_taxCO2_historicalYr = %cm_taxCO2_historicalYr%; +$endif.taxCO2historicalYr +*** Check validity of s45_taxCO2_historicalYr +if((s45_taxCO2_historicalYr lt 2005) or (s45_taxCO2_historicalYr ge cm_startyear), + abort "please choose cm_taxCO2_historicalYr to be at least 2005 and strictly smaller than cm_startyear" +); +display s45_taxCO2_historicalYr; + +*** Set s45_taxCO2_historical based on the switch cm_taxCO2_historical +$ifthen.taxCO2historial "%cm_taxCO2_historical%" == "gdx_ref" +*** Check that s45_taxCO2_historicalYr is an element of ttot +if(sum(ttot$(ttot.val eq s45_taxCO2_historicalYr),1)=0, + abort "please choose cm_taxCO2_historicalYr to be last or an element of ttot" +); +*** Extract level of carbon price in s45_taxCO2_historicalYr (defined as maximum of pm_taxCO2eq over all regions) +s45_taxCO2_historical = smax( regi , sum ( ttot$(ttot.val eq s45_taxCO2_historicalYr) , p45_taxCO2eq_path_gdx_ref(ttot,regi) ) ); +$else.taxCO2historial +*** Set s45_taxCO2_historical to be the value provided by the switch, converted from $/t CO2eq to T$/GtC +s45_taxCO2_historical = %cm_taxCO2_historical% * sm_DptCO2_2_TDpGtC; +$endif.taxCO2historial +display s45_taxCO2_historical; +*** Make sure that initial carbon price trajectory is non-decreasing +if(s45_taxCO2_startyear lt s45_taxCO2_historical, + display s45_taxCO2_startyear; + abort "please make sure that cm_taxCO2_startyear is at least as large as the value provided by cm_taxCO2_historical" +); + +*** Step I.2: Create linear global anchor trajectory through the points (s45_taxCO2_historicalYr, s45_taxCO2_historical) and (cm_startyear, s45_taxCO2_startyear) +p45_taxCO2eq_anchor(t) = s45_taxCO2_historical + + (s45_taxCO2_startyear - s45_taxCO2_historical) / (cm_startyear - s45_taxCO2_historicalYr) !! Yearly increase of carbon price + * (t.val - s45_taxCO2_historicalYr) ; +$endIf.taxCO2globalAnchor + +***------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +*** Part II (Post-peak behaviour): The global anchor trajectory can be adjusted after reaching the peak of global CO2 emissions in cm_peakBudgYr. +*** The (initial) choice of cm_peakBudgYr is endogenously adjusted if cm_iterative_target_adj is set to 7 or 9. +*** (with iterative_target_adj = 0): after cm_peakBudgYr, the global anchor trajectory increases linearly with fixed annual increase given by cm_taxCO2_IncAfterPeakBudgYr (default = 0, i.e. constant), +*** set cm_peakBudgYr = 2110 to avoid adjustment +*** (with iterative_target_adj = 5): no adjustment to the functional form after cm_peakBudgYr +*** (with iterative_target_adj = 7): after cm_peakBudgYr, the global anchor trajectory is adjusted so that global net CO2 emissions stay close to zero +*** (with iterative_target_adj = 9): after cm_peakBudgYr, the global anchor trajectory increases linearly with fixed annual increase given by cm_taxCO2_IncAfterPeakBudgYr (default = 0, i.e. constant) +***------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +*** Save the original form of the global anchor trajectory so that it can be accessed if cm_peakBudgYr is shifted to the right +p45_taxCO2eq_anchor_until2150(t) = p45_taxCO2eq_anchor(t); + +*** Adjust global anchor trajectory so that after cm_peakBudgYr, it increases linearly with fixed annual increase given by cm_taxCO2_IncAfterPeakBudgYr +if((cm_iterative_target_adj = 0) or (cm_iterative_target_adj = 9), + p45_taxCO2eq_anchor(t)$(t.val gt cm_peakBudgYr) = sum(t2$(t2.val eq cm_peakBudgYr), p45_taxCO2eq_anchor_until2150(t2)) !! CO2 tax in peak budget year + + (t.val - cm_peakBudgYr) * cm_taxCO2_IncAfterPeakBudgYr * sm_DptCO2_2_TDpGtC; !! increase by cm_taxCO2inc_after_peakBudgYr per year +); + +*** Always set carbon price constant after 2110 to prevent huge taxes after 2110 and the resulting convergence problems +p45_taxCO2eq_anchor(t)$(t.val gt 2110) = p45_taxCO2eq_anchor("2110"); +display p45_taxCO2eq_anchor_until2150, p45_taxCO2eq_anchor; + +***----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +*** Part III (Regional differentiation): Regional carbon price differentiation relative to global anchor trajectory is chosen via cm_taxCO2_regiDiff. +*** (none): No regional differetiation, i.e. uniform carbon pricing +*** (initialSpread10): Maximal initial spread of carbon prices in 2030 between OECD regions and poorest region is equal to 10. Initial spread for each region determined based on GDP per capita (PPP) in 2015. Carbon prices converge using quadratic phase-in until cm_taxCO2_regiDiff_endYr (default = 2050). +*** (initialSpread20): Maximal initial spread of carbon prices in 2030 between OECD regions and poorest region is equal to 20. Initial spread for each region determined based on GDP per capita (PPP) in 2015. Carbon prices converge using quadratic phase-in until cm_taxCO2_regiDiff_endYr (default = 2050). +*** (gdpSpread): Regional differentiation based on GDP per capita (PPP) throughout the century. Uses current GDP per capita (PPP) of OECD countries - around 50'000 US$2017 - as threshold for application of full carbon price. +***----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +*** Compute GDP per capita (in 1e3 $ PPP 2017) +p45_gdppcap_PPP(ttot,regi)$(ttot.val ge 2005) = pm_gdp(ttot,regi) / pm_shPPPMER(regi) / pm_pop(ttot,regi); +display p45_gdppcap_PPP; + +*** Define p45_regiDiff_convFactor based on chosen differentiation scheme +$ifThen.taxCO2regiDiff3 "%cm_taxCO2_regiDiff%" == "none" +p45_regiDiff_convFactor(t,regi) = 1; +$elseIf.taxCO2regiDiff3 "%cm_taxCO2_regiDiff%" == "gdpSpread" +*** Set s45_regiDiff_gdpThreshold (in 1e3 $ PPP 2017) +s45_regiDiff_gdpThreshold = 50; +*** Compute ratio between GDP per capita (in 1e3 $ PPP 2017) and s45_regiDiff_gdpThreshold, and upper bound it by 1 +p45_regiDiff_convFactor(t,regi) = min(p45_gdppcap_PPP(t,regi) / 50 , 1) +$else.taxCO2regiDiff3 +$ifThen.taxCO2regiDiff4 "%cm_taxCO2_regiDiff%" == "initialSpread10" +*** Define p45_regiDiff_initialRatio for maximal initial spread equal to 10 +p45_regiDiff_initialRatio(regi)$(p45_gdppcap_PPP("2015",regi) le 3.5) = 0.1; !! SSA +p45_regiDiff_initialRatio(regi)$(p45_gdppcap_PPP("2015",regi) gt 3.5 and p45_gdppcap_PPP("2015",regi) le 5) = 0.2; !! IND +p45_regiDiff_initialRatio(regi)$(p45_gdppcap_PPP("2015",regi) gt 5 and p45_gdppcap_PPP("2015",regi) le 10) = 0.3; !! OAS +p45_regiDiff_initialRatio(regi)$(p45_gdppcap_PPP("2015",regi) gt 10 and p45_gdppcap_PPP("2015",regi) le 15) = 0.5; !! CHA, LAM, MEA +p45_regiDiff_initialRatio(regi)$(p45_gdppcap_PPP("2015",regi) gt 15 and p45_gdppcap_PPP("2015",regi) le 20) = 0.7; !! REF +p45_regiDiff_initialRatio(regi)$(p45_gdppcap_PPP("2015",regi) gt 20) = 1; !! EUR, JPN, USA, CAZ, NEU +$elseIf.taxCO2regiDiff4 "%cm_taxCO2_regiDiff%" == "initialSpread20" +*** Define p45_regiDiff_initialRatio for maximal initial spread equal to 20 +p45_regiDiff_initialRatio(regi)$(p45_gdppcap_PPP("2015",regi) le 3.5) = 0.05; !! SSA +p45_regiDiff_initialRatio(regi)$(p45_gdppcap_PPP("2015",regi) gt 3.5 and p45_gdppcap_PPP("2015",regi) le 5) = 0.1; !! IND +p45_regiDiff_initialRatio(regi)$(p45_gdppcap_PPP("2015",regi) gt 5 and p45_gdppcap_PPP("2015",regi) le 10) = 0.2; !! OAS +p45_regiDiff_initialRatio(regi)$(p45_gdppcap_PPP("2015",regi) gt 10 and p45_gdppcap_PPP("2015",regi) le 15) = 0.4; !! CHA, LAM, MEA +p45_regiDiff_initialRatio(regi)$(p45_gdppcap_PPP("2015",regi) gt 15 and p45_gdppcap_PPP("2015",regi) le 20) = 0.6; !! REF +p45_regiDiff_initialRatio(regi)$(p45_gdppcap_PPP("2015",regi) gt 20) = 1; !! EUR, JPN, USA, CAZ, NEU +$endIf.taxCO2regiDiff4 +*** Set s45_regiDiff_startYr +s45_regiDiff_startYr = 2030; +*** Set p45_regiDiff_endYr based on data provided by switch cm_taxCO2_regiDiff_endYr +loop((ext_regi)$p45_regiDiff_endYr_data(ext_regi), + loop(regi$regi_groupExt(ext_regi,regi), + p45_regiDiff_endYr(regi) = p45_regiDiff_endYr_data(ext_regi); + ); +); +*** Set convergence factor equal to p45_regiDiff_initialRatio before s45_regiDiff_startYr: +p45_regiDiff_convFactor(t,regi)$(t.val lt s45_regiDiff_startYr) = p45_regiDiff_initialRatio(regi); +*** Set convergence factor equal to 1 from p45_regiDiff_endYr: +p45_regiDiff_convFactor(t,regi)$(t.val ge p45_regiDiff_endYr(regi)) = 1; +*** Create quadratic convergence between s45_regiDiff_startYr and p45_regiDiff_endYr: +loop(t$((t.val ge s45_regiDiff_startYr) and (t.val lt p45_regiDiff_endYr(regi))), + p45_regiDiff_convFactor(t,regi) = + min(1, + max(0, + p45_regiDiff_initialRatio(regi) + (1 - p45_regiDiff_initialRatio(regi)) * Power( (t.val - s45_regiDiff_startYr) / (p45_regiDiff_endYr(regi) - s45_regiDiff_startYr), 2) + ) + ); +); +display p45_regiDiff_initialRatio, p45_regiDiff_endYr; +$endIf.taxCO2regiDiff3 + +***Create regionally differentiated carbon price trajectories based on global anchor trajectory and p45_regiDiff_convFactor +p45_taxCO2eq_regiDiff(t,regi) = p45_regiDiff_convFactor(t,regi) * p45_taxCO2eq_anchor(t); +display p45_regiDiff_convFactor, p45_taxCO2eq_regiDiff; + +***--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +*** Part IV (Interpolation from path_gdx_ref): To smoothen a potential jump of carbon prices in cm_startyear, an interpolation between (a) the carbon prices before cm_startyear procided by path_gdx_ref and (b) the carbon prices from cm_startyear onward defined by parts I-III can be chosen via cm_taxCO2_interpolation +*** (off): no interpolation, i.e. (b) is used from cm_startyear onward +*** (one_step): linear interpolation within 10 years between (a) and (b). For example, if cm_startyear = 2030, it uses (a) until 2025, the average of (a) and (b) in 2030, and (b) from 2035. +*** (two_steps): linear interpolation within 15 years between (a) and (b). For example, if cm_startyear = 2030, it uses (a) until 2025, weighted averages of (a) and (b) in 2030 and 2035, and (b) from 2040. +*** For manual settings, see description of the switch +***--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +*** Step IV.1: Set parameters for interpolation +*** Set linear interpolation as default +p45_interpolation_exponent(regi) = 1; +*** Set last timestep before cm_startyear as default for interpolation start +p45_interpolation_startYr(regi) = smax(ttot$( ttot.val lt cm_startyear ), ttot.val); + +$ifThen.CO2taxInterpolation2 "%cm_co2_tax_interpolation%" == "off" +*** No interpolation +p45_interpolation_endYr(regi) = p45_interpolation_startYr(regi); +$elseIf.CO2taxInterpolation2 "%cm_co2_tax_interpolation%" == "one_step" +*** Interpolation in 10 years, i.e. one intermediate step +p45_interpolation_endYr(regi) = smin(ttot$( ttot.val ge cm_startyear + 5), ttot.val); +$elseIf.CO2taxInterpolation2 "%cm_co2_tax_interpolation%" == "two_steps" +*** Interpolation in 15 years, i.e. two intermediate steps +p45_interpolation_endYr(regi) = smin(ttot$( ttot.val ge cm_startyear + 10), ttot.val); +$else.CO2taxInterpolation2 +*** Overwrite with p45_interpolation_exponent, p45_interpolation_startYr, and p45_interpolation_endYr according to manual settings +loop((ext_regi,ttot,ttot2)$p45_interpolation_data(ext_regi,ttot,ttot2), + loop(regi$regi_groupExt(ext_regi,regi), + p45_interpolation_exponent(regi) = p45_interpolation_data(ext_regi,ttot,ttot2); + p45_interpolation_startYr(regi) = ttot.val; + p45_interpolation_endYr(regi) = ttot2.val; + ); +); +$endIf.CO2taxInterpolation2 +display p45_interpolation_exponent, p45_interpolation_startYr, p45_interpolation_endYr; + +*** Step IV.2: Create interpolation +loop(regi, + pm_taxCO2eq(t,regi)$(t.val lt p45_interpolation_startYr(regi)) = p45_taxCO2eq_path_gdx_ref(t,regi); + pm_taxCO2eq(t,regi)$((t.val ge p45_interpolation_startYr(regi)) and (t.val lt p45_interpolation_endYr(regi))) = + sum(t2$(t2.val eq p45_interpolation_startYr(regi)), p45_taxCO2eq_path_gdx_ref(t2,regi)) !! value of p45_taxCO2eq_path_gdx_ref in p45_interpolation_startYr + * (1 - rPower( (t.val - p45_interpolation_startYr(regi)) / (p45_interpolation_endYr(regi) - p45_interpolation_startYr(regi)), p45_interpolation_exponent(regi))) + + sum(t3$(t3.val eq p45_interpolation_endYr(regi)), p45_taxCO2eq_regiDiff(t3,regi)) !! value of p45_taxCO2eq_regiDiff in p45_interpolation_endYr + * rPower( (t.val - p45_interpolation_startYr(regi)) / (p45_interpolation_endYr(regi) - p45_interpolation_startYr(regi)), p45_interpolation_exponent(regi)) + pm_taxCO2eq(t,regi)$(t.val ge p45_interpolation_endYr(regi)) = p45_taxCO2eq_regiDiff(t,regi); +); +display pm_taxCO2eq; + +*** Step IV.3: Lower bound pm_taxCO2eq by p45_taxCO2eq_path_gdx_ref if switch cm_taxCO2_lowerBound_path_gdx_ref is on +$ifthen.lowerBound not "%cm_taxCO2_lowerBound_path_gdx_ref%" == "on" + pm_taxCO2eq(t,regi) = max(pm_taxCO2eq(t,regi), p45_taxCO2eq_path_gdx_ref(t,regi)); +$endIf.lowerBound +display pm_taxCO2eq; + +*** EOF ./modules/45_carbonprice/functionalForm/datainput.gms diff --git a/modules/45_carbonprice/functionalForm/declarations.gms b/modules/45_carbonprice/functionalForm/declarations.gms new file mode 100644 index 000000000..e222bbcbd --- /dev/null +++ b/modules/45_carbonprice/functionalForm/declarations.gms @@ -0,0 +1,89 @@ +*** | (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/functionalForm/declarations.gms + +scalars +s45_taxCO2_startyear "CO2 tax provided by cm_taxCO2_startyear converted from $/t CO2eq to T$/GtC" + +$ifThen.taxCO2functionalForm "%cm_taxCO2_functionalForm%" == "linear" +s45_taxCO2_historical "historical level of CO2 tax converted from $/t CO2eq to T$/GtC" +s45_taxCO2_historicalYr "year of s45_taxCO2_historical" +$endIf.taxCO2functionalForm + +$ifThen.taxCO2regiDiff1 "%cm_taxCO2_regiDiff%" == "none" +$elseIf.taxCO2regiDiff1 "%cm_taxCO2_regiDiff%" == "gdpSpread" +s45_regiDiff_gdpThreshold "reference value for GDP per capita (1e3 $ PPP 2017) above which carbon price from global anchor trajectory is fully applied" +$else.taxCO2regiDiff1 +s45_regiDiff_startYr "year until which initial ratios of CO2 prices are applied and after which convergence starts" +$endIf.taxCO2regiDiff1 +; + +parameters +p45_taxCO2eq_anchor(ttot) "global anchor trajectory for regional CO2 price trajectories in T$/GtC = $/kgC" +p45_taxCO2eq_anchor_until2150(ttot) "global anchor trajectory continued until 2150 - as if there was no change in trajectory after cm_peakBudgYr. Needed if cm_peakBudgYr was shifted right" +p45_taxCO2eq_regiDiff(ttot,all_regi) "regional differentiated CO2 price trajectories in T$/GtC = $/kgC, used as intermediate step in deriving pm_taxCO2eq from p45_taxCO2eq_anchor" +p45_taxCO2eq_path_gdx_ref(ttot,all_regi) "CO2 tax trajectories from path_gdx_ref" + +p45_gdppcap_PPP(ttot,all_regi) "GDP per capita (1e3 $ PPP 2017)" +p45_regiDiff_convFactor(ttot,all_regi) "convergence factor for regional differentiation" +*** Only declaring additional parameters if cm_taxCO2_regiDiff is set to initialSpread10 or initialSpread20 +$ifThen.taxCO2regiDiff2 "%cm_taxCO2_regiDiff%" == "none" +$elseIf.taxCO2regiDiff2 "%cm_taxCO2_regiDiff%" == "gdpSpread" +$else.taxCO2regiDiff2 +p45_regiDiff_initialRatio(all_regi) "inital ratio between global anchor and regional differentiated CO2 price trajectories" +p45_regiDiff_endYr(all_regi) "end year of regional differentiation, i.e. regional carbon price equal to global anchor trajectory thereafter" +p45_regiDiff_endYr_data(ext_regi) "data provided by switch cm_taxCO2_regiDiff_endYr" +/ %cm_taxCO2_regiDiff_endYr% / +$endIf.taxCO2regiDiff2 + +p45_interpolation_startYr(all_regi) "start year of interpolation from p45_taxCO2eq_path_gdx_ref to p45_taxCO2eq_regiDiff" +p45_interpolation_endYr(all_regi) "end year of interpolation from p45_taxCO2eq_path_gdx_ref to p45_taxCO2eq_regiDiff" +p45_interpolation_exponent(all_regi) "interpolation exponent" +*** Only assigning values to p45_interpolation_data if cm_taxCO2_interpolation is not set to off, one_step, or two_steps +$ifThen.taxCO2interpolation1 "%cm_taxCO2_interpolation%" == "off" +$elseIf.taxCO2interpolation1 "%cm_taxCO2_interpolation%" == "one_step" +$elseIf.taxCO2interpolation1 "%cm_taxCO2_interpolation%" == "two_steps" +$else.taxCO2interpolation1 +p45_interpolation_data(ext_regi,ttot,ttot2) "regional exponent and timewindow for interpolation" +/ %cm_taxCO2_interpolation% / +$endIf.taxCO2interpolation1 +; + + + +*** Scalars only used in functionForm/postsolve.gms +scalars +s45_actualbudgetco2 "actual level of 2020-2100 cumulated emissions, including all CO2 for last iteration" +s45_actualbudgetco2_last "actual level of 2020-2100 cumulated emissions for previous iteration" /0/ +; + +*** Parameters only used in functionForm/postsolve.gms +parameters +p45_actualbudgetco2(ttot) "actual level of cumulated emissions starting from 2020 [GtCO2]" + +p45_taxCO2eq_iteration(iteration,ttot,all_regi) "save pm_taxCO2eq from each iteration for debugging" +p45_taxCO2eq_anchor_iteration(iteration,ttot) "save p45_taxCO2eq_anchor from each iteration for debugging" + +p45_taxCO2eq_anchor_iterationdiff(ttot) "help parameter for iterative adjustment of taxes" +p45_taxCO2eq_anchor_iterationdiff_tmp(ttot) "help parameter for iterative adjustment of taxes" +o45_taxCO2eq_anchor_iterDiff_Itr(iteration) "track p45_taxCO2eq_anchor_iterationdiff over iterations" + +o45_diff_to_Budg(iteration) "Difference between actual CO2 budget and target CO2 budget" +o45_totCO2emi_peakBudgYr(iteration) "Total CO2 emissions in the peakBudgYr" +o45_peakBudgYr_Itr(iteration) "Year in which the CO2 budget is supposed to peak. Is changed in iterative_target_adjust = 9" +o45_factorRescale_taxCO2_afterPeakBudgYr(iteration) "Multiplicative factor for rescaling the CO2 price in the year after peakBudgYr - only needed if flip-flopping of peakBudgYr occurs" +o45_delay_increase_peakBudgYear(iteration) "Counter that tracks if flip-flopping of peakBudgYr happened. Starts an inner loop to try and overcome this" +o45_reached_until2150pricepath(iteration) "Counter that tracks if the inner loop of increasing the CO2 price AFTER peakBudgYr goes beyond the initial trajectory" +o45_totCO2emi_allYrs(ttot,iteration) "Global CO2 emissions over time and iterations. Needed to check the procedure to find the peakBudgYr" +o45_change_totCO2emi_peakBudgYr(iteration) "Measure for how much the CO2 emissions change around the peakBudgYr" +p45_factorRescale_taxCO2(iteration) "Multiplicative factor for rescaling the CO2 price to reach the target" +p45_factorRescale_taxCO2_Funneled(iteration) "Multiplicative factor for rescaling the CO2 price to reach the target - limited by an iteration-dependent funnel" +o45_pkBudgYr_flipflop(iteration) "Counter that tracks if flipfloping of cm_peakBudgYr occured in the last iterations" +; + + +*** EOF ./modules/45_carbonprice/functionalForm/declarations.gms diff --git a/modules/45_carbonprice/diffLin2Lin/not_used.txt b/modules/45_carbonprice/functionalForm/not_used.txt similarity index 96% rename from modules/45_carbonprice/diffLin2Lin/not_used.txt rename to modules/45_carbonprice/functionalForm/not_used.txt index a9cf44fe2..b209cfbc4 100644 --- a/modules/45_carbonprice/diffLin2Lin/not_used.txt +++ b/modules/45_carbonprice/functionalForm/not_used.txt @@ -14,7 +14,6 @@ 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_expoLinear_yearStart,input,questionnaire cm_carbonprice_temperatureLimit,input,questionnaire cm_NDC_divergentScenario,input,questionnaire diff --git a/modules/45_carbonprice/functionalForm/postsolve.gms b/modules/45_carbonprice/functionalForm/postsolve.gms new file mode 100644 index 000000000..a70574544 --- /dev/null +++ b/modules/45_carbonprice/functionalForm/postsolve.gms @@ -0,0 +1,452 @@ +*** | (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/functionalForm/postsolve.gms + +*** Only run postsolve if cm_iterative_target_adj is not equal to 0. +if((cm_iterative_target_adj ne 0), + +***-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +*** Part I and II (Global anchor trajectory and post-peak behaviour): Adjustment of global anchor trajectory to meet (peak or end-of-century) CO2 budget target prescribed via c_budgetCO2from2020. +*** If iterative_target_adj = 7 or 9, cm_peakBudgYr also adjusted. +***-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + + +if(cm_iterative_target_adj eq 5, +*JeS* Iteratively update regional CO2 tax trajectories / regional CO2 budget to reach the global emission budget (s45_actualbudgetco2 runs from 2020-2100, not peak budget) +*KK* for a time step of 5 years, the budget is calculated as 3 * 2020 + ts(2025-2090) + 8 * 2100; +*** 10-pm_ts("2090")/2 and pm_ts("2020")/2 are the time periods that haven't been taken into account in the sum over ttot. +*** 0.5 year of emissions is added for the two boundaries, such that the budget is calculated for 81 years. +s45_actualbudgetco2 = sum(ttot$(ttot.val le 2090 AND ttot.val > 2020), (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))) + + sum(regi, vm_emiTe.l("2100",regi,"co2") + vm_emiCdr.l("2100",regi,"co2") + vm_emiMac.l("2100",regi,"co2")) * sm_c_2_co2 * (10 - pm_ts("2090")/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); + +display s45_actualbudgetco2; + + if (cm_emiscen eq 6, + if(o_modelstat eq 2 AND ord(iteration) 0 AND abs(c_budgetCO2from2020 - s45_actualbudgetco2) ge 0.5, !!only for optimal iterations, and not after the last one, and only if budget still possitive, and only if target not yet reached + sm_globalBudget_dev = s45_actualbudgetco2 / c_budgetCO2from2020; +*** make sure that iteration converges: +*** use multiplicative for budgets higher than 1200 Gt; for lower budgets, use multiplicative adjustment only for first 3 iterations, + if(ord(iteration) lt 3 or c_budgetCO2from2020 > 1200, + !! change in CO2 price through adjustment: new price - old price; needed for adjustment option 2 + p45_taxCO2eq_anchor_iterationdiff(t) = pm_taxCO2eq(t,regi) * min(max((s45_actualbudgetco2/c_budgetCO2from2020)** (25/(2 * iteration.val + 23)),0.5+iteration.val/208),2 - iteration.val/102) - pm_taxCO2eq(t,regi); + pm_taxCO2eq(t,regi) = pm_taxCO2eq(t,regi) + p45_taxCO2eq_anchor_iterationdiff(t) ; +*** then switch to triangle-approximation based on last two iteration data points + else + !! change in CO2 price through adjustment: new price - old price; the two instances of "pm_taxCO2eq" cancel out -> only the difference term + p45_taxCO2eq_anchor_iterationdiff_tmp(t) = + max(p45_taxCO2eq_anchor_iterationdiff(t) * min(max((c_budgetCO2from2020 - s45_actualbudgetco2)/(s45_actualbudgetco2 - s45_actualbudgetco2_last),-2),2),-pm_taxCO2eq(t,regi)/2); + pm_taxCO2eq(t,regi) = pm_taxCO2eq(t,regi) + + max(p45_taxCO2eq_anchor_iterationdiff(t) * min(max((c_budgetCO2from2020 - s45_actualbudgetco2)/(s45_actualbudgetco2 - s45_actualbudgetco2_last),-2),2),-pm_taxCO2eq(t,regi)/2); + p45_taxCO2eq_anchor_iterationdiff(t) = p45_taxCO2eq_anchor_iterationdiff_tmp(t); + ); + o45_taxCO2eq_anchor_iterDiff_Itr(iteration) = p45_taxCO2eq_anchor_iterationdiff("2030"); + else + if(s45_actualbudgetco2 > 0 or abs(c_budgetCO2from2020 - s45_actualbudgetco2) < 2, !! if model was not optimal, or if budget already reached, keep tax constant + pm_taxCO2eq(t,regi) = pm_taxCO2eq(t,regi); + o45_taxCO2eq_anchor_iterDiff_Itr(iteration) = 0; + else +*** if budget has turned negative, reduce CO2 price by 20% + p45_taxCO2eq_anchor_iterationdiff(t) = -0.2*pm_taxCO2eq(t,regi); + pm_taxCO2eq(t,regi) = pm_taxCO2eq(t,regi) + p45_taxCO2eq_anchor_iterationdiff(t); + o45_taxCO2eq_anchor_iterDiff_Itr(iteration) = p45_taxCO2eq_anchor_iterationdiff("2030"); + ); + ); + display o45_taxCO2eq_anchor_iterDiff_Itr; + + pm_taxCO2eq(t,regi)$(t.val gt 2110) = pm_taxCO2eq("2110",regi); !! to prevent huge taxes after 2110 and the resulting convergence problems, set taxes after 2110 equal to 2110 value + display pm_taxCO2eq; + ); +); + + +*** --------------------------------------------------------------------------------------------------------------- +*** ENGAGE peakBudg formulation that works with several CO2 price path realizations of module 45 --------------------- +*** it results in a peak budget with zero net CO2 emissions afterwards +*** --------------------------------------------------------------------------------------------------------------- +if(cm_iterative_target_adj eq 7, +*JeS/CB* Iteratively update regional CO2 tax trajectories / regional CO2 budget to reach the target for global peak budget, but make sure CO2 emissions afterward are close to zero on the global level + + + +*KK* p45_actualbudgetco2 for ttot > 2020. It includes emissions from 2020 to ttot (including ttot). +*** (ttot.val - (ttot - 1).val)/2 and pm_ts("2020")/2 are the time periods that haven't been taken into account in the sum over ttot2. +*** 0.5 year of emissions is added for the two boundaries, such that the budget includes emissions in ttot. +p45_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); +s45_actualbudgetco2 = smax(t$(t.val le cm_peakBudgYr AND t.val le 2100),p45_actualbudgetco2(t)); + + + o45_peakBudgYr_Itr(iteration) = cm_peakBudgYr; + +display s45_actualbudgetco2; +display p45_actualbudgetco2; + + if (cm_emiscen eq 9, + if(o_modelstat eq 2 AND ord(iteration) 0 AND abs(c_budgetCO2from2020 - s45_actualbudgetco2) ge 0.5, !!only for optimal iterations, and not after the last one, and only if budget still possitive, and only if target not yet reached + display pm_taxCO2eq; +*** make sure that iteration converges: +*** use multiplicative for budgets higher than 1600 Gt; for lower budgets, use multiplicative adjustment only for first 3 iterations, + if(ord(iteration) lt 3 or c_budgetCO2from2020 > 1600, + !! change in CO2 price through adjustment: new price - old price; needed for adjustment option 2 + p45_taxCO2eq_anchor_iterationdiff(t) = pm_taxCO2eq(t,regi) * min(max((s45_actualbudgetco2/c_budgetCO2from2020)** (25/(2 * iteration.val + 23)),0.5+iteration.val/208),2 - iteration.val/102) - pm_taxCO2eq(t,regi); + pm_taxCO2eq(t,regi)$(t.val le cm_peakBudgYr) = pm_taxCO2eq(t,regi) + p45_taxCO2eq_anchor_iterationdiff(t) ; + p45_taxCO2eq_anchor_until2150(t) = p45_taxCO2eq_anchor_until2150(t) + p45_taxCO2eq_anchor_iterationdiff(t) ; +*** then switch to triangle-approximation based on last two iteration data points + else + !! change in CO2 price through adjustment: new price - old price; the two instances of "pm_taxCO2eq" cancel out -> only the difference term + !! until cm_peakBudgYr: expolinear price trajectory + p45_taxCO2eq_anchor_iterationdiff_tmp(t) = + max(p45_taxCO2eq_anchor_iterationdiff(t) * min(max((c_budgetCO2from2020 - s45_actualbudgetco2)/(s45_actualbudgetco2 - s45_actualbudgetco2_last),-2),2),-pm_taxCO2eq(t,regi)/2); + pm_taxCO2eq(t,regi)$(t.val le cm_peakBudgYr) = pm_taxCO2eq(t,regi) + + max(p45_taxCO2eq_anchor_iterationdiff(t) * min(max((c_budgetCO2from2020 - s45_actualbudgetco2)/(s45_actualbudgetco2 - s45_actualbudgetco2_last),-2),2),-pm_taxCO2eq(t,regi)/2); + p45_taxCO2eq_anchor_until2150(t) = p45_taxCO2eq_anchor_until2150(t) + + max(p45_taxCO2eq_anchor_iterationdiff(t) * min(max((c_budgetCO2from2020 - s45_actualbudgetco2)/(s45_actualbudgetco2 - s45_actualbudgetco2_last),-2),2),-p45_taxCO2eq_anchor_until2150(t)/2); + p45_taxCO2eq_anchor_iterationdiff(t) = p45_taxCO2eq_anchor_iterationdiff_tmp(t); + !! after cm_peakBudgYr: adjustment so that emissions become zero: increase/decrease tax in each time step after cm_peakBudgYr by percentage of that year's total CO2 emissions of 2015 emissions + ); + o45_taxCO2eq_anchor_iterDiff_Itr(iteration) = p45_taxCO2eq_anchor_iterationdiff("2030"); + display o45_taxCO2eq_anchor_iterDiff_Itr; + else + if(s45_actualbudgetco2 > 0 or abs(c_budgetCO2from2020 - s45_actualbudgetco2) < 2, !! if model was not optimal, or if budget already reached, keep tax constant + pm_taxCO2eq(t,regi) = pm_taxCO2eq(t,regi); + else +*** if budget has turned negative, reduce CO2 price by 20% + pm_taxCO2eq(t,regi) = 0.8*pm_taxCO2eq(t,regi); + p45_taxCO2eq_anchor_until2150(t) = 0.8*p45_taxCO2eq_anchor_until2150(t); + ); + ); +*** after cm_peakBudgYr: always adjust to bring emissions close to zero + pm_taxCO2eq(t,regi)$(t.val gt cm_peakBudgYr) = pm_taxCO2eq(t,regi) + pm_taxCO2eq(t,regi)*max(sum(regi2,vm_emiAll.l(t,regi2,"co2"))/sum(regi2,vm_emiAll.l("2015",regi2,"co2")),-0.75); + +*** check if cm_peakBudgYr is correct: if global emissions already negative, move cm_peakBudgYr forward +*** similar code block as used in iterative-adjust 9 below (credit to RP) + o45_diff_to_Budg(iteration) = (c_budgetCO2from2020 - s45_actualbudgetco2); + o45_totCO2emi_peakBudgYr(iteration) = sum(t$(t.val = cm_peakBudgYr), sum(regi2, vm_emiAll.l(t,regi2,"co2")) ); + o45_totCO2emi_allYrs(t,iteration) = sum(regi2, vm_emiAll.l(t,regi2,"co2") ); + o45_change_totCO2emi_peakBudgYr(iteration) = sum(ttot$(ttot.val = cm_peakBudgYr), (o45_totCO2emi_allYrs(ttot-1,iteration) - o45_totCO2emi_allYrs(ttot+1,iteration) )/4 ); !! Only gives a tolerance range, exact value not important. Division by 4 somewhat arbitrary - could be 3 or 5 as well. + + display cm_peakBudgYr, o45_diff_to_Budg, o45_peakBudgYr_Itr, o45_totCO2emi_allYrs, o45_totCO2emi_peakBudgYr, o45_change_totCO2emi_peakBudgYr; + +***if( sum(t,sum(regi2,vm_emiAll.l(t,regi2,"co2")$(t.val = cm_peakBudgYr))) < -0.1, +*** cm_peakBudgYr = tt.val(t - 1)$(t.val = cm_peakBudgYr); +***); + + if( abs(o45_diff_to_Budg(iteration)) < 20, !! only think about shifting peakBudgYr if the budget is close enough to target budget + display "close enough to target budget to check timing of peak year"; + loop(ttot$(ttot.val = cm_peakBudgYr), !! look at the peak timing +*** if( ( (o45_totCO2emi_peakBudgYr(iteration) < -(0.1 + o45_change_totCO2emi_peakBudgYr(iteration)) ) AND (cm_peakBudgYr > 2040) ), !! no peaking time before 2040 + if( ( (o45_totCO2emi_peakBudgYr(iteration) < -(0.1) ) AND (cm_peakBudgYr > 2040) ), !! no peaking time before 2040 + display "shift peakBudgYr left"; + o45_peakBudgYr_Itr(iteration+1) = pm_ttot_val(ttot - 1); +*** pm_taxCO2eq(t,regi)$(t.val gt pm_ttot_val(ttot - 1)) = p45_taxCO2eq_anchor_until2150(ttot-1) + (t.val - pm_ttot_val(ttot - 1)) * cm_taxCO2inc_after_peakBudgYr * sm_DptCO2_2_TDpGtC; !! increase by cm_taxCO2inc_after_peakBudgYr per year after peakBudgYr +*** if tax after cm_peakBudgYr is higher than normal increase rate (exceeding a 20% tolerance): shift right + elseif( ( sum(regi, sum(t2$(t2.val = pm_ttot_val(ttot+1)),pm_taxCO2eq(t2,regi))) > sum(regi,sum(t2$(t2.val = pm_ttot_val(ttot+1)),p45_taxCO2eq_anchor_until2150(t2)))*1.2 ) AND (cm_peakBudgYr < 2100) ), !! if peaking time would be after 2100, keep 2100 budget year + if( (iteration.val > 2) AND ( o45_peakBudgYr_Itr(iteration - 1) > o45_peakBudgYr_Itr(iteration) ) AND ( o45_peakBudgYr_Itr(iteration - 2) = o45_peakBudgYr_Itr(iteration) ) , !! if the target year was just shifted left after being shifted right + o45_peakBudgYr_Itr(iteration+1) = o45_peakBudgYr_Itr(iteration); !! don't shift right again immediately + else + display "shift peakBudgYr right"; + o45_peakBudgYr_Itr(iteration+1) = pm_ttot_val(ttot + 1); !! ttot+1 is the new peakBudgYr + loop(t$(t.val ge pm_ttot_val(ttot + 1)), + pm_taxCO2eq(t,regi) = p45_taxCO2eq_anchor_until2150(t); + ); + ); + + else !! don't do anything if the peakBudgYr is already at the corner values (2040, 2100) or if the emissions in the peakBudgYr are close to 0 + o45_peakBudgYr_Itr(iteration+1) = o45_peakBudgYr_Itr(iteration) + ); + ); + cm_peakBudgYr = o45_peakBudgYr_Itr(iteration+1); + display cm_peakBudgYr; + ); + + + + + + pm_taxCO2eq(t,regi)$(t.val gt 2110) = pm_taxCO2eq("2110",regi); !! to prevent huge taxes after 2110 and the resulting convergence problems, set taxes after 2110 equal to 2110 value + display pm_taxCO2eq; + ); +); + + +*** --------------------------------------------------------------------------------------------------------------- +*** new peakBudg formulation that works with several CO2 price path realizations of module 45 --------------------- +*** it results in a peak budget with linear increase by 2$/yr afterwards +*** --------------------------------------------------------------------------------------------------------------- + +if (cm_iterative_target_adj eq 9, +*' Update Iteratively update regional CO2 tax trajectories / regional CO2 budget to reach the target for global peak budget, with a linear increase afterwards given by `cm_taxCO2inc_after_peakBudgYr`. The +*' peak budget year is determined automatically (within the time window 2040--2100) + +*' `p45_actualbudgetco2(ttot)` includes emissions from 2020 to `ttot` (inclusive). + p45_actualbudgetco2(ttot)$( 2020 lt ttot.val ) + = sum((regi,ttot2)$( 2020 le ttot2.val AND ttot2.val le ttot.val ), + ( vm_emiTe.l(ttot2,regi,"co2") + + vm_emiCdr.l(ttot2,regi,"co2") + + vm_emiMac.l(ttot2,regi,"co2") + ) + * ( !! second half of the 2020 period: 2020-22 + (pm_ts(ttot2) / 2 + 0.5)$( ttot2.val eq 2020 ) + !! entire middle periods + + (pm_ts(ttot2))$( 2020 lt ttot2.val AND ttot2.val lt ttot.val ) + !! first half of the final period, until the end of the middle year + + ((pm_ttot_val(ttot) - pm_ttot_val(ttot-1)) / 2 + 0.5)$( + ttot2.val eq ttot.val ) + ) + ) + * sm_c_2_co2; + + s45_actualbudgetco2 = smax(t$( t.val le cm_peakBudgYr ), p45_actualbudgetco2(t)); + + o45_peakBudgYr_Itr(iteration) = cm_peakBudgYr; + + display s45_actualbudgetco2, p45_actualbudgetco2; + + if(cm_emiscen eq 9, + +*** --------A: calculate the new CO2 price path, the CO2 tax rescale factor---------------------------------------------------------- + + if(o_modelstat eq 2 AND ord(iteration) < cm_iteration_max AND s45_actualbudgetco2 > 0 AND abs(c_budgetCO2from2020 - s45_actualbudgetco2) ge 2, !!only for optimal iterations, and not after the last one, and only if budget still possitive, and only if target not yet reached + display pm_taxCO2eq; + + if( ( ( p45_actualbudgetco2("2100") > 1.1 * s45_actualbudgetco2 ) AND ( abs(c_budgetCO2from2020 - s45_actualbudgetco2) < 50 ) AND (iteration.val < 12) ), + display iteration; +*** if end-of-century budget is higher than budget at peak point, AND end-of-century budget is already in the range of the target budget (+/- 50 GtC), treat as end-of-century budget +*** for this iteration. Only do this rough approach (jump to 2100) for the first iterations - at later iterations the slower adjustment of the peaking time should work better + display "this is likely an end-of-century budget with no net negative emissions at all. Shift cm_peakBudgYr to 2100"; + s45_actualbudgetco2 = 0.5 * (p45_actualbudgetco2("2100") + s45_actualbudgetco2); !! due to the potential strong jump in cm_peakBudgYr, which implies that the CO2 price +*** will increase over a longer time horizon, take the average of the budget at the old peak time and the new peak time + cm_peakBudgYr = 2100; + ); + +*** --------A1: for that, calculate the CO2 tax rescale factor--- + + if(iteration.val lt 10, + p45_factorRescale_taxCO2(iteration) = max(0.1, (s45_actualbudgetco2/c_budgetCO2from2020) ) ** 3; + else + p45_factorRescale_taxCO2(iteration) = max(0.1, (s45_actualbudgetco2/c_budgetCO2from2020) ) ** 2; + ); + p45_factorRescale_taxCO2_Funneled(iteration) = + max(min( 2 * EXP( -0.15 * iteration.val ) + 1.01 ,p45_factorRescale_taxCO2(iteration)), + 1/ ( 2 * EXP( -0.15 * iteration.val ) + 1.01) + ); + + p45_taxCO2eq_anchor_iterationdiff(t) = max(1* sm_DptCO2_2_TDpGtC, pm_taxCO2eq(t,regi) * p45_factorRescale_taxCO2_Funneled(iteration) ) - pm_taxCO2eq(t,regi); + p45_taxCO2eq_anchor_until2150(t) = max(1* sm_DptCO2_2_TDpGtC, p45_taxCO2eq_anchor_until2150(t) * p45_factorRescale_taxCO2_Funneled(iteration) ); + pm_taxCO2eq(t,regi) = max(1* sm_DptCO2_2_TDpGtC, pm_taxCO2eq(t,regi) * p45_factorRescale_taxCO2_Funneled(iteration) ); !! rescale co2tax + loop(t2$(t2.val eq cm_peakBudgYr), + pm_taxCO2eq(t,regi)$(t.val gt cm_peakBudgYr) = p45_taxCO2eq_anchor_until2150(t2) + (t.val - t2.val) * cm_taxCO2inc_after_peakBudgYr * sm_DptCO2_2_TDpGtC; !! increase by cm_taxCO2inc_after_peakBudgYr per year + ); + + display p45_factorRescale_taxCO2, p45_factorRescale_taxCO2_Funneled; + + o45_taxCO2eq_anchor_iterDiff_Itr(iteration) = p45_taxCO2eq_anchor_iterationdiff("2030"); + + display o45_taxCO2eq_anchor_iterDiff_Itr; + + + else !! if(o_modelstat eq 2 AND ord(iteration) 0 AND abs(c_budgetCO2from2020 )) + if(s45_actualbudgetco2 > 0 or abs(c_budgetCO2from2020 - s45_actualbudgetco2) < 2, !! if model was not optimal, or if budget already reached, keep tax constant + p45_factorRescale_taxCO2(iteration) = 1; + p45_factorRescale_taxCO2_Funneled(iteration) = 1; + p45_taxCO2eq_anchor_until2150(t) = p45_taxCO2eq_anchor_until2150(t); !! nothing changes + else +*** if budget has turned negative, reduce CO2 price by 20% + p45_factorRescale_taxCO2(iteration) = 0.8; + p45_factorRescale_taxCO2_Funneled(iteration) = p45_factorRescale_taxCO2(iteration); + + p45_taxCO2eq_anchor_until2150(t) = p45_factorRescale_taxCO2(iteration) * p45_taxCO2eq_anchor_until2150(t); + pm_taxCO2eq(t,regi) = p45_factorRescale_taxCO2(iteration) * pm_taxCO2eq(t,regi); + ); + ); !! if(o_modelstat eq 2 AND ord(iteration) 0 AND abs(c_budgetCO2from2020 - s45_actualbudgetco2) ge 2, + + display pm_taxCO2eq, p45_taxCO2eq_anchor_until2150(t); + + +*** -------B: checking the peak timing, if cm_peakBudgYr is still correct or needs to be shifted----------------------- + + o45_diff_to_Budg(iteration) = (c_budgetCO2from2020 - s45_actualbudgetco2); + o45_totCO2emi_peakBudgYr(iteration) = sum(t$(t.val = cm_peakBudgYr), sum(regi2, vm_emiAll.l(t,regi2,"co2")) ); + o45_totCO2emi_allYrs(t,iteration) = sum(regi2, vm_emiAll.l(t,regi2,"co2") ); + +*RP* calculate how fast emissions are changing around the peaking time to get an idea how close it is possible to get to 0 due to the 5(10) year time steps + o45_change_totCO2emi_peakBudgYr(iteration) = sum(ttot$(ttot.val = cm_peakBudgYr), (o45_totCO2emi_allYrs(ttot-1,iteration) - o45_totCO2emi_allYrs(ttot+1,iteration) )/4 ); !! Only gives a tolerance range, exact value not important. Division by 4 somewhat arbitrary - could be 3 or 5 as well. + + display cm_peakBudgYr, o45_diff_to_Budg, o45_peakBudgYr_Itr, o45_totCO2emi_allYrs, o45_totCO2emi_peakBudgYr, o45_change_totCO2emi_peakBudgYr; + + +*** ----B1: check if cm_peakBudgYr should be shifted left or right: + if( abs(o45_diff_to_Budg(iteration)) < 20, !! only think about shifting peakBudgYr if the budget is close enough to target budget + display "close enough to target budget to check timing of peak year"; + + !! check if the target year was just shifted back left after being shifted right before + if ( (iteration.val > 2) AND ( o45_peakBudgYr_Itr(iteration - 1) > o45_peakBudgYr_Itr(iteration) ) AND ( o45_peakBudgYr_Itr(iteration - 2) = o45_peakBudgYr_Itr(iteration) ), + o45_pkBudgYr_flipflop(iteration) = 1; + display "flipflop observed (before loop)"; + ); + + loop(ttot$(ttot.val = cm_peakBudgYr), !! look at the peak timing + if( ( (o45_totCO2emi_peakBudgYr(iteration) < -(0.1 + o45_change_totCO2emi_peakBudgYr(iteration)) ) AND (cm_peakBudgYr > 2040) ), !! no peaking time before 2040 + display "shift peakBudgYr left"; + o45_peakBudgYr_Itr(iteration+1) = pm_ttot_val(ttot - 1); + pm_taxCO2eq(t,regi)$(t.val gt pm_ttot_val(ttot - 1)) = p45_taxCO2eq_anchor_until2150(ttot-1) + (t.val - pm_ttot_val(ttot - 1)) * cm_taxCO2inc_after_peakBudgYr * sm_DptCO2_2_TDpGtC; !! increase by cm_taxCO2inc_after_peakBudgYr per year after peakBudgYr + + elseif ( ( o45_totCO2emi_peakBudgYr(iteration) > (0.1 + o45_change_totCO2emi_peakBudgYr(iteration)) ) AND (cm_peakBudgYr < 2100) ), !! if peaking time would be after 2100, keep 2100 budget year + if( (o45_pkBudgYr_flipflop(iteration) eq 1), !! if the target year was just shifted left after being shifted right, and would now be shifted right again + display "peakBudgYr was left, right, left and is now supposed to be shifted right again -> flipflop, thus go into separate loop"; + o45_peakBudgYr_Itr(iteration+1) = o45_peakBudgYr_Itr(iteration); !! don't shift right again immediately, but go into a different loop: + o45_delay_increase_peakBudgYear(iteration) = 1; + elseif ( o45_delay_increase_peakBudgYear(iteration) eq 1 ), + display "still in separate loop trying to resolve flip-flop behavior"; + o45_peakBudgYr_Itr(iteration+1) = o45_peakBudgYr_Itr(iteration); !! keep current peakBudgYr, + else + display "shift peakBudgYr right"; + o45_peakBudgYr_Itr(iteration+1) = pm_ttot_val(ttot + 1); !! ttot+1 is the new peakBudgYr + loop(t$(t.val ge pm_ttot_val(ttot + 1)), + pm_taxCO2eq(t,regi) = p45_taxCO2eq_anchor_until2150(ttot+1) + + (t.val - pm_ttot_val(ttot + 1)) * cm_taxCO2inc_after_peakBudgYr * sm_DptCO2_2_TDpGtC; !! increase by cm_taxCO2inc_after_peakBudgYr per year + ); + ); + + else !! don't do anything if the peakBudgYr is already at the corner values (2040, 2100) or if the emissions in the peakBudgYr are close enough to 0 (within the range of +/- o45_change_totCO2emi_peakBudgYr) + o45_peakBudgYr_Itr(iteration+1) = o45_peakBudgYr_Itr(iteration) + ); + ); + cm_peakBudgYr = o45_peakBudgYr_Itr(iteration+1); + display cm_peakBudgYr; + ); + + pm_taxCO2eq(t,regi)$(t.val le cm_peakBudgYr) = p45_taxCO2eq_anchor_until2150(t); !! until peakBudgYr, take the contiuous price trajectory + +*** -----B2: if there was a flip-floping of cm_peakBudgYr in the previous iterations, try to overome this by adjusting the CO2 price path after the peaking year + if (o45_delay_increase_peakBudgYear(iteration) = 1, + display "not shifting peakBudgYr right, instead adjusting CO2 price for following year"; + loop(ttot$(ttot.val eq cm_peakBudgYr), !! set ttot to the current peakBudgYr + loop(t2$(t2.val eq pm_ttot_val(ttot+1)), !! set t2 to the following time step + o45_factorRescale_taxCO2_afterPeakBudgYr(iteration) = 1 + max(sum(regi2,vm_emiAll.l(ttot,regi2,"co2"))/sum(regi2,vm_emiAll.l("2015",regi2,"co2")),-0.75) ; + !! this was inspired by Christoph's approach. This value is 1 if emissions in the peakBudgYr are 0; goes down to 0.25 if emissions are <0 and approaching the size of 2015 emissions, and > 1 if emissions > 0. + + !! in case the normal linear extension still is not enough to get emissions to 0 after the peakBudgYr, shift peakBudgYr right again: + if( ( o45_reached_until2150pricepath(iteration-1) eq 1 ) AND ( o45_totCO2emi_peakBudgYr(iteration) > (0.1 + o45_change_totCO2emi_peakBudgYr(iteration)) ), + display "price in following year reached original path in previous iteration and is still not enough -> shift peakBudgYr to right"; + o45_delay_increase_peakBudgYear(iteration+1) = 0; !! probably is not necessary + o45_reached_until2150pricepath(iteration) = 0; + o45_peakBudgYr_Itr(iteration+1) = t2.val; !! shift PeakBudgYear to the following time step + pm_taxCO2eq(t2,regi) = p45_taxCO2eq_anchor_until2150(t2) ; !! set CO2 price in t2 to value in the "continuous path" + + elseif ( ( o45_reached_until2150pricepath(iteration-1) eq 1 ) AND ( o45_totCO2emi_peakBudgYr(iteration) < (0.1 + o45_change_totCO2emi_peakBudgYr(iteration)) ) ), + display "New intermediate price in timestep after cm_peakBudgYr is sufficient to stabilize peaking year - go back to normal loop"; + o45_delay_increase_peakBudgYear(iteration+1) = 0; !! probably is not necessary + o45_reached_until2150pricepath(iteration) = 0; + o45_peakBudgYr_Itr(iteration+1) = o45_peakBudgYr_Itr(iteration); + else !! either didn't reach the continued "until2150"-price path in last iteration, or the increase was high enough to get emissions to 0. + !! in this case, keep PeakBudgYr, and adjust the price in the year after the peakBudgYr to get emissions close to 0, + o45_delay_increase_peakBudgYear(iteration+1) = 1; !! make sure next iteration peakBudgYr is not shifted right again + o45_peakBudgYr_Itr(iteration+1) = o45_peakBudgYr_Itr(iteration); + pm_taxCO2eq(t2,regi) = max(pm_taxCO2eq(ttot,regi), !! at least as high as the price in the peakBudgYr + pm_taxCO2eq(t2,regi) * (o45_factorRescale_taxCO2_afterPeakBudgYr(iteration) / p45_factorRescale_taxCO2_Funneled(iteration) ) !! the full path was already rescaled by p45_factorRescale_taxCO2_Funneled, so adjust the second rescaling + ); + loop(regi, !! this loop is necessary to allow the <-comparison in the next if statement + if( p45_taxCO2eq_anchor_until2150(t2) < pm_taxCO2eq(t2,regi) , !! check if new price would be higher than the price if the peakBudgYr would be one timestep later + display "price increase reached price from path with cm_peakBudgYr one timestep later - downscale to 99%"; + pm_taxCO2eq(t2,regi) = 0.99 * p45_taxCO2eq_anchor_until2150(t2); !! reduce the new CO2 price to 99% of the price that it would be if the peaking year was one timestep later. The next iteration will show if this is enough, otherwise cm_peakBudgYr will be shifted right + o45_reached_until2150pricepath(iteration) = 1; !! upward CO2 price correction reached the continued price path - check in next iteration if this is high enough. + ); + ); + ); + + display o45_factorRescale_taxCO2_afterPeakBudgYr; + pm_taxCO2eq(t,regi)$(t.val gt t2.val) = pm_taxCO2eq(t2,regi) + (t.val - t2.val) * cm_taxCO2inc_after_peakBudgYr * sm_DptCO2_2_TDpGtC; !! increase by cm_taxCO2inc_after_peakBudgYr per year + + ); !! loop t2$(t2.val eq pm_ttot_val(ttot+1)), !! set t2 to the following time step + ); !! loop ttot$(ttot.val eq cm_peakBudgYr), !! set ttot to the current peakBudgYr + cm_peakBudgYr = o45_peakBudgYr_Itr(iteration+1); !! this has to happen outside the loop, otherwise the loop condition might be true twice + ); !! if o45_delay_increase_peakBudgYear(iteration) = 1, !! if there was a flip-floping in the previous iterations, try to solve this + + + + display o45_delay_increase_peakBudgYear, o45_reached_until2150pricepath, pm_taxCO2eq, o45_peakBudgYr_Itr, o45_pkBudgYr_flipflop, cm_peakBudgYr; + ); !! if cm_emiscen eq 9, +); !! if cm_iterative_target_adj eq 9, + +***------ end of "cm_iterative_target_adj" variants----------------------------------------- + +*** for having it available in next iteration, too: +s45_actualbudgetco2_last = s45_actualbudgetco2; + +****************************************************************** END OF CORE PART + +*** if CO2 price is iteratively adjusted (i.e. cm_iterative_target_adj != 0), + +*** re-create the linear carbon price trajectory for developed countries to ensure that it +*** starts at historical level given by cm_co2_tax_hist in year cm_year_co2_tax_hist, and +*** ends at the endogenously adjusted tax level in the peak year (with iterative_target_adj = 6|7|9) or in 2110 (otherwise) +if((cm_iterative_target_adj eq 6) or (cm_iterative_target_adj eq 7) or (cm_iterative_target_adj eq 9), + loop(regi$(p45_gdppcap2015_PPP(regi) gt 20), !! 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. + p45_CO2priceTrajDeveloped(t)$(t.val le cm_peakBudgYr) + = s45_co2_tax_hist + + (sum(t2$(t2.val eq cm_peakBudgYr), pm_taxCO2eq(t2,regi)) - s45_co2_tax_hist) / (cm_peakBudgYr - s45_year_co2_tax_hist) !! Yearly increase of CO2 price that interpolates between s45_co2_tax_hist in s45_year_co2_tax_hist and pm_taxCO2eq in peak year + * (t.val - s45_year_co2_tax_hist) ; + p45_CO2priceTrajDeveloped(t)$(t.val gt cm_peakBudgYr) = pm_taxCO2eq(t,regi); + ); + else + loop(regi$(p45_gdppcap2015_PPP(regi) gt 20), !! 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. + p45_CO2priceTrajDeveloped(t)$(t.val le 2110) + = s45_co2_tax_hist + + (pm_taxCO2eq("2110",regi) - s45_co2_tax_hist) / (2110 - s45_year_co2_tax_hist) !! Yearly increase of CO2 price that interpolates between s45_co2_tax_hist in s45_year_co2_tax_hist and pm_taxCO2eq in 2110 + * (t.val - s45_year_co2_tax_hist) ; + p45_CO2priceTrajDeveloped(t)$(t.val gt 2110) = pm_taxCO2eq(t,regi); + ); +); + + +***-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +*** Part III (Regional differentiation): Re-create regional carbon price trajectories p45_taxCO2eq_regiDiff using p45_taxCO2eq_anchor (updated in parts I-II above) and p45_regiDiff_convFactor (computed in datainput) +***-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +p45_taxCO2eq_regiDiff(t,regi) = p45_regiDiff_convFactor(t,regi) * p45_taxCO2eq_anchor(t); +display p45_taxCO2eq_regiDiff; + +***------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ +*** Part IV (Interpolation from path_gdx_ref): Re-create interpolation based on p45_taxCO2eq_regiDiff (updated in part III above) and p45_interpolation_exponent, p45_interpolation_startYr, p45_interpolation_endYr (computed in datainput) +***----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +*** Re-reate interpolation +loop(regi, + pm_taxCO2eq(t,regi)$(t.val lt p45_interpolation_startYr(regi)) = p45_taxCO2eq_path_gdx_ref(t,regi); + pm_taxCO2eq(t,regi)$((t.val ge p45_interpolation_startYr(regi)) and (t.val lt p45_interpolation_endYr(regi))) = + sum(t2$(t2.val eq p45_interpolation_startYr(regi)), p45_taxCO2eq_path_gdx_ref(t2,regi)) !! value of p45_taxCO2eq_path_gdx_ref in p45_interpolation_startYr + * (1 - rPower( (t.val - p45_interpolation_startYr(regi)) / (p45_interpolation_endYr(regi) - p45_interpolation_startYr(regi)), p45_interpolation_exponent(regi))) + + sum(t3$(t3.val eq p45_interpolation_endYr(regi)), p45_taxCO2eq_regiDiff(t3,regi)) !! value of p45_taxCO2eq_regiDiff in p45_interpolation_endYr + * rPower( (t.val - p45_interpolation_startYr(regi)) / (p45_interpolation_endYr(regi) - p45_interpolation_startYr(regi)), p45_interpolation_exponent(regi)) + pm_taxCO2eq(t,regi)$(t.val ge p45_interpolation_endYr(regi)) = p45_taxCO2eq_regiDiff(t,regi); +); +display pm_taxCO2eq; + +*** Re-introduce lower bound pm_taxCO2eq by p45_taxCO2eq_path_gdx_ref if switch cm_taxCO2_lowerBound_path_gdx_ref is on +$ifthen.lowerBound not "%cm_taxCO2_lowerBound_path_gdx_ref%" == "on" + pm_taxCO2eq(t,regi) = max(pm_taxCO2eq(t,regi), p45_taxCO2eq_path_gdx_ref(t,regi)); +$endIf.lowerBound +display pm_taxCO2eq; + +*** Save pm_taxCO2eq and p45_taxCO2eq_anchor over iterations for debugging +p45_taxCO2eq_iteration(iteration,ttot,regi) = pm_taxCO2eq(ttot,regi); +p45_taxCO2eq_anchor_iteration(iteration,t) = p45_taxCO2eq_anchor(t); + +); +*** EOF ./modules/45_carbonprice/functionalForm/postsolve.gms diff --git a/modules/45_carbonprice/functionalForm/realization.gms b/modules/45_carbonprice/functionalForm/realization.gms new file mode 100644 index 000000000..fefbf3d13 --- /dev/null +++ b/modules/45_carbonprice/functionalForm/realization.gms @@ -0,0 +1,45 @@ +*** | (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/functionalForm/realization.gms + +*' @description: Carbon price trajectory follows a prescribed functional form (linear/exponential) - either until peak year or until end-of-century - +*' and can be endogenously adjusted to meet CO2 budget targets - either peak or end-of-century - that are formulated in terms of total cumulated CO2 emissions from 2020 (c_budgetCO2from2020). +*' Flexible choices for regional carbon price differentiation. + +***-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +*** The realization uses a global anchor trajectory based on which the regional carbon price trajectories are defined. +*** Part I (Global anchor trajectory): The functional form (linear/exponential) of the global anchor trajectory is chosen via cm_taxCO2_functionalForm. +*** The (initial) carbon price in cm_startyear is chosen via cm_taxCO2_startyear. This value is endogenously adjusted to meet CO2 budget targets if cm_iterative_target_adj is set to 5, 7, or 9. +*** (linear): The linear curve is determined by the two points (cm_taxCO2_historicalYr, cm_taxCO2_historical) and (cm_startyear, cm_taxCO2_startyear). +*** By default, cm_taxCO2_historicalYr is the last timestep before cm_startyear, and cm_taxCO2_historical is the carbon price in that timestep in the reference run (path_gdx_ref) - computed as the maximum of pm_taxCO2eq over all regions. +*** (exponential): The exponential curve is determined by exponential growth rate (cm_taxCO2_expGrowth). +*** Part II (Post-peak behaviour): The global anchor trajectory can be adjusted after reaching the peak of global CO2 emissions in cm_peakBudgYr. +*** The (initial) choice of cm_peakBudgYr is endogenously adjusted if cm_iterative_target_adj is set to 7 or 9. +*** (with iterative_target_adj = 0): after cm_peakBudgYr, the global anchor trajectory increases linearly with fixed annual increase given by cm_taxCO2_IncAfterPeakBudgYr (default = 0, i.e. constant), +*** set cm_peakBudgYr = 2110 to avoid adjustment +*** (with iterative_target_adj = 5): no adjustment to the functional form after cm_peakBudgYr +*** (with iterative_target_adj = 7): after cm_peakBudgYr, the global anchor trajectory is adjusted so that global net CO2 emissions stay close to zero +*** (with iterative_target_adj = 9): after cm_peakBudgYr, the global anchor trajectory increases linearly with fixed annual increase given by cm_taxCO2_IncAfterPeakBudgYr (default = 0, i.e. constant) +*** Part III (Regional differentiation): Regional carbon price differentiation relative to global anchor trajectory is chosen via cm_taxCO2_regiDiff. +*** (none): No regional differetiation, i.e. uniform carbon pricing +*** (initialSpread10): Maximal initial spread of carbon prices in 2030 between OECD regions and poorest region is equal to 10. Initial spread for each region determined based on GDP per capita (PPP) in 2015. Carbon prices converge using quadratic phase-in until cm_taxCO2_regiDiff_endYr (default = 2050). +*** (initialSpread20): Maximal initial spread of carbon prices in 2030 between OECD regions and poorest region is equal to 20. Initial spread for each region determined based on GDP per capita (PPP) in 2015. Carbon prices converge using quadratic phase-in until cm_taxCO2_regiDiff_endYr (default = 2050). +*** (gdpSpread): Regional differentiation based on GDP per capita (PPP) throughout the century. Uses current GDP per capita (PPP) of OECD countries - around 50'000 US$2017 - as threshold for application of full carbon price. +*** Part IV (Interpolation from path_gdx_ref): To smoothen a potential jump of carbon prices in cm_startyear, an interpolation between (a) the carbon prices before cm_startyear procided by path_gdx_ref and (b) the carbon prices from cm_startyear onward defined by parts I-III can be chosen via cm_taxCO2_interpolation +*** (off): no interpolation, i.e. (b) is used from cm_startyear onward +*** (one_step): linear interpolation within 10 years between (a) and (b). For example, if cm_startyear = 2030, it uses (a) until 2025, the average of (a) and (b) in 2030, and (b) from 2035. +*** (two_steps): linear interpolation within 15 years between (a) and (b). For example, if cm_startyear = 2030, it uses (a) until 2025, weighted averages of (a) and (b) in 2030 and 2035, and (b) from 2040. +*** For manual settings, see description of the switch +***-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +*####################### R SECTION START (PHASES) ############################## +$Ifi "%phase%" == "declarations" $include "./modules/45_carbonprice/functionalForm/declarations.gms" +$Ifi "%phase%" == "datainput" $include "./modules/45_carbonprice/functionalForm/datainput.gms" +$Ifi "%phase%" == "postsolve" $include "./modules/45_carbonprice/functionalForm/postsolve.gms" +*######################## R SECTION END (PHASES) ############################### + +*** EOF ./modules/45_carbonprice/functionalForm/realization.gms diff --git a/modules/45_carbonprice/module.gms b/modules/45_carbonprice/module.gms index dd45e9903..ba9a1a79e 100644 --- a/modules/45_carbonprice/module.gms +++ b/modules/45_carbonprice/module.gms @@ -9,27 +9,26 @@ *' @title Carbonprice *' *' @description -*' The carbonprice module sets (exogenously given price path or predefined level in start year and linear/exponential increase afterwards) -*' or adjusts carbon price trajectories between iterations s.t. the desired climate policy targets are met. The carbon price is the main indicator -*' to reflect the increase in climate policy ambition over time. +*' The carbonprice module sets or adjusts carbon price trajectories between iterations s.t. the desired climate policy targets are met. +*' Carbon price trajectories either (a) follow a prescribed funtional form (linear/exponential), (b) relect NPi or NDC targets, or (c) are set exogenously. +*' The carbon price is the main indicator to reflect the change in climate policy ambition over time. *' Carbon prices are potentially defined by three modules: *' - 45_carbonprice: define the carbon price necessary to reach global emission targets following specific price trajectories. *' - 46_carbonpriceRegi: add a markup pm_taxCO2eqRegi to 45_carbonprice estimations to reach specific NDC or net zero targets *' - 47_regipol: under the regiCarbonPrice realisation, define more detailed region or emissions market specific targets, overwriting the all other carbon prices for selected regions. -*' @authors Christoph Bertram, Gunnar Luderer, Robert Pietzcker +*' @authors Christoph Bertram, Laurin Koehler-Schindler, Gunnar Luderer, Rahel Mandaroux, Robert Pietzcker, Oliver Richters *###################### R SECTION START (MODULETYPES) ########################## +$Ifi "%carbonprice%" == "functionalForm" $include "./modules/45_carbonprice/functionalForm/realization.gms" +$Ifi "%carbonprice%" == "exogenous" $include "./modules/45_carbonprice/exogenous/realization.gms" +$Ifi "%carbonprice%" == "expoLinear" $include "./modules/45_carbonprice/expoLinear/realization.gms" $Ifi "%carbonprice%" == "NDC" $include "./modules/45_carbonprice/NDC/realization.gms" +$Ifi "%carbonprice%" == "none" $include "./modules/45_carbonprice/none/realization.gms" $Ifi "%carbonprice%" == "NPi" $include "./modules/45_carbonprice/NPi/realization.gms" $Ifi "%carbonprice%" == "NPi2025_EUR55" $include "./modules/45_carbonprice/NPi2025_EUR55/realization.gms" $Ifi "%carbonprice%" == "NPiexpo" $include "./modules/45_carbonprice/NPiexpo/realization.gms" -$Ifi "%carbonprice%" == "diffExp2Lin" $include "./modules/45_carbonprice/diffExp2Lin/realization.gms" -$Ifi "%carbonprice%" == "diffLin2Lin" $include "./modules/45_carbonprice/diffLin2Lin/realization.gms" -$Ifi "%carbonprice%" == "exogenous" $include "./modules/45_carbonprice/exogenous/realization.gms" -$Ifi "%carbonprice%" == "expoLinear" $include "./modules/45_carbonprice/expoLinear/realization.gms" -$Ifi "%carbonprice%" == "none" $include "./modules/45_carbonprice/none/realization.gms" $Ifi "%carbonprice%" == "temperatureNotToExceed" $include "./modules/45_carbonprice/temperatureNotToExceed/realization.gms" *###################### R SECTION END (MODULETYPES) ############################ *** EOF ./modules/45_carbonprice/module.gms From a7523ccf5aa6dc327e8952eb38e9a19052550b7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laurin=20K=C3=B6hler-Schindler?= Date: Fri, 1 Nov 2024 20:23:14 +0100 Subject: [PATCH 2/3] Second iteration of 45_carbonprice refactoring --- config/scenario_config.csv | 82 +++--- core/datainput.gms | 4 + core/declarations.gms | 2 + main.gms | 48 ++-- modules/45_carbonprice/NDC/not_used.txt | 20 +- modules/45_carbonprice/NPi/not_used.txt | 20 +- .../NPi2025_EUR55/datainput.gms | 4 +- .../45_carbonprice/NPi2025_EUR55/not_used.txt | 18 +- modules/45_carbonprice/NPiexpo/datainput.gms | 2 +- modules/45_carbonprice/NPiexpo/not_used.txt | 18 +- modules/45_carbonprice/exogenous/not_used.txt | 20 +- .../45_carbonprice/expoLinear/datainput.gms | 18 +- .../expoLinear/declarations.gms | 4 +- .../45_carbonprice/expoLinear/not_used.txt | 17 +- .../functionalForm/datainput.gms | 15 +- .../functionalForm/declarations.gms | 9 +- .../functionalForm/not_used.txt | 3 - .../functionalForm/postsolve.gms | 250 ++++++++---------- modules/45_carbonprice/module.gms | 8 +- modules/45_carbonprice/none/not_used.txt | 20 +- .../temperatureNotToExceed/not_used.txt | 20 +- modules/80_optimization/nash/postsolve.gms | 6 +- modules/80_optimization/negishi/not_used.txt | 6 +- .../80_optimization/testOneRegi/not_used.txt | 6 +- modules/81_codePerformance/on/presolve.gms | 8 +- scripts/start/checkFixCfg.R | 4 + scripts/start/readCheckScenarioConfig.R | 16 +- tests/testthat/test_01-checkFixCfg.R | 4 +- 28 files changed, 355 insertions(+), 297 deletions(-) diff --git a/config/scenario_config.csv b/config/scenario_config.csv index db03d2c2c..5696d9027 100644 --- a/config/scenario_config.csv +++ b/config/scenario_config.csv @@ -1,41 +1,41 @@ -title;start;CES_parameters;slurmConfig;regionmapping;extramappings_historic;cm_rcp_scen;cm_iterative_target_adj;subsidizeLearning;c_budgetCO2from2020;carbonprice;cm_co2_tax_startyear;cm_peakBudgYr;cm_co2_tax_spread;cm_CO2priceRegConvEndYr;cm_emiscen;c_regi_earlyreti_rate;c_tech_earlyreti_rate;cm_fetaxscen;cm_co2_tax_growth;cm_bioenergy_SustTax;cm_33EW;cm_33OAE;cm_33_OAE_eff;cm_33_OAE_scen;cm_frac_NetNegEmi;c_ccsinjecratescen;c_ccscapratescen;c_changeProdCost;cm_CESMkup_build;cm_CESMkup_ind;cm_CESMkup_ind_data;cm_wasteIncinerationCCSshare;techpol;regipol;cm_implicitQttyTarget;cm_emiMktTarget;cm_NucRegiPol;cm_CoalRegiPol;cm_altFeEmiFac;cm_POPscen;cm_GDPscen;cm_demScen;cm_oil_scen;cm_gas_scen;cm_coal_scen;c_techAssumptScen;cm_nucscen;cm_so2tax_scen;cm_multigasscen;cm_LU_emi_scen;cm_tradecostBio;cm_1stgen_phaseout;c_SSP_forcing_adjust;cm_APscen;cm_EDGEtr_scen;cm_startyear;path_gdx;path_gdx_ref;path_gdx_bau;path_gdx_refpolicycost;description -# H12 SSP2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -SSP2-NPi-calibrate;calibrate,AMT,compileInTests;calibrate;14;;;rcp45;;;0;NPi;;;;;9;;;;;;;;;;;;;;;;;;NPi2018;regiCarbonPrice;;;on;on;EUR_regi, NEU_regi;;;;;;;;;;3;;;;;;Mix1;2005;;;;;SSP2-NPi-calibrate: This reference policy/baseline scenario follows the Shared Socioeconomic Pathways 2 called Middle of the Road. -SSP2-NDC;1,AMT,2;;;;;rcp45;3;globallyOptimal;0;NDC;;;;;9;;;;;;;;;;;;;;;;;;NDC;regiCarbonPrice;2030.EUR_regi.tax.t.FE_wo_b_wo_n_e.all 1.2809;2020.2030.EUR_regi.all.year.netGHG_LULUCFGrassi 2.450;on;on;EUR_regi, NEU_regi;;;;;;;;;;3;;;;;;Mix2;2030;;SSP2-NPi;SSP2-NPi;SSP2-NPi;SSP2-NDC: This Nationally Determined Contribution (NDC) scenario follows the Shared Socioeconomic Pathways 2 called Middle of the Road. The NDC includes all pledged policies even if not yet implemented. It assumes that the moderate and heterogeneous climate ambition reflected in the NDCs at the begining of 2021 continues over the 21st century. -SSP2-NPi;1,AMT,compileInTests,2;;;;;rcp45;3;;0;NPi;;;;;9;;;;;;;;;;;;;;;;;;NPi2018;regiCarbonPrice;;;on;on;EUR_regi, NEU_regi;;;;;;;;;;3;;;;;;Mix1;2005;;;;;SSP2-NPi: This National Policies Implemented (NPi) scenario follows the Shared Socioeconomic Pathways 2 called Middle of the Road. The NPi assumes that policies fail to achieve NDC targets in 2030. Instead, carbon prices are assumed to grow and converge more slowly, leading to emissions trajectories in line with bottom-up studies on the effect of currently implemented policies. -SSP2-PkBudg500;1,AMT,2;;;;;rcp20;9;globallyOptimal;500;diffLin2Lin;200;2045;;;9;;;;;;;;;;;;;1;;;;2050.GLO 0.9;NDC;regiCarbonPrice;2030.EUR_regi.tax.t.FE_wo_b_wo_n_e.all 1.2809;;on;on;EUR_regi, NEU_regi;;;;;;;;;;;;;;;;Mix4ICEban;2030;;SSP2-NPi;;SSP2-NPi;SSP2-PkBudg500: This climate policy scenario follows the Shared Socioeconomic Pathways 2 called Middle of the Road. The stylized climate policy scenario assumes a peak budget of 500 Gt CO2 on total CO2 emissions from 2015 to 2100. This is a 1.5C scenario, peak warming is allowed to be well below 1.5C at median climate sensitivity but returns to values below 1.5C in at least 67 % of scenarios by the end of the century. -SSP2-PkBudg650;1,AMT,2;;;;;rcp20;9;globallyOptimal;650;diffLin2Lin;75;2055;;;9;;;;;;;;;;;;;1;;;;2050.GLO 0.9;NDC;regiCarbonPrice;2030.EUR_regi.tax.t.FE_wo_b_wo_n_e.all 1.2809;;on;on;EUR_regi, NEU_regi;;;;;;;;;;;;;;;;Mix4ICEban;2030;;SSP2-NPi;;SSP2-NPi;SSP2-PkBudg650: This climate policy scenario follows the Shared Socioeconomic Pathways 2 called Middle of the Road. The stylized climate policy scenario assumes a peak budget of 650 Gt CO2 on total CO2 emissions from 2015 to 2100. This is a 1.5C scenario, peak warming is allowed to be at or slightly above 1.5C at median climate sensitivity but returns to values below 1.5C in at least 67 % of scenarios by the end of the century. -SSP2-PkBudg1000;1,AMT,2;;;;;rcp26;9;globallyOptimal;1000;diffLin2Lin;45;2080;;;9;;;;;;;;;;;;;1;;;;2050.GLO 0.5;NDC;regiCarbonPrice;2030.EUR_regi.tax.t.FE_wo_b_wo_n_e.all 1.2809;;on;on;EUR_regi, NEU_regi;;;;;;;;;;;;;;;;Mix3ICEban;2030;;SSP2-NPi;;SSP2-NPi;SSP2-PkBudg1050: This climate policy scenario follows the Shared Socioeconomic Pathways 2 called Middle of the Road. The stylized climate policy scenario assumes a peak budget of 1150 Gt CO2 on total CO2 emissions from 2015 to 2100. This is a well below 2C scenario at median climate sensitivity but returns to values below 2C in at least 67 % of scenarios during the whole century. -SSP2-EcBudg400;1,AMT,2;;;;;rcp26;5;globallyOptimal;400;diffExp2Lin;70;;20;2070;9;;;;;;1;1;0.9;0;0;;;1;;;;2060.GLO 0.9;NDC;regiCarbonPrice;;;on;on;EUR_regi, NEU_regi;;;;;;;;;;;;;;;;Mix3ICEban;2035;;SSP2-NPi;;SSP2-NPi;SSP2-EcBudg400: This climate policy scenario follows the Shared Socioeconomic Pathways 2 called Middle of the Road. The stylized climate policy scenario assumes an end-of-century budget of 400 Gt CO2 on total CO2 emissions from 2020 to 2100. This is a high overshoot scenario with delayed climate policy. -# EU21 SSP2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -SSP2-EU21-NPi-calibrate;calibrate;calibrate;14;./config/regionmapping_21_EU11.csv;./config/extramapping_EU27.csv;rcp45;;;0;NPi;;;;;9;;;;;;;;;;;;;;;;;;NPi2018;regiCarbonPrice;;;on;on;EUR_regi, NEU_regi;;;;;;;;;;3;;;;;;Mix1;2005;;;;;SSP2-EU21-calibration: This baseline scenario follows the Shared Socioeconomic Pathways 2 called Middle of the Road. -SSP2-EU21-Base;1,AMT,compileInTests,2;;;./config/regionmapping_21_EU11.csv;./config/extramapping_EU27.csv;;;;0;;;;;;;;off;;;;;;;;;;;;;;;;;;;;;;EUR_regi, NEU_regi;;;;;;;;;;;;;;;;Mix1;2005;;;;;SSP2-EU21-Base: This baseline calibration scenario follows the Shared Socioeconomic Pathways 2 called Middle of the Road. -SSP2-EU21-NDC;1,AMT,2;;;./config/regionmapping_21_EU11.csv;./config/extramapping_EU27.csv;rcp45;3;globallyOptimal;0;NDC;;;;;9;;;;;;;;;;;;;;;;;;NDC;regiCarbonPrice;2030.EUR_regi.tax.t.FE_wo_b_wo_n_e.all 1.2809;2020.2030.EUR_regi.all.year.netGHG_LULUCFGrassi 2.450;on;on;EUR_regi, NEU_regi;;;;;;;;;;3;;;;;;Mix2;2030;;SSP2-EU21-NPi;SSP2-EU21-NPi;SSP2-EU21-NPi;SSP2-EU21-NDC: This Nationally Determined Contribution (NDC) scenario follows the Shared Socioeconomic Pathways 2 called Middle of the Road. The NDC includes all pledged policies even if not yet implemented. It assumes that the moderate and heterogeneous climate ambition reflected in the NDCs at the begining of 2021 continues over the 21st century. -SSP2-EU21-NPi;1,AMT,2;;;./config/regionmapping_21_EU11.csv;./config/extramapping_EU27.csv;rcp45;3;;0;NPi;;;;;9;;;;;;;;;;;;;;;;;;NPi2018;regiCarbonPrice;;;on;on;EUR_regi, NEU_regi;;;;;;;;;;3;;;;;;Mix1;2005;;;;;SSP2-EU21-NPi: This National Policies Implemented (NPi) scenario follows the Shared Socioeconomic Pathways 2 called Middle of the Road. The NPi assumes that policies fail to achieve NDC targets in 2030. Instead, carbon prices are assumed to grow and converge more slowly, leading to emissions trajectories in line with bottom-up studies on the effect of currently implemented policies. -SSP2-EU21-PkBudg500;1,AMT,2;;;./config/regionmapping_21_EU11.csv;./config/extramapping_EU27.csv;rcp20;9;globallyOptimal;500;diffLin2Lin;200;2045;;;9;;;;;;;;;;;;;1;;;;2050.GLO 0.9;NDC;regiCarbonPrice;2030.EUR_regi.tax.t.FE_wo_b_wo_n_e.all 1.2809;;on;on;EUR_regi, NEU_regi;;;;;;;;;;;;;;;;Mix4ICEban;2030;;SSP2-EU21-NPi;;SSP2-EU21-NPi;SSP2-EU21-PkBudg500: This climate policy scenario follows the SSP2. The stylized climate policy scenario assumes a peak budget of 500 Gt CO2 on total CO2 emissions from 2015 to 2100. This is a 1.5C scenario, peak warming is allowed to be at or slightly above 1.5C at median climate sensitivity but returns to values below 1.5C in at least 67 % of scenarios by the end of the century. -SSP2-EU21-PkBudg650;1,AMT,2;;;./config/regionmapping_21_EU11.csv;./config/extramapping_EU27.csv;rcp20;9;globallyOptimal;650;diffLin2Lin;75;2055;;;9;;;;;;;;;;;;;1;;;;2050.GLO 0.9;NDC;regiCarbonPrice;2030.EUR_regi.tax.t.FE_wo_b_wo_n_e.all 1.2809;;on;on;EUR_regi, NEU_regi;;;;;;;;;;;;;;;;Mix4ICEban;2030;;SSP2-EU21-NPi;;SSP2-EU21-NPi;SSP2-EU21-PkBudg650: This climate policy scenario follows the SSP2. The stylized climate policy scenario assumes a peak budget of 650 Gt CO2 on total CO2 emissions from 2015 to 2100. This is a 1.5C scenario, peak warming is allowed to be at or slightly above 1.5C at median climate sensitivity but returns to values below 1.5C in at least 67 % of scenarios by the end of the century. -SSP2-EU21-PkBudg1000;1,AMT,2;;;./config/regionmapping_21_EU11.csv;./config/extramapping_EU27.csv;rcp26;9;globallyOptimal;1000;diffLin2Lin;45;2080;;;9;;;;;;;;;;;;;1;;;;2050.GLO 0.5;NDC;regiCarbonPrice;2030.EUR_regi.tax.t.FE_wo_b_wo_n_e.all 1.2809;;on;on;EUR_regi, NEU_regi;;;;;;;;;;;;;;;;Mix3ICEban;2030;;SSP2-EU21-NPi;;SSP2-EU21-NPi;SSP2-EU21-PkBudg1050: This climate policy scenario follows the SSP2. The stylized climate policy scenario assumes a peak budget of 1050 Gt CO2 on total CO2 emissions from 2015 to 2100. This is a well below 2C scenario at median climate sensitivity but returns to values below 2C in at least 67 % of scenarios during the whole century. -# H12 SSP3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -SSP3-NPi-calibrate;calibrate;calibrate;14;;;rcp45;;;0;NPi;;;;;9;;;1;;;;;;;;;;;;;;;NPi2018;regiCarbonPrice;;;on;on;EUR_regi, NEU_regi;pop_SSP3;gdp_SSP3;gdp_SSP3;;;highCoal;;;0;3;SSP3;1.5;;forcing_SSP3;;Mix1;2005;;;;;SSP3-NPi-calibrate: This reference policy/baseline scenario follows the Shared Socioeconomic Pathways 3 called High. -SSP3-NDC;0;;;;;rcp45;3;;0;NDC;;;;;9;;;1;;;;;;;;;;;;;;;NDC;regiCarbonPrice;2030.EUR_regi.tax.t.FE_wo_b_wo_n_e.all 1.2809;2020.2030.EUR_regi.all.year.netGHG_LULUCFGrassi 2.450;on;on;EUR_regi, NEU_regi;pop_SSP3;gdp_SSP3;gdp_SSP3;;;highCoal;;;0;3;SSP3;1.5;;forcing_SSP3;;Mix2;2030;;SSP2-NPi;SSP3-NPi;SSP3-NPi;SSP3-NDC: This Nationally Determined Contribution (NDC) scenario follows the Shared Socioeconomic Pathways 3 called High. The NDC includes all pledged policies even if not yet implemented. It assumes that the moderate and heterogeneous climate ambition reflected in the NDCs at the begining of 2021 continues over the 21st century. -SSP3-NPi;0;;;;;rcp45;3;;0;NPi;;;;;9;;;1;;;;;;;;;;;;;;;NPi2018;regiCarbonPrice;;;on;on;EUR_regi, NEU_regi;pop_SSP3;gdp_SSP3;gdp_SSP3;;;highCoal;;;0;3;SSP3;1.5;;forcing_SSP3;;Mix1;2005;;;;;SSP3-NPi: This National Policies Implemented (NPi) scenario follows the Shared Socioeconomic Pathways 3 called High. The NPi assumes that policies fail to achieve NDC targets in 2030. Instead, carbon prices are assumed to grow and converge more slowly, leading to emissions trajectories in line with bottom-up studies on the effect of currently implemented policies. -SSP3-PkBudg1000;0;;;;;rcp26;9;;1000;diffLin2Lin;45;2080;;2100;9;;;1;;;;;;;;;;1;;;;2050.GLO 0.5;NDC;regiCarbonPrice;2030.EUR_regi.tax.t.FE_wo_b_wo_n_e.all 1.2809;;on;on;EUR_regi, NEU_regi;pop_SSP3;gdp_SSP3;gdp_SSP3;;;highCoal;;;0;;SSP3;1.5;;forcing_SSP3;;Mix3ICEban;2030;;SSP2-NPi;;;SSP3-PkBudg1050: This climate policy scenario follows the Shared Socioeconomic Pathways 3 called High. The stylized climate policy scenario assumes a peak budget of 1150 Gt CO2 on total CO2 emissions from 2015 to 2100. This is a well below 2C scenario at median climate sensitivity but returns to values below 2C in at least 67 % of scenarios during the whole century. -SSP3-rollBack;0;;;;;rcp45;9;;;NPiexpo;;;;;9;;;1;0.9;;;;;;;;;;;;;;NPi2018;regiCarbonPrice;;;on;on;EUR_regi, NEU_regi;pop_SSP3;gdp_SSP3;gdp_SSP3;;;highCoal;;;0;;SSP3;1.5;;forcing_SSP3;;Mix1;2030;;SSP2-NPi;;; -# H12 SSP1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -SSP1-NPi-calibrate;calibrate;calibrate;14;;;rcp45;;;0;NPi;;;;;9;GLO 0.12, EUR_regi 0.15;;2;1.025;1.75;;;;;;2;;;;;;;NPi2018;regiCarbonPrice;;;on;on;EUR_regi, NEU_regi;pop_SSP1;gdp_SSP1;gdp_SSP1;lowOil;lowGas;lowCoal;2;;4;3;SDP;0.5;1;forcing_SSP1;MFR;Mix1;2005;;;;;SSP1-calibration: This baseline calibration scenario follows the Shared Socioeconomic Pathways 1 called Sustainability. -SSP1-NDC;1,AMT,compileInTests;;;;;rcp45;3;globallyOptimal;0;NDC;;;;;9;GLO 0.12, EUR_regi 0.16;;2;1.025;1.75;;;;;;2;;;;;;;NDC;regiCarbonPrice;2030.EUR_regi.tax.t.FE_wo_b_wo_n_e.all 1.2809;2020.2030.EUR_regi.all.year.netGHG_LULUCFGrassi 2.450;on;on;EUR_regi, NEU_regi;pop_SSP1;gdp_SSP1;gdp_SSP1;lowOil;lowGas;lowCoal;2;;4;3;SDP;0.5;1;forcing_SSP1;MFR;Mix2;2030;;SSP2-NPi;SSP1-NPi;SSP1-NPi;SSP1-NDC: This Nationally Determined Contribution (NDC) scenario follows the Shared Socioeconomic Pathways 1 called Sustainability. The NDC includes all pledged policies even if not yet implemented. It assumes that the moderate and heterogeneous climate ambition reflected in the NDCs at the begining of 2021 continues over the 21st century. -SSP1-NPi;1,AMT;;;;;rcp45;3;;0;NPi;;;;;9;GLO 0.12, EUR_regi 0.15;;2;1.025;1.75;;;;;;2;;;;;;;NPi2018;regiCarbonPrice;;;on;on;EUR_regi, NEU_regi;pop_SSP1;gdp_SSP1;gdp_SSP1;lowOil;lowGas;lowCoal;2;;4;3;SDP;0.5;1;forcing_SSP1;MFR;Mix1;2005;;;;;SSP1-NPi: This National Policies Implemented (NPi) scenario follows the Shared Socioeconomic Pathways 1 called Sustainability. The NPi assumes that policies fail to achieve NDC targets in 2030. Instead, carbon prices are assumed to grow and converge more slowly, leading to emissions trajectories in line with bottom-up studies on the effect of currently implemented policies. -SSP1-PkBudg650;1,AMT;;;;;rcp20;9;globallyOptimal;650;diffLin2Lin;75;2055;;;9;GLO 0.12, EUR_regi 0.16;;2;1.025;1.75;;;;;;2;;1;feelhpb 1.05, fehob 1.75, feheb 0.1;manual;feh2_otherInd 1.04, feelhth_otherInd 0.4, feh2_cement 2.0, feelhth_chemicals 1.3, feh2_chemicals 1.04;2050.GLO 0.9;NDC;regiCarbonPrice;2030.EUR_regi.tax.t.FE_wo_b_wo_n_e.all 1.2809;;on;on;EUR_regi, NEU_regi;pop_SSP1;gdp_SSP1;gdp_SSP1;lowOil;lowGas;lowCoal;2;;4;;SDP;0.5;1;forcing_SSP1;MFR;Mix4ICEban;2030;;SSP2-NPi;;;SSP1-PkBudg650: This climate policy scenario follows the Shared Socioeconomic Pathways 1 called Sustainability. The stylized climate policy scenario assumes a peak budget of 650 Gt CO2 on total CO2 emissions from 2015 to 2100. This is a 1.5C scenario, peak warming is allowed to be at or slightly above 1.5C at median climate sensitivity but returns to values below 1.5C in at least 67 % of scenarios by the end of the century. -SSP1-PkBudg1000;1,AMT;;;;;rcp26;9;globallyOptimal;1000;diffLin2Lin;45;2080;;;9;GLO 0.12, EUR_regi 0.16;;2;1.025;1.75;;;;;;2;;1;;;;2050.GLO 0.5;NDC;regiCarbonPrice;2030.EUR_regi.tax.t.FE_wo_b_wo_n_e.all 1.2809;;on;on;EUR_regi, NEU_regi;pop_SSP1;gdp_SSP1;gdp_SSP1;lowOil;lowGas;lowCoal;2;;4;;SDP;0.5;1;forcing_SSP1;MFR;Mix3ICEban;2030;;SSP2-NPi;;;SSP1-PkBudg1050: This climate policy scenario follows the Shared Socioeconomic Pathways 1 called Sustainability. The stylized climate policy scenario assumes a peak budget of 1050 Gt CO2 on total CO2 emissions from 2015 to 2100. This is a well below 2C scenario at median climate sensitivity but returns to values below 2C in at least 67 % of scenarios during the whole century. -# H12 SSP2 lowEnergy;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -SSP2_lowEn-NPi-calibrate;calibrate;calibrate;14;;;rcp45;;;0;NPi;;;;;9;;;;;;;;;;;;;;;;;;NPi2018;regiCarbonPrice;;;on;on;EUR_regi, NEU_regi;;;gdp_SSP2_lowEn;;;;;;;3;;;;;;Mix1;2005;;;;;SSP2_lowEn-calibration: This baseline scenario follows the Shared Socioeconomic Pathways 2 called Middle of the Road. This scenario also assumes low energy demand trajectories. -SSP2_lowEn-NDC;1,AMT;;;;;rcp45;3;globallyOptimal;0;NDC;;;;;9;;;;;;;;;;;;;;;;;;NDC;regiCarbonPrice;2030.EUR_regi.tax.t.FE_wo_b_wo_n_e.all 1.2809;2020.2030.EUR_regi.all.year.netGHG_LULUCFGrassi 2.450;on;on;EUR_regi, NEU_regi;;;gdp_SSP2_lowEn;;;;;;;3;;;;;;Mix2;2025;;SSP2-NPi;SSP2_lowEn-NPi;SSP2_lowEn-NPi;SSP2_lowEn-NDC: This Nationally Determined Contribution (NDC) scenario follows the Shared Socioeconomic Pathways 2 called Middle of the Road. This scenario also assumes low energy demand trajectories. The NDC includes all pledged policies even if not yet implemented. It assumes that the moderate and heterogeneous climate ambition reflected in the NDCs at the begining of 2021 continues over the 21st century. -SSP2_lowEn-NPi;1,AMT;;;;;rcp45;3;;0;NPi;;;;;9;;;;;;;;;;;;;;;;;;NPi2018;regiCarbonPrice;;;on;on;EUR_regi, NEU_regi;;;gdp_SSP2_lowEn;;;;;;;3;;;;;;Mix1;2005;;;;;SSP2_lowEn-NPi: This National Policies Implemented (NPi) scenario follows the Shared Socioeconomic Pathways 2 called Middle of the Road. This scenario also assumes low energy demand trajectories. The NPi assumes that policies fail to achieve NDC targets in 2030. Instead, carbon prices are assumed to grow and converge more slowly, leading to emissions trajectories in line with bottom-up studies on the effect of currently implemented policies. -SSP2_lowEn-PkBudg650;1,AMT;;;;;rcp20;9;globallyOptimal;650;diffLin2Lin;75;2055;;;9;;;;;;;;;;;;;1;;;;2050.GLO 0.9;NDC;regiCarbonPrice;2030.EUR_regi.tax.t.FE_wo_b_wo_n_e.all 1.2809;;on;on;EUR_regi, NEU_regi;;;gdp_SSP2_lowEn;;;;;;;;;;;;;Mix4ICEban;2030;;SSP2-NPi;;;SSP2_lowEn-PkBudg650: This climate policy scenario follows the Shared Socioeconomic Pathways 2 called Middle of the Road. This scenario also assumes low energy demand trajectories. The stylized climate policy scenario assumes a peak budget of 650 Gt CO2 on total CO2 emissions from 2015 to 2100. This is a 1.5C scenario, peak warming is allowed to be at or slightly above 1.5C at median climate sensitivity but returns to values below 1.5C in at least 67 % of scenarios by the end of the century. -SSP2_lowEn-PkBudg1000;1,AMT;;;;;rcp26;9;globallyOptimal;1000;diffLin2Lin;45;2080;;;9;;;;;;;;;;;;;1;;;;2050.GLO 0.5;NDC;regiCarbonPrice;2030.EUR_regi.tax.t.FE_wo_b_wo_n_e.all 1.2809;;on;on;EUR_regi, NEU_regi;;;gdp_SSP2_lowEn;;;;;;;;;;;;;Mix3ICEban;2030;;SSP2-NPi;;;SSP2_lowEn-PkBudg1050: This climate policy scenario follows the Shared Socioeconomic Pathways 2 called Middle of the Road. This scenario also assumes low energy demand trajectories. The stylized climate policy scenario assumes a peak budget of 1050 Gt CO2 on total CO2 emissions from 2015 to 2100. This is a well below 2C scenario at median climate sensitivity but returns to values below 2C in at least 67 % of scenarios during the whole century. -# H12 SSP5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -SSP5-NPi-calibrate;calibrate;calibrate;14;;;rcp45;;;0;NPi;;;;;9;;;1;;1.75;;;;;;3;2;;;;;;NPi2018;regiCarbonPrice;;;on;on;EUR_regi, NEU_regi;pop_SSP5;gdp_SSP5;gdp_SSP5;highOil;highGas;highCoal;3;6;4;3;SSP5;0.5;1;forcing_SSP5;SSP5;Mix1;2005;;;;;SSP5-calibration: This baseline calibration scenario follows the Shared Socioeconomic Pathways 5 called Fossil-Fueled Development. -SSP5-NDC;1;;;;;rcp45;3;globallyOptimal;0;NDC;;;;;9;;;1;;1.75;;;;;;3;2;;;;;;NDC;regiCarbonPrice;2030.EUR_regi.tax.t.FE_wo_b_wo_n_e.all 1.2809;2020.2030.EUR_regi.all.year.netGHG_LULUCFGrassi 2.450;on;on;EUR_regi, NEU_regi;pop_SSP5;gdp_SSP5;gdp_SSP5;highOil;highGas;highCoal;3;6;4;3;SSP5;0.5;1;forcing_SSP5;SSP5;Mix2;2030;;SSP2-NPi;SSP5-NPi;SSP5-NPi;SSP5-NDC: This Nationally Determined Contribution (NDC) scenario follows the Shared Socioeconomic Pathways 5 called Fossil-Fueled Development. The NDC includes all pledged policies even if not yet implemented. It assumes that the moderate and heterogeneous climate ambition reflected in the NDCs at the begining of 2021 continues over the 21st century. -SSP5-NPi;1;;;;;rcp45;3;;0;NPi;;;;;9;;;1;;1.75;;;;;;3;2;;;;;;NPi2018;regiCarbonPrice;;;on;on;EUR_regi, NEU_regi;pop_SSP5;gdp_SSP5;gdp_SSP5;highOil;highGas;highCoal;3;6;4;3;SSP5;0.5;1;forcing_SSP5;SSP5;Mix1;2005;;;;;SSP5-NPi: This National Policies Implemented (NPi) scenario follows the Shared Socioeconomic Pathways 5 called Fossil-Fueled Development. The NPi assumes that policies fail to achieve NDC targets in 2030. Instead, carbon prices are assumed to grow and converge more slowly, leading to emissions trajectories in line with bottom-up studies on the effect of currently implemented policies. -SSP5-PkBudg650;1;;;;;rcp20;9;globallyOptimal;650;diffLin2Lin;75;2055;;;9;;;1;;1.75;;;;;;3;2;1;;;;2050.GLO 0.9;NDC;regiCarbonPrice;2030.EUR_regi.tax.t.FE_wo_b_wo_n_e.all 1.2809;;on;on;EUR_regi, NEU_regi;pop_SSP5;gdp_SSP5;gdp_SSP5;highOil;highGas;highCoal;3;6;4;;SSP5;0.5;1;forcing_SSP5;SSP5;Mix4ICEban;2030;;SSP2-NPi;;;SSP5-PkBudg650: This climate policy scenario follows the Shared Socioeconomic Pathways 5 called Fossil-Fueled Development. The stylized climate policy scenario assumes a peak budget of 650 Gt CO2 on total CO2 emissions from 2015 to 2100. This is a 1.5C scenario, peak warming is allowed to be at or slightly above 1.5C at median climate sensitivity but returns to values below 1.5C in at least 67 % of scenarios by the end of the century. -SSP5-PkBudg1000;1,compileInTests;;;;;rcp26;9;globallyOptimal;1000;diffLin2Lin;45;2080;;;9;;;1;;1.75;;;;;;3;2;1;;;;2050.GLO 0.5;NDC;regiCarbonPrice;2030.EUR_regi.tax.t.FE_wo_b_wo_n_e.all 1.2809;;on;on;EUR_regi, NEU_regi;pop_SSP5;gdp_SSP5;gdp_SSP5;highOil;highGas;highCoal;3;6;4;;SSP5;0.5;1;forcing_SSP5;SSP5;Mix3ICEban;2030;;SSP2-NPi;;;SSP5-PkBudg1050: This climate policy scenario follows the Shared Socioeconomic Pathways 5 called Fossil-Fueled Development. The stylized climate policy scenario assumes a peak budget of 1050 Gt CO2 on total CO2 emissions from 2015 to 2100. This is a well below 2C scenario at median climate sensitivity but returns to values below 2C in at least 67 % of scenarios during the whole century. +title;start;CES_parameters;slurmConfig;regionmapping;extramappings_historic;cm_rcp_scen;cm_iterative_target_adj;subsidizeLearning;cm_budgetCO2from2020;carbonprice;cm_taxCO2_functionalForm;cm_taxCO2_expGrowth;cm_taxCO2_regiDiff;cm_taxCO2_regiDiff_endYr;cm_taxCO2_startyear;cm_peakBudgYr;cm_emiscen;c_regi_earlyreti_rate;c_tech_earlyreti_rate;cm_fetaxscen;cm_bioenergy_SustTax;cm_33EW;cm_33OAE;cm_33_OAE_eff;cm_33_OAE_scen;cm_frac_NetNegEmi;c_ccsinjecratescen;c_ccscapratescen;c_changeProdCost;cm_CESMkup_build;cm_CESMkup_ind;cm_CESMkup_ind_data;cm_wasteIncinerationCCSshare;techpol;regipol;cm_implicitQttyTarget;cm_emiMktTarget;cm_NucRegiPol;cm_CoalRegiPol;cm_altFeEmiFac;cm_POPscen;cm_GDPscen;cm_demScen;cm_oil_scen;cm_gas_scen;cm_coal_scen;c_techAssumptScen;cm_nucscen;cm_so2tax_scen;cm_multigasscen;cm_LU_emi_scen;cm_tradecostBio;cm_1stgen_phaseout;c_SSP_forcing_adjust;cm_APscen;cm_EDGEtr_scen;cm_startyear;path_gdx;path_gdx_ref;path_gdx_bau;path_gdx_refpolicycost;description +# H12 SSP2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +SSP2-NPi-calibrate;calibrate,AMT,compileInTests;calibrate;14;;;rcp45;;;0;NPi;;;;;;;9;;;;;;;;;;;;;;;;;NPi2018;regiCarbonPrice;;;on;on;EUR_regi, NEU_regi;;;;;;;;;;3;;;;;;Mix1;2005;;;;;SSP2-NPi-calibrate: This reference policy/baseline scenario follows the Shared Socioeconomic Pathways 2 called Middle of the Road. +SSP2-NDC;1,AMT,2;;;;;rcp45;3;globallyOptimal;0;NDC;;;;;;;9;;;;;;;;;;;;;;;;;NDC;regiCarbonPrice;2030.EUR_regi.tax.t.FE_wo_b_wo_n_e.all 1.2809;2020.2030.EUR_regi.all.year.netGHG_LULUCFGrassi 2.450;on;on;EUR_regi, NEU_regi;;;;;;;;;;3;;;;;;Mix2;2030;;SSP2-NPi;SSP2-NPi;SSP2-NPi;SSP2-NDC: This Nationally Determined Contribution (NDC) scenario follows the Shared Socioeconomic Pathways 2 called Middle of the Road. The NDC includes all pledged policies even if not yet implemented. It assumes that the moderate and heterogeneous climate ambition reflected in the NDCs at the begining of 2021 continues over the 21st century. +SSP2-NPi;1,AMT,compileInTests,2;;;;;rcp45;3;;0;NPi;;;;;;;9;;;;;;;;;;;;;;;;;NPi2018;regiCarbonPrice;;;on;on;EUR_regi, NEU_regi;;;;;;;;;;3;;;;;;Mix1;2005;;;;;SSP2-NPi: This National Policies Implemented (NPi) scenario follows the Shared Socioeconomic Pathways 2 called Middle of the Road. The NPi assumes that policies fail to achieve NDC targets in 2030. Instead, carbon prices are assumed to grow and converge more slowly, leading to emissions trajectories in line with bottom-up studies on the effect of currently implemented policies. +SSP2-PkBudg500;1,AMT,2;;;;;rcp20;9;globallyOptimal;500;functionalForm;linear;;;;200;2045;9;;;;;;;;;;;;1;;;;2050.GLO 0.9;NDC;regiCarbonPrice;2030.EUR_regi.tax.t.FE_wo_b_wo_n_e.all 1.2809;;on;on;EUR_regi, NEU_regi;;;;;;;;;;;;;;;;Mix4ICEban;2030;;SSP2-NPi;;SSP2-NPi;SSP2-PkBudg500: This climate policy scenario follows the Shared Socioeconomic Pathways 2 called Middle of the Road. The stylized climate policy scenario assumes a peak budget of 500 Gt CO2 on total CO2 emissions from 2015 to 2100. This is a 1.5C scenario, peak warming is allowed to be well below 1.5C at median climate sensitivity but returns to values below 1.5C in at least 67 % of scenarios by the end of the century. +SSP2-PkBudg650;1,AMT,2;;;;;rcp20;9;globallyOptimal;650;functionalForm;linear;;;;75;2055;9;;;;;;;;;;;;1;;;;2050.GLO 0.9;NDC;regiCarbonPrice;2030.EUR_regi.tax.t.FE_wo_b_wo_n_e.all 1.2809;;on;on;EUR_regi, NEU_regi;;;;;;;;;;;;;;;;Mix4ICEban;2030;;SSP2-NPi;;SSP2-NPi;SSP2-PkBudg650: This climate policy scenario follows the Shared Socioeconomic Pathways 2 called Middle of the Road. The stylized climate policy scenario assumes a peak budget of 650 Gt CO2 on total CO2 emissions from 2015 to 2100. This is a 1.5C scenario, peak warming is allowed to be at or slightly above 1.5C at median climate sensitivity but returns to values below 1.5C in at least 67 % of scenarios by the end of the century. +SSP2-PkBudg1000;1,AMT,2;;;;;rcp26;9;globallyOptimal;1000;functionalForm;linear;;;;45;2080;9;;;;;;;;;;;;1;;;;2050.GLO 0.5;NDC;regiCarbonPrice;2030.EUR_regi.tax.t.FE_wo_b_wo_n_e.all 1.2809;;on;on;EUR_regi, NEU_regi;;;;;;;;;;;;;;;;Mix3ICEban;2030;;SSP2-NPi;;SSP2-NPi;SSP2-PkBudg1050: This climate policy scenario follows the Shared Socioeconomic Pathways 2 called Middle of the Road. The stylized climate policy scenario assumes a peak budget of 1150 Gt CO2 on total CO2 emissions from 2015 to 2100. This is a well below 2C scenario at median climate sensitivity but returns to values below 2C in at least 67 % of scenarios during the whole century. +SSP2-EcBudg400;1,AMT,2;;;;;rcp26;5;globallyOptimal;400;functionalForm;exponential;;initialSpread20;GLO 2070;70;;9;;;;;1;1;0.9;0;0;;;1;;;;2060.GLO 0.9;NDC;regiCarbonPrice;;;on;on;EUR_regi, NEU_regi;;;;;;;;;;;;;;;;Mix3ICEban;2035;;SSP2-NPi;;SSP2-NPi;SSP2-EcBudg400: This climate policy scenario follows the Shared Socioeconomic Pathways 2 called Middle of the Road. The stylized climate policy scenario assumes an end-of-century budget of 400 Gt CO2 on total CO2 emissions from 2020 to 2100. This is a high overshoot scenario with delayed climate policy. +# EU21 SSP2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +SSP2-EU21-NPi-calibrate;calibrate;calibrate;14;./config/regionmapping_21_EU11.csv;./config/extramapping_EU27.csv;rcp45;;;0;NPi;;;;;;;9;;;;;;;;;;;;;;;;;NPi2018;regiCarbonPrice;;;on;on;EUR_regi, NEU_regi;;;;;;;;;;3;;;;;;Mix1;2005;;;;;SSP2-EU21-calibration: This baseline scenario follows the Shared Socioeconomic Pathways 2 called Middle of the Road. +SSP2-EU21-Base;1,AMT,compileInTests,2;;;./config/regionmapping_21_EU11.csv;./config/extramapping_EU27.csv;;;;0;;;;;;;;;;off;;;;;;;;;;;;;;;;;;;;;EUR_regi, NEU_regi;;;;;;;;;;;;;;;;Mix1;2005;;;;;SSP2-EU21-Base: This baseline calibration scenario follows the Shared Socioeconomic Pathways 2 called Middle of the Road. +SSP2-EU21-NDC;1,AMT,2;;;./config/regionmapping_21_EU11.csv;./config/extramapping_EU27.csv;rcp45;3;globallyOptimal;0;NDC;;;;;;;9;;;;;;;;;;;;;;;;;NDC;regiCarbonPrice;2030.EUR_regi.tax.t.FE_wo_b_wo_n_e.all 1.2809;2020.2030.EUR_regi.all.year.netGHG_LULUCFGrassi 2.450;on;on;EUR_regi, NEU_regi;;;;;;;;;;3;;;;;;Mix2;2030;;SSP2-EU21-NPi;SSP2-EU21-NPi;SSP2-EU21-NPi;SSP2-EU21-NDC: This Nationally Determined Contribution (NDC) scenario follows the Shared Socioeconomic Pathways 2 called Middle of the Road. The NDC includes all pledged policies even if not yet implemented. It assumes that the moderate and heterogeneous climate ambition reflected in the NDCs at the begining of 2021 continues over the 21st century. +SSP2-EU21-NPi;1,AMT,2;;;./config/regionmapping_21_EU11.csv;./config/extramapping_EU27.csv;rcp45;3;;0;NPi;;;;;;;9;;;;;;;;;;;;;;;;;NPi2018;regiCarbonPrice;;;on;on;EUR_regi, NEU_regi;;;;;;;;;;3;;;;;;Mix1;2005;;;;;SSP2-EU21-NPi: This National Policies Implemented (NPi) scenario follows the Shared Socioeconomic Pathways 2 called Middle of the Road. The NPi assumes that policies fail to achieve NDC targets in 2030. Instead, carbon prices are assumed to grow and converge more slowly, leading to emissions trajectories in line with bottom-up studies on the effect of currently implemented policies. +SSP2-EU21-PkBudg500;1,AMT,2;;;./config/regionmapping_21_EU11.csv;./config/extramapping_EU27.csv;rcp20;9;globallyOptimal;500;functionalForm;linear;;;;200;2045;9;;;;;;;;;;;;1;;;;2050.GLO 0.9;NDC;regiCarbonPrice;2030.EUR_regi.tax.t.FE_wo_b_wo_n_e.all 1.2809;;on;on;EUR_regi, NEU_regi;;;;;;;;;;;;;;;;Mix4ICEban;2030;;SSP2-EU21-NPi;;SSP2-EU21-NPi;SSP2-EU21-PkBudg500: This climate policy scenario follows the SSP2. The stylized climate policy scenario assumes a peak budget of 500 Gt CO2 on total CO2 emissions from 2015 to 2100. This is a 1.5C scenario, peak warming is allowed to be at or slightly above 1.5C at median climate sensitivity but returns to values below 1.5C in at least 67 % of scenarios by the end of the century. +SSP2-EU21-PkBudg650;1,AMT,2;;;./config/regionmapping_21_EU11.csv;./config/extramapping_EU27.csv;rcp20;9;globallyOptimal;650;functionalForm;linear;;;;75;2055;9;;;;;;;;;;;;1;;;;2050.GLO 0.9;NDC;regiCarbonPrice;2030.EUR_regi.tax.t.FE_wo_b_wo_n_e.all 1.2809;;on;on;EUR_regi, NEU_regi;;;;;;;;;;;;;;;;Mix4ICEban;2030;;SSP2-EU21-NPi;;SSP2-EU21-NPi;SSP2-EU21-PkBudg650: This climate policy scenario follows the SSP2. The stylized climate policy scenario assumes a peak budget of 650 Gt CO2 on total CO2 emissions from 2015 to 2100. This is a 1.5C scenario, peak warming is allowed to be at or slightly above 1.5C at median climate sensitivity but returns to values below 1.5C in at least 67 % of scenarios by the end of the century. +SSP2-EU21-PkBudg1000;1,AMT,2;;;./config/regionmapping_21_EU11.csv;./config/extramapping_EU27.csv;rcp26;9;globallyOptimal;1000;functionalForm;linear;;;;45;2080;9;;;;;;;;;;;;1;;;;2050.GLO 0.5;NDC;regiCarbonPrice;2030.EUR_regi.tax.t.FE_wo_b_wo_n_e.all 1.2809;;on;on;EUR_regi, NEU_regi;;;;;;;;;;;;;;;;Mix3ICEban;2030;;SSP2-EU21-NPi;;SSP2-EU21-NPi;SSP2-EU21-PkBudg1050: This climate policy scenario follows the SSP2. The stylized climate policy scenario assumes a peak budget of 1050 Gt CO2 on total CO2 emissions from 2015 to 2100. This is a well below 2C scenario at median climate sensitivity but returns to values below 2C in at least 67 % of scenarios during the whole century. +# H12 SSP3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +SSP3-NPi-calibrate;calibrate;calibrate;14;;;rcp45;;;0;NPi;;;;;;;9;;;1;;;;;;;;;;;;;;NPi2018;regiCarbonPrice;;;on;on;EUR_regi, NEU_regi;pop_SSP3;gdp_SSP3;gdp_SSP3;;;highCoal;;;0;3;SSP3;1.5;;forcing_SSP3;;Mix1;2005;;;;;SSP3-NPi-calibrate: This reference policy/baseline scenario follows the Shared Socioeconomic Pathways 3 called High. +SSP3-NDC;0;;;;;rcp45;3;;0;NDC;;;;;;;9;;;1;;;;;;;;;;;;;;NDC;regiCarbonPrice;2030.EUR_regi.tax.t.FE_wo_b_wo_n_e.all 1.2809;2020.2030.EUR_regi.all.year.netGHG_LULUCFGrassi 2.450;on;on;EUR_regi, NEU_regi;pop_SSP3;gdp_SSP3;gdp_SSP3;;;highCoal;;;0;3;SSP3;1.5;;forcing_SSP3;;Mix2;2030;;SSP2-NPi;SSP3-NPi;SSP3-NPi;SSP3-NDC: This Nationally Determined Contribution (NDC) scenario follows the Shared Socioeconomic Pathways 3 called High. The NDC includes all pledged policies even if not yet implemented. It assumes that the moderate and heterogeneous climate ambition reflected in the NDCs at the begining of 2021 continues over the 21st century. +SSP3-NPi;0;;;;;rcp45;3;;0;NPi;;;;;;;9;;;1;;;;;;;;;;;;;;NPi2018;regiCarbonPrice;;;on;on;EUR_regi, NEU_regi;pop_SSP3;gdp_SSP3;gdp_SSP3;;;highCoal;;;0;3;SSP3;1.5;;forcing_SSP3;;Mix1;2005;;;;;SSP3-NPi: This National Policies Implemented (NPi) scenario follows the Shared Socioeconomic Pathways 3 called High. The NPi assumes that policies fail to achieve NDC targets in 2030. Instead, carbon prices are assumed to grow and converge more slowly, leading to emissions trajectories in line with bottom-up studies on the effect of currently implemented policies. +SSP3-PkBudg1000;0;;;;;rcp26;9;;1000;functionalForm;linear;;;GLO 2100;45;2080;9;;;1;;;;;;;;;1;;;;2050.GLO 0.5;NDC;regiCarbonPrice;2030.EUR_regi.tax.t.FE_wo_b_wo_n_e.all 1.2809;;on;on;EUR_regi, NEU_regi;pop_SSP3;gdp_SSP3;gdp_SSP3;;;highCoal;;;0;;SSP3;1.5;;forcing_SSP3;;Mix3ICEban;2030;;SSP2-NPi;;;SSP3-PkBudg1050: This climate policy scenario follows the Shared Socioeconomic Pathways 3 called High. The stylized climate policy scenario assumes a peak budget of 1150 Gt CO2 on total CO2 emissions from 2015 to 2100. This is a well below 2C scenario at median climate sensitivity but returns to values below 2C in at least 67 % of scenarios during the whole century. +SSP3-rollBack;0;;;;;rcp45;9;;;NPiexpo;;0.9;;;;;9;;;1;;;;;;;;;;;;;;NPi2018;regiCarbonPrice;;;on;on;EUR_regi, NEU_regi;pop_SSP3;gdp_SSP3;gdp_SSP3;;;highCoal;;;0;;SSP3;1.5;;forcing_SSP3;;Mix1;2030;;SSP2-NPi;;; +# H12 SSP1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +SSP1-NPi-calibrate;calibrate;calibrate;14;;;rcp45;;;0;NPi;;;;;;;9;GLO 0.12, EUR_regi 0.15;;2;1.75;;;;;;2;;;;;;;NPi2018;regiCarbonPrice;;;on;on;EUR_regi, NEU_regi;pop_SSP1;gdp_SSP1;gdp_SSP1;lowOil;lowGas;lowCoal;2;;4;3;SDP;0.5;1;forcing_SSP1;MFR;Mix1;2005;;;;;SSP1-calibration: This baseline calibration scenario follows the Shared Socioeconomic Pathways 1 called Sustainability. +SSP1-NDC;1,AMT,compileInTests;;;;;rcp45;3;globallyOptimal;0;NDC;;;;;;;9;GLO 0.12, EUR_regi 0.16;;2;1.75;;;;;;2;;;;;;;NDC;regiCarbonPrice;2030.EUR_regi.tax.t.FE_wo_b_wo_n_e.all 1.2809;2020.2030.EUR_regi.all.year.netGHG_LULUCFGrassi 2.450;on;on;EUR_regi, NEU_regi;pop_SSP1;gdp_SSP1;gdp_SSP1;lowOil;lowGas;lowCoal;2;;4;3;SDP;0.5;1;forcing_SSP1;MFR;Mix2;2030;;SSP2-NPi;SSP1-NPi;SSP1-NPi;SSP1-NDC: This Nationally Determined Contribution (NDC) scenario follows the Shared Socioeconomic Pathways 1 called Sustainability. The NDC includes all pledged policies even if not yet implemented. It assumes that the moderate and heterogeneous climate ambition reflected in the NDCs at the begining of 2021 continues over the 21st century. +SSP1-NPi;1,AMT;;;;;rcp45;3;;0;NPi;;;;;;;9;GLO 0.12, EUR_regi 0.15;;2;1.75;;;;;;2;;;;;;;NPi2018;regiCarbonPrice;;;on;on;EUR_regi, NEU_regi;pop_SSP1;gdp_SSP1;gdp_SSP1;lowOil;lowGas;lowCoal;2;;4;3;SDP;0.5;1;forcing_SSP1;MFR;Mix1;2005;;;;;SSP1-NPi: This National Policies Implemented (NPi) scenario follows the Shared Socioeconomic Pathways 1 called Sustainability. The NPi assumes that policies fail to achieve NDC targets in 2030. Instead, carbon prices are assumed to grow and converge more slowly, leading to emissions trajectories in line with bottom-up studies on the effect of currently implemented policies. +SSP1-PkBudg650;1,AMT;;;;;rcp20;9;globallyOptimal;650;functionalForm;linear;;;;75;2055;9;GLO 0.12, EUR_regi 0.16;;2;1.75;;;;;;2;;1;feelhpb 1.05, fehob 1.75, feheb 0.1;manual;feh2_otherInd 1.04, feelhth_otherInd 0.4, feh2_cement 2.0, feelhth_chemicals 1.3, feh2_chemicals 1.04;2050.GLO 0.9;NDC;regiCarbonPrice;2030.EUR_regi.tax.t.FE_wo_b_wo_n_e.all 1.2809;;on;on;EUR_regi, NEU_regi;pop_SSP1;gdp_SSP1;gdp_SSP1;lowOil;lowGas;lowCoal;2;;4;;SDP;0.5;1;forcing_SSP1;MFR;Mix4ICEban;2030;;SSP2-NPi;;;SSP1-PkBudg650: This climate policy scenario follows the Shared Socioeconomic Pathways 1 called Sustainability. The stylized climate policy scenario assumes a peak budget of 650 Gt CO2 on total CO2 emissions from 2015 to 2100. This is a 1.5C scenario, peak warming is allowed to be at or slightly above 1.5C at median climate sensitivity but returns to values below 1.5C in at least 67 % of scenarios by the end of the century. +SSP1-PkBudg1000;1,AMT;;;;;rcp26;9;globallyOptimal;1000;functionalForm;linear;;;;45;2080;9;GLO 0.12, EUR_regi 0.16;;2;1.75;;;;;;2;;1;;;;2050.GLO 0.5;NDC;regiCarbonPrice;2030.EUR_regi.tax.t.FE_wo_b_wo_n_e.all 1.2809;;on;on;EUR_regi, NEU_regi;pop_SSP1;gdp_SSP1;gdp_SSP1;lowOil;lowGas;lowCoal;2;;4;;SDP;0.5;1;forcing_SSP1;MFR;Mix3ICEban;2030;;SSP2-NPi;;;SSP1-PkBudg1050: This climate policy scenario follows the Shared Socioeconomic Pathways 1 called Sustainability. The stylized climate policy scenario assumes a peak budget of 1050 Gt CO2 on total CO2 emissions from 2015 to 2100. This is a well below 2C scenario at median climate sensitivity but returns to values below 2C in at least 67 % of scenarios during the whole century. +# H12 SSP2 lowEnergy;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +SSP2_lowEn-NPi-calibrate;calibrate;calibrate;14;;;rcp45;;;0;NPi;;;;;;;9;;;;;;;;;;;;;;;;;NPi2018;regiCarbonPrice;;;on;on;EUR_regi, NEU_regi;;;gdp_SSP2_lowEn;;;;;;;3;;;;;;Mix1;2005;;;;;SSP2_lowEn-calibration: This baseline scenario follows the Shared Socioeconomic Pathways 2 called Middle of the Road. This scenario also assumes low energy demand trajectories. +SSP2_lowEn-NDC;1,AMT;;;;;rcp45;3;globallyOptimal;0;NDC;;;;;;;9;;;;;;;;;;;;;;;;;NDC;regiCarbonPrice;2030.EUR_regi.tax.t.FE_wo_b_wo_n_e.all 1.2809;2020.2030.EUR_regi.all.year.netGHG_LULUCFGrassi 2.450;on;on;EUR_regi, NEU_regi;;;gdp_SSP2_lowEn;;;;;;;3;;;;;;Mix2;2025;;SSP2-NPi;SSP2_lowEn-NPi;SSP2_lowEn-NPi;SSP2_lowEn-NDC: This Nationally Determined Contribution (NDC) scenario follows the Shared Socioeconomic Pathways 2 called Middle of the Road. This scenario also assumes low energy demand trajectories. The NDC includes all pledged policies even if not yet implemented. It assumes that the moderate and heterogeneous climate ambition reflected in the NDCs at the begining of 2021 continues over the 21st century. +SSP2_lowEn-NPi;1,AMT;;;;;rcp45;3;;0;NPi;;;;;;;9;;;;;;;;;;;;;;;;;NPi2018;regiCarbonPrice;;;on;on;EUR_regi, NEU_regi;;;gdp_SSP2_lowEn;;;;;;;3;;;;;;Mix1;2005;;;;;SSP2_lowEn-NPi: This National Policies Implemented (NPi) scenario follows the Shared Socioeconomic Pathways 2 called Middle of the Road. This scenario also assumes low energy demand trajectories. The NPi assumes that policies fail to achieve NDC targets in 2030. Instead, carbon prices are assumed to grow and converge more slowly, leading to emissions trajectories in line with bottom-up studies on the effect of currently implemented policies. +SSP2_lowEn-PkBudg650;1,AMT;;;;;rcp20;9;globallyOptimal;650;functionalForm;linear;;;;75;2055;9;;;;;;;;;;;;1;;;;2050.GLO 0.9;NDC;regiCarbonPrice;2030.EUR_regi.tax.t.FE_wo_b_wo_n_e.all 1.2809;;on;on;EUR_regi, NEU_regi;;;gdp_SSP2_lowEn;;;;;;;;;;;;;Mix4ICEban;2030;;SSP2-NPi;;;SSP2_lowEn-PkBudg650: This climate policy scenario follows the Shared Socioeconomic Pathways 2 called Middle of the Road. This scenario also assumes low energy demand trajectories. The stylized climate policy scenario assumes a peak budget of 650 Gt CO2 on total CO2 emissions from 2015 to 2100. This is a 1.5C scenario, peak warming is allowed to be at or slightly above 1.5C at median climate sensitivity but returns to values below 1.5C in at least 67 % of scenarios by the end of the century. +SSP2_lowEn-PkBudg1000;1,AMT;;;;;rcp26;9;globallyOptimal;1000;functionalForm;linear;;;;45;2080;9;;;;;;;;;;;;1;;;;2050.GLO 0.5;NDC;regiCarbonPrice;2030.EUR_regi.tax.t.FE_wo_b_wo_n_e.all 1.2809;;on;on;EUR_regi, NEU_regi;;;gdp_SSP2_lowEn;;;;;;;;;;;;;Mix3ICEban;2030;;SSP2-NPi;;;SSP2_lowEn-PkBudg1050: This climate policy scenario follows the Shared Socioeconomic Pathways 2 called Middle of the Road. This scenario also assumes low energy demand trajectories. The stylized climate policy scenario assumes a peak budget of 1050 Gt CO2 on total CO2 emissions from 2015 to 2100. This is a well below 2C scenario at median climate sensitivity but returns to values below 2C in at least 67 % of scenarios during the whole century. +# H12 SSP5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +SSP5-NPi-calibrate;calibrate;calibrate;14;;;rcp45;;;0;NPi;;;;;;;9;;;1;1.75;;;;;;3;2;;;;;;NPi2018;regiCarbonPrice;;;on;on;EUR_regi, NEU_regi;pop_SSP5;gdp_SSP5;gdp_SSP5;highOil;highGas;highCoal;3;6;4;3;SSP5;0.5;1;forcing_SSP5;SSP5;Mix1;2005;;;;;SSP5-calibration: This baseline calibration scenario follows the Shared Socioeconomic Pathways 5 called Fossil-Fueled Development. +SSP5-NDC;1;;;;;rcp45;3;globallyOptimal;0;NDC;;;;;;;9;;;1;1.75;;;;;;3;2;;;;;;NDC;regiCarbonPrice;2030.EUR_regi.tax.t.FE_wo_b_wo_n_e.all 1.2809;2020.2030.EUR_regi.all.year.netGHG_LULUCFGrassi 2.450;on;on;EUR_regi, NEU_regi;pop_SSP5;gdp_SSP5;gdp_SSP5;highOil;highGas;highCoal;3;6;4;3;SSP5;0.5;1;forcing_SSP5;SSP5;Mix2;2030;;SSP2-NPi;SSP5-NPi;SSP5-NPi;SSP5-NDC: This Nationally Determined Contribution (NDC) scenario follows the Shared Socioeconomic Pathways 5 called Fossil-Fueled Development. The NDC includes all pledged policies even if not yet implemented. It assumes that the moderate and heterogeneous climate ambition reflected in the NDCs at the begining of 2021 continues over the 21st century. +SSP5-NPi;1;;;;;rcp45;3;;0;NPi;;;;;;;9;;;1;1.75;;;;;;3;2;;;;;;NPi2018;regiCarbonPrice;;;on;on;EUR_regi, NEU_regi;pop_SSP5;gdp_SSP5;gdp_SSP5;highOil;highGas;highCoal;3;6;4;3;SSP5;0.5;1;forcing_SSP5;SSP5;Mix1;2005;;;;;SSP5-NPi: This National Policies Implemented (NPi) scenario follows the Shared Socioeconomic Pathways 5 called Fossil-Fueled Development. The NPi assumes that policies fail to achieve NDC targets in 2030. Instead, carbon prices are assumed to grow and converge more slowly, leading to emissions trajectories in line with bottom-up studies on the effect of currently implemented policies. +SSP5-PkBudg650;1;;;;;rcp20;9;globallyOptimal;650;functionalForm;linear;;;;75;2055;9;;;1;1.75;;;;;;3;2;1;;;;2050.GLO 0.9;NDC;regiCarbonPrice;2030.EUR_regi.tax.t.FE_wo_b_wo_n_e.all 1.2809;;on;on;EUR_regi, NEU_regi;pop_SSP5;gdp_SSP5;gdp_SSP5;highOil;highGas;highCoal;3;6;4;;SSP5;0.5;1;forcing_SSP5;SSP5;Mix4ICEban;2030;;SSP2-NPi;;;SSP5-PkBudg650: This climate policy scenario follows the Shared Socioeconomic Pathways 5 called Fossil-Fueled Development. The stylized climate policy scenario assumes a peak budget of 650 Gt CO2 on total CO2 emissions from 2015 to 2100. This is a 1.5C scenario, peak warming is allowed to be at or slightly above 1.5C at median climate sensitivity but returns to values below 1.5C in at least 67 % of scenarios by the end of the century. +SSP5-PkBudg1000;1,compileInTests;;;;;rcp26;9;globallyOptimal;1000;functionalForm;linear;;;;45;2080;9;;;1;1.75;;;;;;3;2;1;;;;2050.GLO 0.5;NDC;regiCarbonPrice;2030.EUR_regi.tax.t.FE_wo_b_wo_n_e.all 1.2809;;on;on;EUR_regi, NEU_regi;pop_SSP5;gdp_SSP5;gdp_SSP5;highOil;highGas;highCoal;3;6;4;;SSP5;0.5;1;forcing_SSP5;SSP5;Mix3ICEban;2030;;SSP2-NPi;;;SSP5-PkBudg1050: This climate policy scenario follows the Shared Socioeconomic Pathways 5 called Fossil-Fueled Development. The stylized climate policy scenario assumes a peak budget of 1050 Gt CO2 on total CO2 emissions from 2015 to 2100. This is a well below 2C scenario at median climate sensitivity but returns to values below 2C in at least 67 % of scenarios during the whole century. diff --git a/core/datainput.gms b/core/datainput.gms index f27060b6a..565c5452d 100644 --- a/core/datainput.gms +++ b/core/datainput.gms @@ -25,6 +25,10 @@ pm_temperatureImpulseResponseCO2(tall,tall) = 0; vm_demFeForEs.L(t,regi,entyFe,esty,teEs) = 0; vm_demFeForEs.L(t,regi,fe2es(entyFe,esty,teEs)) = 0.1; +*** -------- initial declaration of parameters for iterative target adjustment +pm_taxCO2eq_anchor_iterationdiff(t) = 0; +pm_taxCO2eq_anchor_iterationdiff_tmp(t) = 0; + *------------------------------------------------------------------------------------ *** calculations based on sets *------------------------------------------------------------------------------------ diff --git a/core/declarations.gms b/core/declarations.gms index b98a22e21..27ad78b32 100644 --- a/core/declarations.gms +++ b/core/declarations.gms @@ -28,6 +28,8 @@ pm_gdp_gdx(tall,all_regi) "GDP path from gdx, updated p_inv_gdx(tall,all_regi) "macro-investments path from gdx, updated iteratively." pm_taxCO2eq(ttot,all_regi) "CO2 tax path in T$/GtC = $/kgC. To get $/tCO2, multiply with 272 [T$/GtC]" pm_taxCO2eqRegi(tall,all_regi) "additional regional CO2 tax path in T$/GtC = $/kgC. To get $/tCO2, multiply with 272 [T$/GtC]" +pm_taxCO2eq_anchor_iterationdiff(ttot) "help parameter for iterative adjustment of taxes" +pm_taxCO2eq_anchor_iterationdiff_tmp(ttot) "help parameter for iterative adjustment of taxes" pm_taxCO2eqSum(tall,all_regi) "sum of pm_taxCO2eq, pm_taxCO2eqRegi, pm_taxCO2eqSCC in T$/GtC = $/kgC. To get $/tCO2, multiply with 272 [T$/GtC]" 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" diff --git a/main.gms b/main.gms index be89b39b3..e1f0e2d99 100755 --- a/main.gms +++ b/main.gms @@ -510,7 +510,6 @@ parameter *' * (9): tax scenario (requires running module 21_tax "on"), tax level controlled by module 45_carbonprice and cm_taxCO2_startyear, other GHG etc. controlled by cm_rcp_scen *' * (10): used for cost-benefit analysis *' *JeS* WARNING: data for cm_emiscen 4 only exists for multigas_scen 2 bau scenarios and for multigas_scen 1 -*' parameter cm_taxCO2_startyear "level of co2 tax in start year in $ per t CO2eq" ; @@ -518,12 +517,31 @@ parameter *' * (-1): default setting equivalent to no carbon tax *' * (any number >= 0): CO2 tax in start year [if cm_iterative_target_adj eq 0]; *' * initialization of CO2 tax in start year [if cm_iterative_target_adj ne 0] -*' parameter cm_taxCO2_expGrowth "growth rate of carbon tax" ; cm_taxCO2_expGrowth = 1.045; !! def = 1.045 !! regexp = is.numeric *' (any number >= 0): rate of exponential increase over time, default value chosen to be consistent with interest rate +parameter + cm_budgetCO2from2020 "CO2 budget for all economic sectors starting from 2020 (GtCO2). It can be either peak budget, but can also be an end-of-century budget" +; + cm_budgetCO2from2020 = 1150; !! def = 1150 +*' budgets from AR6 for 2020-2100 (including 2020), for 1.5 C: 500 Gt CO2 peak budget (400 Gt CO2 end of century), for 2 C: 1150 Gt CO2 +parameter + cm_peakBudgYr "date of net-zero CO2 emissions for peak budget runs without overshoot" +; + cm_peakBudgYr = 2050; !! def = 2050 +*' time of net-zero CO2 emissions (peak budget) +*' endogenous adjustment by algorithms in 45_carbonprice/functionalForm/postsolve.gms [requires emiscen = 9 and cm_iterative_target_adj = 7 or 9] +parameter + cm_taxCO2_IncAfterPeakBudgYr "annual increase of CO2 tax after cm_peakBudgYr in $ per tCO2" +; + cm_taxCO2_IncAfterPeakBudgYr = 0; !! def = 0 . For weak targets (higher than 1100 Peak Budget), this value might need to increased to prevent continually increasing temperatures +*' +parameter + cm_expoLinear_yearStart "time at which carbon price increases linearly instead of exponentially" +; + cm_expoLinear_yearStart = 2050; !! def = 2050 *' parameter c_macscen "scenario switch on whether or not to use MAC (Marginal Abatement Cost) for certain sectors not related to direct combustion of fossil fuel, e.g. fugitive emissions from old mines, forestry, agriculture and cement" @@ -914,22 +932,7 @@ parameter cm_33_EW_shortTermLimit "Limit on 2030 potential for enhanced weathering, defined as % of land on which EW is applied. Default 0.5% of land" ; cm_33_EW_shortTermLimit = 0.005; !! def = 0.5% !! regexp = is.nonnegative - -parameter - cm_expoLinear_yearStart "time at which carbon price increases linearly instead of exponentially" -; - cm_expoLinear_yearStart = 2050; !! def = 2050 *' -parameter - c_budgetCO2from2020FFI "carbon budget for CO2 emissions starting from 2020 from fossil fuels & industry (FFI), i.e. without land-use (in GtCO2). It can be either peak budget, but can also be an end-of-century budget" -; - c_budgetCO2from2020FFI = 700; !! def = 700 -*' -parameter - c_budgetCO2from2020 "CO2 budget for all economic sectors starting from 2020 (GtCO2). It can be either peak budget, but can also be an end-of-century budget" -; - c_budgetCO2from2020 = 1150; !! def = 1150 -*' budgets from AR6 for 2020-2100 (including 2020), for 1.5 C: 500 Gt CO2 peak budget (400 Gt CO2 end of century), for 2 C: 1150 Gt CO2 parameter cm_postTargetIncrease "carbon price increase per year after regipol emission target is reached (euro per tCO2)" ; @@ -1017,17 +1020,6 @@ 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 - cm_peakBudgYr "date of net-zero CO2 emissions for peak budget runs without overshoot" -; - cm_peakBudgYr = 2050; !! def = 2050 -*' time of net-zero CO2 emissions (peak budget) -*' endogenous adjustment by algorithms in 45_carbonprice/functionalForm/postsolve.gms [requires emiscen = 9 and cm_iterative_target_adj = 7 or 9] -parameter - cm_taxCO2_IncAfterPeakBudgYr "annual increase of CO2 tax after cm_peakBudgYr in $ per tCO2" -; - cm_taxCO2_IncAfterPeakBudgYr = 0; !! def = 0 . For weak targets (higher than 1100 Peak Budget), this value might need to increased to prevent continually increasing temperatures -*' parameter c_teNoLearngConvEndYr "Year at which regional costs of non-learning technologies converge" ; diff --git a/modules/45_carbonprice/NDC/not_used.txt b/modules/45_carbonprice/NDC/not_used.txt index fc180917b..f55431927 100644 --- a/modules/45_carbonprice/NDC/not_used.txt +++ b/modules/45_carbonprice/NDC/not_used.txt @@ -7,7 +7,6 @@ name,type,reason cm_emiscen, switch, ??? pm_ttot_val,parameter,??? -cm_co2_tax_growth,switch,??? cm_expoLinear_yearStart,switch,??? pm_globalMeanTemperature,input,questionnaire pm_temperatureImpulseResponseCO2,input,questionnaire @@ -19,9 +18,20 @@ pm_ttot_2_tall,input,questionnaire pm_shPPPMER,input,questionnaire pm_pop,input,questionnaire pm_gdp,input,questionnaire -cm_CO2priceRegConvEndYr,input,questionnaire -cm_co2_tax_spread,switch,no carbon price differentiation in this realization -cm_co2_tax_startyear,input,added by codeCheck cm_peakBudgYr,input,added by codeCheck -cm_taxCO2inc_after_peakBudgYr,input,added by codeCheck fm_taxCO2eqHist,input,not needed +sm_budgetCO2eqGlob,input,no iterative target adjustment +sm_globalBudget_dev,input,no iterative target adjustment +vm_emiTe,input,no iterative target adjustment +vm_emiCdr,input,no iterative target adjustment +vm_emiMac,input,no iterative target adjustment +vm_emiAll,input,no iterative target adjustment +pm_budgetCO2eq,input,no iterative target adjustment +pm_ts,input,no iterative target adjustment +cm_iteration_max,input,no iterative target adjustment +cm_taxCO2_startyear,input,added by codeCheck +cm_taxCO2_expGrowth,input,added by codeCheck +cm_taxCO2_IncAfterPeakBudgYr,input,added by codeCheck +cm_budgetCO2from2020,input,no iterative target adjustment +pm_taxCO2eq_anchor_iterationdiff,input,no iterative target adjustment +pm_taxCO2eq_anchor_iterationdiff_tmp,input,no iterative target adjustment diff --git a/modules/45_carbonprice/NPi/not_used.txt b/modules/45_carbonprice/NPi/not_used.txt index 8a85cb636..70c968d89 100644 --- a/modules/45_carbonprice/NPi/not_used.txt +++ b/modules/45_carbonprice/NPi/not_used.txt @@ -7,7 +7,6 @@ name,type,reason cm_emiscen, switch, ??? pm_ttot_val,parameter,??? -cm_co2_tax_growth,switch,??? cm_expoLinear_yearStart,switch,??? pm_globalMeanTemperature,input,questionnaire pm_temperatureImpulseResponseCO2,input,questionnaire @@ -23,13 +22,24 @@ cm_iterative_target_adj,input,questionnaire pm_shPPPMER,input,questionnaire pm_pop,input,questionnaire pm_gdp,input,questionnaire -cm_CO2priceRegConvEndYr,input,questionnaire cm_NDC_divergentScenario,input,questionnaire vm_demFeSector,input,questionnaire pm_emifac,input,questionnaire cm_startyear,input,added by codeCheck -cm_co2_tax_spread,input,no carbon price differentiation in this realization -cm_co2_tax_startyear,input,added by codeCheck cm_peakBudgYr,input,added by codeCheck -cm_taxCO2inc_after_peakBudgYr,input,added by codeCheck fm_taxCO2eqHist,input,not needed +sm_budgetCO2eqGlob,input,no iterative target adjustment +sm_globalBudget_dev,input,no iterative target adjustment +vm_emiTe,input,no iterative target adjustment +vm_emiCdr,input,no iterative target adjustment +vm_emiMac,input,no iterative target adjustment +vm_emiAll,input,no iterative target adjustment +pm_budgetCO2eq,input,no iterative target adjustment +pm_ts,input,no iterative target adjustment +cm_iteration_max,input,no iterative target adjustment +cm_taxCO2_startyear,input,added by codeCheck +cm_taxCO2_expGrowth,input,added by codeCheck +cm_taxCO2_IncAfterPeakBudgYr,input,added by codeCheck +cm_budgetCO2from2020,input,no iterative target adjustment +pm_taxCO2eq_anchor_iterationdiff,input,no iterative target adjustment +pm_taxCO2eq_anchor_iterationdiff_tmp,input,no iterative target adjustment diff --git a/modules/45_carbonprice/NPi2025_EUR55/datainput.gms b/modules/45_carbonprice/NPi2025_EUR55/datainput.gms index 531c7ec75..d2c98bdbe 100755 --- a/modules/45_carbonprice/NPi2025_EUR55/datainput.gms +++ b/modules/45_carbonprice/NPi2025_EUR55/datainput.gms @@ -12,10 +12,10 @@ pm_taxCO2eq(ttot,regi)$(ttot.val le 2025) = fm_taxCO2eqHist(ttot,regi) * sm_DptCO2_2_TDpGtC; -pm_taxCO2eq(t,regi)$(t.val gt 2025) = sum(ttot, pm_taxCO2eq(ttot,regi)$(ttot.val eq 2025)) * cm_co2_tax_growth**(t.val - 2025); +pm_taxCO2eq(t,regi)$(t.val gt 2025) = sum(ttot, pm_taxCO2eq(ttot,regi)$(ttot.val eq 2025)) * cm_taxCO2_expGrowth**(t.val - 2025); loop(ext_regi$sameas(ext_regi, "EUR_regi"), - pm_taxCO2eq(t,regi)$(t.val ge 2030 AND regi_group(ext_regi,regi)) = fm_taxCO2eqHist("2030",regi) * sm_DptCO2_2_TDpGtC * cm_co2_tax_growth**(t.val - 2030); + pm_taxCO2eq(t,regi)$(t.val ge 2030 AND regi_group(ext_regi,regi)) = fm_taxCO2eqHist("2030",regi) * sm_DptCO2_2_TDpGtC * cm_taxCO2_expGrowth**(t.val - 2030); ); pm_taxCO2eq(t,regi)$(t.val gt 2110) = pm_taxCO2eq("2110",regi); !! to prevent huge taxes after 2110 and the resulting convergence problems, set taxes after 2110 equal to 2110 value diff --git a/modules/45_carbonprice/NPi2025_EUR55/not_used.txt b/modules/45_carbonprice/NPi2025_EUR55/not_used.txt index 57c09d7f0..ef3c5f10e 100755 --- a/modules/45_carbonprice/NPi2025_EUR55/not_used.txt +++ b/modules/45_carbonprice/NPi2025_EUR55/not_used.txt @@ -23,12 +23,22 @@ pm_ttot_2_tall,input,questionnaire pm_shPPPMER,input,questionnaire pm_pop,input,questionnaire pm_gdp,input,questionnaire -cm_CO2priceRegConvEndYr,input,questionnaire cm_NDC_divergentScenario,input,questionnaire vm_demFeSector,input,questionnaire pm_emifac,input,questionnaire -cm_co2_tax_spread,input,not needed cm_peakBudgYr,input,not needed -cm_co2_tax_startyear,input,not needed -cm_taxCO2inc_after_peakBudgYr,input,not needed sm_D2005_2_D2017,input,not needed +sm_budgetCO2eqGlob,input,no iterative target adjustment +sm_globalBudget_dev,input,no iterative target adjustment +vm_emiTe,input,no iterative target adjustment +vm_emiCdr,input,no iterative target adjustment +vm_emiMac,input,no iterative target adjustment +vm_emiAll,input,no iterative target adjustment +pm_budgetCO2eq,input,no iterative target adjustment +pm_ts,input,no iterative target adjustment +cm_iteration_max,input,no iterative target adjustment +cm_taxCO2_startyear,input,added by codeCheck +cm_taxCO2_IncAfterPeakBudgYr,input,added by codeCheck +cm_budgetCO2from2020,input,no iterative target adjustment +pm_taxCO2eq_anchor_iterationdiff,input,no iterative target adjustment +pm_taxCO2eq_anchor_iterationdiff_tmp,input,no iterative target adjustment diff --git a/modules/45_carbonprice/NPiexpo/datainput.gms b/modules/45_carbonprice/NPiexpo/datainput.gms index 108cac05b..00ce621b9 100644 --- a/modules/45_carbonprice/NPiexpo/datainput.gms +++ b/modules/45_carbonprice/NPiexpo/datainput.gms @@ -14,7 +14,7 @@ Execute_Loadpoint "input_ref" pm_taxCO2eq = pm_taxCO2eq; *** calculate pm_taxCO2eq for year before startyear -pm_taxCO2eq(t,regi) = sum(ttot, pm_taxCO2eq(ttot,regi)$(ttot.val eq smax(ttot2$( ttot2.val lt cm_startyear ), ttot2.val))) * cm_co2_tax_growth**(t.val-smax(ttot2$( ttot2.val lt cm_startyear ), ttot2.val)); +pm_taxCO2eq(t,regi) = sum(ttot, pm_taxCO2eq(ttot,regi)$(ttot.val eq smax(ttot2$( ttot2.val lt cm_startyear ), ttot2.val))) * cm_taxCO2_expGrowth**(t.val-smax(ttot2$( ttot2.val lt cm_startyear ), ttot2.val)); pm_taxCO2eq(t,regi)$(t.val gt 2110) = pm_taxCO2eq("2110",regi); !! to prevent huge taxes after 2110 and the resulting convergence problems, set taxes after 2110 equal to 2110 value diff --git a/modules/45_carbonprice/NPiexpo/not_used.txt b/modules/45_carbonprice/NPiexpo/not_used.txt index a8a0fa0a3..be908a924 100644 --- a/modules/45_carbonprice/NPiexpo/not_used.txt +++ b/modules/45_carbonprice/NPiexpo/not_used.txt @@ -22,14 +22,24 @@ pm_ttot_2_tall,input,questionnaire pm_shPPPMER,input,questionnaire pm_pop,input,questionnaire pm_gdp,input,questionnaire -cm_CO2priceRegConvEndYr,input,questionnaire cm_NDC_divergentScenario,input,questionnaire vm_demFeSector,input,questionnaire pm_emifac,input,questionnaire sm_DptCO2_2_TDpGtC,input,added by codeCheck cm_peakBudgYr,input,added by codeCheck -cm_co2_tax_startyear,input,added by codeCheck fm_taxCO2eqHist,input,not needed sm_D2005_2_D2017,input,not needed -cm_taxCO2inc_after_peakBudgYr,input,not needed -cm_co2_tax_spread,input,not needed +sm_budgetCO2eqGlob,input,no iterative target adjustment +sm_globalBudget_dev,input,no iterative target adjustment +vm_emiTe,input,no iterative target adjustment +vm_emiCdr,input,no iterative target adjustment +vm_emiMac,input,no iterative target adjustment +vm_emiAll,input,no iterative target adjustment +pm_budgetCO2eq,input,no iterative target adjustment +pm_ts,input,no iterative target adjustment +cm_iteration_max,input,no iterative target adjustment +cm_taxCO2_startyear,input,added by codeCheck +cm_taxCO2_IncAfterPeakBudgYr,input,added by codeCheck +cm_budgetCO2from2020,input,no iterative target adjustment +pm_taxCO2eq_anchor_iterationdiff,input,no iterative target adjustment +pm_taxCO2eq_anchor_iterationdiff_tmp,input,no iterative target adjustment diff --git a/modules/45_carbonprice/exogenous/not_used.txt b/modules/45_carbonprice/exogenous/not_used.txt index b23d8b978..1c046562f 100644 --- a/modules/45_carbonprice/exogenous/not_used.txt +++ b/modules/45_carbonprice/exogenous/not_used.txt @@ -7,7 +7,6 @@ name,type,reason sm_c_2_co2,switch, ??? pm_ttot_val,parameter,??? -cm_co2_tax_growth,switch,??? cm_expoLinear_yearStart,switch,??? vm_co2eq,variable,??? vm_emiFgas,input,questionnaire @@ -21,15 +20,26 @@ pm_ttot_2_tall,input,questionnaire pm_shPPPMER,input,questionnaire pm_pop,input,questionnaire pm_gdp,input,questionnaire -cm_CO2priceRegConvEndYr,input,questionnaire cm_NDC_divergentScenario,input,questionnaire vm_demFeSector,input,questionnaire pm_emifac,input,questionnaire sm_DptCO2_2_TDpGtC,input,questionnaire cm_startyear,input,questionnaire -cm_co2_tax_spread,switch,no carbon price differentiation in this realization -cm_co2_tax_startyear,input,added by codeCheck cm_peakBudgYr,input,added by codeCheck -cm_taxCO2inc_after_peakBudgYr,input,added by codeCheck sm_D2005_2_D2017,input,not needed fm_taxCO2eqHist,input,not needed +sm_budgetCO2eqGlob,input,no iterative target adjustment +sm_globalBudget_dev,input,no iterative target adjustment +vm_emiTe,input,no iterative target adjustment +vm_emiCdr,input,no iterative target adjustment +vm_emiMac,input,no iterative target adjustment +vm_emiAll,input,no iterative target adjustment +pm_budgetCO2eq,input,no iterative target adjustment +pm_ts,input,no iterative target adjustment +cm_iteration_max,input,no iterative target adjustment +cm_taxCO2_startyear,input,added by codeCheck +cm_taxCO2_expGrowth,input,added by codeCheck +cm_taxCO2_IncAfterPeakBudgYr,input,added by codeCheck +cm_budgetCO2from2020,input,no iterative target adjustment +pm_taxCO2eq_anchor_iterationdiff,input,no iterative target adjustment +pm_taxCO2eq_anchor_iterationdiff_tmp,input,no iterative target adjustment diff --git a/modules/45_carbonprice/expoLinear/datainput.gms b/modules/45_carbonprice/expoLinear/datainput.gms index 5d4cfd6d7..aadc34404 100644 --- a/modules/45_carbonprice/expoLinear/datainput.gms +++ b/modules/45_carbonprice/expoLinear/datainput.gms @@ -6,7 +6,7 @@ *** | Contact: remind@pik-potsdam.de *** SOF ./modules/45_carbonprice/expoLinear/datainput.gms -*** Carbon price increases exponentially with rate given by cm_co2_tax_growth (default = 4.5%) %) until cm_expoLinear_yearStart (defaults to 2060) +*** Carbon price increases exponentially with rate given by cm_taxCO2_expGrowth (default = 4.5%) %) until cm_expoLinear_yearStart (defaults to 2060) *** and then transitions into linear growth (with slope given by last timestep before cm_expoLinear_yearStart). *** Not compatible with iterative adjustment of CO2 tax [i.e. requires cm_iterative_target_adj = 0] @@ -15,24 +15,24 @@ if( cm_iterative_target_adj ne 0, abort "The realization 45_carbonprice/expoLinear is only compatible with cm_iterative_target_adj = 0. Please adjust config file accordingly" ); -if(cm_co2_tax_startyear le 0, - abort "please choose a valid cm_co2_tax_startyear" -elseif cm_co2_tax_startyear gt 0, +if(cm_taxCO2_startyear le 0, + abort "please choose a valid cm_taxCO2_startyear" +elseif cm_taxCO2_startyear gt 0, *** convert tax value from $/t CO2eq to T$/GtC - s45_co2_tax_startyear = cm_co2_tax_startyear * sm_DptCO2_2_TDpGtC; + s45_taxCO2_startyear = cm_taxCO2_startyear * sm_DptCO2_2_TDpGtC; ); *** calculate tax path until cm_expoLinear_yearStart (defaults to 2060) -pm_taxCO2eq(t,regi) = s45_co2_tax_startyear*cm_co2_tax_growth**(t.val-cm_startyear); +pm_taxCO2eq(t,regi) = s45_taxCO2_startyear*cm_taxCO2_expGrowth**(t.val-cm_startyear); *** use linear tax path from cm_expoLinear_yearStart on (with slope given by last timestep before cm_expoLinear_yearStart) -p45_tau_co2_tax_inc(regi) = sum(ttot$(ttot.val eq cm_expoLinear_yearStart), +p45_taxCO2eq_expoLinearIncrease(regi) = sum(ttot$(ttot.val eq cm_expoLinear_yearStart), ((pm_taxCO2eq(ttot, regi) - pm_taxCO2eq(ttot - 1, regi)) / (pm_ttot_val(ttot) - pm_ttot_val(ttot - 1)))); !! Using ttot to make use of pm_ttot_val pm_taxCO2eq(t,regi)$(t.val gt cm_expoLinear_yearStart) = sum(t2$(t2.val eq cm_expoLinear_yearStart), pm_taxCO2eq(t2, regi)) - + p45_tau_co2_tax_inc(regi) * (t.val - cm_expoLinear_yearStart); + + p45_taxCO2eq_expoLinearIncrease(regi) * (t.val - cm_expoLinear_yearStart); *** set carbon price constant after 2110 to prevent huge carbon prices which lead to convergence problems pm_taxCO2eq(t,regi)$(t.val gt 2110) = pm_taxCO2eq("2110",regi); display pm_taxCO2eq; -display p45_tau_co2_tax_inc; +display p45_taxCO2eq_expoLinearIncrease; *** EOF ./modules/45_carbonprice/expoLinear/datainput.gms diff --git a/modules/45_carbonprice/expoLinear/declarations.gms b/modules/45_carbonprice/expoLinear/declarations.gms index 6f149acf7..aaa563e02 100644 --- a/modules/45_carbonprice/expoLinear/declarations.gms +++ b/modules/45_carbonprice/expoLinear/declarations.gms @@ -7,10 +7,10 @@ *** SOF ./modules/45_carbonprice/expoLinear/declarations.gms scalar -s45_co2_tax_startyear "level of CO2 tax in start year [T$/GtC]" +s45_taxCO2_startyear "CO2 tax provided by cm_taxCO2_startyear converted from $/t CO2eq to T$/GtC" ; parameter -p45_tau_co2_tax_inc(all_regi) "Linear annual increase in carbon price [T$/GtC/yr]" +p45_taxCO2eq_expoLinearIncrease(all_regi) "Linear annual increase in carbon price [T$/GtC/yr] right before cm_expoLinear_yearStart" ; *** EOF ./modules/45_carbonprice/expoLinear/declarations.gms diff --git a/modules/45_carbonprice/expoLinear/not_used.txt b/modules/45_carbonprice/expoLinear/not_used.txt index e399a95dd..6262db85f 100644 --- a/modules/45_carbonprice/expoLinear/not_used.txt +++ b/modules/45_carbonprice/expoLinear/not_used.txt @@ -7,7 +7,6 @@ name,type,reason sm_c_2_co2,switch, ??? cm_emiscen,switch,??? -cm_iterative_target_adj,switch,??? vm_co2eq,variable,??? vm_emiFgas,input,questionnaire pm_globalMeanTemperature,input,questionnaire @@ -20,12 +19,22 @@ pm_ttot_2_tall,input,questionnaire pm_shPPPMER,input,questionnaire pm_pop,input,questionnaire pm_gdp,input,questionnaire -cm_CO2priceRegConvEndYr,input,questionnaire cm_NDC_divergentScenario,input,questionnaire vm_demFeSector,input,questionnaire pm_emifac,input,questionnaire -cm_co2_tax_spread,input,No carbon price differentiation in this realization cm_peakBudgYr,input,added by codeCheck -cm_taxCO2inc_after_peakBudgYr,input,added by codeCheck sm_D2005_2_D2017,input,not needed fm_taxCO2eqHist,input,not needed +sm_budgetCO2eqGlob,input,no iterative target adjustment +sm_globalBudget_dev,input,no iterative target adjustment +vm_emiTe,input,no iterative target adjustment +vm_emiCdr,input,no iterative target adjustment +vm_emiMac,input,no iterative target adjustment +vm_emiAll,input,no iterative target adjustment +pm_budgetCO2eq,input,no iterative target adjustment +pm_ts,input,no iterative target adjustment +cm_iteration_max,input,no iterative target adjustment +cm_taxCO2_IncAfterPeakBudgYr,input,added by codeCheck +cm_budgetCO2from2020,input,no iterative target adjustment +pm_taxCO2eq_anchor_iterationdiff,input,no iterative target adjustment +pm_taxCO2eq_anchor_iterationdiff_tmp,input,no iterative target adjustment diff --git a/modules/45_carbonprice/functionalForm/datainput.gms b/modules/45_carbonprice/functionalForm/datainput.gms index 59d1fcabf..33d6654c3 100644 --- a/modules/45_carbonprice/functionalForm/datainput.gms +++ b/modules/45_carbonprice/functionalForm/datainput.gms @@ -17,8 +17,7 @@ display p45_taxCO2eq_path_gdx_ref; *** -------- initial declaration of parameters for iterative target adjustment o45_reached_until2150pricepath(iteration) = 0; -p45_taxCO2eq_anchor_iterationdiff(t) = 0; -p45_taxCO2eq_anchor_iterationdiff_tmp(t) = 0; + ***----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- *** Part I (Global anchor trajectory): The functional form (linear/exponential) of the global anchor trajectory is chosen via cm_taxCO2_functionalForm. @@ -122,7 +121,7 @@ $elseIf.taxCO2regiDiff3 "%cm_taxCO2_regiDiff%" == "gdpSpread" *** Set s45_regiDiff_gdpThreshold (in 1e3 $ PPP 2017) s45_regiDiff_gdpThreshold = 50; *** Compute ratio between GDP per capita (in 1e3 $ PPP 2017) and s45_regiDiff_gdpThreshold, and upper bound it by 1 -p45_regiDiff_convFactor(t,regi) = min(p45_gdppcap_PPP(t,regi) / 50 , 1) +p45_regiDiff_convFactor(t,regi) = min(p45_gdppcap_PPP(t,regi) / 50 , 1); $else.taxCO2regiDiff3 $ifThen.taxCO2regiDiff4 "%cm_taxCO2_regiDiff%" == "initialSpread10" *** Define p45_regiDiff_initialRatio for maximal initial spread equal to 10 @@ -154,7 +153,7 @@ p45_regiDiff_convFactor(t,regi)$(t.val lt s45_regiDiff_startYr) = p45_regiDiff_i *** Set convergence factor equal to 1 from p45_regiDiff_endYr: p45_regiDiff_convFactor(t,regi)$(t.val ge p45_regiDiff_endYr(regi)) = 1; *** Create quadratic convergence between s45_regiDiff_startYr and p45_regiDiff_endYr: -loop(t$((t.val ge s45_regiDiff_startYr) and (t.val lt p45_regiDiff_endYr(regi))), +loop((t,regi)$((t.val ge s45_regiDiff_startYr) and (t.val lt p45_regiDiff_endYr(regi))), p45_regiDiff_convFactor(t,regi) = min(1, max(0, @@ -183,13 +182,13 @@ p45_interpolation_exponent(regi) = 1; *** Set last timestep before cm_startyear as default for interpolation start p45_interpolation_startYr(regi) = smax(ttot$( ttot.val lt cm_startyear ), ttot.val); -$ifThen.CO2taxInterpolation2 "%cm_co2_tax_interpolation%" == "off" +$ifThen.CO2taxInterpolation2 "%cm_taxCO2_interpolation%" == "off" *** No interpolation p45_interpolation_endYr(regi) = p45_interpolation_startYr(regi); -$elseIf.CO2taxInterpolation2 "%cm_co2_tax_interpolation%" == "one_step" +$elseIf.CO2taxInterpolation2 "%cm_taxCO2_interpolation%" == "one_step" *** Interpolation in 10 years, i.e. one intermediate step p45_interpolation_endYr(regi) = smin(ttot$( ttot.val ge cm_startyear + 5), ttot.val); -$elseIf.CO2taxInterpolation2 "%cm_co2_tax_interpolation%" == "two_steps" +$elseIf.CO2taxInterpolation2 "%cm_taxCO2_interpolation%" == "two_steps" *** Interpolation in 15 years, i.e. two intermediate steps p45_interpolation_endYr(regi) = smin(ttot$( ttot.val ge cm_startyear + 10), ttot.val); $else.CO2taxInterpolation2 @@ -211,7 +210,7 @@ loop(regi, sum(t2$(t2.val eq p45_interpolation_startYr(regi)), p45_taxCO2eq_path_gdx_ref(t2,regi)) !! value of p45_taxCO2eq_path_gdx_ref in p45_interpolation_startYr * (1 - rPower( (t.val - p45_interpolation_startYr(regi)) / (p45_interpolation_endYr(regi) - p45_interpolation_startYr(regi)), p45_interpolation_exponent(regi))) + sum(t3$(t3.val eq p45_interpolation_endYr(regi)), p45_taxCO2eq_regiDiff(t3,regi)) !! value of p45_taxCO2eq_regiDiff in p45_interpolation_endYr - * rPower( (t.val - p45_interpolation_startYr(regi)) / (p45_interpolation_endYr(regi) - p45_interpolation_startYr(regi)), p45_interpolation_exponent(regi)) + * rPower( (t.val - p45_interpolation_startYr(regi)) / (p45_interpolation_endYr(regi) - p45_interpolation_startYr(regi)), p45_interpolation_exponent(regi)); pm_taxCO2eq(t,regi)$(t.val ge p45_interpolation_endYr(regi)) = p45_taxCO2eq_regiDiff(t,regi); ); display pm_taxCO2eq; diff --git a/modules/45_carbonprice/functionalForm/declarations.gms b/modules/45_carbonprice/functionalForm/declarations.gms index e222bbcbd..35a5a9837 100644 --- a/modules/45_carbonprice/functionalForm/declarations.gms +++ b/modules/45_carbonprice/functionalForm/declarations.gms @@ -9,10 +9,10 @@ scalars s45_taxCO2_startyear "CO2 tax provided by cm_taxCO2_startyear converted from $/t CO2eq to T$/GtC" -$ifThen.taxCO2functionalForm "%cm_taxCO2_functionalForm%" == "linear" +$ifThen.taxCO2functionalForm1 "%cm_taxCO2_functionalForm%" == "linear" s45_taxCO2_historical "historical level of CO2 tax converted from $/t CO2eq to T$/GtC" s45_taxCO2_historicalYr "year of s45_taxCO2_historical" -$endIf.taxCO2functionalForm +$endIf.taxCO2functionalForm1 $ifThen.taxCO2regiDiff1 "%cm_taxCO2_regiDiff%" == "none" $elseIf.taxCO2regiDiff1 "%cm_taxCO2_regiDiff%" == "gdpSpread" @@ -67,10 +67,7 @@ p45_actualbudgetco2(ttot) "actual level of cumulat p45_taxCO2eq_iteration(iteration,ttot,all_regi) "save pm_taxCO2eq from each iteration for debugging" p45_taxCO2eq_anchor_iteration(iteration,ttot) "save p45_taxCO2eq_anchor from each iteration for debugging" - -p45_taxCO2eq_anchor_iterationdiff(ttot) "help parameter for iterative adjustment of taxes" -p45_taxCO2eq_anchor_iterationdiff_tmp(ttot) "help parameter for iterative adjustment of taxes" -o45_taxCO2eq_anchor_iterDiff_Itr(iteration) "track p45_taxCO2eq_anchor_iterationdiff over iterations" +o45_taxCO2eq_anchor_iterDiff_Itr(iteration) "track pm_taxCO2eq_anchor_iterationdiff over iterations" o45_diff_to_Budg(iteration) "Difference between actual CO2 budget and target CO2 budget" o45_totCO2emi_peakBudgYr(iteration) "Total CO2 emissions in the peakBudgYr" diff --git a/modules/45_carbonprice/functionalForm/not_used.txt b/modules/45_carbonprice/functionalForm/not_used.txt index b209cfbc4..07e57f96a 100644 --- a/modules/45_carbonprice/functionalForm/not_used.txt +++ b/modules/45_carbonprice/functionalForm/not_used.txt @@ -5,15 +5,12 @@ # | 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_expoLinear_yearStart,input,questionnaire cm_carbonprice_temperatureLimit,input,questionnaire cm_NDC_divergentScenario,input,questionnaire diff --git a/modules/45_carbonprice/functionalForm/postsolve.gms b/modules/45_carbonprice/functionalForm/postsolve.gms index a70574544..fad5c9d47 100644 --- a/modules/45_carbonprice/functionalForm/postsolve.gms +++ b/modules/45_carbonprice/functionalForm/postsolve.gms @@ -10,79 +10,75 @@ if((cm_iterative_target_adj ne 0), ***-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -*** Part I and II (Global anchor trajectory and post-peak behaviour): Adjustment of global anchor trajectory to meet (peak or end-of-century) CO2 budget target prescribed via c_budgetCO2from2020. +*** Part I and II (Global anchor trajectory and post-peak behaviour): Adjustment of global anchor trajectory to meet (peak or end-of-century) CO2 budget target prescribed via cm_budgetCO2from2020. *** If iterative_target_adj = 7 or 9, cm_peakBudgYr also adjusted. ***-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - +*** Algorithm for end-of-century CO2 budget targets if(cm_iterative_target_adj eq 5, *JeS* Iteratively update regional CO2 tax trajectories / regional CO2 budget to reach the global emission budget (s45_actualbudgetco2 runs from 2020-2100, not peak budget) -*KK* for a time step of 5 years, the budget is calculated as 3 * 2020 + ts(2025-2090) + 8 * 2100; +*KK* for a time step of 5 years, the budget is calculated as 3 * 2020 + ts(2025-2090) + 5.5 * 2100; *** 10-pm_ts("2090")/2 and pm_ts("2020")/2 are the time periods that haven't been taken into account in the sum over ttot. *** 0.5 year of emissions is added for the two boundaries, such that the budget is calculated for 81 years. -s45_actualbudgetco2 = sum(ttot$(ttot.val le 2090 AND ttot.val > 2020), (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))) - + sum(regi, vm_emiTe.l("2100",regi,"co2") + vm_emiCdr.l("2100",regi,"co2") + vm_emiMac.l("2100",regi,"co2")) * sm_c_2_co2 * (10 - pm_ts("2090")/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); - +s45_actualbudgetco2 = sum(ttot$(ttot.val le 2090 AND ttot.val > 2020), (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))) + + sum(regi, vm_emiTe.l("2100",regi,"co2") + vm_emiCdr.l("2100",regi,"co2") + vm_emiMac.l("2100",regi,"co2")) * sm_c_2_co2 * (10 - pm_ts("2090")/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); display s45_actualbudgetco2; if (cm_emiscen eq 6, if(o_modelstat eq 2 AND ord(iteration) 0 AND abs(c_budgetCO2from2020 - s45_actualbudgetco2) ge 0.5, !!only for optimal iterations, and not after the last one, and only if budget still possitive, and only if target not yet reached - sm_globalBudget_dev = s45_actualbudgetco2 / c_budgetCO2from2020; + display p45_taxCO2eq_anchor; + if(o_modelstat eq 2 AND ord(iteration) 0 AND abs(cm_budgetCO2from2020 - s45_actualbudgetco2) ge 0.5, !!only for optimal iterations, and not after the last one, and only if budget still possitive, and only if target not yet reached + sm_globalBudget_dev = s45_actualbudgetco2 / cm_budgetCO2from2020; *** make sure that iteration converges: *** use multiplicative for budgets higher than 1200 Gt; for lower budgets, use multiplicative adjustment only for first 3 iterations, - if(ord(iteration) lt 3 or c_budgetCO2from2020 > 1200, + if(ord(iteration) lt 3 or cm_budgetCO2from2020 > 1200, !! change in CO2 price through adjustment: new price - old price; needed for adjustment option 2 - p45_taxCO2eq_anchor_iterationdiff(t) = pm_taxCO2eq(t,regi) * min(max((s45_actualbudgetco2/c_budgetCO2from2020)** (25/(2 * iteration.val + 23)),0.5+iteration.val/208),2 - iteration.val/102) - pm_taxCO2eq(t,regi); - pm_taxCO2eq(t,regi) = pm_taxCO2eq(t,regi) + p45_taxCO2eq_anchor_iterationdiff(t) ; + pm_taxCO2eq_anchor_iterationdiff(t) = p45_taxCO2eq_anchor(t) * min(max((s45_actualbudgetco2/cm_budgetCO2from2020)** (25/(2 * iteration.val + 23)),0.5+iteration.val/208),2 - iteration.val/102) - p45_taxCO2eq_anchor(t); + p45_taxCO2eq_anchor(t) = p45_taxCO2eq_anchor(t) + pm_taxCO2eq_anchor_iterationdiff(t) ; *** then switch to triangle-approximation based on last two iteration data points else - !! change in CO2 price through adjustment: new price - old price; the two instances of "pm_taxCO2eq" cancel out -> only the difference term - p45_taxCO2eq_anchor_iterationdiff_tmp(t) = - max(p45_taxCO2eq_anchor_iterationdiff(t) * min(max((c_budgetCO2from2020 - s45_actualbudgetco2)/(s45_actualbudgetco2 - s45_actualbudgetco2_last),-2),2),-pm_taxCO2eq(t,regi)/2); - pm_taxCO2eq(t,regi) = pm_taxCO2eq(t,regi) + - max(p45_taxCO2eq_anchor_iterationdiff(t) * min(max((c_budgetCO2from2020 - s45_actualbudgetco2)/(s45_actualbudgetco2 - s45_actualbudgetco2_last),-2),2),-pm_taxCO2eq(t,regi)/2); - p45_taxCO2eq_anchor_iterationdiff(t) = p45_taxCO2eq_anchor_iterationdiff_tmp(t); +*** change in CO2 price through adjustment: new price - old price; the two instances of p45_taxCO2eq_anchor cancel out -> only the difference term + pm_taxCO2eq_anchor_iterationdiff_tmp(t) = + max(pm_taxCO2eq_anchor_iterationdiff(t) * min(max((cm_budgetCO2from2020 - s45_actualbudgetco2)/(s45_actualbudgetco2 - s45_actualbudgetco2_last),-2),2),-p45_taxCO2eq_anchor(t)/2); + p45_taxCO2eq_anchor(t) = p45_taxCO2eq_anchor(t) + + max(pm_taxCO2eq_anchor_iterationdiff(t) * min(max((cm_budgetCO2from2020 - s45_actualbudgetco2)/(s45_actualbudgetco2 - s45_actualbudgetco2_last),-2),2),-p45_taxCO2eq_anchor(t)/2); + pm_taxCO2eq_anchor_iterationdiff(t) = pm_taxCO2eq_anchor_iterationdiff_tmp(t); ); - o45_taxCO2eq_anchor_iterDiff_Itr(iteration) = p45_taxCO2eq_anchor_iterationdiff("2030"); + o45_taxCO2eq_anchor_iterDiff_Itr(iteration) = pm_taxCO2eq_anchor_iterationdiff("2100"); else - if(s45_actualbudgetco2 > 0 or abs(c_budgetCO2from2020 - s45_actualbudgetco2) < 2, !! if model was not optimal, or if budget already reached, keep tax constant - pm_taxCO2eq(t,regi) = pm_taxCO2eq(t,regi); + if(s45_actualbudgetco2 > 0 or abs(cm_budgetCO2from2020 - s45_actualbudgetco2) < 2, !! if model was not optimal, or if budget already reached, keep tax constant + p45_taxCO2eq_anchor(t) = p45_taxCO2eq_anchor(t); o45_taxCO2eq_anchor_iterDiff_Itr(iteration) = 0; else *** if budget has turned negative, reduce CO2 price by 20% - p45_taxCO2eq_anchor_iterationdiff(t) = -0.2*pm_taxCO2eq(t,regi); - pm_taxCO2eq(t,regi) = pm_taxCO2eq(t,regi) + p45_taxCO2eq_anchor_iterationdiff(t); - o45_taxCO2eq_anchor_iterDiff_Itr(iteration) = p45_taxCO2eq_anchor_iterationdiff("2030"); + pm_taxCO2eq_anchor_iterationdiff(t) = -0.2*p45_taxCO2eq_anchor(t); + p45_taxCO2eq_anchor(t) = p45_taxCO2eq_anchor(t) + pm_taxCO2eq_anchor_iterationdiff(t); + o45_taxCO2eq_anchor_iterDiff_Itr(iteration) = pm_taxCO2eq_anchor_iterationdiff("2100"); ); ); display o45_taxCO2eq_anchor_iterDiff_Itr; - - pm_taxCO2eq(t,regi)$(t.val gt 2110) = pm_taxCO2eq("2110",regi); !! to prevent huge taxes after 2110 and the resulting convergence problems, set taxes after 2110 equal to 2110 value - display pm_taxCO2eq; +*** If functionalForm is linear, re-adjust global anchor trajectory to go through the point (cm_taxCO2_historicalYr, cm_taxCO2_historical) +$ifThen.taxCO2functionalForm2 "%cm_taxCO2_functionalForm%" == "linear" +p45_taxCO2eq_anchor(t)$(t.val lt 2110) = s45_taxCO2_historical + + (p45_taxCO2eq_anchor("2110") - s45_taxCO2_historical) / (2110 - s45_taxCO2_historicalYr) !! Yearly increase of CO2 price that interpolates between cm_taxCO2_historical in cm_taxCO2_historicalYr and p45_taxCO2eq_anchor in 2110 + * (t.val - s45_taxCO2_historicalYr) ; +p45_taxCO2eq_anchor(t)$(t.val gt 2110) = p45_taxCO2eq_anchor("2110"); +$endIf.taxCO2functionalForm2 ); ); - -*** --------------------------------------------------------------------------------------------------------------- -*** ENGAGE peakBudg formulation that works with several CO2 price path realizations of module 45 --------------------- -*** it results in a peak budget with zero net CO2 emissions afterwards -*** --------------------------------------------------------------------------------------------------------------- +*** Algorithm for ENGAGE peakBudg formulation that results in a peak budget with zero net CO2 emissions afterwards if(cm_iterative_target_adj eq 7, *JeS/CB* Iteratively update regional CO2 tax trajectories / regional CO2 budget to reach the target for global peak budget, but make sure CO2 emissions afterward are close to zero on the global level - - - *KK* p45_actualbudgetco2 for ttot > 2020. It includes emissions from 2020 to ttot (including ttot). *** (ttot.val - (ttot - 1).val)/2 and pm_ts("2020")/2 are the time periods that haven't been taken into account in the sum over ttot2. *** 0.5 year of emissions is added for the two boundaries, such that the budget includes emissions in ttot. @@ -91,52 +87,50 @@ p45_actualbudgetco2(ttot)$(ttot.val > 2020) = sum(ttot2$(ttot2.val < ttot.val AN + 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); s45_actualbudgetco2 = smax(t$(t.val le cm_peakBudgYr AND t.val le 2100),p45_actualbudgetco2(t)); - - o45_peakBudgYr_Itr(iteration) = cm_peakBudgYr; +o45_peakBudgYr_Itr(iteration) = cm_peakBudgYr; -display s45_actualbudgetco2; -display p45_actualbudgetco2; +display s45_actualbudgetco2, p45_actualbudgetco2; if (cm_emiscen eq 9, - if(o_modelstat eq 2 AND ord(iteration) 0 AND abs(c_budgetCO2from2020 - s45_actualbudgetco2) ge 0.5, !!only for optimal iterations, and not after the last one, and only if budget still possitive, and only if target not yet reached - display pm_taxCO2eq; + if(o_modelstat eq 2 AND ord(iteration) 0 AND abs(cm_budgetCO2from2020 - s45_actualbudgetco2) ge 0.5, !!only for optimal iterations, and not after the last one, and only if budget still possitive, and only if target not yet reached + display p45_taxCO2eq_anchor; *** make sure that iteration converges: *** use multiplicative for budgets higher than 1600 Gt; for lower budgets, use multiplicative adjustment only for first 3 iterations, - if(ord(iteration) lt 3 or c_budgetCO2from2020 > 1600, + if(ord(iteration) lt 3 or cm_budgetCO2from2020 > 1600, !! change in CO2 price through adjustment: new price - old price; needed for adjustment option 2 - p45_taxCO2eq_anchor_iterationdiff(t) = pm_taxCO2eq(t,regi) * min(max((s45_actualbudgetco2/c_budgetCO2from2020)** (25/(2 * iteration.val + 23)),0.5+iteration.val/208),2 - iteration.val/102) - pm_taxCO2eq(t,regi); - pm_taxCO2eq(t,regi)$(t.val le cm_peakBudgYr) = pm_taxCO2eq(t,regi) + p45_taxCO2eq_anchor_iterationdiff(t) ; - p45_taxCO2eq_anchor_until2150(t) = p45_taxCO2eq_anchor_until2150(t) + p45_taxCO2eq_anchor_iterationdiff(t) ; + pm_taxCO2eq_anchor_iterationdiff(t) = p45_taxCO2eq_anchor(t) * min(max((s45_actualbudgetco2/cm_budgetCO2from2020)** (25/(2 * iteration.val + 23)),0.5+iteration.val/208),2 - iteration.val/102) - p45_taxCO2eq_anchor(t); + p45_taxCO2eq_anchor(t)$(t.val le cm_peakBudgYr) = p45_taxCO2eq_anchor(t) + pm_taxCO2eq_anchor_iterationdiff(t) ; + p45_taxCO2eq_anchor_until2150(t) = p45_taxCO2eq_anchor_until2150(t) + pm_taxCO2eq_anchor_iterationdiff(t) ; *** then switch to triangle-approximation based on last two iteration data points else - !! change in CO2 price through adjustment: new price - old price; the two instances of "pm_taxCO2eq" cancel out -> only the difference term + !! change in CO2 price through adjustment: new price - old price; the two instances of "p45_taxCO2eq_anchor" cancel out -> only the difference term !! until cm_peakBudgYr: expolinear price trajectory - p45_taxCO2eq_anchor_iterationdiff_tmp(t) = - max(p45_taxCO2eq_anchor_iterationdiff(t) * min(max((c_budgetCO2from2020 - s45_actualbudgetco2)/(s45_actualbudgetco2 - s45_actualbudgetco2_last),-2),2),-pm_taxCO2eq(t,regi)/2); - pm_taxCO2eq(t,regi)$(t.val le cm_peakBudgYr) = pm_taxCO2eq(t,regi) + - max(p45_taxCO2eq_anchor_iterationdiff(t) * min(max((c_budgetCO2from2020 - s45_actualbudgetco2)/(s45_actualbudgetco2 - s45_actualbudgetco2_last),-2),2),-pm_taxCO2eq(t,regi)/2); - p45_taxCO2eq_anchor_until2150(t) = p45_taxCO2eq_anchor_until2150(t) + - max(p45_taxCO2eq_anchor_iterationdiff(t) * min(max((c_budgetCO2from2020 - s45_actualbudgetco2)/(s45_actualbudgetco2 - s45_actualbudgetco2_last),-2),2),-p45_taxCO2eq_anchor_until2150(t)/2); - p45_taxCO2eq_anchor_iterationdiff(t) = p45_taxCO2eq_anchor_iterationdiff_tmp(t); + pm_taxCO2eq_anchor_iterationdiff_tmp(t) = + max(pm_taxCO2eq_anchor_iterationdiff(t) * min(max((cm_budgetCO2from2020 - s45_actualbudgetco2)/(s45_actualbudgetco2 - s45_actualbudgetco2_last),-2),2),-p45_taxCO2eq_anchor(t)/2); + p45_taxCO2eq_anchor(t)$(t.val le cm_peakBudgYr) = p45_taxCO2eq_anchor(t) + + max(pm_taxCO2eq_anchor_iterationdiff(t) * min(max((cm_budgetCO2from2020 - s45_actualbudgetco2)/(s45_actualbudgetco2 - s45_actualbudgetco2_last),-2),2),-p45_taxCO2eq_anchor(t)/2); + p45_taxCO2eq_anchor_until2150(t) = p45_taxCO2eq_anchor_until2150(t) + + max(pm_taxCO2eq_anchor_iterationdiff(t) * min(max((cm_budgetCO2from2020 - s45_actualbudgetco2)/(s45_actualbudgetco2 - s45_actualbudgetco2_last),-2),2),-p45_taxCO2eq_anchor_until2150(t)/2); + pm_taxCO2eq_anchor_iterationdiff(t) = pm_taxCO2eq_anchor_iterationdiff_tmp(t); !! after cm_peakBudgYr: adjustment so that emissions become zero: increase/decrease tax in each time step after cm_peakBudgYr by percentage of that year's total CO2 emissions of 2015 emissions ); - o45_taxCO2eq_anchor_iterDiff_Itr(iteration) = p45_taxCO2eq_anchor_iterationdiff("2030"); + o45_taxCO2eq_anchor_iterDiff_Itr(iteration) = pm_taxCO2eq_anchor_iterationdiff("2100"); display o45_taxCO2eq_anchor_iterDiff_Itr; else - if(s45_actualbudgetco2 > 0 or abs(c_budgetCO2from2020 - s45_actualbudgetco2) < 2, !! if model was not optimal, or if budget already reached, keep tax constant - pm_taxCO2eq(t,regi) = pm_taxCO2eq(t,regi); + if(s45_actualbudgetco2 > 0 or abs(cm_budgetCO2from2020 - s45_actualbudgetco2) < 2, !! if model was not optimal, or if budget already reached, keep tax constant + p45_taxCO2eq_anchor(t) = p45_taxCO2eq_anchor(t); else *** if budget has turned negative, reduce CO2 price by 20% - pm_taxCO2eq(t,regi) = 0.8*pm_taxCO2eq(t,regi); + p45_taxCO2eq_anchor(t) = 0.8*p45_taxCO2eq_anchor(t); p45_taxCO2eq_anchor_until2150(t) = 0.8*p45_taxCO2eq_anchor_until2150(t); ); ); *** after cm_peakBudgYr: always adjust to bring emissions close to zero - pm_taxCO2eq(t,regi)$(t.val gt cm_peakBudgYr) = pm_taxCO2eq(t,regi) + pm_taxCO2eq(t,regi)*max(sum(regi2,vm_emiAll.l(t,regi2,"co2"))/sum(regi2,vm_emiAll.l("2015",regi2,"co2")),-0.75); + p45_taxCO2eq_anchor(t)$(t.val gt cm_peakBudgYr) = p45_taxCO2eq_anchor(t) + p45_taxCO2eq_anchor(t)*max(sum(regi2,vm_emiAll.l(t,regi2,"co2"))/sum(regi2,vm_emiAll.l("2015",regi2,"co2")),-0.75); *** check if cm_peakBudgYr is correct: if global emissions already negative, move cm_peakBudgYr forward *** similar code block as used in iterative-adjust 9 below (credit to RP) - o45_diff_to_Budg(iteration) = (c_budgetCO2from2020 - s45_actualbudgetco2); + o45_diff_to_Budg(iteration) = (cm_budgetCO2from2020 - s45_actualbudgetco2); o45_totCO2emi_peakBudgYr(iteration) = sum(t$(t.val = cm_peakBudgYr), sum(regi2, vm_emiAll.l(t,regi2,"co2")) ); o45_totCO2emi_allYrs(t,iteration) = sum(regi2, vm_emiAll.l(t,regi2,"co2") ); o45_change_totCO2emi_peakBudgYr(iteration) = sum(ttot$(ttot.val = cm_peakBudgYr), (o45_totCO2emi_allYrs(ttot-1,iteration) - o45_totCO2emi_allYrs(ttot+1,iteration) )/4 ); !! Only gives a tolerance range, exact value not important. Division by 4 somewhat arbitrary - could be 3 or 5 as well. @@ -154,16 +148,16 @@ display p45_actualbudgetco2; if( ( (o45_totCO2emi_peakBudgYr(iteration) < -(0.1) ) AND (cm_peakBudgYr > 2040) ), !! no peaking time before 2040 display "shift peakBudgYr left"; o45_peakBudgYr_Itr(iteration+1) = pm_ttot_val(ttot - 1); -*** pm_taxCO2eq(t,regi)$(t.val gt pm_ttot_val(ttot - 1)) = p45_taxCO2eq_anchor_until2150(ttot-1) + (t.val - pm_ttot_val(ttot - 1)) * cm_taxCO2inc_after_peakBudgYr * sm_DptCO2_2_TDpGtC; !! increase by cm_taxCO2inc_after_peakBudgYr per year after peakBudgYr +*** p45_taxCO2eq_anchor(t)$(t.val gt pm_ttot_val(ttot - 1)) = p45_taxCO2eq_anchor_until2150(ttot-1) + (t.val - pm_ttot_val(ttot - 1)) * cm_taxCO2_IncAfterPeakBudgYr * sm_DptCO2_2_TDpGtC; !! increase by cm_taxCO2_IncAfterPeakBudgYr per year after peakBudgYr *** if tax after cm_peakBudgYr is higher than normal increase rate (exceeding a 20% tolerance): shift right - elseif( ( sum(regi, sum(t2$(t2.val = pm_ttot_val(ttot+1)),pm_taxCO2eq(t2,regi))) > sum(regi,sum(t2$(t2.val = pm_ttot_val(ttot+1)),p45_taxCO2eq_anchor_until2150(t2)))*1.2 ) AND (cm_peakBudgYr < 2100) ), !! if peaking time would be after 2100, keep 2100 budget year + elseif( ( sum(regi, sum(t2$(t2.val = pm_ttot_val(ttot+1)),p45_taxCO2eq_anchor(t2))) > sum(regi,sum(t2$(t2.val = pm_ttot_val(ttot+1)),p45_taxCO2eq_anchor_until2150(t2)))*1.2 ) AND (cm_peakBudgYr < 2100) ), !! if peaking time would be after 2100, keep 2100 budget year if( (iteration.val > 2) AND ( o45_peakBudgYr_Itr(iteration - 1) > o45_peakBudgYr_Itr(iteration) ) AND ( o45_peakBudgYr_Itr(iteration - 2) = o45_peakBudgYr_Itr(iteration) ) , !! if the target year was just shifted left after being shifted right o45_peakBudgYr_Itr(iteration+1) = o45_peakBudgYr_Itr(iteration); !! don't shift right again immediately else display "shift peakBudgYr right"; o45_peakBudgYr_Itr(iteration+1) = pm_ttot_val(ttot + 1); !! ttot+1 is the new peakBudgYr loop(t$(t.val ge pm_ttot_val(ttot + 1)), - pm_taxCO2eq(t,regi) = p45_taxCO2eq_anchor_until2150(t); + p45_taxCO2eq_anchor(t) = p45_taxCO2eq_anchor_until2150(t); ); ); @@ -174,24 +168,23 @@ display p45_actualbudgetco2; cm_peakBudgYr = o45_peakBudgYr_Itr(iteration+1); display cm_peakBudgYr; ); - - - - - - pm_taxCO2eq(t,regi)$(t.val gt 2110) = pm_taxCO2eq("2110",regi); !! to prevent huge taxes after 2110 and the resulting convergence problems, set taxes after 2110 equal to 2110 value - display pm_taxCO2eq; - ); +*** If functionalForm is linear, re-adjust global anchor trajectory to go through the point (cm_taxCO2_historicalYr, cm_taxCO2_historical) +$ifThen.taxCO2functionalForm3 "%cm_taxCO2_functionalForm%" == "linear" +p45_taxCO2eq_anchor_until2150(t) = s45_taxCO2_historical + + (sum(t2$(t2.val eq cm_peakBudgYr), p45_taxCO2eq_anchor_until2150(t2)) - s45_taxCO2_historical) / (cm_peakBudgYr - s45_taxCO2_historicalYr) !! Yearly increase of CO2 price that interpolates between cm_taxCO2_historical in cm_taxCO2_historicalYr and p45_taxCO2eq_anchor_until2150 in peak year + * (t.val - s45_taxCO2_historicalYr) ; +p45_taxCO2eq_anchor(t)$(t.val le cm_peakBudgYr) = p45_taxCO2eq_anchor_until2150(t); +p45_taxCO2eq_anchor(t)$(t.val gt 2110) = p45_taxCO2eq_anchor("2110"); +***TODO: CHECK IF ALGORITHM DOES WHAT IS EXPECTED. CURRENTLY NO RE-ADJUSTMENT OF GLOBAL ANCHOR TRAJECTORY BETWEEN PEAK YEAR AND 2110 AS NO SUCH ADJUSTMENT WAS CONTAINED IN ORIGINAL ALGORITHM +$endIf.taxCO2functionalForm3 + ); + display p45_taxCO2eq_anchor_until2150, p45_taxCO2eq_anchor; ); -*** --------------------------------------------------------------------------------------------------------------- -*** new peakBudg formulation that works with several CO2 price path realizations of module 45 --------------------- -*** it results in a peak budget with linear increase by 2$/yr afterwards -*** --------------------------------------------------------------------------------------------------------------- - +*** Algorithm for new peakBudg formulation that results in a peak budget with linear increase given by cm_taxCO2_IncAfterPeakBudgYr if (cm_iterative_target_adj eq 9, -*' Update Iteratively update regional CO2 tax trajectories / regional CO2 budget to reach the target for global peak budget, with a linear increase afterwards given by `cm_taxCO2inc_after_peakBudgYr`. The +*' Iteratively update regional CO2 tax trajectories / regional CO2 budget to reach the target for global peak budget, with a linear increase afterwards given by cm_taxCO2_IncAfterPeakBudgYr. The *' peak budget year is determined automatically (within the time window 2040--2100) *' `p45_actualbudgetco2(ttot)` includes emissions from 2020 to `ttot` (inclusive). @@ -222,10 +215,10 @@ if (cm_iterative_target_adj eq 9, *** --------A: calculate the new CO2 price path, the CO2 tax rescale factor---------------------------------------------------------- - if(o_modelstat eq 2 AND ord(iteration) < cm_iteration_max AND s45_actualbudgetco2 > 0 AND abs(c_budgetCO2from2020 - s45_actualbudgetco2) ge 2, !!only for optimal iterations, and not after the last one, and only if budget still possitive, and only if target not yet reached - display pm_taxCO2eq; + if(o_modelstat eq 2 AND ord(iteration) < cm_iteration_max AND s45_actualbudgetco2 > 0 AND abs(cm_budgetCO2from2020 - s45_actualbudgetco2) ge 2, !!only for optimal iterations, and not after the last one, and only if budget still possitive, and only if target not yet reached + display p45_taxCO2eq_anchor; - if( ( ( p45_actualbudgetco2("2100") > 1.1 * s45_actualbudgetco2 ) AND ( abs(c_budgetCO2from2020 - s45_actualbudgetco2) < 50 ) AND (iteration.val < 12) ), + if( ( ( p45_actualbudgetco2("2100") > 1.1 * s45_actualbudgetco2 ) AND ( abs(cm_budgetCO2from2020 - s45_actualbudgetco2) < 50 ) AND (iteration.val < 12) ), display iteration; *** if end-of-century budget is higher than budget at peak point, AND end-of-century budget is already in the range of the target budget (+/- 50 GtC), treat as end-of-century budget *** for this iteration. Only do this rough approach (jump to 2100) for the first iterations - at later iterations the slower adjustment of the peaking time should work better @@ -238,31 +231,32 @@ if (cm_iterative_target_adj eq 9, *** --------A1: for that, calculate the CO2 tax rescale factor--- if(iteration.val lt 10, - p45_factorRescale_taxCO2(iteration) = max(0.1, (s45_actualbudgetco2/c_budgetCO2from2020) ) ** 3; + p45_factorRescale_taxCO2(iteration) = max(0.1, (s45_actualbudgetco2/cm_budgetCO2from2020) ) ** 3; else - p45_factorRescale_taxCO2(iteration) = max(0.1, (s45_actualbudgetco2/c_budgetCO2from2020) ) ** 2; + p45_factorRescale_taxCO2(iteration) = max(0.1, (s45_actualbudgetco2/cm_budgetCO2from2020) ) ** 2; ); p45_factorRescale_taxCO2_Funneled(iteration) = max(min( 2 * EXP( -0.15 * iteration.val ) + 1.01 ,p45_factorRescale_taxCO2(iteration)), 1/ ( 2 * EXP( -0.15 * iteration.val ) + 1.01) ); - p45_taxCO2eq_anchor_iterationdiff(t) = max(1* sm_DptCO2_2_TDpGtC, pm_taxCO2eq(t,regi) * p45_factorRescale_taxCO2_Funneled(iteration) ) - pm_taxCO2eq(t,regi); + pm_taxCO2eq_anchor_iterationdiff(t) = max(1* sm_DptCO2_2_TDpGtC, p45_taxCO2eq_anchor(t) * p45_factorRescale_taxCO2_Funneled(iteration) ) - p45_taxCO2eq_anchor(t); p45_taxCO2eq_anchor_until2150(t) = max(1* sm_DptCO2_2_TDpGtC, p45_taxCO2eq_anchor_until2150(t) * p45_factorRescale_taxCO2_Funneled(iteration) ); - pm_taxCO2eq(t,regi) = max(1* sm_DptCO2_2_TDpGtC, pm_taxCO2eq(t,regi) * p45_factorRescale_taxCO2_Funneled(iteration) ); !! rescale co2tax + p45_taxCO2eq_anchor(t) = max(1* sm_DptCO2_2_TDpGtC, p45_taxCO2eq_anchor(t) * p45_factorRescale_taxCO2_Funneled(iteration) ); !! rescale co2tax loop(t2$(t2.val eq cm_peakBudgYr), - pm_taxCO2eq(t,regi)$(t.val gt cm_peakBudgYr) = p45_taxCO2eq_anchor_until2150(t2) + (t.val - t2.val) * cm_taxCO2inc_after_peakBudgYr * sm_DptCO2_2_TDpGtC; !! increase by cm_taxCO2inc_after_peakBudgYr per year +*** Note: Adjustment of starting point linear curve is done at the end + p45_taxCO2eq_anchor(t)$(t.val gt cm_peakBudgYr) = p45_taxCO2eq_anchor_until2150(t2) + (t.val - t2.val) * cm_taxCO2_IncAfterPeakBudgYr * sm_DptCO2_2_TDpGtC; !! increase by cm_taxCO2_IncAfterPeakBudgYr per year ); display p45_factorRescale_taxCO2, p45_factorRescale_taxCO2_Funneled; - o45_taxCO2eq_anchor_iterDiff_Itr(iteration) = p45_taxCO2eq_anchor_iterationdiff("2030"); + o45_taxCO2eq_anchor_iterDiff_Itr(iteration) = pm_taxCO2eq_anchor_iterationdiff("2100"); display o45_taxCO2eq_anchor_iterDiff_Itr; - else !! if(o_modelstat eq 2 AND ord(iteration) 0 AND abs(c_budgetCO2from2020 )) - if(s45_actualbudgetco2 > 0 or abs(c_budgetCO2from2020 - s45_actualbudgetco2) < 2, !! if model was not optimal, or if budget already reached, keep tax constant + else !! if(o_modelstat eq 2 AND ord(iteration) 0 AND abs(cm_budgetCO2from2020 )) + if(s45_actualbudgetco2 > 0 or abs(cm_budgetCO2from2020 - s45_actualbudgetco2) < 2, !! if model was not optimal, or if budget already reached, keep tax constant p45_factorRescale_taxCO2(iteration) = 1; p45_factorRescale_taxCO2_Funneled(iteration) = 1; p45_taxCO2eq_anchor_until2150(t) = p45_taxCO2eq_anchor_until2150(t); !! nothing changes @@ -272,16 +266,16 @@ if (cm_iterative_target_adj eq 9, p45_factorRescale_taxCO2_Funneled(iteration) = p45_factorRescale_taxCO2(iteration); p45_taxCO2eq_anchor_until2150(t) = p45_factorRescale_taxCO2(iteration) * p45_taxCO2eq_anchor_until2150(t); - pm_taxCO2eq(t,regi) = p45_factorRescale_taxCO2(iteration) * pm_taxCO2eq(t,regi); + p45_taxCO2eq_anchor(t) = p45_factorRescale_taxCO2(iteration) * p45_taxCO2eq_anchor(t); ); - ); !! if(o_modelstat eq 2 AND ord(iteration) 0 AND abs(c_budgetCO2from2020 - s45_actualbudgetco2) ge 2, + ); !! if(o_modelstat eq 2 AND ord(iteration) 0 AND abs(cm_budgetCO2from2020 - s45_actualbudgetco2) ge 2, - display pm_taxCO2eq, p45_taxCO2eq_anchor_until2150(t); + display p45_taxCO2eq_anchor, p45_taxCO2eq_anchor_until2150; *** -------B: checking the peak timing, if cm_peakBudgYr is still correct or needs to be shifted----------------------- - o45_diff_to_Budg(iteration) = (c_budgetCO2from2020 - s45_actualbudgetco2); + o45_diff_to_Budg(iteration) = (cm_budgetCO2from2020 - s45_actualbudgetco2); o45_totCO2emi_peakBudgYr(iteration) = sum(t$(t.val = cm_peakBudgYr), sum(regi2, vm_emiAll.l(t,regi2,"co2")) ); o45_totCO2emi_allYrs(t,iteration) = sum(regi2, vm_emiAll.l(t,regi2,"co2") ); @@ -305,7 +299,7 @@ if (cm_iterative_target_adj eq 9, if( ( (o45_totCO2emi_peakBudgYr(iteration) < -(0.1 + o45_change_totCO2emi_peakBudgYr(iteration)) ) AND (cm_peakBudgYr > 2040) ), !! no peaking time before 2040 display "shift peakBudgYr left"; o45_peakBudgYr_Itr(iteration+1) = pm_ttot_val(ttot - 1); - pm_taxCO2eq(t,regi)$(t.val gt pm_ttot_val(ttot - 1)) = p45_taxCO2eq_anchor_until2150(ttot-1) + (t.val - pm_ttot_val(ttot - 1)) * cm_taxCO2inc_after_peakBudgYr * sm_DptCO2_2_TDpGtC; !! increase by cm_taxCO2inc_after_peakBudgYr per year after peakBudgYr + p45_taxCO2eq_anchor(t)$(t.val gt pm_ttot_val(ttot - 1)) = p45_taxCO2eq_anchor_until2150(ttot-1) + (t.val - pm_ttot_val(ttot - 1)) * cm_taxCO2_IncAfterPeakBudgYr * sm_DptCO2_2_TDpGtC; !! increase by cm_taxCO2_IncAfterPeakBudgYr per year after peakBudgYr elseif ( ( o45_totCO2emi_peakBudgYr(iteration) > (0.1 + o45_change_totCO2emi_peakBudgYr(iteration)) ) AND (cm_peakBudgYr < 2100) ), !! if peaking time would be after 2100, keep 2100 budget year if( (o45_pkBudgYr_flipflop(iteration) eq 1), !! if the target year was just shifted left after being shifted right, and would now be shifted right again @@ -319,8 +313,8 @@ if (cm_iterative_target_adj eq 9, display "shift peakBudgYr right"; o45_peakBudgYr_Itr(iteration+1) = pm_ttot_val(ttot + 1); !! ttot+1 is the new peakBudgYr loop(t$(t.val ge pm_ttot_val(ttot + 1)), - pm_taxCO2eq(t,regi) = p45_taxCO2eq_anchor_until2150(ttot+1) - + (t.val - pm_ttot_val(ttot + 1)) * cm_taxCO2inc_after_peakBudgYr * sm_DptCO2_2_TDpGtC; !! increase by cm_taxCO2inc_after_peakBudgYr per year + p45_taxCO2eq_anchor(t) = p45_taxCO2eq_anchor_until2150(ttot+1) + + (t.val - pm_ttot_val(ttot + 1)) * cm_taxCO2_IncAfterPeakBudgYr * sm_DptCO2_2_TDpGtC; !! increase by cm_taxCO2_IncAfterPeakBudgYr per year ); ); @@ -331,8 +325,8 @@ if (cm_iterative_target_adj eq 9, cm_peakBudgYr = o45_peakBudgYr_Itr(iteration+1); display cm_peakBudgYr; ); - - pm_taxCO2eq(t,regi)$(t.val le cm_peakBudgYr) = p45_taxCO2eq_anchor_until2150(t); !! until peakBudgYr, take the contiuous price trajectory +*** Note: Adjustment of starting point linear curve is done at the end + p45_taxCO2eq_anchor(t)$(t.val le cm_peakBudgYr) = p45_taxCO2eq_anchor_until2150(t); !! until peakBudgYr, take the contiuous price trajectory *** -----B2: if there was a flip-floping of cm_peakBudgYr in the previous iterations, try to overome this by adjusting the CO2 price path after the peaking year if (o45_delay_increase_peakBudgYear(iteration) = 1, @@ -348,7 +342,7 @@ if (cm_iterative_target_adj eq 9, o45_delay_increase_peakBudgYear(iteration+1) = 0; !! probably is not necessary o45_reached_until2150pricepath(iteration) = 0; o45_peakBudgYr_Itr(iteration+1) = t2.val; !! shift PeakBudgYear to the following time step - pm_taxCO2eq(t2,regi) = p45_taxCO2eq_anchor_until2150(t2) ; !! set CO2 price in t2 to value in the "continuous path" + p45_taxCO2eq_anchor(t2) = p45_taxCO2eq_anchor_until2150(t2) ; !! set CO2 price in t2 to value in the "continuous path" elseif ( ( o45_reached_until2150pricepath(iteration-1) eq 1 ) AND ( o45_totCO2emi_peakBudgYr(iteration) < (0.1 + o45_change_totCO2emi_peakBudgYr(iteration)) ) ), display "New intermediate price in timestep after cm_peakBudgYr is sufficient to stabilize peaking year - go back to normal loop"; @@ -359,62 +353,44 @@ if (cm_iterative_target_adj eq 9, !! in this case, keep PeakBudgYr, and adjust the price in the year after the peakBudgYr to get emissions close to 0, o45_delay_increase_peakBudgYear(iteration+1) = 1; !! make sure next iteration peakBudgYr is not shifted right again o45_peakBudgYr_Itr(iteration+1) = o45_peakBudgYr_Itr(iteration); - pm_taxCO2eq(t2,regi) = max(pm_taxCO2eq(ttot,regi), !! at least as high as the price in the peakBudgYr - pm_taxCO2eq(t2,regi) * (o45_factorRescale_taxCO2_afterPeakBudgYr(iteration) / p45_factorRescale_taxCO2_Funneled(iteration) ) !! the full path was already rescaled by p45_factorRescale_taxCO2_Funneled, so adjust the second rescaling + p45_taxCO2eq_anchor(t2) = max(p45_taxCO2eq_anchor(ttot), !! at least as high as the price in the peakBudgYr + p45_taxCO2eq_anchor(t2) * (o45_factorRescale_taxCO2_afterPeakBudgYr(iteration) / p45_factorRescale_taxCO2_Funneled(iteration) ) !! the full path was already rescaled by p45_factorRescale_taxCO2_Funneled, so adjust the second rescaling ); loop(regi, !! this loop is necessary to allow the <-comparison in the next if statement - if( p45_taxCO2eq_anchor_until2150(t2) < pm_taxCO2eq(t2,regi) , !! check if new price would be higher than the price if the peakBudgYr would be one timestep later + if( p45_taxCO2eq_anchor_until2150(t2) < p45_taxCO2eq_anchor(t2) , !! check if new price would be higher than the price if the peakBudgYr would be one timestep later display "price increase reached price from path with cm_peakBudgYr one timestep later - downscale to 99%"; - pm_taxCO2eq(t2,regi) = 0.99 * p45_taxCO2eq_anchor_until2150(t2); !! reduce the new CO2 price to 99% of the price that it would be if the peaking year was one timestep later. The next iteration will show if this is enough, otherwise cm_peakBudgYr will be shifted right + p45_taxCO2eq_anchor(t2) = 0.99 * p45_taxCO2eq_anchor_until2150(t2); !! reduce the new CO2 price to 99% of the price that it would be if the peaking year was one timestep later. The next iteration will show if this is enough, otherwise cm_peakBudgYr will be shifted right o45_reached_until2150pricepath(iteration) = 1; !! upward CO2 price correction reached the continued price path - check in next iteration if this is high enough. ); ); ); display o45_factorRescale_taxCO2_afterPeakBudgYr; - pm_taxCO2eq(t,regi)$(t.val gt t2.val) = pm_taxCO2eq(t2,regi) + (t.val - t2.val) * cm_taxCO2inc_after_peakBudgYr * sm_DptCO2_2_TDpGtC; !! increase by cm_taxCO2inc_after_peakBudgYr per year + p45_taxCO2eq_anchor(t)$(t.val gt t2.val) = p45_taxCO2eq_anchor(t2) + (t.val - t2.val) * cm_taxCO2_IncAfterPeakBudgYr * sm_DptCO2_2_TDpGtC; !! increase by cm_taxCO2_IncAfterPeakBudgYr per year ); !! loop t2$(t2.val eq pm_ttot_val(ttot+1)), !! set t2 to the following time step ); !! loop ttot$(ttot.val eq cm_peakBudgYr), !! set ttot to the current peakBudgYr cm_peakBudgYr = o45_peakBudgYr_Itr(iteration+1); !! this has to happen outside the loop, otherwise the loop condition might be true twice ); !! if o45_delay_increase_peakBudgYear(iteration) = 1, !! if there was a flip-floping in the previous iterations, try to solve this + +*** If functionalForm is linear, re-adjust global anchor trajectory to go through the point (cm_taxCO2_historicalYr, cm_taxCO2_historical) +$ifThen.taxCO2functionalForm4 "%cm_taxCO2_functionalForm%" == "linear" +p45_taxCO2eq_anchor_until2150(t) = s45_taxCO2_historical + + (sum(t2$(t2.val eq cm_peakBudgYr), p45_taxCO2eq_anchor(t2)) - s45_taxCO2_historical) / (cm_peakBudgYr - s45_taxCO2_historicalYr) !! Yearly increase of CO2 price that interpolates between cm_taxCO2_historical in cm_taxCO2_historicalYr and p45_taxCO2eq_anchor in peak year + * (t.val - s45_taxCO2_historicalYr) ; +p45_taxCO2eq_anchor(t)$(t.val le cm_peakBudgYr) = p45_taxCO2eq_anchor_until2150(t); +p45_taxCO2eq_anchor(t)$(t.val gt cm_peakBudgYr) = sum(t2$(t2.val eq cm_peakBudgYr), p45_taxCO2eq_anchor_until2150(t2)) !! CO2 tax in peak budget year + + (t.val - cm_peakBudgYr) * cm_taxCO2_IncAfterPeakBudgYr * sm_DptCO2_2_TDpGtC; !! increase by cm_taxCO2inc_after_peakBudgYr per year +p45_taxCO2eq_anchor(t)$(t.val gt 2110) = p45_taxCO2eq_anchor("2110"); +$endIf.taxCO2functionalForm4 - - - display o45_delay_increase_peakBudgYear, o45_reached_until2150pricepath, pm_taxCO2eq, o45_peakBudgYr_Itr, o45_pkBudgYr_flipflop, cm_peakBudgYr; + display p45_taxCO2eq_anchor, p45_taxCO2eq_anchor_until2150, o45_delay_increase_peakBudgYear, o45_reached_until2150pricepath, o45_peakBudgYr_Itr, o45_pkBudgYr_flipflop, cm_peakBudgYr; ); !! if cm_emiscen eq 9, ); !! if cm_iterative_target_adj eq 9, -***------ end of "cm_iterative_target_adj" variants----------------------------------------- - -*** for having it available in next iteration, too: +*** Save s45_actualbudgetco2 for having it available in next iteration: s45_actualbudgetco2_last = s45_actualbudgetco2; -****************************************************************** END OF CORE PART - -*** if CO2 price is iteratively adjusted (i.e. cm_iterative_target_adj != 0), - -*** re-create the linear carbon price trajectory for developed countries to ensure that it -*** starts at historical level given by cm_co2_tax_hist in year cm_year_co2_tax_hist, and -*** ends at the endogenously adjusted tax level in the peak year (with iterative_target_adj = 6|7|9) or in 2110 (otherwise) -if((cm_iterative_target_adj eq 6) or (cm_iterative_target_adj eq 7) or (cm_iterative_target_adj eq 9), - loop(regi$(p45_gdppcap2015_PPP(regi) gt 20), !! 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. - p45_CO2priceTrajDeveloped(t)$(t.val le cm_peakBudgYr) - = s45_co2_tax_hist - + (sum(t2$(t2.val eq cm_peakBudgYr), pm_taxCO2eq(t2,regi)) - s45_co2_tax_hist) / (cm_peakBudgYr - s45_year_co2_tax_hist) !! Yearly increase of CO2 price that interpolates between s45_co2_tax_hist in s45_year_co2_tax_hist and pm_taxCO2eq in peak year - * (t.val - s45_year_co2_tax_hist) ; - p45_CO2priceTrajDeveloped(t)$(t.val gt cm_peakBudgYr) = pm_taxCO2eq(t,regi); - ); - else - loop(regi$(p45_gdppcap2015_PPP(regi) gt 20), !! 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. - p45_CO2priceTrajDeveloped(t)$(t.val le 2110) - = s45_co2_tax_hist - + (pm_taxCO2eq("2110",regi) - s45_co2_tax_hist) / (2110 - s45_year_co2_tax_hist) !! Yearly increase of CO2 price that interpolates between s45_co2_tax_hist in s45_year_co2_tax_hist and pm_taxCO2eq in 2110 - * (t.val - s45_year_co2_tax_hist) ; - p45_CO2priceTrajDeveloped(t)$(t.val gt 2110) = pm_taxCO2eq(t,regi); - ); -); - ***-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- *** Part III (Regional differentiation): Re-create regional carbon price trajectories p45_taxCO2eq_regiDiff using p45_taxCO2eq_anchor (updated in parts I-II above) and p45_regiDiff_convFactor (computed in datainput) @@ -433,7 +409,7 @@ loop(regi, sum(t2$(t2.val eq p45_interpolation_startYr(regi)), p45_taxCO2eq_path_gdx_ref(t2,regi)) !! value of p45_taxCO2eq_path_gdx_ref in p45_interpolation_startYr * (1 - rPower( (t.val - p45_interpolation_startYr(regi)) / (p45_interpolation_endYr(regi) - p45_interpolation_startYr(regi)), p45_interpolation_exponent(regi))) + sum(t3$(t3.val eq p45_interpolation_endYr(regi)), p45_taxCO2eq_regiDiff(t3,regi)) !! value of p45_taxCO2eq_regiDiff in p45_interpolation_endYr - * rPower( (t.val - p45_interpolation_startYr(regi)) / (p45_interpolation_endYr(regi) - p45_interpolation_startYr(regi)), p45_interpolation_exponent(regi)) + * rPower( (t.val - p45_interpolation_startYr(regi)) / (p45_interpolation_endYr(regi) - p45_interpolation_startYr(regi)), p45_interpolation_exponent(regi)); pm_taxCO2eq(t,regi)$(t.val ge p45_interpolation_endYr(regi)) = p45_taxCO2eq_regiDiff(t,regi); ); display pm_taxCO2eq; diff --git a/modules/45_carbonprice/module.gms b/modules/45_carbonprice/module.gms index ba9a1a79e..23d0faadc 100644 --- a/modules/45_carbonprice/module.gms +++ b/modules/45_carbonprice/module.gms @@ -21,14 +21,14 @@ *' @authors Christoph Bertram, Laurin Koehler-Schindler, Gunnar Luderer, Rahel Mandaroux, Robert Pietzcker, Oliver Richters *###################### R SECTION START (MODULETYPES) ########################## -$Ifi "%carbonprice%" == "functionalForm" $include "./modules/45_carbonprice/functionalForm/realization.gms" -$Ifi "%carbonprice%" == "exogenous" $include "./modules/45_carbonprice/exogenous/realization.gms" -$Ifi "%carbonprice%" == "expoLinear" $include "./modules/45_carbonprice/expoLinear/realization.gms" $Ifi "%carbonprice%" == "NDC" $include "./modules/45_carbonprice/NDC/realization.gms" -$Ifi "%carbonprice%" == "none" $include "./modules/45_carbonprice/none/realization.gms" $Ifi "%carbonprice%" == "NPi" $include "./modules/45_carbonprice/NPi/realization.gms" $Ifi "%carbonprice%" == "NPi2025_EUR55" $include "./modules/45_carbonprice/NPi2025_EUR55/realization.gms" $Ifi "%carbonprice%" == "NPiexpo" $include "./modules/45_carbonprice/NPiexpo/realization.gms" +$Ifi "%carbonprice%" == "exogenous" $include "./modules/45_carbonprice/exogenous/realization.gms" +$Ifi "%carbonprice%" == "expoLinear" $include "./modules/45_carbonprice/expoLinear/realization.gms" +$Ifi "%carbonprice%" == "functionalForm" $include "./modules/45_carbonprice/functionalForm/realization.gms" +$Ifi "%carbonprice%" == "none" $include "./modules/45_carbonprice/none/realization.gms" $Ifi "%carbonprice%" == "temperatureNotToExceed" $include "./modules/45_carbonprice/temperatureNotToExceed/realization.gms" *###################### R SECTION END (MODULETYPES) ############################ *** EOF ./modules/45_carbonprice/module.gms diff --git a/modules/45_carbonprice/none/not_used.txt b/modules/45_carbonprice/none/not_used.txt index 78701ac4b..138db4c18 100644 --- a/modules/45_carbonprice/none/not_used.txt +++ b/modules/45_carbonprice/none/not_used.txt @@ -8,7 +8,6 @@ name,type,reason cm_emiscen, switch, ??? sm_c_2_co2,switch, ??? pm_ttot_val,parameter,??? -cm_co2_tax_growth,switch,??? cm_startyear,switch,??? cm_iterative_target_adj,switch,??? cm_expoLinear_yearStart,switch,??? @@ -25,13 +24,24 @@ pm_ttot_2_tall,input,questionnaire pm_shPPPMER,input,questionnaire pm_pop,input,questionnaire pm_gdp,input,questionnaire -cm_CO2priceRegConvEndYr,input,questionnaire cm_NDC_divergentScenario,input,questionnaire vm_demFeSector,input,questionnaire pm_emifac,input,questionnaire -cm_co2_tax_spread,input,no carbon price differentiation in this realization -cm_co2_tax_startyear,input,added by codeCheck cm_peakBudgYr,input,added by codeCheck -cm_taxCO2inc_after_peakBudgYr,input,added by codeCheck sm_D2005_2_D2017,input,not needed fm_taxCO2eqHist,input,not needed +sm_budgetCO2eqGlob,input,no iterative target adjustment +sm_globalBudget_dev,input,no iterative target adjustment +vm_emiTe,input,no iterative target adjustment +vm_emiCdr,input,no iterative target adjustment +vm_emiMac,input,no iterative target adjustment +vm_emiAll,input,no iterative target adjustment +pm_budgetCO2eq,input,no iterative target adjustment +pm_ts,input,no iterative target adjustment +cm_iteration_max,input,no iterative target adjustment +cm_taxCO2_startyear,input,added by codeCheck +cm_taxCO2_expGrowth,input,added by codeCheck +cm_taxCO2_IncAfterPeakBudgYr,input,added by codeCheck +cm_budgetCO2from2020,input,no iterative target adjustment +pm_taxCO2eq_anchor_iterationdiff,input,no iterative target adjustment +pm_taxCO2eq_anchor_iterationdiff_tmp,input,no iterative target adjustment diff --git a/modules/45_carbonprice/temperatureNotToExceed/not_used.txt b/modules/45_carbonprice/temperatureNotToExceed/not_used.txt index 5e5f48dba..346ec7493 100644 --- a/modules/45_carbonprice/temperatureNotToExceed/not_used.txt +++ b/modules/45_carbonprice/temperatureNotToExceed/not_used.txt @@ -10,20 +10,30 @@ sm_DptCO2_2_TDpGtC,input,questionnaire vm_co2eq,input,questionnaire vm_emiFgas,input,questionnaire pm_ttot_val,input,questionnaire -cm_co2_tax_growth,input,questionnaire cm_startyear,input,questionnaire cm_iterative_target_adj,input,questionnaire cm_expoLinear_yearStart,input,questionnaire pm_shPPPMER,input,questionnaire pm_pop,input,questionnaire pm_gdp,input,questionnaire -cm_CO2priceRegConvEndYr,input,questionnaire cm_NDC_divergentScenario,input,questionnaire vm_demFeSector,input,questionnaire pm_emifac,input,questionnaire -cm_co2_tax_spread,input,no carbon price differentiation in this realization -cm_co2_tax_startyear,input,added by codeCheck cm_peakBudgYr,input,added by codeCheck -cm_taxCO2inc_after_peakBudgYr,input,added by codeCheck sm_D2005_2_D2017,input,not needed fm_taxCO2eqHist,input,not needed +sm_budgetCO2eqGlob,input,no iterative target adjustment +sm_globalBudget_dev,input,no iterative target adjustment +vm_emiTe,input,no iterative target adjustment +vm_emiCdr,input,no iterative target adjustment +vm_emiMac,input,no iterative target adjustment +vm_emiAll,input,no iterative target adjustment +pm_budgetCO2eq,input,no iterative target adjustment +pm_ts,input,no iterative target adjustment +cm_iteration_max,input,no iterative target adjustment +cm_taxCO2_startyear,input,added by codeCheck +cm_taxCO2_expGrowth,input,added by codeCheck +cm_taxCO2_IncAfterPeakBudgYr,input,added by codeCheck +cm_budgetCO2from2020,input,no iterative target adjustment +pm_taxCO2eq_anchor_iterationdiff,input,no iterative target adjustment +pm_taxCO2eq_anchor_iterationdiff_tmp,input,no iterative target adjustment diff --git a/modules/80_optimization/nash/postsolve.gms b/modules/80_optimization/nash/postsolve.gms index 3502ac928..6026a0aad 100644 --- a/modules/80_optimization/nash/postsolve.gms +++ b/modules/80_optimization/nash/postsolve.gms @@ -442,7 +442,7 @@ display "Reasons for non-convergence in this iteration (if not yet converged)"; if(sameas(convMessage80, "target"), display "#### 6.) A global climate target has not been reached yet."; display "#### check out sm_globalBudget_dev, it must within 0.99 and 1.01 to reach convergence, as well as"; - display "#### pm_taxCO2eq_iterationdiff_tmp and pm_taxCO2eq_iterationdiff in diagnostics section below."; + display "#### pm_taxCO2eq_anchor_iterationdiff_tmp and pm_taxCO2eq_anchor_iterationdiff in diagnostics section below."; display "#### The two parameters give the difference in carbon price in $/GtC to the last iteration."; display sm_globalBudget_dev; ); @@ -507,7 +507,7 @@ display p80_surplus; OPTION decimals = 3; display "Tax difference to last iteration for global targets of core/postsolve"; -display pm_taxCO2eq_iterationdiff_tmp, pm_taxCO2eq_iterationdiff; +display pm_taxCO2eq_anchor_iterationdiff_tmp, pm_taxCO2eq_anchor_iterationdiff; *RP* display effect of additional convergence push display "display effect of additional convergence push"; @@ -555,7 +555,7 @@ if( (s80_bool eq 0) and (iteration.val eq cm_iteration_max), !! reached max if(sameas(convMessage80, "target"), display "#### 6.) A global climate target has not been reached yet."; display "#### check out sm_globalBudget_dev, must within 0.99 and 1.01 to reach convergence, as well as"; - display "#### pm_taxCO2eq_iterationdiff_tmp and pm_taxCO2eq_iterationdiff in diagnostics section below."; + display "#### pm_taxCO2eq_anchor_iterationdiff_tmp and pm_taxCO2eq_anchor_iterationdiff in diagnostics section below."; display "#### The two parameters give the difference in carbon price in $/GtC to the last iteration."; display sm_globalBudget_dev; ); diff --git a/modules/80_optimization/negishi/not_used.txt b/modules/80_optimization/negishi/not_used.txt index 7a2674037..b49e00084 100644 --- a/modules/80_optimization/negishi/not_used.txt +++ b/modules/80_optimization/negishi/not_used.txt @@ -4,7 +4,7 @@ # | 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 +name,type,reason cm_abortOnConsecFail, switch, ??? cm_iteration_max, switch, ??? cm_keep_presolve_gdxes, switch, not needed @@ -43,8 +43,6 @@ pm_implicitQttyTarget_isLimited, parameter, ??? pm_implicitQttyTarget, parameter, ??? pm_nfa_start, input, questionnaire pm_shPerm, parameter, ??? -pm_taxCO2eq_iterationdiff, input, questionnaire -pm_taxCO2eq_iterationdiff_tmp, input, questionnaire pm_taxemiMkt_iteration, input, ?? pm_Xport0, parameter, ??? qm_co2eqCum, equation, ??? @@ -69,3 +67,5 @@ sm_CES_calibration_iteration, scalar, only needed during calibration w cm_maxFadeOutPriceAnticip, parameter, ??? cm_LearningSpillover, input, learning spillover only implemented in nash pm_allTargetsConverged, parameter, only relevant for nash +pm_taxCO2eq_anchor_iterationdiff,input,no iterative target adjustment +pm_taxCO2eq_anchor_iterationdiff_tmp,input,added by codeCheck diff --git a/modules/80_optimization/testOneRegi/not_used.txt b/modules/80_optimization/testOneRegi/not_used.txt index 6af647eb0..e6c220d21 100644 --- a/modules/80_optimization/testOneRegi/not_used.txt +++ b/modules/80_optimization/testOneRegi/not_used.txt @@ -4,7 +4,7 @@ # | 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 +name,type,reason pm_pop, parameter, ??? vm_emiTe, variable, ??? sm_EJ_2_TWa, scalar, ??? @@ -39,8 +39,6 @@ pm_nfa_start, input, questionnaire vm_dummyBudget, input, questionnaire vm_cesIO, variable, ??? cm_TaxConvCheck, variable, ?? -pm_taxCO2eq_iterationdiff, input, ?? -pm_taxCO2eq_iterationdiff_tmp, input, ?? sm_globalBudget_dev, input, ?? pm_factorRescaleemiMktCO2Tax, input, ?? pm_emiMktTarget, input, ?? @@ -65,3 +63,5 @@ pm_gmt_conv, parameter, ??? cm_tempConvergence, switch, not needed cm_LearningSpillover, input, learning spillover only implemented in nash pm_allTargetsConverged, parameter, only relevant for nash +pm_taxCO2eq_anchor_iterationdiff,input,no iterative target adjustment +pm_taxCO2eq_anchor_iterationdiff_tmp,input,added by codeCheck diff --git a/modules/81_codePerformance/on/presolve.gms b/modules/81_codePerformance/on/presolve.gms index 1efeb9895..da243c551 100644 --- a/modules/81_codePerformance/on/presolve.gms +++ b/modules/81_codePerformance/on/presolve.gms @@ -9,15 +9,15 @@ LOOP(run $(ord(run)<(c81_runs+1)), IF(MOD(ord(run)+2,3) EQ 0, -cm_co2_tax_startyear = 0; +cm_taxCO2_startyear = 0; ELSEIF MOD(ord(run)+2,3) EQ 1, -cm_co2_tax_startyear = 30; +cm_taxCO2_startyear = 30; ELSEIF MOD(ord(run)+2,3) EQ 2, -cm_co2_tax_startyear = 150; +cm_taxCO2_startyear = 150; ); *** Globally uniform, exponentially increasing carbonprice starting from the tax level (exogenously defined above) in the start year -pm_taxCO2eq(t,regi) = cm_co2_tax_startyear * sm_DptCO2_2_TDpGtC * cm_co2_tax_growth**(t.val-cm_startyear); +pm_taxCO2eq(t,regi) = cm_taxCO2_startyear * sm_DptCO2_2_TDpGtC * cm_taxCO2_expGrowth**(t.val-cm_startyear); pm_taxCO2eq("2005",regi)=0; display pm_taxCO2eq; diff --git a/scripts/start/checkFixCfg.R b/scripts/start/checkFixCfg.R index 7966f7cfd..8b9c53692 100644 --- a/scripts/start/checkFixCfg.R +++ b/scripts/start/checkFixCfg.R @@ -107,6 +107,10 @@ checkFixCfg <- function(cfg, remindPath = ".", testmode = FALSE) { if (! isTRUE(cfg$gms$cm_rcp_scen %in% c("none","rcp20","rcp26","rcp45") )) { warning("Chosen RCP scenario '", cfg$gms$cm_rcp_scen, "' might currently not be fully operational: test and verify before using it!") } + # check if cm_iterative_target_adj 5, 7, or 9 is used without carbonprice being set to functionalForm + if (isTRUE(cfg$gms$cm_iterative_target_adj %in% c("5","7","9")) && ! isTRUE(cfg$gms$carbonprice == "functionalForm") ) { + warning("Chosen iterative target adjustment algorithm '", cfg$gms$cm_iterative_target_adj, "' will not be applied without using realization 45_carbonprice/functionalForm!") + } # Make sure that an input_bau.gdx has been specified if needed. isBauneeded <- isTRUE(length(unlist(lapply(names(needBau), function(x) intersect(cfg$gms[[x]], needBau[[x]])))) > 0) if (isBauneeded) { diff --git a/scripts/start/readCheckScenarioConfig.R b/scripts/start/readCheckScenarioConfig.R index 075697525..e2c5be9b9 100644 --- a/scripts/start/readCheckScenarioConfig.R +++ b/scripts/start/readCheckScenarioConfig.R @@ -155,9 +155,11 @@ readCheckScenarioConfig <- function(filename, remindPath = ".", testmode = FALSE if (length(unknownColumnNames) > 0) { message("") forbiddenColumnNames <- list( # specify forbidden column name and what should be done with it - "c_budgetCO2" = "Rename to c_budgetCO2from2020, adapt emission budgets, see https://github.com/remindmodel/remind/pull/640", + "c_budgetCO2" = "Rename to cm_budgetCO2from2020, adapt emission budgets, see https://github.com/remindmodel/remind/pull/640", + "c_budgetCO2from2020" = "Rename to cm_budgetCO2from2020, see https://github.com/remindmodel/remind/pull/1874", + "c_budgetCO2from2020FFI" = "Deleted, use cm_budgetCO2from2020 instead, and adapt emission budgets, see https://github.com/remindmodel/remind/pull/1874", "c_peakBudgYr" = "Rename to cm_peakBudgYr, see https://github.com/remindmodel/remind/pull/1747", - "c_budgetCO2FFI" = "Rename to c_budgetCO2from2020FFI, adapt emission budgets, see https://github.com/remindmodel/remind/pull/640", + "c_budgetCO2FFI" = "Deleted, use cm_budgetCO2from2020 instead, and adapt emission budgets, see https://github.com/remindmodel/remind/pull/1874", "cm_bioenergy_tax" = "Rename to cm_bioenergy_SustTax, see https://github.com/remindmodel/remind/pull/1003", "cm_bioenergymaxscen" = "Use more flexible cm_maxProdBiolc switch instead, see https://github.com/remindmodel/remind/pull/1054", "cm_tradecost_bio" = "Use more flexible cm_tradecostBio switch, see https://github.com/remindmodel/remind/pull/1054", @@ -174,13 +176,19 @@ readCheckScenarioConfig <- function(filename, remindPath = ".", testmode = FALSE "cm_fixCO2price" = "Was never in use, removed in https://github.com/remindmodel/remind/pull/1369", "cm_calibration_FE" = "Deleted, only used for old hand made industry trajectories, see https://github.com/remindmodel/remind/pull/1468", "cm_DAC_eff" = "Deleted, not used anymore, see https://github.com/remindmodel/remind/pull/1487", - "cm_peakBudgYr" = "Rename to c_peakBudgYr, see https://github.com/remindmodel/remind/pull/1488", - "c_taxCO2inc_after_peakBudgYr" = "Rename to cm_taxCO2inc_after_peakBudgYr, see https://github.com/remindmodel/remind/pull/1776", + "c_taxCO2inc_after_peakBudgYr" = "Rename to cm_taxCO2_IncAfterPeakBudgYr, see https://github.com/remindmodel/remind/pull/1874", + "cm_taxCO2inc_after_peakBudgYr" = "Rename to cm_taxCO2_IncAfterPeakBudgYr, see https://github.com/remindmodel/remind/pull/1874", "c_solscen" = "Deleted, not used anymore, see https://github.com/remindmodel/remind/pull/1515", "cm_regNetNegCO2" = "Deleted, not used, see https://github.com/remindmodel/remind/pull/1517", "cm_solwindenergyscen" = "Deleted, not used, see https://github.com/remindmodel/remind/pull/1532", "cm_wind_offshore" = "Deleted, not used, see https://github.com/remindmodel/development_issues/issues/272", "cm_co2_tax_2020" = "Use cm_co2_tax_startyear instead, see https://github.com/remindmodel/remind/pull/1858", + "cm_co2_tax_startyear" = "Rename to cm_taxCO2_startyear, see https://github.com/remindmodel/remind/pull/1874", + "cm_co2_tax_growth" = "Rename to cm_taxCO2_expGrowth, see https://github.com/remindmodel/remind/pull/1874", + "cm_co2_tax_spread" = "Use cm_taxCO2_regiDiff instead, see https://github.com/remindmodel/remind/pull/1874", + "cm_co2_tax_hist" = "Rename to cm_taxCO2_historical, see https://github.com/remindmodel/remind/pull/1874", + "cm_year_co2_tax_hist" = "Rename to cm_taxCO2_historicalYr, see https://github.com/remindmodel/remind/pull/1874", + "cm_CO2priceRegConvEndYr" = "Use cm_taxCO2_regiDiff_endYr instead, see https://github.com/remindmodel/remind/pull/1874", NULL) for (i in intersect(names(forbiddenColumnNames), unknownColumnNames)) { msg <- paste0("Column name ", i, " in remind settings is outdated. ", forbiddenColumnNames[i]) diff --git a/tests/testthat/test_01-checkFixCfg.R b/tests/testthat/test_01-checkFixCfg.R index 384ee3e3a..3d4b51479 100644 --- a/tests/testthat/test_01-checkFixCfg.R +++ b/tests/testthat/test_01-checkFixCfg.R @@ -14,7 +14,7 @@ test_that("checkFixCfg works", { "cm_emiscen" = "123", "cm_nash_autoconverge" = "NA", "cm_gs_ew" = "2.2.2", - "cm_co2_tax_growth" = "333++", + "cm_taxCO2_expGrowth" = "333++", "c_macscen" = "-1", "cm_keep_presolve_gdxes" = "1.1", "cm_startyear" = "1985", @@ -22,7 +22,7 @@ test_that("checkFixCfg works", { "cm_rcp_scen" = "apocalypse", "c_testOneRegi_region" = "LOONG", "c_shGreenH2" = "1.5", - "cm_co2_tax_startyear" = "-2", + "cm_taxCO2_startyear" = "-2", NULL) cfg <- savecfg From 7a97f184ef90c8b446b7ee69b20a321a309961ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laurin=20K=C3=B6hler-Schindler?= Date: Mon, 11 Nov 2024 10:07:42 +0100 Subject: [PATCH 3/3] Add scenario config for testing --- config/scenario_config_functionalForm.csv | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 config/scenario_config_functionalForm.csv diff --git a/config/scenario_config_functionalForm.csv b/config/scenario_config_functionalForm.csv new file mode 100644 index 000000000..b47b5ab1d --- /dev/null +++ b/config/scenario_config_functionalForm.csv @@ -0,0 +1,18 @@ +title;start;CES_parameters;slurmConfig;regionmapping;extramappings_historic;cm_rcp_scen;cm_iterative_target_adj;subsidizeLearning;cm_budgetCO2from2020;cm_peakBudgYr;cm_taxCO2_startyear;carbonprice;cm_taxCO2_functionalForm;cm_taxCO2_expGrowth;cm_taxCO2_IncAfterPeakBudgYr;cm_taxCO2_historical;cm_taxCO2_historicalYr;cm_expoLinear_yearStart;cm_taxCO2_regiDiff;cm_taxCO2_regiDiff_endYr;cm_taxCO2_interpolation;cm_taxCO2_lowerBound_path_gdx_ref;cm_emiscen;c_regi_earlyreti_rate;c_tech_earlyreti_rate;cm_fetaxscen;cm_bioenergy_SustTax;cm_33EW;cm_33OAE;cm_33_OAE_eff;cm_33_OAE_scen;cm_frac_NetNegEmi;c_ccsinjecratescen;c_ccscapratescen;c_changeProdCost;cm_CESMkup_build;cm_CESMkup_ind;cm_CESMkup_ind_data;cm_wasteIncinerationCCSshare;techpol;regipol;cm_implicitQttyTarget;cm_emiMktTarget;cm_NucRegiPol;cm_CoalRegiPol;cm_altFeEmiFac;cm_POPscen;cm_GDPscen;cm_demScen;cm_oil_scen;cm_gas_scen;cm_coal_scen;c_techAssumptScen;cm_nucscen;cm_so2tax_scen;cm_multigasscen;cm_LU_emi_scen;cm_tradecostBio;cm_1stgen_phaseout;c_SSP_forcing_adjust;cm_APscen;cm_EDGEtr_scen;cm_startyear;path_gdx;path_gdx_ref;path_gdx_bau;path_gdx_refpolicycost;description +# H12 SSP2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +SSP2-NPi;0;;;;;rcp45;3;;0;;;NPi;;;;;;;;;;;9;;;;;;;;;;;;;;;;;NPi2018;regiCarbonPrice;;;on;on;EUR_regi, NEU_regi;;;;;;;;;;3;;;;;;Mix1;2005;;;;;SSP2-NPi: This National Policies Implemented (NPi) scenario follows the Shared Socioeconomic Pathways 2 called Middle of the Road. The NPi assumes that policies fail to achieve NDC targets in 2030. Instead, carbon prices are assumed to grow and converge more slowly, leading to emissions trajectories in line with bottom-up studies on the effect of currently implemented policies. +SSP2-NPi2025-test;0;;;;;rcp45;3;;0;;;NPi2025_EUR55;;1.01;;;;;;;;;9;;;;;;;;;;;;;;;;;NPi2018;regiCarbonPrice;;;on;on;EUR_regi, NEU_regi;;;;;;;;;;3;;;;;;Mix2ICEban;2005;;;;;SSP2-NPi: This National Policies Implemented (NPi) scenario follows the Shared Socioeconomic Pathways 2 called Middle of the Road. The NPi assumes that policies fail to achieve NDC targets in 2030. Instead, carbon prices are assumed to grow and converge more slowly, leading to emissions trajectories in line with bottom-up studies on the effect of currently implemented policies. +SSP2-PkBudg650;0;;;;;rcp20;9;globallyOptimal;650;2055;75;functionalForm;linear;;;;;;;;;;9;;;;;;;;;;;;1;;;;2050.GLO 0.9;NDC;regiCarbonPrice;2030.EUR_regi.tax.t.FE_wo_b_wo_n_e.all 1.2809;;on;on;EUR_regi, NEU_regi;;;;;;;;;;;;;;;;Mix4ICEban;2030;;SSP2-NPi2025;;SSP2-NPi2020;SSP2-PkBudg650: This climate policy scenario follows the Shared Socioeconomic Pathways 2 called Middle of the Road. The stylized climate policy scenario assumes a peak budget of 650 Gt CO2 on total CO2 emissions from 2015 to 2100. This is a 1.5C scenario, peak warming is allowed to be at or slightly above 1.5C at median climate sensitivity but returns to values below 1.5C in at least 67 % of scenarios by the end of the century. +SSP2-PkBudg1000;0;;;;;rcp26;9;globallyOptimal;1000;2080;45;functionalForm;linear;;;;;;;;;;9;;;;;;;;;;;;1;;;;2050.GLO 0.5;NDC;regiCarbonPrice;2030.EUR_regi.tax.t.FE_wo_b_wo_n_e.all 1.2809;;on;on;EUR_regi, NEU_regi;;;;;;;;;;;;;;;;Mix3ICEban;2030;;SSP2-NPi2025;;SSP2-NPi2020;SSP2-PkBudg1050: This climate policy scenario follows the Shared Socioeconomic Pathways 2 called Middle of the Road. The stylized climate policy scenario assumes a peak budget of 1150 Gt CO2 on total CO2 emissions from 2015 to 2100. This is a well below 2C scenario at median climate sensitivity but returns to values below 2C in at least 67 % of scenarios during the whole century. +SSP2-EcBudg400;0;;;;;rcp26;5;globallyOptimal;400;;70;functionalForm;exponential;;;;;;initialSpread20;GLO 2070;;;9;;;;;1;1;0.9;0;0;;;1;;;;2060.GLO 0.9;NDC;regiCarbonPrice;;;on;on;EUR_regi, NEU_regi;;;;;;;;;;;;;;;;Mix3ICEban;2035;;SSP2-NPi2025;;SSP2-NPi2020;SSP2-EcBudg400: This climate policy scenario follows the Shared Socioeconomic Pathways 2 called Middle of the Road. The stylized climate policy scenario assumes an end-of-century budget of 400 Gt CO2 on total CO2 emissions from 2020 to 2100. This is a high overshoot scenario with delayed climate policy. +SSP2-EcBudg400-a;0;;;;;rcp26;5;globallyOptimal;400;;70;functionalForm;exponential;1.05;;;;;initialSpread20;GLO 2070;;;9;;;;;1;1;0.9;0;0;;;1;;;;2060.GLO 0.9;NDC;regiCarbonPrice;;;on;on;EUR_regi, NEU_regi;;;;;;;;;;;;;;;;Mix3ICEban;2035;;SSP2-NPi2025;;SSP2-NPi2020;SSP2-EcBudg400: This climate policy scenario follows the Shared Socioeconomic Pathways 2 called Middle of the Road. The stylized climate policy scenario assumes an end-of-century budget of 400 Gt CO2 on total CO2 emissions from 2020 to 2100. This is a high overshoot scenario with delayed climate policy. +SSP2-PkBudg650-a;0;;;;;rcp20;7;globallyOptimal;650;2055;75;functionalForm;linear;;;;;;;;;;9;;;;;;;;;;;;1;;;;2050.GLO 0.9;NDC;regiCarbonPrice;2030.EUR_regi.tax.t.FE_wo_b_wo_n_e.all 1.2809;;on;on;EUR_regi, NEU_regi;;;;;;;;;;;;;;;;Mix4ICEban;2030;;SSP2-NPi2025;;SSP2-NPi2020;SSP2-PkBudg650: This climate policy scenario follows the Shared Socioeconomic Pathways 2 called Middle of the Road. The stylized climate policy scenario assumes a peak budget of 650 Gt CO2 on total CO2 emissions from 2015 to 2100. This is a 1.5C scenario, peak warming is allowed to be at or slightly above 1.5C at median climate sensitivity but returns to values below 1.5C in at least 67 % of scenarios by the end of the century. +SSP2-PkBudg650-b;0;;;;;rcp20;9;globallyOptimal;650;2055;75;functionalForm;linear;;2;;;;;;;;9;;;;;;;;;;;;1;;;;2050.GLO 0.9;NDC;regiCarbonPrice;2030.EUR_regi.tax.t.FE_wo_b_wo_n_e.all 1.2809;;on;on;EUR_regi, NEU_regi;;;;;;;;;;;;;;;;Mix4ICEban;2030;;SSP2-NPi2025;;SSP2-NPi2020;SSP2-PkBudg650: This climate policy scenario follows the Shared Socioeconomic Pathways 2 called Middle of the Road. The stylized climate policy scenario assumes a peak budget of 650 Gt CO2 on total CO2 emissions from 2015 to 2100. This is a 1.5C scenario, peak warming is allowed to be at or slightly above 1.5C at median climate sensitivity but returns to values below 1.5C in at least 67 % of scenarios by the end of the century. +SSP2-PkBudg650-c;1;;;;;rcp20;9;globallyOptimal;650;2055;75;functionalForm;linear;;;0;2010;;;;;;9;;;;;;;;;;;;1;;;;2050.GLO 0.9;NDC;regiCarbonPrice;2030.EUR_regi.tax.t.FE_wo_b_wo_n_e.all 1.2809;;on;on;EUR_regi, NEU_regi;;;;;;;;;;;;;;;;Mix4ICEban;2030;;SSP2-NPi2025;;SSP2-NPi2020;SSP2-PkBudg650: This climate policy scenario follows the Shared Socioeconomic Pathways 2 called Middle of the Road. The stylized climate policy scenario assumes a peak budget of 650 Gt CO2 on total CO2 emissions from 2015 to 2100. This is a 1.5C scenario, peak warming is allowed to be at or slightly above 1.5C at median climate sensitivity but returns to values below 1.5C in at least 67 % of scenarios by the end of the century. +SSP2-PkBudg650-d;0;;;;;rcp20;9;globallyOptimal;650;2055;75;functionalForm;linear;;;;;;none;;;;9;;;;;;;;;;;;1;;;;2050.GLO 0.9;NDC;regiCarbonPrice;2030.EUR_regi.tax.t.FE_wo_b_wo_n_e.all 1.2809;;on;on;EUR_regi, NEU_regi;;;;;;;;;;;;;;;;Mix4ICEban;2030;;SSP2-NPi2025;;SSP2-NPi2020;SSP2-PkBudg650: This climate policy scenario follows the Shared Socioeconomic Pathways 2 called Middle of the Road. The stylized climate policy scenario assumes a peak budget of 650 Gt CO2 on total CO2 emissions from 2015 to 2100. This is a 1.5C scenario, peak warming is allowed to be at or slightly above 1.5C at median climate sensitivity but returns to values below 1.5C in at least 67 % of scenarios by the end of the century. +SSP2-PkBudg650-e;0;;;;;rcp20;9;globallyOptimal;650;2055;75;functionalForm;linear;;;;;;;GLO 2050, SSA 2100;;;9;;;;;;;;;;;;1;;;;2050.GLO 0.9;NDC;regiCarbonPrice;2030.EUR_regi.tax.t.FE_wo_b_wo_n_e.all 1.2809;;on;on;EUR_regi, NEU_regi;;;;;;;;;;;;;;;;Mix4ICEban;2030;;SSP2-NPi2025;;SSP2-NPi2020;SSP2-PkBudg650: This climate policy scenario follows the Shared Socioeconomic Pathways 2 called Middle of the Road. The stylized climate policy scenario assumes a peak budget of 650 Gt CO2 on total CO2 emissions from 2015 to 2100. This is a 1.5C scenario, peak warming is allowed to be at or slightly above 1.5C at median climate sensitivity but returns to values below 1.5C in at least 67 % of scenarios by the end of the century. +SSP2-PkBudg650-f;0;;;;;rcp20;9;globallyOptimal;650;2055;75;functionalForm;linear;;;;;;gdpSpread;;;;9;;;;;;;;;;;;1;;;;2050.GLO 0.9;NDC;regiCarbonPrice;2030.EUR_regi.tax.t.FE_wo_b_wo_n_e.all 1.2809;;on;on;EUR_regi, NEU_regi;;;;;;;;;;;;;;;;Mix4ICEban;2030;;SSP2-NPi2025;;SSP2-NPi2020;SSP2-PkBudg650: This climate policy scenario follows the Shared Socioeconomic Pathways 2 called Middle of the Road. The stylized climate policy scenario assumes a peak budget of 650 Gt CO2 on total CO2 emissions from 2015 to 2100. This is a 1.5C scenario, peak warming is allowed to be at or slightly above 1.5C at median climate sensitivity but returns to values below 1.5C in at least 67 % of scenarios by the end of the century. +SSP2-PkBudg650-g;0;;;;;rcp20;9;globallyOptimal;650;2055;75;functionalForm;linear;;;;;;;;two_steps;;9;;;;;;;;;;;;1;;;;2050.GLO 0.9;NDC;regiCarbonPrice;2030.EUR_regi.tax.t.FE_wo_b_wo_n_e.all 1.2809;;on;on;EUR_regi, NEU_regi;;;;;;;;;;;;;;;;Mix4ICEban;2030;;SSP2-NPi2025;;SSP2-NPi2020;SSP2-PkBudg650: This climate policy scenario follows the Shared Socioeconomic Pathways 2 called Middle of the Road. The stylized climate policy scenario assumes a peak budget of 650 Gt CO2 on total CO2 emissions from 2015 to 2100. This is a 1.5C scenario, peak warming is allowed to be at or slightly above 1.5C at median climate sensitivity but returns to values below 1.5C in at least 67 % of scenarios by the end of the century. +SSP2-PkBudg650-h;0;;;;;rcp20;9;globallyOptimal;650;2055;75;functionalForm;linear;;;;;;;;GLO.2025.2050 2, EUR.2025.2060 1;;9;;;;;;;;;;;;1;;;;2050.GLO 0.9;NDC;regiCarbonPrice;2030.EUR_regi.tax.t.FE_wo_b_wo_n_e.all 1.2809;;on;on;EUR_regi, NEU_regi;;;;;;;;;;;;;;;;Mix4ICEban;2030;;SSP2-NPi2025;;SSP2-NPi2020;SSP2-PkBudg650: This climate policy scenario follows the Shared Socioeconomic Pathways 2 called Middle of the Road. The stylized climate policy scenario assumes a peak budget of 650 Gt CO2 on total CO2 emissions from 2015 to 2100. This is a 1.5C scenario, peak warming is allowed to be at or slightly above 1.5C at median climate sensitivity but returns to values below 1.5C in at least 67 % of scenarios by the end of the century. +SSP2-PkBudg650-i;0;;;;;rcp20;9;globallyOptimal;650;2055;75;functionalForm;linear;;;;;;;;;off;9;;;;;;;;;;;;1;;;;2050.GLO 0.9;NDC;regiCarbonPrice;2030.EUR_regi.tax.t.FE_wo_b_wo_n_e.all 1.2809;;on;on;EUR_regi, NEU_regi;;;;;;;;;;;;;;;;Mix4ICEban;2030;;SSP2-NPi2025;;SSP2-NPi2020;SSP2-PkBudg650: This climate policy scenario follows the Shared Socioeconomic Pathways 2 called Middle of the Road. The stylized climate policy scenario assumes a peak budget of 650 Gt CO2 on total CO2 emissions from 2015 to 2100. This is a 1.5C scenario, peak warming is allowed to be at or slightly above 1.5C at median climate sensitivity but returns to values below 1.5C in at least 67 % of scenarios by the end of the century. +SSP2-expoLinear;0;;;;;rcp20;0;globallyOptimal;0;2055;75;expoLinear;;;;;;2060;;;;;9;;;;;;;;;;;;1;;;;2050.GLO 0.9;NDC;regiCarbonPrice;2030.EUR_regi.tax.t.FE_wo_b_wo_n_e.all 1.2809;;on;on;EUR_regi, NEU_regi;;;;;;;;;;;;;;;;Mix4ICEban;2030;;SSP2-NPi2025;;SSP2-NPi2020;SSP2-PkBudg650: This climate policy scenario follows the Shared Socioeconomic Pathways 2 called Middle of the Road. The stylized climate policy scenario assumes a peak budget of 650 Gt CO2 on total CO2 emissions from 2015 to 2100. This is a 1.5C scenario, peak warming is allowed to be at or slightly above 1.5C at median climate sensitivity but returns to values below 1.5C in at least 67 % of scenarios by the end of the century.