Skip to content

Derate thermal capacity reserve margin contribution with FOR#85

Open
clairehalloran wants to merge 13 commits into
mainfrom
ch/firm-derate
Open

Derate thermal capacity reserve margin contribution with FOR#85
clairehalloran wants to merge 13 commits into
mainfrom
ch/firm-derate

Conversation

@clairehalloran
Copy link
Copy Markdown
Collaborator

@clairehalloran clairehalloran commented May 8, 2026

Summary

This PR derates the contribution of thermal capacity to the reserve margin based on technology-specific mean forced outage rates (FORs) during the top net peak load hours during each ccseason. This change only applies when the capacity credit resource adequacy method is used, i.e. GSw_PRM_CapCredit=1. This update does not change capacity credit for VRE, hydro, or storage.

Technical details

Implementation notes

For each thermal technology, the mean FOR during the top net peak load hours is calculated for each ccseason in resource_adequacy/capacity_credit.py based on the same hourly FORs used in PRAS. The mean FOR for each technology is written to the handoff_{t}.gdx file for each year that resource adequacy calculations are run. The capacity of thermal generation is multiplied by (1 - FOR) in eq_reserve_margin.

Additional changes

  • Added ValueError in runreeds.py to disallow GSw_PRM_UpdateMethod=0,GSw_PRM_CapCredit=1, and GSw_PRM_StressIterateMax>0, which iterates to reach an NEUE threshold without updating the PRM values between iterations.
  • In the Pacific_CC test case, updated GSw_PRM_UpdateMethod from the default of 0 to 1 to avoid raising this ValueError.

Validation, testing, and comparison report(s)

I ran the USA_fast test case with the following switches:

  • GSw_PRM_CapCredit=1
  • GSw_PRM_UpdateMethod=1
  • GSw_PRM_scenario=0.1
  • GSw_PRM_UpdateFraction=0.05
  • GSw_PRM_StressIterateMax=20

Derating thermal capacity increased total capacity in most years, especially gas-CT:
image

Derating thermal capacity leads to lower national NEUE values (3.3 ppm vs. 1.2 ppm in 2050):
image

Derating also led to lower PRM values except in PJM-East, which had a 80% PRM with derating in 2050:

PRM with derate:
image

PRM without derate:
image

This feature increased runtime by 4 hours due to increased capacity_credit.py runtime:
image

Full USA_fast_CC comparison here: results-main,derate.pptx

No change in capacity for USA_defaults:
image

Full USA_defaults comparison here: results-USA_defaults_main,USA_defaults_firm-FOR-derate.pptx

Checklist for author

Details to double-check

  • Charge code provided to reviewers
  • Included comparison reports for appropriate test cases
  • Documentation updated if necessary
  • Code formatting standardized
  • Reusable functions used where possible instead of copy/pasted code

General information to guide review

  • Zero impact on results of default case
  • No large data file(s) added/modified
  • No substantive impact on runtime for full-US reference case
  • No substantive impact on folder size for full-US reference case
  • No change to process flow (runbatch.py, d_solve_iterate.py)
  • No change to code organization
  • No change to package requirements (environment.yml or Project.toml)

Did you use LLM tools (chatbot or copilot) in the preparation of this PR? If so, describe how

Yes, as an alternative to looking up pandas documentation and for minor line completion.

@clairehalloran clairehalloran added enhancement New feature or request and removed docs labels May 8, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant