-
Notifications
You must be signed in to change notification settings - Fork 27
Iron: Example with independently sized mine and iron/steel plant #433
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: develop
Are you sure you want to change the base?
Changes from all commits
e52314a
4d86b83
5f82e24
6d2320c
08cbefe
ac33479
a18e9b0
d648213
b37e190
c2971d2
e35b17b
c21a777
b46fb20
a22e7c9
ca55caa
6a4b6de
25250ed
f03ac12
ad3f14b
9444137
a33bffc
59ed5e0
d7b7310
d356c23
868603a
e30973b
76949ec
ebd56ae
7e33bdf
5410238
51c0188
14e918b
e8aca50
5b2050a
1383f2b
991a716
0baf6d7
e59dd59
343708d
ba7692f
cf04d4a
d8af3b1
d0fbd6a
cf0a839
442c5e7
755435c
059c2ea
be93312
d4b726c
0fd1485
03a4ba7
8432393
5d6f52c
7f63887
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| 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. |
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. thanks for removing the old files! |
This file was deleted.
| 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 |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -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"], | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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"]], | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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"], | ||
|
|
@@ -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" | ||
|
|
@@ -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" | ||
|
|
||
This file was deleted.
| 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) |
There was a problem hiding this comment.
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!