Temporal industry load
Closes # (if applicable).
Changes proposed in this Pull Request
Checklist
- [x] I tested my contribution locally and it works as intended.
- [x] Code and workflow changes are sufficiently documented.
- [x] Changed dependencies are added to
envs/environment.yaml. - [x] Changes in configuration options are added in
config/config.default.yaml. - [x] Changes in configuration options are documented in
doc/configtables/*.csv. - [x] Sources of newly added data are documented in
doc/data_sources.rst. - [x] A release note
doc/release_notes.rstis added.
This PR adds support for temporal (hourly) industrial electricity demand profiles
Current behavior: Industrial electricity loads are modeled as constant flat loads (annual demand divided by hours).
New feature: When enabled via the config flag temporal_electricity_industry_load: true, the model:
-
Downloads real load profiles from the FfE (Forschungsstelle für Energiewirtschaft) open data API for different industry sectors (steel, cement, chemicals, paper, etc.) -> Link (https://opendata.ffe.de/dataset/normalized-industrial-electrical-load-profiles-germany/)
-
Creates node-specific profiles by weighting sector profiles according to each node's industrial production mix and energy intensity
-
Maps profiles to simulation timeframe by matching day-of-week and hour patterns from the 2017 reference year
-
Validates consistency by ensuring hourly profiles sum to the same annual demand as before
This allows the model to capture realistic temporal variations in industrial electricity consumption (e.g., weekday/weekend patterns, shift schedules), which is important for accurate grid planning and renewable energy integration studies.
Normalized Load profiles:
Relative to average load in %
Mapping
- the mapping maps the daily and weekly pattern from the reference year 2017 in which the profiles are to the year used (here 2013)
Notes Relevant inputs:
- nodal_df: electricity consumption of industry per node in TWh
- nodal_sector_ratios: nodal electricity consumption in MWh/tMaterial for different industry sectors
- nodal_production: material demand per node and industry (Mton/a)
nodal_df (TWh/a) is calculated by multiplying nodal_sector ratios (MWh/t) * nodal_production (Mton/a)
Examples for 365H run
3H run results
What have I tested?
- workflow runs with default settings and 50 nodes in 365H and 3H for 2030 and 2045
- Overall sum of loads are equal (until rounding 2 decimals in TWh bc of saving with only two decimals in non temporal case)
- Daily and weekly profile makes visually sense (lower on weekends, day and night profile)
- Sum of profiles’ volatilities weighted by the amount one industry has at a node is roughly equal (or lower) to the final load volatility in terms of daily and weekly volatility
Some adaptations
Industrial demands for the whole system in 2030 and 2050
- I changed the profiles for industrial profiles that are not in the ffe data from "Non-specified (Industry)" to profiles with less volatility that are closer to their real life operation
Some final testing on 3H resolution
- 2030, 2045
system cost:
- 2030: before: 769.42 Mrd €; after: 771.68 Mrd €; difference: 2.27 Mrd € (0.3 %)
- 2045: before: 794.31 Mrd €; after: 797.05 Mrd €; difference: 2.74 Mrd € (0.3 %)
energy balance (diff of n_new - n_old in energy supply (n.statistics.supply())
-
2030; in TWh (only printed if absolute diff > 1 TWh) component carrier
Generator Offshore Wind (AC) -5.775976 Offshore Wind (DC) 30.033801 Onshore Wind -4.081143 Solar -2.505021 gas -1.134703 nuclear 2.907199 oil primary 1.005150 solar rooftop -32.243501 Line AC 6.561237 Link DC 17.284844 Open-Cycle Gas -3.745161 battery charger 6.194843 battery discharger 6.069681 electricity distribution grid 14.330783 gas pipeline new 4.020953 home battery charger 3.131703 home battery discharger 3.068430 rural gas boiler 1.635867 urban central gas CHP -22.957647 urban central gas boiler 12.401556 urban central resistive heater -8.350630 urban central solid biomass CHP 10.097725 urban central water pits charger -4.934687 urban central water pits discharger -4.892858 urban decentral air heat pump 2.945944 urban decentral biomass boiler -5.463347 urban decentral gas boiler 18.004273 urban decentral resistive heater -12.490040 StorageUnit Pumped Hydro Storage -3.986153 Store Battery Storage 6.199533 EV battery -1.686478 gas -3.853268 home battery 3.151445 urban central water pits -4.747050 dtype: float64 -
2045: component carrier
Generator Offshore Wind (AC) -7.641278 Offshore Wind (DC) -26.594911 Onshore Wind 27.237053 Solar 4.813791 biogas 10.843997 gas -9.347044 nuclear 6.194771 oil primary 7.305688 solar-hsat -24.775813 Line AC 5.502215 Link BEV charger 2.176873 DAC -1.704307 DC 12.668546 Fischer-Tropsch -7.314679 H2 Electrolysis -9.143604 H2 pipeline 32.405502 Open-Cycle Gas -4.815939 V2G 1.959186 battery charger 16.264212 battery discharger 15.935608 biogas to gas 10.843997 electricity distribution grid -11.479128 gas pipeline 6.328298 oil refining 7.031257 urban central air heat pump -4.372845 urban central gas boiler 11.036632 urban central resistive heater -6.233251 urban central water pits charger -5.919406 urban central water pits discharger -5.933886 urban decentral air heat pump 5.808474 urban decentral resistive heater -5.321739 StorageUnit Pumped Hydro Storage -2.251506 Store Battery Storage 16.257432 EV battery -6.621250 H2 Store -6.269449 urban central water pits -5.994031 dtype: float64
withdrawal
-
2030 component carrier
Line AC 6.376707 Link DC 17.770981 Open-Cycle Gas -5.963633 battery charger 6.322585 battery discharger 6.194843 biomass to liquid -2.420082 electricity distribution grid 14.774003 gas pipeline new 4.020953 home battery charger 3.196281 home battery discharger 3.131703 oil refining 1.005150 rural gas boiler 1.376993 urban central gas CHP -21.699099 urban central gas boiler 10.017412 urban central resistive heater -8.434980 urban central solid biomass CHP 9.225036 urban central water pits charger -4.934687 urban central water pits discharger -4.892858 urban decentral air heat pump 1.130823 urban decentral biomass boiler -6.208349 urban decentral gas boiler 15.155112 urban decentral resistive heater -13.877822 StorageUnit Pumped Hydro Storage -5.315197 Store Battery Storage 6.199533 EV battery -1.686478 gas -3.853268 home battery 3.151445 urban central water pits -4.788879 dtype: float64 -
2045
-
component carrier
Line AC 6.951774 Link BEV charger 2.418748 DAC -5.027705 DC 13.086690 Fischer-Tropsch -10.537545 H2 Electrolysis -12.452542 H2 pipeline 32.663652 Open-Cycle Gas -7.668693 V2G 2.176873 battery charger 16.599592 battery discharger 16.264212 biogas to gas 12.991109 electricity distribution grid -11.834153 gas pipeline 6.382698 oil refining 7.305688 urban central air heat pump -1.915849 urban central gas boiler 8.914889 urban central resistive heater -6.296213 urban central water pits charger -5.919406 urban central water pits discharger -5.933886 urban decentral air heat pump 2.668876 urban decentral resistive heater -5.913043 StorageUnit Pumped Hydro Storage -3.003222 Store Battery Storage 16.257432 EV battery -6.621250 H2 Store -6.269449 urban central water pits -5.979551 dtype: float64 -
results can be found on z1: scratch/htc/jgeis/pypsa-eur/results/2025-11-07-industrial-load
Comparison looks good!