Skip to content

Prisma WP6 NDC delay and SE tech from ref - #2421

Open
RahelMA wants to merge 7 commits into
remindmodel:developfrom
RahelMA:PRISMA_SA
Open

Prisma WP6 NDC delay and SE tech from ref#2421
RahelMA wants to merge 7 commits into
remindmodel:developfrom
RahelMA:PRISMA_SA

Conversation

@RahelMA

@RahelMA RahelMA commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

Purpose of this PR

The purpose of this PR is to update the PRISMA WP6 scenarios to from the latest submission in July 2026. The central changes are the following:

  1. Rewrite the delay of NDC targets (in the initial submission, unfortunately the delay did not work correctly). This also required an adjustment of the linear carbon price path before the NDC target.
  2. In 40_techpol it is now also possible to set a ref scenario as lower bound for SE technologies as solar and wind.

Scenario overview:

  • MeetAspirations: NDC-LTS incl. net-zero target for the US
  • AsymmetricRoll−Back: delay NDC and LTS targets as following
Transition leaders: EUR, NEU, JPN →10
Diversifying economies: LAM, USA, CAZ, IND, CHA, SSA, OAS →20
Fossil-dependant: REF, MEA →30
  • LateReawakening: follows the AR pathway until 2035, in 2040 awakening and tries to still reach net-zero targets (leading to higher required carbon prices to still reach the target, as carbon prices stay constant afterwards following the protocol; this scenarios is more ambitious in the second half of the century)

  • StayingAlive: same carbon price as in AR until the EOC but RE technology increase following MA

image

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

  • ☑️ GAMS Code
  • ☑️ R-scripts
  • ◻️ Documentation (GAMS incode documentation, comments, tutorials)
  • ◻️ Input data / CES parameters
  • ◻️ Tests, CI/CD (continuous integration/deployment)
  • ☑️ Configuration (switches in main.gms, default.cfg, and scenario_config*.csv files)
  • ◻️ Other (please give a description)

Impact

  • ☑️ Bug fix
  • ◻️ Refactoring
  • ◻️ New feature
  • ◻️ Change of parameter values or input data (including CES parameters)
  • ◻️ Minor change (default scenarios show only small differences)
  • ◻️ Fundamental change of results of default scenarios

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
.

  • I executed the automated model tests (make test) after my final commit and all tests pass (FAIL 0)
  • I adjusted the reporting in remind2 if and where it was needed
  • I adjusted the madrat packages (mrremind and other packages involved) for input data generation if and where it was needed
  • My code follows the coding etiquette
  • I explained my changes within the PR, particularly in hard-to-understand areas
  • I checked that the in-code documentation is up-to-date
  • I adjusted forbiddenColumnNames in readCheckScenarioConfig.R in case the PR leads to deprecated switches
  • I updated the CHANGELOG.md correctly (added, changed, fixed, removed, input data/calibration)

Further information (optional)

  • Runs with these changes are here: /p/projects/prisma/WP6/submission-07-2026_final
  • Comparison of results (what changes by this PR?): /p/projects/prisma/WP6/submission-07-2026_final/compScen-PRISMA_final_submission-2026-07-22_16.19.42-REMIND-MAgPIE.pfd

Comment on lines +40 to +46
p40_TechBound(ttot,all_regi,te)$(
ttot.val ge 2030 AND ttot.val le 2100
AND (sameas(te,"windon") OR sameas(te,"windoff") OR sameas(te,"spv") OR sameas(te,"csp"))
) = max(
p40_TechBound(ttot,all_regi,te),
p40_RefCap(ttot,all_regi,te, "1")*1000
);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does it have to follow the ref throughout the whole time span, or just until 2035?
If it is indeed [2030-2100], then we can remove the condition and use set t (This set includes only the active modeled years, which are the years from ttot greater than or equal to the model run year defined in cm_startyear.)
teVRE also contains the relevant techs.

Suggested change
p40_TechBound(ttot,all_regi,te)$(
ttot.val ge 2030 AND ttot.val le 2100
AND (sameas(te,"windon") OR sameas(te,"windoff") OR sameas(te,"spv") OR sameas(te,"csp"))
) = max(
p40_TechBound(ttot,all_regi,te),
p40_RefCap(ttot,all_regi,te, "1")*1000
);
p40_TechBound(t,all_regi,teVRE) = max(
p40_TechBound(t,all_regi,teVRE),
p40_RefCap(t,all_regi,teVRE, "1") * 1000
);

