Skip to content

feat: resistive_heaters and air_sourced_hp for ptes temperature boosting #1711

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 15 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
4 changes: 2 additions & 2 deletions config/config.default.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -486,7 +486,7 @@ sector:
dynamic_capacity: true
supplemental_heating:
enable: false
booster_heat_pump: false
booster_technologies: []
max_top_temperature: 90
min_bottom_temperature: 35
ates:
Expand All @@ -506,6 +506,7 @@ sector:
heat_exchanger_pinch_point_temperature_difference: 5 #K
isentropic_compressor_efficiency: 0.8
heat_loss: 0.0
min_delta_t_lift: 10 #K
limited_heat_sources:
geothermal:
constant_temperature_celsius: 65
Expand All @@ -517,7 +518,6 @@ sector:
heat_pump_sources:
urban central:
- air
- ptes
urban decentral:
- air
rural:
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'
Comment on lines +474 to +480
Copy link
Contributor

Choose a reason for hiding this comment

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

Do we need both entries?

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
6 changes: 4 additions & 2 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,6 +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 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
4 changes: 3 additions & 1 deletion doc/release_notes.rst
Original file line number Diff line number Diff line change
Expand Up @@ -29,13 +29,15 @@ Release Notes

**Changes**

* 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
25 changes: 12 additions & 13 deletions rules/build_sector.smk
Original file line number Diff line number Diff line change
Expand Up @@ -470,19 +470,6 @@ rule build_ptes_operations:
"ptes",
"min_bottom_temperature",
),
# enable_supplemental_heating=config_provider(
# "sector",
# "district_heating",
# "ptes",
# "supplemental_heating",
# "enable",
# ),
# enable_dynamic_capacity=config_provider(
# "sector",
# "district_heating",
# "ptes",
# "dynamic_capacity",
# ),
snapshots=config_provider("snapshots"),
input:
central_heating_forward_temperature_profiles=resources(
Expand All @@ -502,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 @@ -1401,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
20 changes: 12 additions & 8 deletions scripts/build_cop_profiles/BaseCopApproximator.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,14 @@ class BaseCopApproximator(ABC):

Attributes
----------
forward_temperature_celsius : Union[xr.DataArray, np.array]
The forward temperature in Celsius.
sink_outlet_temperature_celsius : Union[xr.DataArray, np.array]
The sink outlet temperature in Celsius.
source_inlet_temperature_celsius : Union[xr.DataArray, np.array]
The source inlet temperature in Celsius.

Methods
-------
__init__(self, forward_temperature_celsius, source_inlet_temperature_celsius)
__init__(self, sink_outlet_temperature_celsius, source_inlet_temperature_celsius)
Initialize CopApproximator.
approximate_cop(self)
Approximate heat pump coefficient of performance (COP).
Expand All @@ -35,16 +35,16 @@ class BaseCopApproximator(ABC):

def __init__(
self,
forward_temperature_celsius: Union[xr.DataArray, np.array],
sink_outlet_temperature_celsius: Union[xr.DataArray, np.array],
source_inlet_temperature_celsius: Union[xr.DataArray, np.array],
):
"""
Initialize CopApproximator.

Parameters
----------
forward_temperature_celsius : Union[xr.DataArray, np.array]
The forward temperature in Celsius.
sink_outlet_temperature_celsius : Union[xr.DataArray, np.array]
The sink outlet temperature in Celsius.
source_inlet_temperature_celsius : Union[xr.DataArray, np.array]
The source inlet temperature in Celsius.
"""
Expand Down Expand Up @@ -105,6 +105,10 @@ def logarithmic_mean(
Union[float, xr.DataArray, np.ndarray]
Logarithmic mean temperature difference.
"""
if (np.asarray(t_hot <= t_cold)).any():
if (np.asarray(t_hot < t_cold)).any():
raise ValueError("t_hot must be greater than t_cold")
return (t_hot - t_cold) / np.log(t_hot / t_cold)
return xr.where(
t_hot == t_cold,
t_hot,
(t_hot - t_cold) / np.log(t_hot / t_cold),
)
Loading
Loading