from abc import ABC, abstractmethod from dataclasses import dataclass @dataclass class Layer: thermal_coefficient: float thickness: float @property def R(self): return self.thickness / self.thermal_coefficient class Interface(ABC): @property @abstractmethod def HT(self) -> float: ... class Surface(Interface): def __init__(self, name: str, area: float, b: float = 1.0): self.name = name self.area = area self.b = b @property @abstractmethod def U(self) -> float: ... @property def HT(self) -> float: return self.b * self.U * self.area class LinearThermalBridge(Interface): def __init__(self, name: str, length: float, psi: float): self.name = name self.length = length self.psi = psi @property def HT(self) -> float: return self.psi * self.length class PointThermalBridge(Interface): def __init__(self, name: str, chi: float): self.name = name self.chi = chi @property def HT(self) -> float: return self.chi class LayeredSurface(Surface): def __init__( self, name: str, area: float, layers: list[Layer], r_surface_1: float, r_surface_2: float, b: float = 1.0, ): super().__init__(name, area, b) self.layers = layers self.r_surface_1 = r_surface_1 self.r_surface_2 = r_surface_2 @property def U(self) -> float: R_layers = sum(layer.R for layer in self.layers) R = self.r_surface_1 + R_layers + self.r_surface_2 return 1 / R class FixedUSurface(Surface): def __init__(self, name: str, area: float, u_value: float, b: float = 1.0): super().__init__(name, area, b) self.u_value = u_value @property def U(self) -> float: return self.u_value