Skip to content
Draft
Show file tree
Hide file tree
Changes from 19 commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
4551f87
Initial fuel cell model with psuedo code
May 20, 2026
9115bbe
Initial fuel cell model
May 27, 2026
9529cf6
fuel cell example - draft
Jun 4, 2026
040cf3b
Update example
Jun 4, 2026
7e2c693
updates
Jun 4, 2026
0352910
Remove print statements
Jun 5, 2026
f7e8b90
Merge in develop
Jun 5, 2026
6bb5751
add new model to hydrogen init file
Jun 5, 2026
bee8478
Updates to model
Jun 18, 2026
4bff858
Merge branch 'develop' into feature/add_new_fc
Jun 18, 2026
30205b3
Add more detailed FC cost model, update for passthrough controller
Jun 19, 2026
8b47b45
Update interpolation model and add NG FC model
Jun 24, 2026
e10050b
Update doc strings
Jun 24, 2026
fcb5c96
Remove print statements from slc
Jun 24, 2026
1aa8d93
Update naming to align with naming conventions
Jun 24, 2026
737fe35
remove leftover example input
Jun 24, 2026
f1ebbd4
Add documentation and changelog
Jun 29, 2026
0442a86
Add tests for PEM fuel cell
Jun 29, 2026
63ac542
Add SONG tests and model updates
Jun 30, 2026
7e6d362
Update PEM regression tests
Jul 6, 2026
a1f97ea
Update h2integrate/converters/hydrogen/PEM_h2_fuel_cell.py
genevievestarke Jul 7, 2026
af7944a
Add PEM FC updates from other branch
Jul 10, 2026
59001b2
Update SO NG FC
Jul 10, 2026
b203840
Update with heating calculation
Aug 20, 2026
5d5771f
Add rated outputs
Aug 20, 2026
bed29d4
Update tests and fix natural gas units conversion
Aug 21, 2026
95b188f
Merge in develop
Aug 21, 2026
b54aae7
Remove PEM-specific finance model
Aug 21, 2026
67003d5
Remove cost model from song fc
Aug 21, 2026
3fc9edf
Update docs pages with removing cost model
Aug 25, 2026
cdd845d
Update class and model overviews
Aug 25, 2026
9a8d377
Update docs fixes
Aug 26, 2026
be5efd0
Update changelog file
Aug 26, 2026
96d876c
Merge branch 'develop' into feature/add_new_fc
kbrunik Aug 27, 2026
ded6a36
Apply feedback from Elenya
Aug 27, 2026
6c29037
Merge branch 'develop' into feature/add_new_fc
johnjasa Aug 28, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
- Added dynamic operating constraints (turndown, ramping, warm/cold start delays) to `AmmoniaSynLoopPerformanceModel` and split `AmmoniaSynLoopCostModel` into its own module. [PR 770](https://github.com/NatLabRockies/H2Integrate/pull/770)
- Speed up the slowest tests in the suite by swapping the Floris wind model for `PYSAMWindPlantPerformanceModel` in examples 01 (`01_onshore_steel_mn`) and 02 (`02_texas_ammonia`), updating the affected `test_steel_example`/`test_simple_ammonia_example` expected values, fixing a pre-existing `cases.sql` cache-path bug and module-scoping the fixtures in `h2integrate/postprocess/test/test_sql_timeseries_to_csv.py` so the example only runs once for all four tests. [PR 782](https://github.com/NatLabRockies/H2Integrate/pull/782)
- Exposed `n_timesteps`, `dt`, `plant_life`, and `fraction_of_year_simulated` as attributes on `CostModelBaseClass` (matching `PerformanceModelBaseClass`) and updated all cost and performance model subclasses across `h2integrate/` to use these attributes instead of reading them from `plant_config`, removing redundant boilerplate from individual components. [PR 783](https://github.com/NatLabRockies/H2Integrate/pull/783)
- Added two new fuel cell models: `PEMH2FuelCellPerformanceModel` and `PEMH2FuelCellCostModel` to model a PEM hydrogen fuel cell and `SONGFuelCellPerformanceModel` and `SONGFuelCellCostModel` to model a natural gas solid oxide fuel cell [PR 794](https://github.com/NatLabRockies/H2Integrate/pull/794)

## 0.8 [April 15, 2026]

Expand Down
2 changes: 2 additions & 0 deletions docs/_toc.yml
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@ parts:
- file: technology_models/iron_dri.md
- file: technology_models/steel_eaf.md
- file: technology_models/steel_eaf_cmu.md
- file: technology_models/PEM_fuel_cell.md
- file: technology_models/SO_NG_fuel_cell.md
- caption: Storage Models
chapters:
- file: storage/storage_models_index.md
Expand Down
49 changes: 49 additions & 0 deletions docs/technology_models/PEM_h2_fuel_cell.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
# PEM Hydrogen Fuel Cell Model

The PEM hydrogen fuel cell performance model implemented in H2Integrate is an electrochemical model that simulates the conversion of hydrogen and oxygen into electricity and water. The model uses a polynomial fit of an I-V (current-voltage) curve to determine the operating point of each cell based on the input `electricity_set_point`, then computes `hydrogen_consumed`, `oxygen_consumed`, `water_out`, and `electricity_out` as the outputs of the system for each timestep.

The model is sized by `system_capacity_kw` and `n_stacks`. The number of cells per stack is calculated from the stack size, a fixed cell active area (400 cm²)([1](https://www.energy.gov/sites/prod/files/2018/02/f49/fcto_battelle_mfg_cost_analysis_1%20_to_25kw_pp_chp_fc_systems_jan2017_0.pdf)), and a maximum cell power density. Hydrogen and oxygen availability is checked against the demand at each timestep. If the available oxygen or hydrogen is insuffucient for the requested power, the operating current is reduced to match the lowest available feedstock. Electricity output is clipped to the system capacity.

There are no non-linear operational considerations in this model such as warm-up delays, degraded performance over operational life, voltage recalculation after current adjustment for limited feedstock supply, or thermal dynamics beyond a constant stack temperature input.

The PEM hydrogen fuel cell cost model is implemented to use cost values in dollars per kilowatt (or per kilowatt per year), decomposed into capital cost components for the stack, hydrogen supply, air supply, cooling, controls and instrumentation, electrical, assembly, and additional labor.

```{note}
The I-V curve is currently internally defined in the model and not adjustable.
```

## Performance Model

```{eval-rst}
.. autoclass:: h2integrate.converters.hydrogen.PEM_h2_fuel_cell.PEMH2FuelCellPerformanceConfig
:members:
:undoc-members:
:show-inheritance:
:no-index:
```

```{eval-rst}
.. autoclass:: h2integrate.converters.hydrogen.PEM_h2_fuel_cell.PEMH2FuelCellPerformanceModel
:members:
:undoc-members:
:show-inheritance:
:no-index:
```

## Cost Model

```{eval-rst}
.. autoclass:: h2integrate.converters.hydrogen.PEM_h2_fuel_cell.PEMH2FuelCellCostConfig
:members:
:undoc-members:
:show-inheritance:
:no-index:
```

```{eval-rst}
.. autoclass:: h2integrate.converters.hydrogen.PEM_h2_fuel_cell.PEMH2FuelCellCostModel
:members:
:undoc-members:
:show-inheritance:
:no-index:
```
49 changes: 49 additions & 0 deletions docs/technology_models/SO_NG_fuel_cell.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
# Solid Oxide Natural Gas Fuel Cell Model

The solid oxide natural gas (SO NG) fuel cell performance model implemented in H2Integrate is an electrochemical model that simulates the conversion of natural gas (assumed to be methane in the chemical reaction equations), steam, and oxygen into electricity, water, and carbon dioxide. The model uses a polynomial fit of an I-V (current-voltage) curve to determine the operating point of each cell based on the input `electricity_set_point`, then computes `natural_gas_consumed`, `oxygen_consumed`, `water_out`, `carbon_dioxide_out`, and `electricity_out` as the outputs of the system for each timestep.

The model is sized by `system_capacity_kw` and `n_stacks`. The number of cells per stack is calculated from the stack size, a fixed cell active area (400 cm²), and a maximum cell power density. Natural gas and oxygen consumption are computed from the cell current via Faraday's law assuming complete electrochemical oxidation of methane. The model uses the methane-reforming equation rather than a direct electrochemical methan-combusting reaction. This assumes that the methane is broken down in a steam-reforming process before the feedstock enteres the fuel cell ([1](https://www.sciencedirect.com/science/article/pii/S0360319906005726)). Electricity output is clipped to the system capacity.

There are no non-linear operational considerations in this model such as warm-up delays, degraded performance over operational life, or thermal dynamics beyond a constant stack temperature input.

The SO NG fuel cell cost model is implemented to use cost values in dollars per kilowatt (or per kilowatt per year), decomposed into capital cost components for the stack, fuel supply, air supply, cooling, controls and instrumentation, electrical, assembly, and additional labor.

```{note}
The I-V curve is currently internally defined in the model and not adjustable.
```

## Performance Model

```{eval-rst}
.. autoclass:: h2integrate.converters.natural_gas.SO_NG_fuel_cell.SONGFuelCellPerformanceConfig
:members:
:undoc-members:
:show-inheritance:
:no-index:
```

```{eval-rst}
.. autoclass:: h2integrate.converters.natural_gas.SO_NG_fuel_cell.SONGFuelCellPerformanceModel
:members:
:undoc-members:
:show-inheritance:
:no-index:
```

## Cost Model

```{eval-rst}
.. autoclass:: h2integrate.converters.natural_gas.SO_NG_fuel_cell.SONGFuelCellCostConfig
:members:
:undoc-members:
:show-inheritance:
:no-index:
```

```{eval-rst}
.. autoclass:: h2integrate.converters.natural_gas.SO_NG_fuel_cell.SONGFuelCellCostModel
:members:
:undoc-members:
:show-inheritance:
:no-index:
```
5 changes: 5 additions & 0 deletions examples/37_pem_fc/37_pem_fc.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
name: H2Integrate_config
system_summary: This reference contains a hydrogen fuel cell meeting an electricity demand
driver_config: driver_config.yaml
technology_config: tech_config.yaml
plant_config: plant_config.yaml
4 changes: 4 additions & 0 deletions examples/37_pem_fc/driver_config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
name: driver_config
description: This analysis runs a hybrid plant to match the first example in H2Integrate
general:
folder_output: outputs
60 changes: 60 additions & 0 deletions examples/37_pem_fc/plant_config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
name: plant_config
description: This plant is located in MN, USA...
sites:
site:
latitude: 32.31714
longitude: -100.18
# array of arrays containing left-to-right technology
# interconnections; can support bidirectional connections
# with the reverse definition.
# this will naturally grow as we mature the interconnected tech
technology_interconnections:
# connect feedstocks to fuel cell
- [h2_feedstock, PEM_fuel_cell, hydrogen, pipe]
- [o2_feedstock, PEM_fuel_cell, oxygen, pipe]
# connect fuel cell to demand component
- [PEM_fuel_cell, electricity_load_demand, electricity, cable]
plant:
plant_life: 2
finance_parameters:
finance_groups:
finance_model: ProFastLCO
model_inputs:
params:
analysis_start_year: 2032
installation_time: 36 # months
inflation_rate: 0.0 # 0 for real analysis
discount_rate: 0.06 # nominal return based on 2024 ATB baseline workbook for land-based wind
debt_equity_ratio: 0.724 # 2024 ATB uses 72.4% debt for land-based wind
property_tax_and_insurance: 0.025 # percent of CAPEX estimated based on https://www.nlr.gov/docs/fy25osti/91775.pdf https://www.house.mn.gov/hrd/issinfo/clsrates.aspx
total_income_tax_rate: 0.2574 # 0.257 tax rate in 2024 atb baseline workbook, value here is based on federal (21%) and state in MN (9.8)
capital_gains_tax_rate: 0.15 # H2FAST default
sales_tax_rate: 0.0 # average combined state and local sales tax https://taxfoundation.org/location/texas/
debt_interest_rate: 0.07 # based on 2024 ATB nominal interest rate for land-based wind
debt_type: Revolving debt # can be "Revolving debt" or "One time loan". Revolving debt is H2FAST default and leads to much lower LCOH
loan_period_if_used: 0 # H2FAST default, not used for revolving debt
cash_onhand_months: 1 # H2FAST default
admin_expense: 0.00 # percent of sales H2FAST default
capital_items:
depr_type: MACRS # can be "MACRS" or "Straight line"
depr_period: 7 # 5 years - for clean energy facilities as specified by the IRS MACRS schedule https://www.irs.gov/publications/p946#en_US_2020_publink1000107507
refurb: [0.]
cost_adjustment_parameters:
cost_year_adjustment_inflation: 0.025 # used to adjust modeled costs to target_dollar_year
target_dollar_year: 2022
finance_subgroups:
h2:
commodity: hydrogen
commodity_stream: h2_feedstock
technologies: [h2_feedstock]
o2:
commodity: oxygen
commodity_stream: o2_feedstock
technologies: [o2_feedstock]
electricity:
commodity: electricity
commodity_stream: PEM_fuel_cell
technologies:
- PEM_fuel_cell
- h2_feedstock
- o2_feedstock
18 changes: 18 additions & 0 deletions examples/37_pem_fc/run_pem_fuel_cell.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import numpy as np

from h2integrate import H2IntegrateModel


# Create a H2Integrate model
model = H2IntegrateModel("37_pem_fc.yaml")

# Setup the model
model.setup()

# Set fuel cell demand profile
demand_profile = np.ones(8760) * 1000
model.prob.set_val("PEM_fuel_cell.electricity_set_point", demand_profile, units="kW")

# Run model
model.run()
model.post_process()
65 changes: 65 additions & 0 deletions examples/37_pem_fc/tech_config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
name: technology_config
description: This hybrid plant produces ammonia
technologies:
PEM_fuel_cell:
performance_model:
model: PEMH2FuelCellPerformanceModel
cost_model:
model: PEMH2FuelCellCostModel
model_inputs:
shared_parameters:
system_capacity_kw: 1500
performance_parameters:
n_stacks: 60
stack_temperature_K: 278 # Not used yet
cost_parameters:
capex_stack_per_kw: 800
capex_hydrogen_supply_per_kw: 140.67
capex_air_supply_per_kw: 138.79
capex_cooling_per_kw: 64.14
capex_controls_instrumentation_per_kw: 106.52
capex_electrical_per_kw: 447.83
capex_assembly_per_kw: 63.51
capex_additional_labor_per_kw: 137.96
fixed_opex_per_kw_per_year: 31
cost_year: 2026
electricity_load_demand:
performance_model:
model: GenericDemandComponent
model_inputs:
performance_parameters:
commodity: electricity
commodity_rate_units: kW
demand_profile: 1000
h2_feedstock:
performance_model:
model: FeedstockPerformanceModel
cost_model:
model: FeedstockCostModel
model_inputs:
shared_parameters:
commodity: hydrogen
commodity_rate_units: kg/h
performance_parameters:
rated_capacity: 50.0 # kg/h of hydrogen
cost_parameters:
cost_year: 2022
price: 5.0
annual_cost: 0.
start_up_cost: 0.0
o2_feedstock:
performance_model:
model: FeedstockPerformanceModel
cost_model:
model: FeedstockCostModel
model_inputs:
shared_parameters:
commodity: oxygen
commodity_rate_units: kg/h
performance_parameters:
rated_capacity: 400.0 # kg/h of oxygen
cost_parameters:
cost_year: 2022
price: 0.5 # $5/kg of oxygen. price is extremely variable
annual_cost: 0.
start_up_cost: 0.0
5 changes: 5 additions & 0 deletions examples/38_song_fc/38_song_fc.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
name: H2Integrate_config
system_summary: This reference contains a hydrogen fuel cell meeting an electricity demand
driver_config: driver_config.yaml
technology_config: tech_config.yaml
plant_config: plant_config.yaml
4 changes: 4 additions & 0 deletions examples/38_song_fc/driver_config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
name: driver_config
description: This analysis runs a hybrid plant to match the first example in H2Integrate
general:
folder_output: outputs
60 changes: 60 additions & 0 deletions examples/38_song_fc/plant_config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
name: plant_config
description: This plant is located in MN, USA...
sites:
site:
latitude: 32.31714
longitude: -100.18
# array of arrays containing left-to-right technology
# interconnections; can support bidirectional connections
# with the reverse definition.
# this will naturally grow as we mature the interconnected tech
technology_interconnections:
# connect feedstocks to fuel cell
- [ng_feedstock, SONG_fuel_cell, natural_gas, pipe]
- [o2_feedstock, SONG_fuel_cell, oxygen, pipe]
# connect fuel cell to demand component
- [SONG_fuel_cell, electricity_load_demand, electricity, cable]
plant:
plant_life: 2
finance_parameters:
finance_groups:
finance_model: ProFastLCO
model_inputs:
params:
analysis_start_year: 2032
installation_time: 36 # months
inflation_rate: 0.0 # 0 for real analysis
discount_rate: 0.06 # nominal return based on 2024 ATB baseline workbook for land-based wind
debt_equity_ratio: 0.724 # 2024 ATB uses 72.4% debt for land-based wind
property_tax_and_insurance: 0.025 # percent of CAPEX estimated based on https://www.nlr.gov/docs/fy25osti/91775.pdf https://www.house.mn.gov/hrd/issinfo/clsrates.aspx
total_income_tax_rate: 0.2574 # 0.257 tax rate in 2024 atb baseline workbook, value here is based on federal (21%) and state in MN (9.8)
capital_gains_tax_rate: 0.15 # H2FAST default
sales_tax_rate: 0.0 # average combined state and local sales tax https://taxfoundation.org/location/texas/
debt_interest_rate: 0.07 # based on 2024 ATB nominal interest rate for land-based wind
debt_type: Revolving debt # can be "Revolving debt" or "One time loan". Revolving debt is H2FAST default and leads to much lower LCOH
loan_period_if_used: 0 # H2FAST default, not used for revolving debt
cash_onhand_months: 1 # H2FAST default
admin_expense: 0.00 # percent of sales H2FAST default
capital_items:
depr_type: MACRS # can be "MACRS" or "Straight line"
depr_period: 7 # 5 years - for clean energy facilities as specified by the IRS MACRS schedule https://www.irs.gov/publications/p946#en_US_2020_publink1000107507
refurb: [0.]
cost_adjustment_parameters:
cost_year_adjustment_inflation: 0.025 # used to adjust modeled costs to target_dollar_year
target_dollar_year: 2022
finance_subgroups:
# h2:
# commodity: hydrogen
# commodity_stream: h2_feedstock
# technologies: [h2_feedstock]
# o2:
# commodity: oxygen
# commodity_stream: o2_feedstock
# technologies: [o2_feedstock]
electricity:
commodity: electricity
commodity_stream: SONG_fuel_cell
technologies:
- SONG_fuel_cell
- ng_feedstock
- o2_feedstock
18 changes: 18 additions & 0 deletions examples/38_song_fc/run_song_fuel_cell.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import numpy as np

from h2integrate import H2IntegrateModel


# Create a H2Integrate model
model = H2IntegrateModel("38_song_fc.yaml")

# Setup the model
model.setup()

# Set fuel cell demand profile
demand_profile = np.ones(8760) * 1000
model.prob.set_val("SONG_fuel_cell.electricity_set_point", demand_profile, units="kW")

# Run model
model.run()
model.post_process()
Loading