Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion config/config.default.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -488,7 +488,7 @@ sector:
dynamic_capacity: true
supplemental_heating:
enable: false
booster_heat_pump: false
booster_technologies: []
Copy link
Contributor

Choose a reason for hiding this comment

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

Looks like you've branched from another feature and not the main branch, meaning we should wait with merging this PR until the boosting feature is merged.

max_top_temperature: 90
min_bottom_temperature: 35
ates:
Expand Down
3 changes: 3 additions & 0 deletions config/plotting.default.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -424,6 +424,7 @@ plotting:
urban central water pits: "#d96f4c"
urban central water pits charger: "#a85d47"
urban central water pits discharger: "#b36452"
urban central water pits boosting: "#ffa36c"
aquifer thermal energy storage: "#6d00fc"
aquifer thermal energy storage charger: "#6d00fc"
aquifer thermal energy storage discharger: "#6d00fc"
Expand Down Expand Up @@ -470,11 +471,13 @@ plotting:
CHP electric: '#8a5751'
district heating: '#e8beac'
resistive heater: '#d8f9b8'
ptes resistive heater: '#a0e78d'
residential rural resistive heater: '#bef5b5'
residential urban decentral resistive heater: '#b2f1a9'
services rural resistive heater: '#a5ed9d'
services urban decentral resistive heater: '#98e991'
urban central resistive heater: '#8cdf85'
urban central ptes resistive heater: '#71c96b'
retrofitting: '#8487e8'
building retrofitting: '#8487e8'
# hydrogen
Expand Down
5 changes: 4 additions & 1 deletion config/test/config.myopic.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,10 @@ sector:
ptes:
supplemental_heating:
enable: true
booster_heat_pump: true
booster_technologies: ["heat_pump", "resistive_heaters"]
heat_pump_sources:
urban central:
- ptes

electricity:
extendable_carriers:
Expand Down
5 changes: 4 additions & 1 deletion config/test/config.overnight.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -65,9 +65,12 @@ sector:
ptes:
supplemental_heating:
enable: true
booster_heat_pump: true
booster_technologies: ["heat_pump", "resistive_heaters"]
ates:
enable: true
heat_pump_sources:
urban central:
- ptes


industry:
Expand Down
5 changes: 4 additions & 1 deletion config/test/config.perfect.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -48,9 +48,12 @@ sector:
ptes:
supplemental_heating:
enable: true
booster_heat_pump: true
booster_technologies: ["heat_pump", "resistive_heaters"]
ates:
enable: true
heat_pump_sources:
urban central:
- ptes


