Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
e52314a
added in-progress refactored iron winning models
elenya-grant Dec 10, 2025
4d86b83
updated natural gas dri performance model
elenya-grant Dec 10, 2025
5f82e24
updated docs in ng iron performance model
elenya-grant Dec 11, 2025
6d2320c
Merge remote-tracking branch 'upstream/develop' into HEAD
kbrunik Dec 11, 2025
08cbefe
updated iron cost model
elenya-grant Dec 11, 2025
ac33479
Merge branch 'iron/winning' of github.com:elenya-grant/GreenHEART int…
elenya-grant Dec 11, 2025
a18e9b0
updated coefficient paths for rosner iron plant models
elenya-grant Dec 11, 2025
d648213
updated example 21 and fixed bugs that were found
elenya-grant Dec 11, 2025
b37e190
minor updates to dri cost and perf models
elenya-grant Dec 11, 2025
c2971d2
added basic tests for new dri models
elenya-grant Dec 11, 2025
e35b17b
removed notes from rosner dri test
elenya-grant Dec 11, 2025
c21a777
double checked water costs and unit conversions and cleaned up some s…
elenya-grant Dec 11, 2025
b46fb20
Merge branch 'develop' into iron/winning
johnjasa Dec 16, 2025
a22e7c9
Merge branch 'develop' into iron/winning
kbrunik Dec 23, 2025
ca55caa
renamed ng iron reduction models and configs
elenya-grant Dec 23, 2025
6a4b6de
renamed ng iron dri files
elenya-grant Dec 23, 2025
25250ed
updated iron example tech config
elenya-grant Dec 23, 2025
f03ac12
added h2 dri cost and performance models
elenya-grant Dec 23, 2025
ad3f14b
added h2 dri models to supported models
elenya-grant Dec 23, 2025
9444137
Merge branch 'develop' into iron/winning
kbrunik Dec 24, 2025
a33bffc
update test values for wombat version bump
kbrunik Dec 24, 2025
59ed5e0
update unit test
kbrunik Dec 24, 2025
d7b7310
Merge branch 'wombat-update' into HEAD
kbrunik Dec 24, 2025
d356c23
update docstrings
kbrunik Dec 24, 2025
868603a
update feedstocks to be per ton pig iron
kbrunik Dec 24, 2025
e30973b
merged supported models
elenya-grant Dec 29, 2025
76949ec
refactored DRI performance and cost models to share baseclass
elenya-grant Dec 29, 2025
ebd56ae
updated electricity to not double count
elenya-grant Dec 29, 2025
7e33bdf
added test for performance with limited feedstock availability
elenya-grant Dec 29, 2025
5410238
eaf wip
kbrunik Dec 29, 2025
51c0188
Merge branch 'iron/winning' of https://github.com/elenya-grant/GreenH…
kbrunik Dec 29, 2025
14e918b
steel tests wip
kbrunik Dec 29, 2025
e8aca50
undo align
kbrunik Dec 29, 2025
5b2050a
minor update on handling negative exponents in steel eaf cost model
elenya-grant Dec 29, 2025
1383f2b
added carbon and lime to pipe
elenya-grant Dec 29, 2025
991a716
update rosner eaf test
kbrunik Dec 29, 2025
0baf6d7
draft update to iron example
elenya-grant Dec 29, 2025
e59dd59
Merge branch 'iron/winning' of github.com:elenya-grant/GreenHEART int…
elenya-grant Dec 29, 2025
343708d
updated iron example to include steel eaf
elenya-grant Dec 30, 2025
ba7692f
updated doc page and changelog
elenya-grant Dec 30, 2025
cf04d4a
added small test for example 21
elenya-grant Dec 30, 2025
d8af3b1
Merge branch 'develop' into iron/winning
kbrunik Dec 30, 2025
d0fbd6a
Fix run_iron.py to actually compare old and new
jmartin4u Dec 30, 2025
cf0a839
Comparing old and new models
jmartin4u Dec 30, 2025
442c5e7
Merge branch 'develop' of https://github.com/NREL/H2Integrate into ir…
jmartin4u Jan 2, 2026
755435c
Old and new models matched up
jmartin4u Jan 2, 2026
059c2ea
Cleaning up PR
jmartin4u Jan 24, 2026
be93312
Merge commit '1750b36ec077ebaf08c2665ed91c29d4ef359b96' into iron_min…
jmartin4u Jan 24, 2026
d4b726c
Merge remote-tracking branch 'upstream/develop' into iron_mine_plant_…
jmartin4u Jan 27, 2026
0fd1485
Less goofy plant config and other cleanup
jmartin4u Jan 27, 2026
03a4ba7
Going back to old coefficients with electricity in processing cost
jmartin4u Jan 27, 2026
8432393
Fixed tests, need to document
jmartin4u Jan 27, 2026
5d6f52c
Merge remote-tracking branch 'upstream/develop' into iron_mine_plant_…
jmartin4u Jan 28, 2026
7f63887
updated example 21 so iron_ore_consumed is used for transport cost
elenya-grant Jan 29, 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 docs/_toc.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ parts:
- file: technology_models/geologic_hydrogen.md
- file: technology_models/grid
- file: technology_models/hydrogen_storage.md
- file: technology_models/iron_ewin.md

