hub/city_model_structure/building_demand/thermal_opening.py

302 lines
8.1 KiB
Python
Raw Normal View History

2020-10-28 13:42:58 -04:00
"""
ThermalOpening module
SPDX - License - Identifier: LGPL - 3.0 - or -later
Copyright © 2020 Project Author Guille Gutierrez guillermo.gutierrezmorote@concordia.ca
Contributors Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
2020-10-28 13:42:58 -04:00
"""
import uuid
2021-09-14 13:46:48 -04:00
from typing import TypeVar, Union
Polygon = TypeVar('Polygon')
2020-10-28 13:42:58 -04:00
class ThermalOpening:
"""
ThermalOpening class
"""
def __init__(self):
self._id = None
self._area = None
2020-10-28 13:42:58 -04:00
self._openable_ratio = None
self._conductivity = None
self._frame_ratio = None
2020-10-28 13:42:58 -04:00
self._g_value = None
self._thickness = None
self._front_side_solar_transmittance_at_normal_incidence = None
self._back_side_solar_transmittance_at_normal_incidence = None
self._overall_u_value = None
self._hi = None
self._he = None
self._surface_geometry = None
self._inside_emissivity = None
self._alpha_coefficient = None
self._radiative_coefficient = None
2021-03-16 12:19:35 -04:00
@property
def id(self):
"""
Get thermal zone id, an universally unique identifier randomly generated
:return: str
"""
if self._id is None:
self._id = uuid.uuid4()
return self._id
@property
2021-09-14 13:46:48 -04:00
def area(self) -> Union[None, float]:
"""
Get thermal opening area in square meters
2021-09-14 13:46:48 -04:00
:return: None or float
"""
return self._area
2020-10-28 13:42:58 -04:00
@area.setter
def area(self, value):
"""
Set thermal opening area in square meters
:param value: float
"""
2021-09-14 13:46:48 -04:00
if value is not None:
self._area = float(value)
2020-10-28 13:42:58 -04:00
@property
def openable_ratio(self):
"""
Raises not implemented error
2020-10-28 13:42:58 -04:00
"""
raise NotImplementedError
2020-10-28 13:42:58 -04:00
@openable_ratio.setter
def openable_ratio(self, value):
"""
Raises not implemented error
2020-10-28 13:42:58 -04:00
"""
raise NotImplementedError
2020-10-28 13:42:58 -04:00
@property
2021-09-14 13:46:48 -04:00
def conductivity(self) -> Union[None, float]:
2020-10-28 13:42:58 -04:00
"""
Get thermal opening conductivity in W/mK
2021-09-14 13:46:48 -04:00
:return: None or float
2020-10-28 13:42:58 -04:00
"""
return self._conductivity
@conductivity.setter
def conductivity(self, value):
"""
Set thermal opening conductivity in W/mK
2020-10-28 13:42:58 -04:00
:param value: float
"""
# The code to calculate overall_u_value is duplicated here and in thickness_m.
# This ensures a more robust code that returns the overall_u_value regardless the order the parameters are read.
2021-09-14 13:46:48 -04:00
if value is not None:
self._conductivity = float(value)
if self._overall_u_value is None and self.thickness is not None:
h_i = self.hi
h_e = self.he
r_value = 1 / h_i + 1 / h_e + float(self._conductivity) / float(self.thickness)
self._overall_u_value = 1 / r_value
2020-10-28 13:42:58 -04:00
@property
2021-09-14 13:46:48 -04:00
def frame_ratio(self) -> Union[None, float]:
2020-10-28 13:42:58 -04:00
"""
Get thermal opening frame ratio
2021-09-14 13:46:48 -04:00
:return: None or float
2020-10-28 13:42:58 -04:00
"""
return self._frame_ratio
@frame_ratio.setter
def frame_ratio(self, value):
"""
Set thermal opening frame ratio
:param value: float
"""
2021-09-14 13:46:48 -04:00
if value is not None:
self._frame_ratio = float(value)
2020-10-28 13:42:58 -04:00
@property
2021-09-14 13:46:48 -04:00
def g_value(self) -> Union[None, float]:
2020-10-28 13:42:58 -04:00
"""
Get thermal opening g-value
2021-09-14 13:46:48 -04:00
:return: None or float
2020-10-28 13:42:58 -04:00
"""
return self._g_value
@g_value.setter
def g_value(self, value):
"""
Set thermal opening g-value
:param value: float
2020-10-28 13:42:58 -04:00
"""
2021-09-14 13:46:48 -04:00
if value is not None:
self._g_value = float(value)
2020-10-28 13:42:58 -04:00
@property
2021-09-14 13:46:48 -04:00
def thickness(self) -> Union[None, float]:
2020-10-28 13:42:58 -04:00
"""
Get thermal opening thickness in meters
2021-09-14 13:46:48 -04:00
:return: None or float
2020-10-28 13:42:58 -04:00
"""
return self._thickness
@thickness.setter
def thickness(self, value):
"""
Set thermal opening thickness in meters
:param value: float
"""
# The code to calculate overall_u_value is duplicated here and in conductivity.
# This ensures a more robust code that returns the overall_u_value regardless the order the parameters are read.
2021-09-14 13:46:48 -04:00
if value is not None:
self._thickness = float(value)
if self._overall_u_value is None and self.conductivity is not None:
h_i = self.hi
h_e = self.he
r_value = 1 / h_i + 1 / h_e + float(self.conductivity) / float(self._thickness)
self._overall_u_value = 1 / r_value
2020-10-28 13:42:58 -04:00
@property
2021-09-14 13:46:48 -04:00
def front_side_solar_transmittance_at_normal_incidence(self) -> Union[None, float]:
2020-10-28 13:42:58 -04:00
"""
Get thermal opening front side solar transmittance at normal incidence
2021-09-14 13:46:48 -04:00
:return: None or float
2020-10-28 13:42:58 -04:00
"""
return self._front_side_solar_transmittance_at_normal_incidence
@front_side_solar_transmittance_at_normal_incidence.setter
def front_side_solar_transmittance_at_normal_incidence(self, value):
"""
Set thermal opening front side solar transmittance at normal incidence
:param value: float
"""
2021-09-14 13:46:48 -04:00
if value is not None:
self._front_side_solar_transmittance_at_normal_incidence = float(value)
2020-10-28 13:42:58 -04:00
@property
2021-09-14 13:46:48 -04:00
def back_side_solar_transmittance_at_normal_incidence(self) -> Union[None, float]:
2020-10-28 13:42:58 -04:00
"""
Get thermal opening back side solar transmittance at normal incidence
2021-09-14 13:46:48 -04:00
:return: None or float
2020-10-28 13:42:58 -04:00
"""
return self._back_side_solar_transmittance_at_normal_incidence
@back_side_solar_transmittance_at_normal_incidence.setter
def back_side_solar_transmittance_at_normal_incidence(self, value):
"""
Set thermal opening back side solar transmittance at normal incidence
:param value: float
"""
2021-09-14 13:46:48 -04:00
if value is not None:
self._back_side_solar_transmittance_at_normal_incidence = float(value)
2020-10-28 13:42:58 -04:00
@property
2021-09-14 13:46:48 -04:00
def overall_u_value(self) -> Union[None, float]:
2020-10-28 13:42:58 -04:00
"""
Get thermal opening overall U-value in W/m2K
2021-09-14 13:46:48 -04:00
:return: None or float
2020-10-28 13:42:58 -04:00
"""
return self._overall_u_value
@overall_u_value.setter
def overall_u_value(self, value):
"""
Set thermal opening overall U-value in W/m2K
2020-10-28 13:42:58 -04:00
:param value: float
"""
2021-09-14 13:46:48 -04:00
if value is not None:
self._overall_u_value = float(value)
@property
2021-09-14 13:46:48 -04:00
def hi(self) -> Union[None, float]:
"""
Get internal convective heat transfer coefficient (W/m2K)
2021-09-14 13:46:48 -04:00
:return: None or float
"""
return self._hi
@hi.setter
def hi(self, value):
"""
Set internal convective heat transfer coefficient (W/m2K)
:param value: float
"""
2021-09-14 13:46:48 -04:00
if value is not None:
self._hi = float(value)
@property
2021-09-14 13:46:48 -04:00
def he(self) -> Union[None, float]:
"""
Get external convective heat transfer coefficient (W/m2K)
2021-09-14 13:46:48 -04:00
:return: None or float
"""
return self._he
@he.setter
def he(self, value):
"""
Set external convective heat transfer coefficient (W/m2K)
:param value: float
"""
2021-09-14 13:46:48 -04:00
if value is not None:
self._he = float(value)
@property
def surface_geometry(self) -> Polygon:
"""
Get the polygon that defines the thermal opening
:return: Polygon
"""
return self._surface_geometry
# todo: need extract information from construction library or assume them at the beginning of workflows
@property
2021-09-14 13:46:48 -04:00
def inside_emissivity(self) -> Union[None, float]:
"""
Get the short wave emissivity factor of the thermal opening's internal surface (-)
2021-09-14 13:46:48 -04:00
:return: None or float
"""
return self._inside_emissivity
@inside_emissivity.setter
def inside_emissivity(self, value):
"""
Set short wave emissivity factor of the thermal opening's internal surface (-)
:param value: float
"""
2021-09-14 13:46:48 -04:00
if value is not None:
self._inside_emissivity = float(value)
@property
2021-09-14 13:46:48 -04:00
def alpha_coefficient(self) -> Union[None, float]:
"""
Get the long wave emissivity factor of the thermal opening's internal surface (-)
2021-09-14 13:46:48 -04:00
:return: None or float
"""
return self._alpha_coefficient
@alpha_coefficient.setter
def alpha_coefficient(self, value):
"""
Set long wave emissivity factor of the thermal opening's internal surface (-)
:param value: float
"""
2021-09-14 13:46:48 -04:00
if value is not None:
self._alpha_coefficient = float(value)
@property
2021-09-14 13:46:48 -04:00
def radiative_coefficient(self) -> Union[None, float]:
"""
Get the radiative coefficient of the thermal opening's external surface (-)
2021-09-14 13:46:48 -04:00
:return: None or float
"""
return self._radiative_coefficient
@radiative_coefficient.setter
def radiative_coefficient(self, value):
"""
Set radiative coefficient of the thermal opening's external surface (-)
:param value: float
"""
2021-09-14 13:46:48 -04:00
if value is not None:
self._radiative_coefficient = float(value)