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

refactor: allocate heat pump CAPEX on heat bus

Open TomKae00 opened this issue 7 months ago • 0 comments

Changes proposed in this Pull Request

This PR builds on #1711 and refines how heat pump investment costs are calculated:

  • Remove the nominal-efficiency factor and compute investment costs directly on the heat bus.
  • Define the booster heat-pump capital cost using:

The capital cost for the booster heat pump of the ptes have been defined as:

capital_cost = (
    costs.at[costs_name_heat_pump, "capital_cost"]
    * overdim_factor
    * (ptes_temperature_boost_ratio / (1 + ptes_temperature_boost_ratio)).max()
)

Explanation

The formula above ensures we only charge for the additional heat provided by boosting, rather than the total stream through the link. Since the model’s heat output for the booster reflects only the added energy, the ratio term appropriately scales the capital cost.


Testing

scenario:
  clusters:
    - 8

planning_horizons:
  - 2030

foresight: overnight
countries: ['DE', 'PL']

clustering:
  temporal:
    resolution_sector: 12h

Results

  • System costs:
    • Master: 140.982 Trillion
    • With PR changes: 141.069 Trillion

Heat Balances for each Sector:

Urban Central

  • Ground heat pump capacity decreases by a factor of nine compared to master
  • Contribution from resistive heaters increases (including for PTES boosting)
  • Gas boiler capacity increases slightly

urban_central_heat_fix_vs_master

Urban decentral

  • Air source heat pumps now contribute modestly to the energy mix

urban_decentral_heat_fix_vs_master

Rural

  • Gas-boiler output falls by 1 × 10⁸ MWh; ground-source heat pumps supply the balance
  • From a cost efficiency standpoint, ground-source heat pumps dominate: their annualized cost is roughly 150 k€/MWh versus about 100 k€/MWh for air-source units, while offering a higher average COP. See figure below.
  • Regeneration concern: ground source heat pumps now run as baseload, but operating as baseload would prevent soil recharge. Guidelines for Berlin advise limiting to about 2 000 full-load hours per year to allow proper thermal recovery as stated in this document: leitfaden_geothermie.pdf. Should we handle this in a follow-up PR or include it here, @cpschau and @amos-schledorn?

rural_heat_fix_vs_master rural_heat_stack_comparison_shared_legend overview2plots_rural_hp_comparison_PL0_1

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.

TomKae00 avatar Jun 11 '25 15:06 TomKae00