Skip to content

Cfe additionality testing - #38

Open
djwels wants to merge 22 commits into
mainfrom
cfe-additionality-testing
Open

djwels wants to merge 22 commits into
mainfrom
cfe-additionality-testing

Conversation

@djwels

@djwels djwels commented Feb 11, 2026

Copy link
Copy Markdown
Contributor

This pull request adds features and functionality to the existing cfe repo in two key areas identified as limitations/areas to develop after the 2025 CFE studies:

  1. Strict additionality constraints - whereby the C&I consumer could not sign PPAs directly with existing brownfield capacity but would instead have to import from the brownfield but with potentially high shares of fossil generation (i.e. clean and dirty molecules were mixed into a "grid score")

  2. Strict location constraints - whereby the C&I consumer could only procure clean electricity by building new capacity or by importing from its parent brownfield.

Multiple changes have been made in this PR with three overarching aims:

  1. Mitigate the limitations identified above from the 2025 CFE study design
  2. Ensure backwards compatibility to the original CFE study
  3. Provide inputs in a configurable/amendable format to give the user as much control as possible over key assumptions.

The main changes are summarised below.

Strict additionality constraints

  • Existing assets on brownfield can sign PPAs with greenfield C&I grid assuming they meet user-defined vintage criteria
  • PPAs from brownfield sent through a separate, new, link from the brownfield-C&I bus link

Strict location constraints

  • CFE bus can sign PPAs with any generator in any bus assigned by user
  • LCOE of candidate PPA plants has been calculated as a marginal cost of generation for the links between brownfield and C&I consumer

The following have been included as user configurable inputs:

  • Share of brownfield assets which can contribute to CFE (set at a generator level)
  • Buses which can sign PPAs with CFE bus (in non-neighbouring zones) - creates virtual links from brownfield of non-adjoining (i.e. non-parent ) nodes to CFE bus (with marginal cost set on that link = maximum generator LCOE)
  • Vintage limit (i.e. assets older than user defined input cannot contribute to CFE directly in PPAs)

Constraints and equations have been added/amended in the run_scenarios.py and CFE.py scripts to account for the changes made including:

  • Ensuring the total flow of brownfield PPAs into the C&I bus does not exceed the maximum user-defined "cfe_contribution" share of each generator
  • Adding the new additionality flows into the cfe energy balance equation and amending the "grid score" calculation to take into account some clean generation is now going directly into the C&I bus as CFE.

This PR has been tested extensively with the India stock model. Whilst the model is very close to that used in CFE, some minor changes were made between the publication of the India CFE study and picking up the stock model for testing in this repo. Therefore small variations are to be expected.

However, when checking for backwards compatibility to the original CFE study (checked by setting the new user-configurable "cfe_contribution" input parameter to zero ("Additionality_0" in images attached, i.e. no brownfield capacity can be directly contracted via PPAs by the C&I consumer), the results match very closely (see attached images).
image
image

djwels added 14 commits November 7, 2025 17:28
…p in configs so can be changed between model runs and countries
…d score (i.e. ratio of clean to total generators across all nodes) or define a specific sub-set (can be multiple or just one, as in recent cfe studies by TZ)
…racted and grid cfe score amended accordingly netting off this clean contracted ppa from brownfield
…nking C&I bus to multiple brownfields and additionality candidates
…ity to avoid confusion and implemented nested loop for additionality candidates
…nality supply given other nodes can contribute not through grid but directly via additionality links
…een non-neighbouring brownfield buses grid and C&I bus

@AggelosRag AggelosRag left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Hi Dan, I would like to ask some modeling related questions based on the code. You can find them in the comments. Thanks!

Comment thread src/cfe.py
Comment thread run/run_scenarios.py
Comment thread src/cfe.py
Comment thread run/run_scenarios.py
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