diff --git a/modules/45_carbonprice/NDC/declarations.gms b/modules/45_carbonprice/NDC/declarations.gms index 9f95a2102..831a385b8 100644 --- a/modules/45_carbonprice/NDC/declarations.gms +++ b/modules/45_carbonprice/NDC/declarations.gms @@ -17,6 +17,7 @@ p45_factorRescaleCO2TaxLtd_iter(iteration,ttot,all_regi) "Track the changes of p p45_taxCO2eqFirstNDCyear(all_regi) "CO2eq tax in p45_firstNDCyear [T$/GtC]" p45_taxCO2eq_bau(ttot,all_regi) "level of CO2 taxes in business as usual run [T$/GtC]" pm_NDCEmiTargetDeviation(ttot,all_regi) "deviation of REMIND emissions to NDC target emissions in last iteration normalized to NDC target emissions [0-1]" +p45_iterDamping "Lower bound on the price rescaling to avoid oscillations and favour convergence, between 0.25 and 1" $ifthen "%cm_targetDelay%" == "prisma" p45_delay(all_regi) "delay of NDC targets, defined per region [years]" $endif diff --git a/modules/45_carbonprice/NDC/postsolve.gms b/modules/45_carbonprice/NDC/postsolve.gms index c1fd6a7b9..fc7fb9a25 100644 --- a/modules/45_carbonprice/NDC/postsolve.gms +++ b/modules/45_carbonprice/NDC/postsolve.gms @@ -44,9 +44,19 @@ if( iteration.val lt 8, p45_adjustExponent = 4; p45_factorRescaleCO2Tax(p45_NDCyearSet(t,regi)) = ( (p45_CO2eqwoLU_actual(t,regi)+0.0001)/(p45_CO2eqwoLU_goal(t,regi)+0.0001) )**p45_adjustExponent; +*' Concave curve growing from 0 at iteration 0 to 1 at cm_iteration_max https://www.desmos.com/calculator/ekpauw9fxx +p45_iterDamping = + 1 - (1 - iteration.val / cm_iteration_max) ** 2; + +*' Damping factor to limit the change of the CO2 tax in each iteration, ensures convergence and prevents oscillation' p45_factorRescaleCO2TaxLtd(p45_NDCyearSet(t,regi)) = - min(max(0.1**p45_adjustExponent, p45_factorRescaleCO2Tax(t,regi)), max(2-iteration.val/15,1.01-iteration.val/10000)); -*** use max(0.1, ...) to make sure that negative emission values cause no problem, use +0.0001 such that net zero targets cause no problem + min(5, + max(0.1, + 1 + + (p45_factorRescaleCO2Tax(t,regi) - 1) + * p45_iterDamping + )); + pm_taxCO2eq(t,regi)$(t.val gt 2021 AND t.val le p45_lastNDCyear(regi)) = max(1* sm_DptCO2_2_TDpGtC,pm_taxCO2eq(t,regi) * p45_factorRescaleCO2TaxLtd(t,regi) );