- caption: Resource Models
chapters:
Expand Down
34 changes: 34 additions & 0 deletions docs/technology_models/iron_mine.md
Copy link
Collaborator

Choose a reason for hiding this comment

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

thanks for adding this doc page! It looks great!

Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# Iron mine model

H2I contains an iron mine model that simulates the extraction of crude ore and its processing into iron ore pellets.
The main input feedstock is `crude_ore`, i.e. the unprocessed ore in the earth containing iron oxide.
The output commodity is `iron_ore` in the form of pellets that can be shipped to other plants for further processing (`iron_plant` for instance).

This model was developed in conjunction with the University of Minnesota's Natural Resource Research Institute (NRRI).
NRRI compiled cost and production data from 5 existing mines and provided expertise for analysis at NLR to determine the energy input and cost trends across these mines.
Four of the mines (Northshore, United, Hibbing, and Minorca) are located in Minnesota, while one (Tilden) is located in Michigan.

There are two potential grades of ore produced from an iron mine in this model:
- Standard or Blast Furnace (BF) grade pellets (62-65% Fe)
- Direct Reduction (DR) grade pellets (>67% Fe)

It was determined that 3 of these mines (Northshore, United, and Hibbing) had crude reserves sufficient to produce DR-grade pellets, although only one (Northshore) reported production data on DR-grade pellets, with the rest reporting their data strictly on standard ore pellets.
The increases in cost and energy usage reported at the Northshore mine were used to project the potential performance and cost of DR-grade production at United and Hibbing.
The results of this analysis are compiled in the directory `h2integreate/converters/iron/martin_ore/`.
Performance data are included in `perf_inputs.csv`, with cost data in `cost_inputs.csv`.

