update NDC realization to run 2030+2035 NDC emissions targets by default and clean up + extend on switches for NDC variants#2289
Conversation
…ion 2025_cond/uncond and improve documentation of NDC target versions
…p45_useSingleYearCloseTo as this is meanwhile done by switch cm_NDC_targetYear
…nd clean-up NDC post-target co2 price settings. This introduces new flags cm_NDC_CO2PriceLimit, cm_NDC_postTargetDevelopment, cm_NDC_CO2PriceMinimum
… emissions targets should be convergence criterion. By default, runs do not require NDC target compliance
… NPi co2 price for all time steps
…DC realization always iterates carbon prices
…al NDC targets based on latest PBL data) and switch on targets for 2030 and 2035 by default
…SSP scenarios. Needs to be there until deleted in input data.
…oduced in main.gms
RahelMA
left a comment
There was a problem hiding this comment.
Great work, thank you! I just have minor documentation comments!
| p45_taxCO2eqConvergenceYear = 3000; | ||
| ); | ||
| *** initialize carbon price trajectory before target adjustment iterations by setting carbon price to NPi | ||
| pm_taxCO2eq(t,regi) = p45_taxCO2eq_bau(t,regi); |
There was a problem hiding this comment.
Initializing on the NPi2025 is useful, have you check that we never are below? I just wonder if we also need a constraint NPI <= NDC e.g. with low 2035 NDC targets
There was a problem hiding this comment.
This is taken care of by cm_NDC_CO2PriceMinimum = NPi which is the default setting now.
| Scalar p45_minRatioOfCoverageToMax "only targets whose coverage is this times p45_bestNDCcoverage are considered. Use 1 for only best [0..1]" /1.0/; | ||
| Scalar p45_useSingleYearCloseTo "if 0: use all. If > 0: use only one single NDC target per country closest to this year (use 2030.4 to prefer 2030 over 2035 over 2025) [year]" /2030.4/; | ||
| Scalar p45_minRatioOfCoverageToMax "only targets whose coverage is this times p45_bestNDCcoverage are considered. Use 1 for only best [0..1]" /0/; | ||
| Scalar p45_useSingleYearCloseTo "if 0: use all. If > 0: use only one single NDC target per country closest to this year (use 2030.4 to prefer 2030 over 2035 over 2025) [year]" /0/; |
There was a problem hiding this comment.
- Use NDC targets independent from coverage, top!
- I think with your change you use all targets in the input data, I asume thats ok as we only have 2030 and 2035 for Emissions_2026_cond, for other versions this would cause an error (e.g. 2024 also includes some 2050 targets) ... maybe you want to add a little warning note?
There was a problem hiding this comment.
The switch cm_NDC_targetYear = 2030, 2035 now only selects those two years.
|
|
||
| if (not sameas("%cm_NDC_version%","2018_uncond"), | ||
| p45_factorTargetyear(t,regi)$(sameas(regi,"LAM") AND sameas(t,"2030")) = p45_factorTargetyear(t,regi) + 0.2; | ||
| p45_factorTargetyear(t,regi)$(sameas(regi,"LAM") AND sameas(t,"2035")) = p45_factorTargetyear(t,regi) + 0.2; |
There was a problem hiding this comment.
With these deletions, older version may have problems, but that ok, as we will remove them this summer ;)
| 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]" | ||
| $ifthen not "%cm_NDC_CO2PriceLimit%" == "off" | ||
| p45_CO2PriceLimitNDC(ttot,all_regi) "Upper limit of CO2 price in NDC realization, read from switch cm_NDC_CO2PriceLimit [$/tCO2]" / %cm_NDC_CO2PriceLimit% / |
There was a problem hiding this comment.
so we currently set the price limit in the config, that's nice!
| pm_budgetDeviation,input,added by codeCheck | ||
| pm_regionalBudget_absDevTol,input,added by codeCheck | ||
| cm_startyear,input,not used | ||
| sm_D2005_2_D2017,input,not used |
There was a problem hiding this comment.
why do we need to add this here? sm_D2005_2_D2017
There was a problem hiding this comment.
Just a code check request. Probably I deleted code using this before.
| *#' calculate level of emission target per REMIND region. It is componsed to two terms: | ||
| *#' 1. Contribution of countries within REMIND region with NDC target: | ||
| *#' share of emissions covered by NDC in particular region * REMIND NPI emissions in 2015 * (country-aggregated) relative NDC emissions target with respect to 2015 | ||
| *#' 2. Contribution of countries within REMIND region without NDC target: |
| p45_CO2eqwoLU_goal(p45_NDCyearSet(t,regi)) = | ||
| p45_shareTarget(t,regi) * p45_BAU_reg_emi_wo_LU_wo_bunkers("2015",regi) * p45_factorTargetyear(t,regi) !! share with NDC target | ||
| + (1-p45_shareTarget(t,regi)) * p45_BAU_reg_emi_wo_LU_wo_bunkers(t,regi); !! baseline for share of countries without NDC target | ||
| + (1-p45_shareTarget(t,regi)) * p45_BAU_reg_emi_wo_LU_wo_bunkers(t,regi); !! baseline for share of countries without NDC target |
There was a problem hiding this comment.
I see it correctly, you have not changed the formula, right?
| $ifthen.NDC "%carbonprice%" == "NDC" | ||
| $ifthen.targetCheck "%cm_NDC_TargetCheckConv%" == "on" | ||
| *** additional criterion: Were NDC emissions targets reached? | ||
| loop((t,regi)$pm_NDCEmiTargetDeviation(t,regi), |
There was a problem hiding this comment.
Could you please add the documentation what happens in pm_NDCEmiTargetDeviation?
There was a problem hiding this comment.
Is this only checking if the target is reached?
| *' * (2026_uncond): all NDCs independent of international financial support published until end of 2025 (PBL collection), note that for countries / regions with target ranges (e.g. EU 66-72% 2035 target) | ||
| *' * the less ambitious target is chosen even if it is strictly speaking not an unconditional NDC target | ||
| *' * (2024_cond_extrapol): all NDCs conditional to international financial support published until August 31, 2024 with extrapolation of 2030 targets to 2035 targets for conutries without 2035 target | ||
| *' * (2024_uncond_extrapol): all NDCs independent of international financial support published until August 31, 2024 with extrapolation of 2030 targets to 2035 targets for conutries without 2035 target |
main.gms
Outdated
| *' * Note: including target years here does not mean they are automcatically considered in the carbonprice NDC realization. | ||
| *' * Depending on the p45_minRatioOfCoverageToMax parameter, each region receives the target year with the highest share of emissions covered under NDCs. | ||
| $setglobal cm_NDC_targetYear "2030" !! def = "2030" | ||
| $setglobal cm_NDC_targetYear "2030, 2035" !! def = "2030, 2035" |
There was a problem hiding this comment.
ah I see we only have 2030 and 2035, so you can ignore my comment before ;)
|
Could you please provide the config changes in a readable format using |
|
Eventually, I realized I didn't need a scenario config change. I tested the new default NDC run here |
Purpose of this PR
This PR works over the realization of the NDC scenario in REMIND. The main changes are:
Type of change
Indicate the items relevant for your PR by replacing ◻️ with ☑️.
Do not delete any lines. This makes it easier to understand which areas are affected by your changes and which are not.
Parts concerned
Impact
Checklist
Do not delete any line. Leave unfinished elements unchecked so others know how far along you are.
In the end all checkboxes must be ticked before you can merge.
make test) after my final commit and all tests pass (FAIL 0)remind2if and where it was neededforbiddenColumnNamesin readCheckScenarioConfig.R in case the PR leads to deprecated switchesCHANGELOG.mdcorrectly (added, changed, fixed, removed, input data/calibration)Further information (optional)
/p/tmp/schreyer/Modeling/remind/Dev1/compScen-NDC_Current_vs_2030_vs_NDCallPF-2026-02-17_10.19.07-H12.pdfNew NDC is
NDC_all_pf. Old NDC isSSP2-NDC-AMT.