Skip to content
Open
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 @@ -4,6 +4,7 @@
- Enable `PySAMWindPlantPerformanceModel` to accept more than 300 turbines by overriding the default maximum in the PySAM model. [PR 831](https://github.com/NatLabRockies/H2Integrate/pull/831)
- Add `PySAMWavePerformanceModel` and `WaveResource` to wrap PySAM MhkWave as an H2I performance model, replacing the HOPP wave module in example 09. [PR 825](https://github.com/NatLabRockies/H2Integrate/pull/825)
- Replace HOPP with native H2I wind, solar, and battery models in example 11. Adds `percent_load_missed` and `curtailment_percent` outputs to `DemandComponentBase`, allows zero capacity in wind/solar/battery performance models. [PR 826](https://github.com/NatLabRockies/H2Integrate/pull/826)
- Add `NRRIIronMinePerformanceModel` and `NRRIIronMineCostModel`. [PR 840](https://github.com/NatLabRockies/H2Integrate/pull/840)

## 0.9 [August 10, 2026]

Expand Down
4 changes: 2 additions & 2 deletions docs/_static/class_hierarchy.html

Large diffs are not rendered by default.

35 changes: 32 additions & 3 deletions docs/technology_models/iron_mine.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
# Iron mine model

H2I contains an iron mine model that simulates the extraction of crude ore and its processing into iron ore pellets.
H2I contains 2 iron mine models that simulate the extraction of crude ore and its processing into iron ore pellets:
- `SimpleIronMine`: Models only the flow of `crude_ore` in and `iron_ore` out, with costs all lumped together
- `NRRIIronMine`: Models mass flows and electricity/fuel consumption at intermediate steps, with costs broken out

## SimpleIronMine
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 (e.g. `iron_plant`) for further processing.

Expand All @@ -14,7 +18,7 @@ There are two potential grades of ore produced from an iron mine in this model:

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 `h2integrate/converters/iron/martin_ore/`.
The results of this analysis are compiled in the directory `h2integrate/converters/iron/simple_ore/`.
Performance data are included in `perf_inputs.csv` with cost data in `cost_inputs.csv`.

These data were compiled from two sources:
Expand All @@ -27,8 +31,33 @@ These data were compiled from two sources:
- [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 `"MartinIronMinePerformanceComponent"` as the performance model and `"MartinIronMineCostComponent"` as the cost model.
To use this model, specify `"SimpleIronMinePerformanceComponent"` as the performance model and `"SimpleIronMineCostComponent"` 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 annually.
Besides these calculations, previously-calculated performance and cost metrics are simply loaded from the input spreadsheets.

## NRRIIronMine
The main inputs are `electricity` and `fuel`.
The output commodity is `iron_ore` in the form of pellets that can be shipped to other plants (e.g. `iron_plant`) for further processing.

This model was developed in conjunction with the [University of Minnesota's Natural Resource Research Institute (NRRI)](https://www.nrri.umn.edu/), led by Kimberly Anderson <kimander@d.umn.edu>

This model splits out the separate processes to produce iron ore pellets at a mine (mining, comminution, beneficiation, pelletization) and tracks the material flows.

Sources:
- [SEC S-K 1300 Tilden Mining Company](https://www.sec.gov/Archives/edgar/data/764065/000076406522000037/clf-2021123110xkex965.htm)
- [SEC S-K 1300 Hibbing Taconite](https://www.sec.gov/Archives/edgar/data/764065/000076406522000033/a20220211-8xkxex961.htm)
- [SEC S-K 1300 United Taconite](https://www.sec.gov/Archives/edgar/data/764065/000076406522000033/a20220211-8xkxex964.htm)
- [SEC S-K 1300 Minorca Mine](https://www.sec.gov/Archives/edgar/data/764065/000076406522000033/a20220211-8xkxex962.htm)
- [SEC S-K 1300 Northshore Mining Company](https://www.sec.gov/Archives/edgar/data/764065/000076406522000033/a20220211-8xkxex963.htm)
- [Tilden Estimated Electrical Costs](https://www.electricitylocal.com/states/michigan/marquette/)
- [Hibtac Estimate Electrical Costs](https://www.electricitylocal.com/states/minnesota/hibbing/)
- [Minora Estimated Electrical Costs](https://www.electricitylocal.com/states/minnesota/virginia/)
- [Northshore - Babbitt Electrical Costs](https://www.electricitylocal.com/states/minnesota/babbitt/)
- [Northshore - Silver Bay Electrical Costs](https://www.electricitylocal.com/states/minnesota/silver-bay/)

Estimated electrical breakdown data synthesized using Gemini and ChatGPT and verified using:
- Prediction of fuel consumption of mining dump trucks: A neural networks approach Elnaz Siami-Irdemoosa, Saeid Dindarloo, Applied Energy 151, 2015, pp. 77-84
- US DOE - Critical Minerals & Energy Innovation under Lawrence Berkeley National Laboratory under Contract DE-AC02-05CH11231 (January 2026)
- The Effects of Increasing Costs of the Future Relation Between Open Pit and Underground Mining, Dan Nilsson, 1982. US Dept of Interior - Office of Surface Mining - Bureau of Mines under Grand No. OSM G5105032
4 changes: 2 additions & 2 deletions docs/user_guide/model_overview.md
Original file line number Diff line number Diff line change
Expand Up @@ -171,13 +171,13 @@ auto-generated API page.
- performance models:
+ {py:class}`~h2integrate.converters.iron.humbert_ewin_perf.HumbertEwinPerformanceComponent` - OpenMDAO component for the Humbert iron electrowinning performance model.
+ {py:class}`~h2integrate.converters.iron.iron_dri_plant.HydrogenIronReductionPlantPerformanceComponent` - Performance component for hydrogen-based direct reduced iron (DRI) plant using the Rosner performance model.
+ {py:class}`~h2integrate.converters.iron.martin_mine_perf_model.MartinIronMinePerformanceComponent`
+ {py:class}`~h2integrate.converters.iron.simple_mine_perf_model.SimpleIronMinePerformanceComponent`
+ {py:class}`~h2integrate.converters.iron.iron_dri_plant.NaturalGasIronReductionPlantPerformanceComponent` - Performance component for natural gas-based direct reduced iron (DRI) plant using the Rosner performance model.
- cost models:
+ {py:class}`~h2integrate.converters.iron.humbert_stinn_ewin_cost.HumbertStinnEwinCostComponent` - OpenMDAO component for the Humbert/Stinn iron electrowinning cost model.
+ {py:class}`~h2integrate.converters.iron.iron_dri_plant.HydrogenIronReductionPlantCostComponent` - Cost component for hydrogen-based direct reduced iron (DRI) plant using the Rosner cost model.
+ {py:class}`~h2integrate.converters.iron.iron_transport.IronTransportCostComponent`
+ {py:class}`~h2integrate.converters.iron.martin_mine_cost_model.MartinIronMineCostComponent`
+ {py:class}`~h2integrate.converters.iron.simple_mine_cost_model.SimpleIronMineCostComponent`
+ {py:class}`~h2integrate.converters.iron.iron_dri_plant.NaturalGasIronReductionPlantCostComponent` - Cost component for natural gas-based direct reduced iron (DRI) plant using the Rosner cost model.
- other components:
+ {py:class}`~h2integrate.converters.iron.iron_transport.IronTransportPerformanceComponent`
Expand Down
4 changes: 2 additions & 2 deletions examples/21_iron_examples/iron_dri/tech_config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -42,9 +42,9 @@ technologies:
commodity_rate_units: t/h
iron_mine:
performance_model:
model: MartinIronMinePerformanceComponent
model: SimpleIronMinePerformanceComponent
cost_model:
model: MartinIronMineCostComponent
model: SimpleIronMineCostComponent
model_inputs:
shared_parameters:
mine: Northshore
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,9 @@ technologies:
commodity_rate_units: t/h
iron_mine: # iron mine - turns crude_iron into iron_ore
performance_model:
model: MartinIronMinePerformanceComponent
model: SimpleIronMinePerformanceComponent
cost_model:
model: MartinIronMineCostComponent
model: SimpleIronMineCostComponent
model_inputs:
shared_parameters:
mine: Northshore
Expand Down
2 changes: 1 addition & 1 deletion examples/21_iron_examples/iron_mapping/run_iron.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
save_plot_filepath.unlink(missing_ok=True)
case_results_filepath = ex_out_dir / "cases.csv"
ore_prices_filepath = ex_dir / "example_ore_prices.csv"
shipping_coords_filepath = ROOT_DIR / "converters/iron/martin_transport/shipping_coords.csv"
shipping_coords_filepath = ROOT_DIR / "converters/iron/simple_transport/shipping_coords.csv"
shipping_prices_filepath = ex_dir / "example_shipping_prices.csv"

# Plot the LCOI results with geopandas and contextily
Expand Down
4 changes: 2 additions & 2 deletions examples/21_iron_examples/iron_mapping/tech_config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -42,9 +42,9 @@ technologies:
commodity_rate_units: t/h
iron_mine:
performance_model:
model: MartinIronMinePerformanceComponent
model: SimpleIronMinePerformanceComponent
cost_model:
model: MartinIronMineCostComponent
model: SimpleIronMineCostComponent
model_inputs:
shared_parameters:
mine: Northshore
Expand Down
2 changes: 1 addition & 1 deletion examples/test/test_all_examples.py
Original file line number Diff line number Diff line change
Expand Up @@ -2275,7 +2275,7 @@ def test_iron_mapping_example(subtests, temp_copy_of_example):
ex_dir = example_folder
ex_out_dir = ex_dir / "ex_out"
ore_prices_filepath = ex_dir / "example_ore_prices.csv"
shipping_coords_filepath = ROOT_DIR / "converters/iron/martin_transport/shipping_coords.csv"
shipping_coords_filepath = ROOT_DIR / "converters/iron/simple_transport/shipping_coords.csv"
shipping_prices_filepath = ex_dir / "example_shipping_prices.csv"
cases_csv_fpath = ex_out_dir / "cases.csv"
ex_png_fpath = ex_out_dir / "example_iron_map.png"
Expand Down
10 changes: 7 additions & 3 deletions h2integrate/converters/iron/__init__.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from h2integrate.converters.iron.martin_mine_perf_model import (
MartinIronMinePerformanceComponent,
from h2integrate.converters.iron.simple_mine_perf_model import (
SimpleIronMinePerformanceComponent,
)
from h2integrate.converters.iron.martin_mine_cost_model import MartinIronMineCostComponent
from h2integrate.converters.iron.simple_mine_cost_model import SimpleIronMineCostComponent
from h2integrate.converters.iron.iron_dri_plant import (
NaturalGasIronReductionPlantPerformanceComponent,
NaturalGasIronReductionPlantCostComponent,
Expand All @@ -14,3 +14,7 @@
IronTransportPerformanceComponent,
IronTransportCostComponent,
)
from h2integrate.converters.iron.nrri_iron_mine import (
NRRIIronMinePerformanceComponent,
NRRIIronMineCostComponent,
)
2 changes: 1 addition & 1 deletion h2integrate/converters/iron/iron_transport.py
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ def compute(self, inputs, outputs):
lon = self.options["plant_config"]["sites"].get("site", {}).get("longitude")
site_location = (lat, lon)
shipping_coord_fpath = (
ROOT_DIR / "converters" / "iron" / "martin_transport" / "shipping_coords.csv"
ROOT_DIR / "converters" / "iron" / "simple_transport" / "shipping_coords.csv"
)
shipping_locations = pd.read_csv(shipping_coord_fpath, index_col="Unnamed: 0")

Expand Down
Loading
Loading