Skip to content

Endogenize steel and cement production and add existing industry sites#1719

Open
toniseibold wants to merge 34 commits intomasterfrom
industry_plants
Open

Endogenize steel and cement production and add existing industry sites#1719
toniseibold wants to merge 34 commits intomasterfrom
industry_plants

Conversation

@toniseibold
Copy link
Copy Markdown
Contributor

@toniseibold toniseibold commented Jun 25, 2025

Closes # (if applicable).
PyPSA/pypsa-de#8

Dependencies

Changes proposed in this Pull Request

This PR endogenizes the production of steel and cement and for brownfield optimizations adds the existing plants for steel, cement, ammonia and methanol.
This PR uses the dataset provided by Neuwirth et al. to add existing industry sites.
Where necessary this dataset is complemented with other datasets since it's limited to EU27 countries only.

image

Ammonia

As soon as the config setting config["sector"]["ammonia"] is either True or regional and the optimization runs with perfect or myopic foresight, ammonia plant capacities are added in add_existing_baseyear.

Switching existing Haber-Bosch capacities from natural gas to hydrogen is not permitted since it's associated with retrofitting costs and there are only few Examples.
Comparison of eurostat demand vs. database installed capacity shows a high degree of agreement.

Methanol

Existing methanol capacities are added as methanol plants. It is implemented as a green methanolisation, since grey and blue are already indirectly included with SMR and SMR CC hydrogen production.

Steel

There are two routes for steel making implemented. The BF-BOF uses coal to reduce iron ore and produce steel in one process. On the other hand, natural gas or hydrogen direct reduced iron processes reduce iron to hot briquetted iron (HBI). The last step is to produce iron via an electric arc furnace (EAF).
EAF are also necessary to recycle secondary steel however this is still hidden in the electricity for industry load.

Cement

Cement production consists of two processes, clinker production and cement production.
For clinker production, the raw material is fed into a cement kiln, and under high temperature heat the clinker is burnt.
The heat for clinker production can either be supplied via biomass, waste or natural gas - additional to those specific emissions, there is carbon from the raw material oxidizing which contributes to the specific emissions.
The clinker is then ground with gypsum to get cement.

Installed Capacities

In general, the production capacities mostly agree with the demand from the JRC-IDEES database. The methanol capacities do not match the naphtha for industry demand since that one is met via oil based routes currently.
In bus regions where the demand is higher than the brownfield capacities, new plants can be built from links added in prepare_sector_network.

image

Open ToDos

Checklist

  • I tested my contribution locally and it works as intended.
  • Code and workflow changes are sufficiently documented.
  • Changed dependencies are added to pixi.toml (using pixi add <dependency-name>). not applicable
  • Changes in configuration options are added in config/config.default.yaml.
  • Changes in configuration options are documented in doc/configtables/*.csv.
  • A release note doc/release_notes.rst is added.

@toniseibold toniseibold changed the title Add industry sites Endogenize steel and cement production and add existing industry sites Oct 21, 2025
@bobbyxng bobbyxng self-requested a review January 15, 2026 14:03
@bobbyxng
Copy link
Copy Markdown
Collaborator

Updated branch to master, including removal of doctables, moved to schema setup, see #1912

Copy link
Copy Markdown
Collaborator

@bobbyxng bobbyxng left a comment

Choose a reason for hiding this comment

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

Thanks @toniseibold for this super extensive PR! I have now been able to go through the code base and have primarily focused on consistency, there are still a few changes, proposals and some questions wrt. my personal understanding. In summary:

  • Allow for toggling endogenisation via an enable or empty list
  • Please double-check units, efficiency and cost calculations/normalisations, both in add_existing_baseyear and prepare_sector_network
  • Please double-check that all arguments, params are passed to all functions and add correct docstring/typing to all functions
  • Consider for some parameters to be moved to config or technolog-data
  • Please open a PR on data when the PR is ready @lkstrp

Could you also do a comparison plot for energy use and/or regional distribution with and without endogenisation, e.g. weekly/24-hourly resolution.

Thanks a lot :)

@bobbyxng
Copy link
Copy Markdown
Collaborator

Also please merge with latest master and double-check compatibility with the new schema

@toniseibold
Copy link
Copy Markdown
Contributor Author

I did a couple of checks to make sure the extension works as intended (however low temporal resolution runs)

Cement and Steel Demand

Exogenous by multiplying sector_ratios with production levels for steel and cement
Δ Endogenous: new exogenous demands for industry

Carrier / Output Exogenous (TWh/a) Δ Endogenous (TWh/a)
Electricity 74.53 75.00
Coal 7.51 123.00*
Coke 84.46 *
Biomass 41.10 41.00
Methane / Gas 127.96 128.00
Hydrogen 20.73 21.00
Heat 2.12 2.0
Naphtha 20.12 20.00
Ammonia 0.00 0.0
Methanol 0.00 0.0
Process emissions 107.04 107.04

*coke: 1.366 x coal

Endogenous Demand for Steel and Cement Production

Carrier Technology Value (TWh/a)
Hydrogen H₂ DRI 45.43
Gas Gas DRI 19.98
Electricity DRI 29.69
  EAF 18.43
  Cement kiln 7.78
  Cement finishing 29.66
Coal BOF 171.71
Heat Cement kiln (total) 105.83
  from Biomass 0.11
  from Gas 0.00
  from Waste 105.72
CO₂ Cement kiln (process) 56.83
  from Heat 30.20

Commodity Prices (low resolution excluding carbon price for meoh)

image

I spotted one weirdness:
industry_sector_ratios_2050 report negative process emissions for HVC
So far that was not a problem since the process emissions from other subsectors are >0 which leads to an overall load > 0 but we could start running into problems
Maybe @fneum knows more about that

@toniseibold toniseibold requested a review from bobbyxng March 25, 2026 15:35
@toniseibold toniseibold marked this pull request as ready for review March 25, 2026 15:35
@lkstrp lkstrp requested a review from euronion March 26, 2026 13:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants