112 lines
3.3 KiB
Python
112 lines
3.3 KiB
Python
# -*- coding: utf-8 -*-
|
|
# SPDX-FileCopyrightText: : 2020-2024 The PyPSA-Eur Authors
|
|
#
|
|
# SPDX-License-Identifier: MIT
|
|
|
|
from abc import ABC, abstractmethod
|
|
from typing import Union
|
|
|
|
import numpy as np
|
|
import xarray as xr
|
|
|
|
|
|
class BaseCopApproximator(ABC):
|
|
"""
|
|
Abstract class for approximating the coefficient of performance (COP) of a
|
|
heat pump.
|
|
|
|
Attributes:
|
|
----------
|
|
forward_temperature_celsius : Union[xr.DataArray, np.array]
|
|
The forward 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)
|
|
Initialize CopApproximator.
|
|
approximate_cop(self)
|
|
Approximate heat pump coefficient of performance (COP).
|
|
celsius_to_kelvin(t_celsius)
|
|
Convert temperature from Celsius to Kelvin.
|
|
logarithmic_mean(t_hot, t_cold)
|
|
Calculate the logarithmic mean temperature difference.
|
|
"""
|
|
|
|
def __init__(
|
|
self,
|
|
forward_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.
|
|
source_inlet_temperature_celsius : Union[xr.DataArray, np.array]
|
|
The source inlet temperature in Celsius.
|
|
"""
|
|
pass
|
|
|
|
@abstractmethod
|
|
def approximate_cop(self) -> Union[xr.DataArray, np.array]:
|
|
"""
|
|
Approximate heat pump coefficient of performance (COP).
|
|
|
|
Returns:
|
|
-------
|
|
Union[xr.DataArray, np.array]
|
|
The calculated COP values.
|
|
"""
|
|
pass
|
|
|
|
@staticmethod
|
|
def celsius_to_kelvin(
|
|
t_celsius: Union[float, xr.DataArray, np.array]
|
|
) -> Union[float, xr.DataArray, np.array]:
|
|
"""
|
|
Convert temperature from Celsius to Kelvin.
|
|
|
|
Parameters:
|
|
----------
|
|
t_celsius : Union[float, xr.DataArray, np.array]
|
|
Temperature in Celsius.
|
|
|
|
Returns:
|
|
-------
|
|
Union[float, xr.DataArray, np.array]
|
|
Temperature in Kelvin.
|
|
"""
|
|
if (np.asarray(t_celsius) > 200).any():
|
|
raise ValueError(
|
|
"t_celsius > 200. Are you sure you are using the right units?"
|
|
)
|
|
return t_celsius + 273.15
|
|
|
|
@staticmethod
|
|
def logarithmic_mean(
|
|
t_hot: Union[float, xr.DataArray, np.ndarray],
|
|
t_cold: Union[float, xr.DataArray, np.ndarray],
|
|
) -> Union[float, xr.DataArray, np.ndarray]:
|
|
"""
|
|
Calculate the logarithmic mean temperature difference.
|
|
|
|
Parameters:
|
|
----------
|
|
t_hot : Union[float, xr.DataArray, np.ndarray]
|
|
Hot temperature.
|
|
t_cold : Union[float, xr.DataArray, np.ndarray]
|
|
Cold temperature.
|
|
|
|
Returns:
|
|
-------
|
|
Union[float, xr.DataArray, np.ndarray]
|
|
Logarithmic mean temperature difference.
|
|
"""
|
|
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)
|