Skip to content

feat:add lake-water-sourced heat pumps#1951

Open
amos-schledorn wants to merge 20 commits intofeat-improve-ptx-excess-heatfrom
lake-heat-pumps
Open

feat:add lake-water-sourced heat pumps#1951
amos-schledorn wants to merge 20 commits intofeat-improve-ptx-excess-heatfrom
lake-heat-pumps

Conversation

@amos-schledorn
Copy link
Contributor

@amos-schledorn amos-schledorn commented Dec 22, 2025

This PR adds support for lake-water heat pumps, building on the implementation of @MajaHIC and the existing river-water heat implementation.

Method

Lake water heat potential is estimated by:

  1. Water temperature: Approximated from ambient air temperature using the empirical formula from Triebs & Tsatsaronis (2022), originally developed for rivers:

    $$T_{water} = k_1 + \frac{k_2}{1 + e^{k_4(k_3 - \bar{T}_{air})}}$$

    where $\bar{T}_{air}$ is a 13-day moving average of ambient temperature.

  2. Volume flow: Lake volume is assumed to turn over once per year. The annual volume is converted to an equivalent flow rate in m³/s for consistency with the river-water power calculation:

    $$\dot{V} = \frac{V_{lake}}{8760 \times 3600}$$

  3. Thermal power: Calculated using the base class formula:

    $$P = \dot{V} \cdot \rho \cdot c_p \cdot \Delta T$$

    where $\Delta T = \min(\Delta T_{max}, T_{water} - T_{outlet,min})$, with default $\Delta T_{max} = 1$ K.

Data Sources

Data Source Notes
Lake polygons & volumes HydroLAKES v1.0 (Messager et al. 2016) Vol_total in MCM (million m³)
Ambient temperature HERA dataset 6-hourly, reprojected to EPSG:3035
Temperature approximation Triebs & Tsatsaronis (2022), ECOS proceedings Moving average + logistic formula
ΔT assumption Triebs dissertation (2023) 1 K/year on lake volume

Changes by File

New files

  • scripts/build_surface_water_heat_potentials/approximators/lake_water_heat_approximator.py — Lake heat approximator class
  • scripts/build_surface_water_heat_potentials/build_lake_water_heat_potential.py — run script

Modified files

  • rules/build_sector.smk — Added build_lake_heat_potential rule
  • rules/retrieve.smk — Added retrieve_lake_data rule for HydroLAKES GDB
  • scripts/definitions/heat_system.py — Added LAKE_WATER to HeatSource enum and heat pump cost mapping
  • config/config.default.yaml — Added lake_water to heat source options
  • config/plotting.default.yaml — Added colors for lake water heat components
  • config/test/ — Added lake_water as heat source for tests
  • doc/release_notes.rst — Updated documentation

Testing

Config

foresight: overnight

scenario:
  clusters:
  - 8
  planning_horizons:
  - 2040

clustering:
  temporal:
    resolution_sector: 25h

countries: ['DE', 'DK']

sector:
  district_heating:
    supply_temperature_approximation:
      max_forward_temperature_baseyear:
        DE: 110
        DK: 80
      min_forward_temperature_baseyear:
        DE: 75
        DK: 55
      return_temperature_baseyear:
        DE: 60
        DK: 50
      relative_annual_temperature_reduction: 0.0
    ptes:
      enable: false
  heat_sources:
    urban central:
    - air
    - lake_water
    - river_water
    
solving:
  options:
    noisy_costs: false

Heat potentials

image

System costs

Scenario Objective Value [bn€] Difference to Air-only [%]
Air-only 117.36 0.00
Air + lakes 117.24 −0.10
Air + lakes + rivers 117.15 −0.18

Heat mix

Air-only

image

Air + Lakes

image

Air + Lakes + Rivers

image

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>).
  • Changes in configuration options are added in config/config.default.yaml.
  • Changes in configuration options are documented in doc/configtables/*.csv.
  • For new data sources or versions, these instructions <https://pypsa-eur.readthedocs.io/en/latest/data_sources.html>_ have been followed.
  • A release note doc/release_notes.rst is added.

@amos-schledorn amos-schledorn marked this pull request as draft December 22, 2025 18:04
@amos-schledorn amos-schledorn changed the base branch from master to feat-electrolyser-excess-heat-boosting December 22, 2025 18:04
@amos-schledorn amos-schledorn changed the base branch from feat-electrolyser-excess-heat-boosting to feat-improve-ptx-excess-heat December 22, 2025 18:05
@amos-schledorn amos-schledorn changed the title feat:add support for lake-water-sourced heat pumps feat:add lake-water-sourced heat pumps Dec 23, 2025
@amos-schledorn amos-schledorn marked this pull request as ready for review December 23, 2025 18:15
Copy link
Member

@fneum fneum left a comment

Choose a reason for hiding this comment

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

Looks good! Some minor comments about new dataset integration.

@amos-schledorn
Copy link
Contributor Author

Note: 36110d5 fixed a bug that caused the return flow temperature to be used in the COP approximation of all heat sources, including those pre-heating the return flow.
-> The above results assume incorrect COPs for heat sources above the return temperature boosted via heat pumps.

Copy link
Contributor

@cpschau cpschau left a comment

Choose a reason for hiding this comment

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

Just nitpicking about distinction between polyhedron and polygon. Thinking about it a polyhedron is probably nothing else than a set of cohesive polygons, so also fine if it stays as it is.

I was a bit baffled about the assumption about the singular turnover per year for all lakes.

Other than that, this looks good to me. After the changes in #1893, it seems quite straightforward to add new heat sources.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants