Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
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