These data were compiled from two sources:
- The EPA's "Taconite Iron Ore NESHAP Economic Impact Analysis" by [Heller et al.](https://www.epa.gov/sites/default/files/2020-07/documents/taconite_eia_neshap_final_08-2003.pdf) - Capex estimates
- This document esitmated the total percentage of cost spent throughout the entire industry on capital as a percentage of total production costs - 5.4%. This percentage is applied to the total annual production costs of each plant to find the estimated Capex.
- Cleveland-Cliffs Inc.'s Technical Report Summaries for individual mines - Opex and performance data
- [Northshore Mine](https://minedocs.com/22/Northshore-TR-12312021.pdf)
- [United Mine](https://minedocs.com/22/United-Taconite-TR-12312021.pdf)
- [Hibbing Mine](https://minedocs.com/22/Hibbing-Taconite-TR-12312021.pdf)
- [Minorca Mine](https://minedocs.com/22/Minorca-TR-12312021.pdf)
- [Tilden Mine](https://minedocs.com/22/Tilden-TR-12312021.pdf)

To use this model, specify `"iron_mine_performance_martin"` as the performance model and `"iron_mine_cost_martin"` as the cost model.
Currently, no complex calculations occur beyond importing performance and costs.
In the performance model, the "wet long tons" (wlt) that ore production is typically reported in are converted to dry metric tons for use in H2I.
In the cost model, the total capex costs for a plant are scaled by the amount of are produced annualy.
Besides these calculations, previously-calculated performance and cost metrics are simply loaded from the input spreadsheets.
2 changes: 1 addition & 1 deletion examples/21_iron_mn_to_il/21_iron.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name: "H2Integrate_config"

system_summary: "This reference hybrid plant is located in Minnesota and contains wind, solar, and battery storage technologies. The system is designed to produce hydrogen using an electrolyzer and also produce steel using a grid-connected plant."
system_summary: "An iron mine producing ore pellets and a separately-located iron plant performing direct reduction."

driver_config: "driver_config.yaml"
technology_config: "tech_config.yaml"
Expand Down
7 changes: 0 additions & 7 deletions examples/21_iron_mn_to_il/21_iron_old.yaml
Copy link
Collaborator

Choose a reason for hiding this comment

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

thanks for removing the old files!

This file was deleted.

2 changes: 1 addition & 1 deletion examples/21_iron_mn_to_il/driver_config.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
name: "driver_config"
description: "This analysis runs a hybrid plant to match the first example in H2Integrate"
description: "Simply setting up an outputs folder, nothing fancy"

general:
folder_output: outputs
31 changes: 14 additions & 17 deletions examples/21_iron_mn_to_il/plant_config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -6,21 +6,22 @@ sites:
latitude: 41.717
longitude: -88.398

# 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 iron mine
["grid_feedstock","iron_mine","electricity","cable"],
["mine_feedstock","iron_mine","crude_ore","pipe"],
# connect feedstocks to iron plant
["iron_mine","iron_plant","iron_ore","iron_transport"],
# Connect feedstocks to iron mine.
["mine_electricity_feedstock","iron_mine","electricity","cable"],
["mine_crude_ore_feedstock","iron_mine","crude_ore","pipe"],
# Connect iron_ore price and processed_ore_feedstock to iron_transport
# Connect the LCOI of iron ore to the price of a feedstock component representing the ore to be used in DRI
["finance_subgroup_iron_ore","processed_ore_feedstock",["price_iron_ore","price"]],
# Connect the ore feedstock available to the iron plant
["processed_ore_feedstock","iron_plant","iron_ore","pipe"],
Copy link
Collaborator

Choose a reason for hiding this comment

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

I replaced iron_transport here with a pipe so that the iron_transport model is not input the total iron ore available

["dri_grid_feedstock","iron_plant","electricity","cable"],
["catalyst_feedstock","iron_plant","reformer_catalyst","pipe"],
["water_feedstock","iron_plant","water","pipe"],
["natural_gas_feedstock","iron_plant","natural_gas","pipe"],
# connect feedstocks to steel plant
# Use the iron ore consumed by the iron plant to calculate transport costs
["iron_plant","iron_transport", ["iron_ore_consumed","iron_ore_in"]],
Copy link
Collaborator

Choose a reason for hiding this comment

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

@jmartin4u - this is where I'm connecting the iron ore consumed to the iron transport model

# Connect feedstocks to steel plant
["eaf_grid_feedstock","steel_plant","electricity","cable"],
["eaf_water_feedstock","steel_plant","water","pipe"],
["eaf_natural_gas_feedstock","steel_plant","natural_gas","pipe"],
Expand Down Expand Up @@ -63,14 +64,12 @@ finance_parameters:
iron_ore:
commodity: "iron_ore"
commodity_stream: "iron_mine"
technologies: ["iron_mine", "grid_feedstock", "mine_feedstock"]
technologies: ["iron_mine", "mine_electricity_feedstock", "mine_crude_ore_feedstock"]
pig_iron:
commodity: "pig_iron"
commodity_stream: "iron_plant"
technologies:
- "iron_mine"
- "grid_feedstock"
- "mine_feedstock"
- "processed_ore_feedstock"
- "iron_transport"
- "iron_plant"
- "dri_grid_feedstock"
Expand All @@ -81,9 +80,7 @@ finance_parameters:
commodity: "steel"
commodity_stream: "steel_plant"
technologies:
- "iron_mine"
- "grid_feedstock"
- "mine_feedstock"
- "processed_ore_feedstock"
- "iron_transport"
- "iron_plant"
- "dri_grid_feedstock"
Expand Down
55 changes: 0 additions & 55 deletions examples/21_iron_mn_to_il/plant_config_old.yaml

This file was deleted.

94 changes: 78 additions & 16 deletions examples/21_iron_mn_to_il/run_iron.py
Original file line number Diff line number Diff line change
@@ -1,37 +1,99 @@
from pathlib import Path

import numpy as np
import pandas as pd

from h2integrate.tools.run_cases import modify_tech_config, load_tech_config_cases
from h2integrate.core.h2integrate_model import H2IntegrateModel


# Create H2Integrate models - comparing old and new
# Create H2Integrate model
model = H2IntegrateModel("21_iron.yaml")
model_old = H2IntegrateModel("21_iron_old.yaml")

# Load cases
case_file = Path("test_inputs.csv")
cases = load_tech_config_cases(case_file)

# Modify and run the model for different cases
casenames = [
"Case 1",
"Case 2",
"Case 3",
"Case 4",
"Standard Iron - Hibbing",
"Standard Iron - Northshore",
"DR Grade Iron - Northshore",
"DR Grade Iron - Northshore (adjusted)",
]
lcois = []
lcois_old = []

lcois_ore = []
capexes_ore = []
fopexes_ore = []
vopexes_ore = []
lcois_iron = []
capexes_iron = []
fopexes_iron = []
vopexes_iron = []
lcois_steel = []
capexes_steel = []
fopexes_steel = []
vopexes_steel = []


for casename in casenames:
model = modify_tech_config(model, cases[casename])
model_old = modify_tech_config(model_old, cases[casename])
model.run()
model_old.run()
model.post_process()
model_old.post_process()
lcois.append(float(model.model.get_val("finance_subgroup_pig_iron.price_pig_iron")[0]))
lcois_old.append(float(model_old.model.get_val("finance_subgroup_pig_iron.price_pig_iron")[0]))
lcois_ore.append(float(model.model.get_val("finance_subgroup_iron_ore.price_iron_ore")[0]))
capexes_ore.append(
float(model.model.get_val("finance_subgroup_iron_ore.total_capex_adjusted")[0])
)
fopexes_ore.append(
float(model.model.get_val("finance_subgroup_iron_ore.total_opex_adjusted")[0])
)
vopexes_ore.append(
float(model.model.get_val("finance_subgroup_iron_ore.total_varopex_adjusted")[0])
)
lcois_iron.append(float(model.model.get_val("finance_subgroup_pig_iron.price_pig_iron")[0]))
capexes_iron.append(
float(model.model.get_val("finance_subgroup_pig_iron.total_capex_adjusted")[0])
)
fopexes_iron.append(
float(model.model.get_val("finance_subgroup_pig_iron.total_opex_adjusted")[0])
)
vopexes_iron.append(
float(model.model.get_val("finance_subgroup_pig_iron.total_varopex_adjusted")[0])
)
lcois_steel.append(float(model.model.get_val("finance_subgroup_steel.price_steel")[0]))
capexes_steel.append(
float(model.model.get_val("finance_subgroup_steel.total_capex_adjusted")[0])
)
fopexes_steel.append(
float(model.model.get_val("finance_subgroup_steel.total_opex_adjusted")[0])
)
vopexes_steel.append(
float(model.model.get_val("finance_subgroup_steel.total_varopex_adjusted")[0])
)

# Compare the LCOIs from iron_wrapper and modular iron
print(lcois)
print(lcois_old)
# Compare the Capex, Fixed Opex, and Variable Opex across the 4 cases
columns = [
"Levelized Cost\n[USD/kg]",
"Capex\n[USD]",
"Fixed Opex\n[USD/year]",
"Variable Opex\n[USD/year]",
]
df_ore = pd.DataFrame(
np.transpose(np.vstack([lcois_ore, capexes_ore, fopexes_ore, vopexes_ore])),
index=casenames,
columns=columns,
)
print(df_ore)
df_iron = pd.DataFrame(
np.transpose(np.vstack([lcois_iron, capexes_iron, fopexes_iron, vopexes_iron])),
index=casenames,
columns=columns,
)
print(df_iron)
df_steel = pd.DataFrame(
np.transpose(np.vstack([lcois_steel, capexes_steel, fopexes_steel, vopexes_steel])),
index=casenames,
columns=columns,
)
df_steel = df_steel.iloc[2:]
print(df_steel)
37 changes: 29 additions & 8 deletions examples/21_iron_mn_to_il/tech_config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: "technology_config"
description: "This hybrid plant produces iron"

technologies:
grid_feedstock: #electricity feedstock for iron ore
mine_electricity_feedstock: #electricity feedstock for iron ore
performance_model:
model: "feedstock_performance"
cost_model:
Expand All @@ -12,14 +12,14 @@ technologies:
feedstock_type: "electricity"
units: "MW"
performance_parameters:
rated_capacity: 30. # MW, need 27.913 MW per timestep for iron ore
rated_capacity: 70. # MW, need 27.913 MW per timestep for iron ore
cost_parameters:
cost_year: 2022
price: 58.02 #USD/MW
price: 0. # Electricity costs are already priced in to current mine model
annual_cost: 0.
start_up_cost: 0.

mine_feedstock: #iron ore feedstock
mine_crude_ore_feedstock: #iron ore feedstock
performance_model:
model: "feedstock_performance"
cost_model:
Expand All @@ -29,10 +29,10 @@ technologies:
feedstock_type: "crude_ore"
units: "t/h"
performance_parameters:
rated_capacity: 2000. # need 828.50385048 t/h
rated_capacity: 2500. # need 828.50385048 t/h
cost_parameters:
cost_year: 2022
price: 0.0
price: 0. #USD/t
annual_cost: 0.
start_up_cost: 0.

Expand All @@ -45,7 +45,25 @@ technologies:
shared_parameters:
mine: "Northshore"
taconite_pellet_type: "drg"
max_ore_production_rate_tonnes_per_hr: 221.2592636 #516.0497610311598
max_ore_production_rate_tonnes_per_hr: 500


processed_ore_feedstock: #iron ore feedstock
performance_model:
model: "feedstock_performance"
cost_model:
model: "feedstock_cost"
model_inputs:
shared_parameters:
feedstock_type: "iron_ore"
units: "t/h"
performance_parameters:
rated_capacity: 250. # need 828.50385048 t/h
cost_parameters:
cost_year: 2022
price: 0.0
annual_cost: 0.
start_up_cost: 0.

iron_transport:
performance_model:
Expand Down Expand Up @@ -90,7 +108,7 @@ technologies:
rated_capacity: 40000. # need 38710.49649 galUS/h
cost_parameters:
cost_year: 2022
price: 0.0016700004398318847 # cost is USD0.441167535/t, converted to USD/gal
price: 0.0016700004398318847 # cost is USD 0.441167535/t, converted to USD/gal
annual_cost: 0.
start_up_cost: 0.

Expand Down Expand Up @@ -142,6 +160,7 @@ technologies:
skilled_labor_cost: 40.85 #2022 USD/hr
unskilled_labor_cost: 30.0 #2022 USD/hr


eaf_grid_feedstock: #electricity feedstock for EAF
performance_model:
model: "feedstock_performance"
Expand Down Expand Up @@ -185,6 +204,8 @@ technologies:
shared_parameters:
feedstock_type: "natural_gas"
units: "MMBtu"
feedstock_type: "natural_gas"
units: "MMBtu"
performance_parameters:
rated_capacity: 280. # need 276.5242929731515 MMBtu at each timestep
cost_parameters:
Expand Down
Loading