*** calculate tax path until NDC target year - linear increase
$ifThen "%cm_targetDelay%" == "prisma"
p45_taxCO2eqFirstNDCyear(regi) = smax(t$(t.val = p45_firstNDCyear(regi)), pm_taxCO2eq(t,regi));
pm_taxCO2eq(t,regi)$(t.val > 2031 AND t.val < p45_firstNDCyear(regi)) = (p45_taxCO2eqFirstNDCyear(regi) - pm_taxCO2eq("2035",regi))*(t.val-2035)/(p45_firstNDCyear(regi)-2035) + pm_taxCO2eq("2035",regi);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To save us having to check that the linear interpolation is correct, we could use macro_interpolate:

*** macro_interpolate(t,t0,t1,x0,x1): Linear interpolation between two values x0 and x1 at time points t0 and t1 for an intermediate time point t

Suggested change
pm_taxCO2eq(t,regi)$(t.val > 2031 AND t.val < p45_firstNDCyear(regi)) = (p45_taxCO2eqFirstNDCyear(regi) - pm_taxCO2eq("2035",regi))*(t.val-2035)/(p45_firstNDCyear(regi)-2035) + pm_taxCO2eq("2035",regi);
pm_taxCO2eq(t,regi) $ (t.val >= 2035 and t.val < p45_firstNDCyear(regi))
= macro_interpolate(t.val, 2035, p45_firstNDCyear(regi), pm_taxCO2eq("2035",regi), p45_taxCO2eqFirstNDCyear(regi));

pm_taxCO2eq(t,regi)$(t.val > 2031 AND t.val < p45_firstNDCyear(regi)) = (p45_taxCO2eqFirstNDCyear(regi) - pm_taxCO2eq("2035",regi))*(t.val-2035)/(p45_firstNDCyear(regi)-2035) + pm_taxCO2eq("2035",regi);
$else
p45_taxCO2eqFirstNDCyear(regi) = smax(t$(t.val = p45_firstNDCyear(regi)), pm_taxCO2eq(t,regi));
pm_taxCO2eq(t,regi)$(t.val > 2021 AND t.val < p45_firstNDCyear(regi)) = (p45_taxCO2eqFirstNDCyear(regi) - pm_taxCO2eq("2020",regi))*(t.val-2020)/(p45_firstNDCyear(regi)-2020) + pm_taxCO2eq("2020",regi);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here we could use macro_interpolate too.

Suggested change
pm_taxCO2eq(t,regi)$(t.val > 2021 AND t.val < p45_firstNDCyear(regi)) = (p45_taxCO2eqFirstNDCyear(regi) - pm_taxCO2eq("2020",regi))*(t.val-2020)/(p45_firstNDCyear(regi)-2020) + pm_taxCO2eq("2020",regi);
pm_taxCO2eq(t,regi) $ (t.val >= 2020 and t.val < p45_firstNDCyear(regi))
= macro_interpolate(t.val, 2020, p45_firstNDCyear(regi), pm_taxCO2eq("2020",regi), p45_taxCO2eqFirstNDCyear(regi));

$endif

*** calculate tax path until NDC target year - linear increase
$ifThen "%cm_targetDelay%" == "prisma"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just to confirm. imagining region XXX has a 2030 NDC pushed to 2050:

  • without cm_targetDelay, the carbon price goes "normal in 2020 to NDC-aligned in 2030. Why not normal in 2025 too? Could the slope start in 2025?
  • with cm_targetDelay, the carbon price goes to "normal in 2035 to NDC-aligned in 2050. Is it the protocol that wants the price to stay normal until 2035? The NDCs are delayed, but don't regions start working toward them now (just too slowly)? Could the slope start in 2025?

If yes, we could replace the whole $ifThen block by:

p45_taxCO2eqFirstNDCyear(regi) = smax(t$(t.val = p45_firstNDCyear(regi)), pm_taxCO2eq(t,regi));
pm_taxCO2eq(t,regi) $ (t.val >= 2025 and t.val < p45_firstNDCyear(regi))
  = macro_interpolate(t.val, 2025, p45_firstNDCyear(regi), pm_taxCO2eq("2025",regi), p45_taxCO2eqFirstNDCyear(regi));

(because p45_firstNDCyear already adapts to cm_targetDelay)

Comment on lines 58 to +90
@@ -72,10 +86,17 @@ $ifThen.cm_NDC_CO2PriceLimit_continuation not "%cm_NDC_CO2PriceLimit_continuatio
$endif.cm_NDC_CO2PriceLimit_continuation
);
$endif.cm_NDC_CO2PriceLimit

$endif

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(I did not verify the calculation.)
Would there be a nice way to avoid duplicating such heavy equations? They look very similar =)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants