Skip to content

Add h2 fuel cell technology to ReEDS main - #111

Open
yijinli22 wants to merge 59 commits into
mainfrom
yl/fuel_cell_fy26
Open

Add h2 fuel cell technology to ReEDS main#111
yijinli22 wants to merge 59 commits into
mainfrom
yl/fuel_cell_fy26

Conversation

@yijinli22

@yijinli22 yijinli22 commented May 29, 2026

Copy link
Copy Markdown
Collaborator

Summary

Adds h2-fuel-cell (hydrogen-powered fuel cell) as a new technology option in ReEDS, complementing the existing ng-fuel-cell (natural gas fuel cell) already in the model. The H2 fuel cell consumes hydrogen (h2fuel, the same fuel as H2-CT/H2-CC), is gated by a new dedicated switch GSw_H2FuelCell, and offers three cost scenarios (conservative/moderate/advanced) based on Reznicek et al. (2026).

Technical details

Implementation notes

  • Separate on/off switches for the two fuel cells. The existing ng-fuel-cell switch GSw_FuelCell was renamed to GSw_GasFuelCell (and the GAMS set fuel_cell(i)ng_fuel_cell(i); the FUEL_CELL subset column → NG_FUEL_CELL in tech-subset-table.csv and i_subtech.csv) so its scope is unambiguously natural-gas-only. h2-fuel-cell is governed by the new GSw_H2FuelCell. The two fuel cells are fully independent — any on/off combination is valid.
  • New H2_GEN subset, decoupled from H2_COMBUSTION. h2-fuel-cell is added to a new H2_FUEL_CELL subset and to a new H2_GEN subset (= {H2-CT, H2-CC, h2-fuel-cell}). H2_COMBUSTION was narrowed to combustion only ({H2-CT, H2-CC}), so GSw_H2Combustion / GSw_H2Combustionupgrade now affect only the turbines. H2_GEN drives the hydrogen fuel/emissions/accounting (H2 supply-demand balance, fuel cost, leakage emissions, retirement eligibility, tg_i('h2') group, first-year, and reporting), so a fuel cell built with the turbines off still consumes and pays for hydrogen. h2-fuel-cell is also flagged GENTECH and RE, matching H2-CT/H2-CC.
  • GAMS gating (b_inputs.gms): adds h2_fuel_cell(i), h2_gen(i), and ng_fuel_cell(i) sets. Bans are now per-technology: Sw_GasFuelCell=0 bans ng-fuel-cell, Sw_H2FuelCell=0 bans h2-fuel-cell, Sw_H2Combustion=0 bans H2_COMBUSTION (turbines only).
  • Fuel & classification: h2-fuel-cell uses h2fuel (fuel2tech.csv), is added to i.csv and techs_default.csv (region type p).
  • Key parameters: unit size 100 MW; lifetime (max age) 40 years; financing/eval period 30 years (same as Gas-CT); construction time 3 years; min load 1%; heat rate 8.461 MMBtu/MWh; VOM 1.7054 $/MWh; FOM ~27 $/kW-yr (moderate, 2030); ramp 100%/min; 6% min CF; 5% forced & scheduled outage; 0 start cost; zero direct CO₂/SO₂. Capital cost and heat rate are from Reznicek et al. (2026); FOM/VOM from Exhibit 5-19 (Case B31A) of NETL Fossil Energy Baseline Rev 4a (Schmitt et al. 2022).
  • Per-technology h2-fuel-cell rows were added across the plant-characteristic and financial input files (emitrate, h2_leakage_rate, cost_opres_default/_market, minCF, mttr, outage_forced_static, outage_scheduled_static, ramprate, startcost, unitsize_atb, heat_rate_adj, heat_rate_penalty_spin, degradation_annual_default, years_until_endogenous, construction_times_default, financials_tech_ATB2023/_CRP20/ATB2024, reg_cap_cost_diff_default, nat_gen_tech_frac, ivt_default/_small/_step, futurefiles, runfiles).

Additional changes

  • postprocessing/tech_aggregation.csv, tech_map.csv, tech_style.csv updated for h2-fuel-cell display: mapped to H2-Fuel-Cell (color #87A21D) and aggregated with H2-CT/H2-CC. The aggregation label was renamed Hydrogen CombustionHydrogen Generation (in both tech_aggregation.csv and the matching tech_style.csv color key) so it accurately covers the fuel cell alongside the turbines.
  • GSw_MGA_SubObjective gained an h2_gen option (in addition to the existing h2_combustion).
  • cases_h2-fuelcell.csv added with 5 test scenarios: USA_defaults_fc_pr (runs without fc switch turning on), USA_defaults_fc_mid (moderate cost/deployment cost case), USA_defaults_fc_low (advanced/high deployment cost case), USA_defaults_fc_high (conservative/low deployment cost case), USA_defaults_fc_mid_w_ng_fc (moderate level + NG fuel cell switch turned on).
  • Documentation: new "Hydrogen fuel cells" subsection in docs/source/model_documentation.md, file entries in sources.md, and Reznicek 2026 + Schmitt (NETL) 2022 entries in references.bib.

Switches added/removed/changed

Switch Values Default Description
GSw_GasFuelCell 0, 1 0 Renamed from GSw_FuelCell — enables ng-fuel-cell (natural gas fuel cell) only
GSw_H2FuelCell 0, 1 0 New — enables h2-fuel-cell (independent of GSw_GasFuelCell and GSw_H2Combustion)
plantchar_h2fuelcell h2fuelcell_conservative, h2fuelcell_moderate, h2fuelcell_advanced h2fuelcell_moderate New — H2 fuel cell cost and performance scenario
GSw_H2Combustion 0, 1 1 Scope narrowed — now bans only H2-CT/H2-CC (fuel cell removed from H2_COMBUSTION)
GSw_MGA_SubObjective h2_combustion, h2_gen gentech Option addedh2_gen (H2-CT + H2-CC + fuel cell)

Relevant sources or documentation

  • Reznicek, E., Berres, A., Li, Y., et al., Cost Analysis of Heavy-Duty Vehicle Proton Exchange Membrane Fuel Cell Stationary Power Plants (2026), https://doi.org/10.2172/3018256 — unit size and performance parameters
Screenshot 2026-06-30 at 12 44 08 PM

Validation, testing, and comparison report(s)

Ran 1/7 cases under the main ReEDS branch and the remaining cases under cases_h2-fuelcell.csv to test the H2 fuel-cell scenarios (pr baseline, fc_low, fc_mid, fc_high) plus three sensitivities (fc_mid_ngfc, fc_mid_no_h2cc, fc_mid_no_h2combust), and compared capacity, location, and dispatch with compare_cases.py. The new h2-fuel-cell technology builds, is selected over H2-CT as costs decline, and dispatches as expected. (This run uses 3-year solve steps: 2029, 2032, 2035, 2038, 2041, 2044, 2047, 2050.)

Location & technology selection (2029, first build year)

The H2 capacity lands in CA_LA (461 MW) in every scenario; only fc_low adds a second, economic build of 127 MW in NM_W. The location is fixed and only the technology filling the CA_LA slot swaps between scenarios as the fuel-cell cost case improves:

Scenario CA_LA (461 MW) NM_W (economic add)
pr H2-CT
fc_low fuel cell fuel cell (127 MW)
fc_mid fuel cell
fc_mid_ngfc fuel cell
fc_mid_no_h2cc fuel cell
fc_high H2-CT

This CA_LA capacity is a prescribed build from inputs/capacity_exogenous/interconnection_queues.csv. It appears as a step in 2029, holds flat through 2038, then declines. The model fills that prescribed requirement with the cheapest available H2 technology — fuel cell in the cheaper cost cases (low/mid), H2-CT in pr (baseline) and high where the fuel cell is too expensive.

H2 fuel cell capacity build (MW)

Scenario 2029 2032 2035 2038 2041 2044 2047 2050
pr 0 0 0 0 0 0 0 0
low 588 588 588 588 279 233 233 63
mid 461 461 461 461 254 211 211 34
high 0 0 0 0 0 0 0 0

H2-CT capacity build (MW)

Scenario 2029 2032 2035 2038 2041 2044 2047 2050
pr 461 461 461 461 209 182 168 0
high 461 461 461 461 209 182 168 0
low / mid 0 0 0 0 0 0 0 0

Sensitivities: NG fuel cell and H2-CC

  • NG fuel cell does not build. fc_mid_ngfc is identical to fc_mid (fuel-cell capacity and generation match exactly across all years; only second-order solver noise elsewhere). Enabling NG fuel cells added zero capacity.
  • H2-CC does not build. fc_mid_no_h2cc is identical to fc_mid, so removing the H2-CC option changes nothing. There is no distinct h2-cc technology in the output (H2-CC would be gas-cc on hydrogen fuel), so a verified zero requires the fuel-consumption output.
  • fc_mid_no_h2combust (H2-CT and H2-CC both prohibited): H2-CT generation is 0 and the fuel-cell build is unchanged from fc_mid. Prohibiting all H2 combustion has no effect on the mid case because the fuel cell was already the selected H2 technology — H2 combustion only builds when the fuel cell is prohibited or too expensive (pr, high).

Dispatch / capacity factor

Annual CF is a flat 6.0% across every scenario and year. The 6% is the annual minimum CF requirement imposed in inputs/plant_characteristics/minCF.csv; peak hourly utilization reaches ~16% max in the gen_h.csv output. H2-CT and fuel cell dispatch identically (same CF, same hourly shape).

comparison reports

comparison with main

Screenshot 2026-07-30 at 1 36 02 AM Screenshot 2026-07-30 at 1 36 10 AM

Checklist for author

Details to double-check

  • References for all H2 fuel cell operational data (Reznicek et al. 2026, DOI 10.2172/3018256)
  • Charge code provided to reviewers
  • Included comparison reports for appropriate test cases
  • Documentation updated if necessary
  • If input data added/modified:
    • Dollar year recorded and converted to 2004$ for GAMS (dollaryear.csv updated for h2fuelcell_* scenarios, 2022$)
    • Units specified (MW capacity, $/kW capex, $/kW-yr FOM, $/MWh VOM, MMBtu/MWh heat rate)
    • No large data files — all inputs are small CSVs
  • No change to process flow (runreeds.py, solve.py)
  • No change to spatial/temporal resolution

General information to guide review

  • Zero impact on results of default case (GSw_H2FuelCell=0 by default — no change when switch is off)
  • No large data file(s) added/modified
  • No substantive impact on runtime
  • No change to process flow
  • No change to package requirements

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

Yes — Claude Code (Anthropic) assisted with documentation modification and writing this PR language.

Tag points of contact

@yijinli22

@yijinli22
yijinli22 requested a review from louisaserpe June 8, 2026 17:42
@yijinli22 yijinli22 self-assigned this Jun 8, 2026
Comment thread cases.csv

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.

Small comment: I'm not sure if I'm a representative sample, but at first glance I would expect GSw_FuelCell to control H2 fuel cells rather than methane fuel cells. The comment on GSw_FuelCell also doesn't reflect its operation; it says it controls both H2 and methane, but only controls methane.

To try to avoid confusion, my suggestion would be to rename GSw_FuelCell to GSw_GasFuelCell, in keeping with the other non-default gas techs (GSw_GasCC_H_1x1, GSw_GasCC_H_2x1, GSw_GasCT_Aero). Its functionality can stay the same, but the switch comment should be modified to remove the reference to H2.

Comment thread runreeds.py Outdated

if int(sw['GSw_H2FuelCell']) == 1 and int(sw['GSw_H2Combustion']) == 0:
raise ValueError(
'H2 fuel cells technology belong to the H2_COMBUSTION tech subset, so they are '

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.

Because fuel cells don't involve combustion, including H2 fuel cells in H2_COMBUSTION seems confusing to me. I would suggest keeping these separate. If you need a new category to refer to H2-CT, H2-CC, and H2-FuelCells together, I'd suggest adding a column to tech-subset-table.csv and calling it something like H2_GEN.

Relatedly, I think it'd be best to allow the user to turn on H2 fuel cells and turn off H2-CT/H2-CC if they want to. So if H2 fuel cells are removed from H2_COMBUSTION, you can remove this compatibility check.

Comment thread cases_h2fc.csv Outdated

@louisaserpe louisaserpe 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.

Can you update the PR text to mention the changes to the NG fuel cell switch?

Comment thread inputs/tech-subset-table.csv
Comment thread postprocessing/tech_aggregation.csv Outdated
Comment thread reeds/core/setup/b_inputs.gms Outdated
Comment thread inputs/sets/i_subtech.csv Outdated
@patrickbrown4

Copy link
Copy Markdown
Contributor

Can you add a comparison report against the main branch for the USA_defaults case?

@louisaserpe

Copy link
Copy Markdown

Let's add a link to the comparison report in the body of the PR: comparison with main

Comment thread docs/source/model_documentation.md Outdated
Comment thread docs/source/model_documentation.md Outdated
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.

4 participants