pypsa-eur icon indicating copy to clipboard operation
pypsa-eur copied to clipboard

Temporal industry load

Open JulianGeis opened this issue 1 month ago • 4 comments

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.rst is added.

JulianGeis avatar Nov 03 '25 08:11 JulianGeis

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:

  1. 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/)

  2. Creates node-specific profiles by weighting sector profiles according to each node's industrial production mix and energy intensity

  3. Maps profiles to simulation timeframe by matching day-of-week and hour patterns from the 2017 reference year

  4. 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:

image - The values are **dimensionless** - they represent the relative load pattern normalized to integrate to 1 over the year. This means: - The sum of all 8760 hourly values for each industry branch equals 1.0 - Each value represents the **fraction of total annual load** occurring in that specific hour - To get actual energy consumption, you would multiply these normalized values by the total annual energy consumption for that industry branch - Paper: https://www.ffe.de/wp-content/uploads/2021/11/Wie-koennen-europaeische-Branchen-Lastgaenge-die-Energiewende-im-Industriesektor-unterstuetzen.pdf

Relative to average load in %

image - e.g. stell has little deviations wheras mining / transport has higher deviations - daily and weekly profiles exist; slighlty different values for different monthly / seasons

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) image

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)

JulianGeis avatar Nov 03 '25 08:11 JulianGeis

Examples for 365H run

image

3H run results

image

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

JulianGeis avatar Nov 04 '25 10:11 JulianGeis

Some adaptations

Industrial demands for the whole system in 2030 and 2050 image

  • 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

JulianGeis avatar Nov 10 '25 09:11 JulianGeis

Comparison looks good!

fneum avatar Nov 10 '25 13:11 fneum