atlite:
Expand Down
7 changes: 4 additions & 3 deletions doc/configtables/sector.csv
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,9 @@ district_heating,--,,
-- ptes,,,
-- -- dynamic_capacity,--,"{true, false}",Add option for dynamic temperature-dependent energy capacity of pit storage in district heating
-- -- supplemental_heating,,,
-- -- -- enable,--,"{true, false}",Add option to enable supplemental heating of pit storage in district heating
-- -- -- booster_heat_pump: true,--,"{true, false}",Add option to enable a booster heat pump for supplemental heating of pit storage in district heating
-- -- -- enable,--,"{true, false}",Add option to enable supplemental heating of pit storage (PTES) in district heating
-- -- -- booster_technologies,--,List of booster technologies suitable for supplemental heating of PTES. Must be subset of ['heat_pump';
'resistive_heaters'],
-- -- max_top_temperature,C,float,The maximum top temperature of the pit storage according to DEA technology catalogue (2018)
-- -- min_bottom_temperature,C,float,The minimum bottom temperature of the pit storage according to DEA technology catalogue (2018)
-- ates,,,
Expand All @@ -47,7 +48,7 @@ district_heating,--,,
-- -- heat_exchanger_pinch_point_temperature_difference,K,float,Heat pump pinch point temperature difference in heat exchangers assumed for approximation.
-- -- isentropic_compressor_efficiency,--,float,Isentropic efficiency of heat pump compressor assumed for approximation. Must be between 0 and 1.
-- -- heat_loss,--,float,Heat pump heat loss assumed for approximation. Must be between 0 and 1.
-- -- min_delta_t_lift,--,float,"Minimum feasible temperature lift for heat pumps, used to approximate technical limits in heat pump operation. This value accounts for practical constraints in heat pump design."
-- -- min_delta_t_lift,--,float,Minimum feasible temperature lift for heat pumps assumed for approximation.
-- limited_heat_sources,--,Dictionary with names of limited heat sources (not air) for which data by Fraunhofer ISI (`Manz et al. 2024 <https://www.sciencedirect.com/science/article/pii/S0960148124001769>) is used,
-- -- geothermal,-,Name of the heat source. Must be the same as in ``heat_pump_sources``,
-- -- -- constant_temperature_celsius,°C,heat source temperature,
Expand Down
6 changes: 5 additions & 1 deletion doc/release_notes.rst
Original file line number Diff line number Diff line change
Expand Up @@ -35,13 +35,17 @@ Release Notes

**Changes**

* Fix: Heat pump investment costs now calculated on the heat bus directly, with the nominal efficiency factor removed

* Added resistive heaters as a temperature boosting technology for PTES. Additionally, the heat pump booster now uses ambient air as its heat source for boosting.

* Introduce the ability to use the bidding zones as administrative zones for the clustering (https://github.com/PyPSA/pypsa-eur/pull/1578). This also introduces the ability to create a custom `busmap` from custom `busshapes`. To use bidding zones as clustering mode, a `bz` mode has been introduced for `administrative` clustering. This feature is compatible with the general NUTS clustering approach. Custom `busshapes` must be provided as `data/busshapes/base_s_{clusters}_{base_network}.geojson`.

* Improved balance map plotting: Carriers in the balance map legends which can serve as both supply and consumption (e.g. H2 for industry) are now placed in the legend category where its total absolute value is larger in the total system balance.

* Added aquifer thermal energy storage (ATES) to district heating. Some parameters (CAPEX, standing losses) might require tuning by the user. Eligibility computation is relatively basic. Turned off by default.

* Added supplemental heating of thermal energy storages (currently implemented for PTES). This can be enabled by setting: ``sector: district_heating: ptes: supplemental_heating: true`` . To enable a boosting heat pump as the supplemental heating technology, use: ``sector: district_heating: ptes: supplemental_heating: booster_heat_pump: true``
* Added supplemental heating of thermal energy storages (currently implemented for PTES). This can be enabled by setting: ``sector: district_heating: ptes: supplemental_heating: true`` .

* Non-sequestered HVC (plastic waste) is now allocated based on the population instead of production. It can be either burned without energetic utilization or in CHPs to support the district heating system.

Expand Down
12 changes: 12 additions & 0 deletions rules/build_sector.smk
Original file line number Diff line number Diff line change
Expand Up @@ -489,6 +489,9 @@ rule build_ptes_operations:
ptes_e_max_pu_profiles=resources(
"ptes_e_max_pu_profiles_base_s_{clusters}_{planning_horizons}.nc"
),
ptes_temperature_boost_ratio_profiles=resources(
"ptes_temperature_boost_ratio_profiles_base_s_{clusters}_{planning_horizons}.nc"
),
resources:
mem_mb=2000,
log:
Expand Down Expand Up @@ -1388,6 +1391,15 @@ rule prepare_sector_network:
)(w)
else []
),
ptes_temperature_boost_ratio_profiles=lambda w: (
resources(
"ptes_temperature_boost_ratio_profiles_base_s_{clusters}_{planning_horizons}.nc"
)
if config_provider(
"sector", "district_heating", "ptes", "supplemental_heating", "enable"
)(w)
else []
),
solar_thermal_total=lambda w: (
resources("solar_thermal_total_base_s_{clusters}.nc")
if config_provider("sector", "solar_thermal")(w)
Expand Down
19 changes: 12 additions & 7 deletions scripts/build_cop_profiles/run.py
Original file line number Diff line number Diff line change
Expand Up @@ -128,18 +128,23 @@ def get_cop(
for heat_system_type, heat_sources in snakemake.params.heat_pump_sources.items():
cop_this_system_type = []
for heat_source in heat_sources:
if heat_source in ["ground", "air", "ptes"]:
if heat_source == "ptes":
source_inlet_temperature_celsius = xr.open_dataarray(
snakemake.input["temp_air_total"]
)
sink_inlet_temperature_celsius = xr.open_dataarray(
snakemake.input[f"temp_{heat_source}_total"]
)
elif heat_source in [
"ground",
"air",
]:
source_inlet_temperature_celsius = xr.open_dataarray(
snakemake.input[
f"temp_{heat_source.replace('ground', 'soil')}_total"
]
)
elif heat_source in snakemake.params.limited_heat_sources.keys():
source_inlet_temperature_celsius = (
snakemake.params.limited_heat_sources[heat_source][
"constant_temperature_celsius"
]
)
sink_inlet_temperature_celsius = central_heating_return_temperature
else:
raise ValueError(
f"Unknown heat source {heat_source}. Must be one of [ground, air] or {snakemake.params.heat_sources.keys()}."
Expand Down
28 changes: 22 additions & 6 deletions scripts/build_ptes_operations/ptes_temperature_approximator.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,17 +19,17 @@ class PtesTemperatureApproximator:
return_temperature : xr.DataArray
The return temperature profile from the district heating network.
max_ptes_top_temperature : float
Maximum operational temperature of top layer in PTES, default 90°C.
Maximum operational temperature of top layer in PTES.
min_ptes_bottom_temperature : float
Minimum operational temperature of bottom layer in PTES, default 35°C.
Minimum operational temperature of bottom layer in PTES.
"""

def __init__(
self,
forward_temperature: xr.DataArray,
return_temperature: xr.DataArray,
max_ptes_top_temperature: float = 90,
min_ptes_bottom_temperature: float = 35,
max_ptes_top_temperature: float,
min_ptes_bottom_temperature: float,
):
"""
Initialize PtesTemperatureApproximator.
Expand All @@ -41,9 +41,9 @@ def __init__(
return_temperature : xr.DataArray
The return temperature profile from the district heating network.
max_ptes_top_temperature : float, optional
Maximum operational temperature of top layer in PTES, default 90°C.
Maximum operational temperature of top layer in PTES.
min_ptes_bottom_temperature : float, optional
Minimum operational temperature of bottom layer in PTES, default 35°C.
Minimum operational temperature of bottom layer in PTES.
"""
self.forward_temperature = forward_temperature
self.return_temperature = return_temperature
Expand Down Expand Up @@ -106,3 +106,19 @@ def e_max_pu(self) -> xr.DataArray:
self.max_ptes_top_temperature - self.bottom_temperature
)
return normalized_delta_t.clip(min=0) # Ensure non-negative values

@property
def temperature_boost_ratio(self) -> xr.DataArray:
"""
Calculate the additional lift required between the store's
current top temperature and the forward temperature with the lift
already achieved inside the store.

Returns
-------
xr.DataArray
The resulting fraction of PTES charge that must be further heated.
"""
return (self.forward_temperature - self.top_temperature) / (
self.top_temperature - self.return_temperature
)
11 changes: 11 additions & 0 deletions scripts/build_ptes_operations/run.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
supplemental_heating:
enable:
max_top_temperature:
min_bottom_temperature:

Inputs
------
Expand All @@ -43,6 +44,8 @@
Binary indicator for additional heating (1 = direct PTES use, 0 = supplemental heating required).
- `resources/<run_name>/ptes_e_max_pu_profiles.nc`
Normalized PTES capacity profiles.
- `resources/<run_name>/ptes_temperature_boost_ratio_profiles.nc`
Ratio of PTES charge that requires additional heating due to temperature differences.

Source
------
Expand Down Expand Up @@ -116,3 +119,11 @@
ptes_temperature_approximator.e_max_pu.to_netcdf(
snakemake.output.ptes_e_max_pu_profiles
)

# Get PTES temperature boost ratio
logger.info(
f"Saving PTES reheat ratio profiles to {snakemake.output.ptes_temperature_boost_ratio_profiles}"
)
ptes_temperature_approximator.temperature_boost_ratio.to_netcdf(
snakemake.output.ptes_temperature_boost_ratio_profiles
)
Loading
Loading