Skip to content

Change NDC target calculation from relative to absolute targets#2328

Open
fschreyer wants to merge 10 commits intoremindmodel:developfrom
fschreyer:NpiNDC
Open

Change NDC target calculation from relative to absolute targets#2328
fschreyer wants to merge 10 commits intoremindmodel:developfrom
fschreyer:NpiNDC

Conversation

@fschreyer
Copy link
Copy Markdown
Contributor

@fschreyer fschreyer commented Apr 2, 2026

Purpose of this PR

This PR changes the NDC target calculation from relative to absolute emissions targets and complements the mrremind change. Now:

NDC emissions target per region =

sum of emissions targets of all countries with targets + share of emissions of countries without target * NPI emissions in target year.

It also increments the input data revision to use the new absolute NDC targets with target filtering removed. This caused NDC targets to increase quite a bit in multiple REMIND regions (MEA, SSA, OAS etc., see below).

Moreover, the NPI emissions are not loaded from a mif file anymore, but come from the input_bau.gdx. This is a refactoring to ideally remove the dependency on the prepare_NDC.R script. This script can probably be removed, but let's check that in a separate process.

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:
  • Comparison of results (what changes by this PR?):

This is how the targets changed (circles are targets with old approach, triangles are new absolute targets without filtering out of too unambitious/ambitious targets):

The blue line is the new resulting NDC scenario.

image

I think, the China 2030 target still needs a check.

/p/tmp/schreyer/Modeling/remind/Dev1/compScen-NDC_Rel_vs_Abs_Targets-2026-04-01_13.47.47-H12-short.pdf

Felix Schreyer added 9 commits March 4, 2026 09:33
…rgets coming from REMIND via fm_EmiTargetAbs instead of target factors (relative emissions targets).
…t target year it is set to. This affects whether in standard NDC runs carbon prices should also be limited in 2035. By default they are now not limited. But, a limitation mechanism can still be activated via a new switch
…ange and use this one for NDC realization by reading from the reference GDX instead of reading those emissions from the reporting via prepare NDC script
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR updates the 45_carbonprice/NDC realization to use absolute (country-summed) NDC emissions targets at the REMIND-region level, and refactors the BAU/NPI emissions input to come from a reference GDX (via a new internal GAMS emissions aggregate) instead of relying on externally prepared reporting inputs.

Changes:

  • Replace relative-to-2015 NDC target scaling with absolute NDC emissions targets (p45_EmiTargetAbs) in the regional target calculation.
  • Load BAU/NPI “GHG excl. LULUCF & excl. bunkers” emissions from input_ref using a new core variable/equation (vm_emiGHG_exclLULUCF_exclBunkers).
  • Add a new switch (cm_NDC_CO2PriceLimit_continuation) to optionally extend CO2 price limits beyond the target year with a growing cap and a minimum cap level.

Reviewed changes

Copilot reviewed 8 out of 8 changed files in this pull request and generated 7 comments.

Show a summary per file
File Description
modules/45_carbonprice/NDC/preloop.gms Switch regional NDC target computation to absolute emissions targets plus BAU share for non-target countries.
modules/45_carbonprice/NDC/datainput.gms Load absolute NDC targets and overwrite BAU emissions using values loaded from input_ref based on a new core emissions aggregate.
modules/45_carbonprice/NDC/postsolve.gms Add optional post-target-year continuation logic for CO2 price limits.
modules/45_carbonprice/NDC/input/files Update listed NDC input artifact from relative-factor to absolute-target file.
core/equations.gms Introduce equation computing total GHG excl. LULUCF and excl. bunkers for NDC use.
core/declarations.gms Declare the new variable and equation for the NDC-specific emissions aggregate.
main.gms Document and define the new continuation switch for NDC CO2 price limits.
config/default.cfg Bump default input data revision to 7.90.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Copy link
Copy Markdown
Contributor

@RahelMA RahelMA left a comment

Choose a reason for hiding this comment

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

Thank you, Felix this is a great and fundamental improvement of the NDC scenario! I only have minor comments ;)

( p45_CO2PriceLimitNDC(t,regi) * (1 + 0.2 * (t2.val - t.val)) ) * sm_DptCO2_2_TDpGtC );
$ifThen.cm_NDC_CO2PriceLimit_continuation not "%cm_NDC_CO2PriceLimit_continuation%" == "off"
*** For the periods after the carbon price limit:
*** If this switch is on, limit increase by 20%/yr, but allow for minimum carbon price of at least 200$/tCO2.
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.

Thats really nice. Thank you for this switch, I think it would be useful to have the percentage here variable.
(1 + 0.2 * (t2.val - t.val)) * sm_DptCO2_2_TDpGtC, maybe directly the input of the switch as a percentage and default to 0.2?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

In principle, I agree. Let's see if we really need it once we spot cases in which we want to limit 2035 carbon prices. So far, my impression was that generally we don't want to limit carbon prices after 2030.

***--------------------------------------------------
*' Total GHG emissions excl. land-use change and excl. bunker emissions (needed for NDC targets)
***--------------------------------------------------
q_emiGHG_exclLULUCF_exclBunkers(t,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.

Could you please explain why you add this variable? in the NDC calculation we don't use it and in the reporting it is already there?!

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

It is used for reading in the emissions trajectory of the NPI run here. This replaces reading data from pm_BAU_reg_emi_wo_LU_wo_bunkers.cs4r. I'd remove these data files and the infrastructure for them later.

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
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.

3 participants