forked from s_ranjbar/city_retrofit
modified thermal zones to be created in different ways depending on the user needs
This commit is contained in:
parent
f3208f1735
commit
a147afe76f
|
@ -41,7 +41,7 @@ class Building(CityObject):
|
||||||
self._floor_area = None
|
self._floor_area = None
|
||||||
self._roof_type = None
|
self._roof_type = None
|
||||||
self._internal_zones = None
|
self._internal_zones = None
|
||||||
self._thermal_zones = None
|
self._thermal_zones_from_internal_zones = None
|
||||||
self._shell = None
|
self._shell = None
|
||||||
self._aliases = []
|
self._aliases = []
|
||||||
self._type = 'building'
|
self._type = 'building'
|
||||||
|
@ -118,22 +118,19 @@ class Building(CityObject):
|
||||||
return self._internal_zones
|
return self._internal_zones
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def thermal_zones(self) -> Union[None, List[ThermalZone]]:
|
def thermal_zones_from_internal_zones(self) -> Union[None, List[ThermalZone]]:
|
||||||
"""
|
"""
|
||||||
Get building thermal zones
|
Get building thermal zones
|
||||||
For Lod up to 3, there can be more than one thermal zone per internal zone.
|
|
||||||
In LoD 4, there can be more than one internal zone, and therefore, only one thermal zone per internal zone
|
|
||||||
:return: [ThermalZone]
|
:return: [ThermalZone]
|
||||||
"""
|
"""
|
||||||
if self._thermal_zones is None:
|
if self._thermal_zones_from_internal_zones is None:
|
||||||
self._thermal_zones = []
|
self._thermal_zones_from_internal_zones = []
|
||||||
for internal_zone in self.internal_zones:
|
for internal_zone in self.internal_zones:
|
||||||
if internal_zone.thermal_zones is None:
|
if internal_zone.thermal_zones_from_internal_zones is None:
|
||||||
self._thermal_zones = None
|
self._thermal_zones_from_internal_zones = None
|
||||||
return self._thermal_zones
|
return self._thermal_zones_from_internal_zones
|
||||||
for thermal_zone in internal_zone.thermal_zones:
|
self._thermal_zones_from_internal_zones.append(internal_zone.thermal_zones_from_internal_zones[0])
|
||||||
self._thermal_zones.append(thermal_zone)
|
return self._thermal_zones_from_internal_zones
|
||||||
return self._thermal_zones
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def grounds(self) -> List[Surface]:
|
def grounds(self) -> List[Surface]:
|
||||||
|
@ -621,7 +618,7 @@ class Building(CityObject):
|
||||||
def _calculate_working_hours(self):
|
def _calculate_working_hours(self):
|
||||||
_working_hours = {}
|
_working_hours = {}
|
||||||
for internal_zone in self.internal_zones:
|
for internal_zone in self.internal_zones:
|
||||||
for thermal_zone in internal_zone.thermal_zones:
|
for thermal_zone in internal_zone.thermal_zones_from_internal_zones:
|
||||||
_working_hours_per_thermal_zone = {}
|
_working_hours_per_thermal_zone = {}
|
||||||
for schedule in thermal_zone.thermal_control.hvac_availability_schedules:
|
for schedule in thermal_zone.thermal_control.hvac_availability_schedules:
|
||||||
_working_hours_per_schedule = [0] * len(schedule.values)
|
_working_hours_per_schedule = [0] * len(schedule.values)
|
||||||
|
|
|
@ -9,9 +9,9 @@ import uuid
|
||||||
from typing import Union, List
|
from typing import Union, List
|
||||||
from hub.city_model_structure.building_demand.usage import Usage
|
from hub.city_model_structure.building_demand.usage import Usage
|
||||||
from hub.city_model_structure.building_demand.thermal_zone import ThermalZone
|
from hub.city_model_structure.building_demand.thermal_zone import ThermalZone
|
||||||
|
from hub.city_model_structure.building_demand.thermal_boundary import ThermalBoundary
|
||||||
from hub.city_model_structure.attributes.polyhedron import Polyhedron
|
from hub.city_model_structure.attributes.polyhedron import Polyhedron
|
||||||
from hub.city_model_structure.energy_systems.hvac_system import HvacSystem
|
from hub.city_model_structure.energy_systems.hvac_system import HvacSystem
|
||||||
from hub.helpers.thermal_zones_creation import ThermalZonesCreation
|
|
||||||
|
|
||||||
|
|
||||||
class InternalZone:
|
class InternalZone:
|
||||||
|
@ -24,7 +24,7 @@ class InternalZone:
|
||||||
self._geometry = None
|
self._geometry = None
|
||||||
self._volume = volume
|
self._volume = volume
|
||||||
self._area = area
|
self._area = area
|
||||||
self._thermal_zones = None
|
self._thermal_zones_from_internal_zones = None
|
||||||
self._usages = None
|
self._usages = None
|
||||||
self._hvac_system = None
|
self._hvac_system = None
|
||||||
|
|
||||||
|
@ -108,17 +108,29 @@ class InternalZone:
|
||||||
self._hvac_system = value
|
self._hvac_system = value
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def thermal_zones(self) -> Union[None, List[ThermalZone]]:
|
def thermal_zones_from_internal_zones(self) -> Union[None, List[ThermalZone]]:
|
||||||
"""
|
"""
|
||||||
Get building thermal zones
|
Get building thermal zones as one per internal zone
|
||||||
:return: [ThermalZone]
|
:return: [ThermalZone]
|
||||||
"""
|
"""
|
||||||
return self._thermal_zones
|
_thermal_boundaries = []
|
||||||
|
for surface in self.surfaces:
|
||||||
|
if surface.holes_polygons is None:
|
||||||
|
windows_areas = None
|
||||||
|
else:
|
||||||
|
windows_areas = []
|
||||||
|
for hole in surface.holes_polygons:
|
||||||
|
windows_areas.append(hole.area)
|
||||||
|
_thermal_boundary = ThermalBoundary(surface, surface.solid_polygon.area, windows_areas)
|
||||||
|
_thermal_boundaries.append(_thermal_boundary)
|
||||||
|
_thermal_zone = ThermalZone(_thermal_boundaries, self, self.volume, self.area)
|
||||||
|
self._thermal_zones_from_internal_zones = [_thermal_zone]
|
||||||
|
return self._thermal_zones_from_internal_zones
|
||||||
|
|
||||||
@thermal_zones.setter
|
@thermal_zones_from_internal_zones.setter
|
||||||
def thermal_zones(self, value):
|
def thermal_zones_from_internal_zones(self, value):
|
||||||
"""
|
"""
|
||||||
Set city object thermal zones
|
Set city object thermal zones as one per internal zone
|
||||||
:param value: [ThermalZone]
|
:param value: [ThermalZone]
|
||||||
"""
|
"""
|
||||||
self._thermal_zones = value
|
self._thermal_zones_from_internal_zones = value
|
||||||
|
|
|
@ -221,15 +221,43 @@ class ThermalZone:
|
||||||
Get thermal zone view factors matrix
|
Get thermal zone view factors matrix
|
||||||
:return: [[float]]
|
:return: [[float]]
|
||||||
"""
|
"""
|
||||||
return self._view_factors_matrix
|
# todo: review method if windows not in window_ratio but in geometry
|
||||||
|
if self._view_factors_matrix is None:
|
||||||
|
total_area = 0
|
||||||
|
for thermal_boundary in self.thermal_boundaries:
|
||||||
|
total_area += thermal_boundary.opaque_area
|
||||||
|
for thermal_opening in thermal_boundary.thermal_openings:
|
||||||
|
total_area += thermal_opening.area
|
||||||
|
|
||||||
@view_factors_matrix.setter
|
view_factors_matrix = []
|
||||||
def view_factors_matrix(self, value):
|
for thermal_boundary_1 in self.thermal_boundaries:
|
||||||
"""
|
values = []
|
||||||
Set thermal zone view factors matrix
|
for thermal_boundary_2 in self.thermal_boundaries:
|
||||||
:param value: [[float]]
|
value = 0
|
||||||
"""
|
if thermal_boundary_1.id != thermal_boundary_2.id:
|
||||||
self._view_factors_matrix = value
|
value = thermal_boundary_2.opaque_area / (total_area - thermal_boundary_1.opaque_area)
|
||||||
|
values.append(value)
|
||||||
|
for thermal_boundary in self.thermal_boundaries:
|
||||||
|
for thermal_opening in thermal_boundary.thermal_openings:
|
||||||
|
value = thermal_opening.area / (total_area - thermal_boundary_1.opaque_area)
|
||||||
|
values.append(value)
|
||||||
|
view_factors_matrix.append(values)
|
||||||
|
|
||||||
|
for thermal_boundary_1 in self.thermal_boundaries:
|
||||||
|
values = []
|
||||||
|
for thermal_opening_1 in thermal_boundary_1.thermal_openings:
|
||||||
|
for thermal_boundary_2 in self.thermal_boundaries:
|
||||||
|
value = thermal_boundary_2.opaque_area / (total_area - thermal_opening_1.area)
|
||||||
|
values.append(value)
|
||||||
|
for thermal_boundary in self.thermal_boundaries:
|
||||||
|
for thermal_opening_2 in thermal_boundary.thermal_openings:
|
||||||
|
value = 0
|
||||||
|
if thermal_opening_1.id != thermal_opening_2.id:
|
||||||
|
value = thermal_opening_2.area / (total_area - thermal_opening_1.area)
|
||||||
|
values.append(value)
|
||||||
|
view_factors_matrix.append(values)
|
||||||
|
self._view_factors_matrix = view_factors_matrix
|
||||||
|
return self._view_factors_matrix
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def usage_name(self) -> Union[None, str]:
|
def usage_name(self) -> Union[None, str]:
|
||||||
|
|
|
@ -335,7 +335,7 @@ class EnergyAde:
|
||||||
def _thermal_zones(self, building, city):
|
def _thermal_zones(self, building, city):
|
||||||
thermal_zones = []
|
thermal_zones = []
|
||||||
for internal_zone in building.internal_zones:
|
for internal_zone in building.internal_zones:
|
||||||
for index, thermal_zone in enumerate(internal_zone.thermal_zones):
|
for index, thermal_zone in enumerate(internal_zone.thermal_zones_from_internal_zones):
|
||||||
usages = []
|
usages = []
|
||||||
for usage in internal_zone.usages:
|
for usage in internal_zone.usages:
|
||||||
usages.append({'@xlink:href': f'#GML_{usage.id}'})
|
usages.append({'@xlink:href': f'#GML_{usage.id}'})
|
||||||
|
|
|
@ -510,9 +510,9 @@ class Idf:
|
||||||
for building in self._city.buildings:
|
for building in self._city.buildings:
|
||||||
print('building name', building.name)
|
print('building name', building.name)
|
||||||
for internal_zone in building.internal_zones:
|
for internal_zone in building.internal_zones:
|
||||||
if internal_zone.thermal_zones is None:
|
if internal_zone.thermal_zones_from_internal_zones is None:
|
||||||
continue
|
continue
|
||||||
for thermal_zone in internal_zone.thermal_zones:
|
for thermal_zone in internal_zone.thermal_zones_from_internal_zones:
|
||||||
for thermal_boundary in thermal_zone.thermal_boundaries:
|
for thermal_boundary in thermal_zone.thermal_boundaries:
|
||||||
self._add_construction(thermal_boundary)
|
self._add_construction(thermal_boundary)
|
||||||
if thermal_boundary.parent_surface.vegetation is not None:
|
if thermal_boundary.parent_surface.vegetation is not None:
|
||||||
|
@ -556,7 +556,7 @@ class Idf:
|
||||||
self._add_dhw(thermal_zone, building.name)
|
self._add_dhw(thermal_zone, building.name)
|
||||||
if self._export_type == "Surfaces":
|
if self._export_type == "Surfaces":
|
||||||
if building.name in self._target_buildings or building.name in self._adjacent_buildings:
|
if building.name in self._target_buildings or building.name in self._adjacent_buildings:
|
||||||
if building.internal_zones[0].thermal_zones is not None:
|
if building.internal_zones[0].thermal_zones_from_internal_zones is not None:
|
||||||
self._add_surfaces(building, building.name)
|
self._add_surfaces(building, building.name)
|
||||||
else:
|
else:
|
||||||
self._add_pure_geometry(building, building.name)
|
self._add_pure_geometry(building, building.name)
|
||||||
|
@ -611,7 +611,7 @@ class Idf:
|
||||||
num_stories=int(building.storeys_above_ground))
|
num_stories=int(building.storeys_above_ground))
|
||||||
|
|
||||||
for surface in self._idf.idfobjects[self._SURFACE]:
|
for surface in self._idf.idfobjects[self._SURFACE]:
|
||||||
for thermal_zone in building.thermal_zones:
|
for thermal_zone in building.thermal_zones_from_internal_zones:
|
||||||
for boundary in thermal_zone.thermal_boundaries:
|
for boundary in thermal_zone.thermal_boundaries:
|
||||||
if surface.Type == self.idf_surfaces[boundary.surface.type]:
|
if surface.Type == self.idf_surfaces[boundary.surface.type]:
|
||||||
surface.Construction_Name = boundary.construction_name
|
surface.Construction_Name = boundary.construction_name
|
||||||
|
@ -664,7 +664,7 @@ class Idf:
|
||||||
idf_surface.setcoords(coordinates)
|
idf_surface.setcoords(coordinates)
|
||||||
if self._lod >= 3:
|
if self._lod >= 3:
|
||||||
for internal_zone in building.internal_zones:
|
for internal_zone in building.internal_zones:
|
||||||
for thermal_zone in internal_zone.thermal_zones:
|
for thermal_zone in internal_zone.thermal_zones_from_internal_zones:
|
||||||
for boundary in thermal_zone.thermal_boundaries:
|
for boundary in thermal_zone.thermal_boundaries:
|
||||||
self._add_windows_by_vertices(boundary)
|
self._add_windows_by_vertices(boundary)
|
||||||
else:
|
else:
|
||||||
|
@ -674,7 +674,7 @@ class Idf:
|
||||||
|
|
||||||
def _add_surfaces(self, building, zone_name):
|
def _add_surfaces(self, building, zone_name):
|
||||||
for internal_zone in building.internal_zones:
|
for internal_zone in building.internal_zones:
|
||||||
for thermal_zone in internal_zone.thermal_zones:
|
for thermal_zone in internal_zone.thermal_zones_from_internal_zones:
|
||||||
for boundary in thermal_zone.thermal_boundaries:
|
for boundary in thermal_zone.thermal_boundaries:
|
||||||
idf_surface_type = self.idf_surfaces[boundary.parent_surface.type]
|
idf_surface_type = self.idf_surfaces[boundary.parent_surface.type]
|
||||||
outside_boundary_condition = 'Outdoors'
|
outside_boundary_condition = 'Outdoors'
|
||||||
|
@ -711,7 +711,7 @@ class Idf:
|
||||||
|
|
||||||
if self._lod >= 3:
|
if self._lod >= 3:
|
||||||
for internal_zone in building.internal_zones:
|
for internal_zone in building.internal_zones:
|
||||||
for thermal_zone in internal_zone.thermal_zones:
|
for thermal_zone in internal_zone.thermal_zones_from_internal_zones:
|
||||||
for boundary in thermal_zone.thermal_boundaries:
|
for boundary in thermal_zone.thermal_boundaries:
|
||||||
self._add_windows_by_vertices(boundary)
|
self._add_windows_by_vertices(boundary)
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -44,7 +44,7 @@ class InselMonthlyEnergyBalance:
|
||||||
self._insel_files_paths.append(building.name + '.insel')
|
self._insel_files_paths.append(building.name + '.insel')
|
||||||
file_name_out = building.name + '.out'
|
file_name_out = building.name + '.out'
|
||||||
output_path = Path(self._path / file_name_out).resolve()
|
output_path = Path(self._path / file_name_out).resolve()
|
||||||
if building.thermal_zones is None:
|
if building.thermal_zones_from_internal_zones is None:
|
||||||
logging.warning('Building %s has missing values. Monthly Energy Balance cannot be processed', building.name)
|
logging.warning('Building %s has missing values. Monthly Energy Balance cannot be processed', building.name)
|
||||||
|
|
||||||
self._contents.append(
|
self._contents.append(
|
||||||
|
@ -126,7 +126,7 @@ class InselMonthlyEnergyBalance:
|
||||||
|
|
||||||
# todo: this method and the insel model have to be reviewed for more than one internal zone
|
# todo: this method and the insel model have to be reviewed for more than one internal zone
|
||||||
internal_zone = building.internal_zones[0]
|
internal_zone = building.internal_zones[0]
|
||||||
thermal_zone = internal_zone.thermal_zones[0]
|
thermal_zone = internal_zone.thermal_zones_from_internal_zones[0]
|
||||||
parameters.append(f'{thermal_zone.indirectly_heated_area_ratio} % BP(6) Indirectly heated area ratio')
|
parameters.append(f'{thermal_zone.indirectly_heated_area_ratio} % BP(6) Indirectly heated area ratio')
|
||||||
parameters.append(f'{thermal_zone.effective_thermal_capacity / 3600 / building.average_storey_height}'
|
parameters.append(f'{thermal_zone.effective_thermal_capacity / 3600 / building.average_storey_height}'
|
||||||
f' % BP(7) Effective heat capacity (Wh/m2K)')
|
f' % BP(7) Effective heat capacity (Wh/m2K)')
|
||||||
|
@ -139,7 +139,7 @@ class InselMonthlyEnergyBalance:
|
||||||
|
|
||||||
for i, usage in enumerate(internal_zone.usages):
|
for i, usage in enumerate(internal_zone.usages):
|
||||||
percentage_usage = usage.percentage
|
percentage_usage = usage.percentage
|
||||||
parameters.append(f'{internal_zone.thermal_zones[0].total_floor_area * percentage_usage} '
|
parameters.append(f'{internal_zone.thermal_zones_from_internal_zones[0].total_floor_area * percentage_usage} '
|
||||||
f'% BP(11) #1 Area of zone {i + 1} (m2)')
|
f'% BP(11) #1 Area of zone {i + 1} (m2)')
|
||||||
total_internal_gain = 0
|
total_internal_gain = 0
|
||||||
for i_gain in usage.internal_gains:
|
for i_gain in usage.internal_gains:
|
||||||
|
@ -169,11 +169,11 @@ class InselMonthlyEnergyBalance:
|
||||||
infiltration_day = 0
|
infiltration_day = 0
|
||||||
for value in schedule.values:
|
for value in schedule.values:
|
||||||
if value == 0:
|
if value == 0:
|
||||||
infiltration_day += internal_zone.thermal_zones[0].infiltration_rate_system_off / 24
|
infiltration_day += internal_zone.thermal_zones_from_internal_zones[0].infiltration_rate_system_off / 24
|
||||||
ventilation_day += 0
|
ventilation_day += 0
|
||||||
else:
|
else:
|
||||||
ventilation_value = usage.mechanical_air_change * value
|
ventilation_value = usage.mechanical_air_change * value
|
||||||
infiltration_value = internal_zone.thermal_zones[0].infiltration_rate_system_off * value
|
infiltration_value = internal_zone.thermal_zones_from_internal_zones[0].infiltration_rate_system_off * value
|
||||||
if ventilation_value >= infiltration_value:
|
if ventilation_value >= infiltration_value:
|
||||||
ventilation_day += ventilation_value / 24
|
ventilation_day += ventilation_value / 24
|
||||||
infiltration_day += 0
|
infiltration_day += 0
|
||||||
|
|
|
@ -65,7 +65,7 @@ class LoadsCalculation:
|
||||||
"""
|
"""
|
||||||
heating_load_transmitted = 0
|
heating_load_transmitted = 0
|
||||||
for internal_zone in self._building.internal_zones:
|
for internal_zone in self._building.internal_zones:
|
||||||
for thermal_zone in internal_zone.thermal_zones:
|
for thermal_zone in internal_zone.thermal_zones_from_internal_zones:
|
||||||
internal_temperature = thermal_zone.thermal_control.mean_heating_set_point
|
internal_temperature = thermal_zone.thermal_control.mean_heating_set_point
|
||||||
heating_load_transmitted += self._get_load_transmitted(thermal_zone, internal_temperature, ambient_temperature,
|
heating_load_transmitted += self._get_load_transmitted(thermal_zone, internal_temperature, ambient_temperature,
|
||||||
ground_temperature)
|
ground_temperature)
|
||||||
|
@ -78,7 +78,7 @@ class LoadsCalculation:
|
||||||
"""
|
"""
|
||||||
cooling_load_transmitted = 0
|
cooling_load_transmitted = 0
|
||||||
for internal_zone in self._building.internal_zones:
|
for internal_zone in self._building.internal_zones:
|
||||||
for thermal_zone in internal_zone.thermal_zones:
|
for thermal_zone in internal_zone.thermal_zones_from_internal_zones:
|
||||||
internal_temperature = thermal_zone.thermal_control.mean_cooling_set_point
|
internal_temperature = thermal_zone.thermal_control.mean_cooling_set_point
|
||||||
cooling_load_transmitted += self._get_load_transmitted(thermal_zone, internal_temperature, ambient_temperature,
|
cooling_load_transmitted += self._get_load_transmitted(thermal_zone, internal_temperature, ambient_temperature,
|
||||||
ground_temperature)
|
ground_temperature)
|
||||||
|
@ -91,7 +91,7 @@ class LoadsCalculation:
|
||||||
"""
|
"""
|
||||||
heating_ventilation_load = 0
|
heating_ventilation_load = 0
|
||||||
for internal_zone in self._building.internal_zones:
|
for internal_zone in self._building.internal_zones:
|
||||||
for thermal_zone in internal_zone.thermal_zones:
|
for thermal_zone in internal_zone.thermal_zones_from_internal_zones:
|
||||||
internal_temperature = thermal_zone.thermal_control.mean_heating_set_point
|
internal_temperature = thermal_zone.thermal_control.mean_heating_set_point
|
||||||
heating_ventilation_load += self._get_load_ventilation(thermal_zone, internal_temperature, ambient_temperature)
|
heating_ventilation_load += self._get_load_ventilation(thermal_zone, internal_temperature, ambient_temperature)
|
||||||
return heating_ventilation_load
|
return heating_ventilation_load
|
||||||
|
@ -103,7 +103,7 @@ class LoadsCalculation:
|
||||||
"""
|
"""
|
||||||
cooling_ventilation_load = 0
|
cooling_ventilation_load = 0
|
||||||
for internal_zone in self._building.internal_zones:
|
for internal_zone in self._building.internal_zones:
|
||||||
for thermal_zone in internal_zone.thermal_zones:
|
for thermal_zone in internal_zone.thermal_zones_from_internal_zones:
|
||||||
internal_temperature = thermal_zone.thermal_control.mean_cooling_set_point
|
internal_temperature = thermal_zone.thermal_control.mean_cooling_set_point
|
||||||
cooling_ventilation_load += self._get_load_ventilation(thermal_zone, internal_temperature, ambient_temperature)
|
cooling_ventilation_load += self._get_load_ventilation(thermal_zone, internal_temperature, ambient_temperature)
|
||||||
return cooling_ventilation_load
|
return cooling_ventilation_load
|
||||||
|
@ -117,7 +117,7 @@ class LoadsCalculation:
|
||||||
cooling_load_lighting = 0
|
cooling_load_lighting = 0
|
||||||
cooling_load_equipment_sensible = 0
|
cooling_load_equipment_sensible = 0
|
||||||
for internal_zone in self._building.internal_zones:
|
for internal_zone in self._building.internal_zones:
|
||||||
for thermal_zone in internal_zone.thermal_zones:
|
for thermal_zone in internal_zone.thermal_zones_from_internal_zones:
|
||||||
cooling_load_occupancy_sensible += (thermal_zone.occupancy.sensible_convective_internal_gain
|
cooling_load_occupancy_sensible += (thermal_zone.occupancy.sensible_convective_internal_gain
|
||||||
+ thermal_zone.occupancy.sensible_radiative_internal_gain) \
|
+ thermal_zone.occupancy.sensible_radiative_internal_gain) \
|
||||||
* thermal_zone.footprint_area
|
* thermal_zone.footprint_area
|
||||||
|
@ -139,7 +139,7 @@ class LoadsCalculation:
|
||||||
"""
|
"""
|
||||||
cooling_load_radiation = 0
|
cooling_load_radiation = 0
|
||||||
for internal_zone in self._building.internal_zones:
|
for internal_zone in self._building.internal_zones:
|
||||||
for thermal_zone in internal_zone.thermal_zones:
|
for thermal_zone in internal_zone.thermal_zones_from_internal_zones:
|
||||||
for thermal_boundary in thermal_zone.thermal_boundaries:
|
for thermal_boundary in thermal_zone.thermal_boundaries:
|
||||||
for thermal_opening in thermal_boundary.thermal_openings:
|
for thermal_opening in thermal_boundary.thermal_openings:
|
||||||
radiation = thermal_boundary.parent_surface.global_irradiance[cte.HOUR][irradiance_format][hour]
|
radiation = thermal_boundary.parent_surface.global_irradiance[cte.HOUR][irradiance_format][hour]
|
||||||
|
|
|
@ -6,8 +6,6 @@ Project Coder Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from hub.imports.construction.helpers.storeys_generation import StoreysGeneration
|
from hub.imports.construction.helpers.storeys_generation import StoreysGeneration
|
||||||
from hub.city_model_structure.building_demand.thermal_zone import ThermalZone
|
|
||||||
from hub.city_model_structure.building_demand.thermal_boundary import ThermalBoundary
|
|
||||||
|
|
||||||
|
|
||||||
class ThermalZonesCreation:
|
class ThermalZonesCreation:
|
||||||
|
@ -50,28 +48,6 @@ class ThermalZonesCreation:
|
||||||
# thermal_boundary.window_ratio = \
|
# thermal_boundary.window_ratio = \
|
||||||
# float(catalog_construction.window_ratio['west']) / 100
|
# float(catalog_construction.window_ratio['west']) / 100
|
||||||
|
|
||||||
@property
|
|
||||||
def thermal_zones_from_internal_zones(self) -> [ThermalZone]:
|
|
||||||
"""
|
|
||||||
Create and get thermal zones as 1 per each internal zone
|
|
||||||
:return: [ThermalZone]
|
|
||||||
"""
|
|
||||||
_thermal_zones = []
|
|
||||||
_thermal_boundaries = []
|
|
||||||
for internal_zone in self._building.internal_zones:
|
|
||||||
for surface in internal_zone.surfaces:
|
|
||||||
if surface.holes_polygons is None:
|
|
||||||
windows_areas = None
|
|
||||||
else:
|
|
||||||
windows_areas = []
|
|
||||||
for hole in surface.holes_polygons:
|
|
||||||
windows_areas.append(hole.area)
|
|
||||||
_thermal_boundary = ThermalBoundary(surface, surface.solid_polygon.area, windows_areas)
|
|
||||||
_thermal_boundaries.append(_thermal_boundary)
|
|
||||||
_thermal_zone = ThermalZone(_thermal_boundaries, internal_zone, internal_zone.volume, internal_zone.floor_area)
|
|
||||||
_thermal_zones.append(_thermal_zone)
|
|
||||||
return _thermal_zones
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def thermal_zones_from_storeys(self):
|
def thermal_zones_from_storeys(self):
|
||||||
"""
|
"""
|
||||||
|
@ -85,49 +61,7 @@ class ThermalZonesCreation:
|
||||||
building.average_storey_height = archetype.average_storey_height
|
building.average_storey_height = archetype.average_storey_height
|
||||||
thermal_zones = StoreysGeneration(building, building.internal_zones[0],
|
thermal_zones = StoreysGeneration(building, building.internal_zones[0],
|
||||||
divide_in_storeys=divide_in_storeys).thermal_zones
|
divide_in_storeys=divide_in_storeys).thermal_zones
|
||||||
building.internal_zones[0].thermal_zones = thermal_zones
|
building.internal_zones[0].thermal_zones_from_internal_zones = thermal_zones
|
||||||
|
|
||||||
# todo: verify windows
|
|
||||||
@staticmethod
|
|
||||||
def _calculate_view_factors(thermal_zone):
|
|
||||||
"""
|
|
||||||
Get thermal zone view factors matrix
|
|
||||||
:return: [[float]]
|
|
||||||
"""
|
|
||||||
total_area = 0
|
|
||||||
for thermal_boundary in thermal_zone.thermal_boundaries:
|
|
||||||
total_area += thermal_boundary.opaque_area
|
|
||||||
for thermal_opening in thermal_boundary.thermal_openings:
|
|
||||||
total_area += thermal_opening.area
|
|
||||||
|
|
||||||
view_factors_matrix = []
|
|
||||||
for thermal_boundary_1 in thermal_zone.thermal_boundaries:
|
|
||||||
values = []
|
|
||||||
for thermal_boundary_2 in thermal_zone.thermal_boundaries:
|
|
||||||
value = 0
|
|
||||||
if thermal_boundary_1.id != thermal_boundary_2.id:
|
|
||||||
value = thermal_boundary_2.opaque_area / (total_area - thermal_boundary_1.opaque_area)
|
|
||||||
values.append(value)
|
|
||||||
for thermal_boundary in thermal_zone.thermal_boundaries:
|
|
||||||
for thermal_opening in thermal_boundary.thermal_openings:
|
|
||||||
value = thermal_opening.area / (total_area - thermal_boundary_1.opaque_area)
|
|
||||||
values.append(value)
|
|
||||||
view_factors_matrix.append(values)
|
|
||||||
|
|
||||||
for thermal_boundary_1 in thermal_zone.thermal_boundaries:
|
|
||||||
values = []
|
|
||||||
for thermal_opening_1 in thermal_boundary_1.thermal_openings:
|
|
||||||
for thermal_boundary_2 in thermal_zone.thermal_boundaries:
|
|
||||||
value = thermal_boundary_2.opaque_area / (total_area - thermal_opening_1.area)
|
|
||||||
values.append(value)
|
|
||||||
for thermal_boundary in thermal_zone.thermal_boundaries:
|
|
||||||
for thermal_opening_2 in thermal_boundary.thermal_openings:
|
|
||||||
value = 0
|
|
||||||
if thermal_opening_1.id != thermal_opening_2.id:
|
|
||||||
value = thermal_opening_2.area / (total_area - thermal_opening_1.area)
|
|
||||||
values.append(value)
|
|
||||||
view_factors_matrix.append(values)
|
|
||||||
thermal_zone.view_factors_matrix = view_factors_matrix
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _search_construction_in_archetype(archetype, construction_type):
|
def _search_construction_in_archetype(archetype, construction_type):
|
||||||
|
|
|
@ -45,12 +45,12 @@ class InselMonthlyEnergyBalance:
|
||||||
domestic_hot_water_demand = []
|
domestic_hot_water_demand = []
|
||||||
lighting_demand = []
|
lighting_demand = []
|
||||||
appliances_demand = []
|
appliances_demand = []
|
||||||
if building.internal_zones[0].thermal_zones is None:
|
if building.internal_zones[0].thermal_zones_from_internal_zones is None:
|
||||||
domestic_hot_water_demand = [0] * 12
|
domestic_hot_water_demand = [0] * 12
|
||||||
lighting_demand = [0] * 12
|
lighting_demand = [0] * 12
|
||||||
appliances_demand = [0] * 12
|
appliances_demand = [0] * 12
|
||||||
else:
|
else:
|
||||||
thermal_zone = building.internal_zones[0].thermal_zones[0]
|
thermal_zone = building.internal_zones[0].thermal_zones_from_internal_zones[0]
|
||||||
area = thermal_zone.total_floor_area
|
area = thermal_zone.total_floor_area
|
||||||
cold_water = building.cold_water_temperature[cte.MONTH]['epw']
|
cold_water = building.cold_water_temperature[cte.MONTH]['epw']
|
||||||
peak_flow = thermal_zone.domestic_hot_water.peak_flow
|
peak_flow = thermal_zone.domestic_hot_water.peak_flow
|
||||||
|
|
|
@ -58,7 +58,7 @@ class CityObject(Models):
|
||||||
self.wall_area = wall_area
|
self.wall_area = wall_area
|
||||||
window_ratio = 0
|
window_ratio = 0
|
||||||
for internal_zone in building.internal_zones:
|
for internal_zone in building.internal_zones:
|
||||||
for thermal_zone in internal_zone.thermal_zones:
|
for thermal_zone in internal_zone.thermal_zones_from_internal_zones:
|
||||||
for thermal_boundary in thermal_zone.thermal_boundaries:
|
for thermal_boundary in thermal_zone.thermal_boundaries:
|
||||||
window_ratio = thermal_boundary.window_ratio
|
window_ratio = thermal_boundary.window_ratio
|
||||||
break
|
break
|
||||||
|
|
|
@ -106,7 +106,7 @@ class TestConstructionFactory(TestCase):
|
||||||
self.assertIsNotNone(building.shell, 'building shell is none')
|
self.assertIsNotNone(building.shell, 'building shell is none')
|
||||||
|
|
||||||
def _check_thermal_zones(self, internal_zone):
|
def _check_thermal_zones(self, internal_zone):
|
||||||
for thermal_zone in internal_zone.thermal_zones:
|
for thermal_zone in internal_zone.thermal_zones_from_internal_zones:
|
||||||
self.assertIsNotNone(thermal_zone.id, 'thermal_zone id is none')
|
self.assertIsNotNone(thermal_zone.id, 'thermal_zone id is none')
|
||||||
self.assertIsNotNone(thermal_zone.footprint_area, 'thermal_zone floor area is none')
|
self.assertIsNotNone(thermal_zone.footprint_area, 'thermal_zone floor area is none')
|
||||||
self.assertTrue(len(thermal_zone.thermal_boundaries) > 0, 'thermal_zone thermal_boundaries not defined')
|
self.assertTrue(len(thermal_zone.thermal_boundaries) > 0, 'thermal_zone thermal_boundaries not defined')
|
||||||
|
@ -133,7 +133,7 @@ class TestConstructionFactory(TestCase):
|
||||||
for thermal_boundary in thermal_zone.thermal_boundaries:
|
for thermal_boundary in thermal_zone.thermal_boundaries:
|
||||||
self.assertIsNotNone(thermal_boundary.id, 'thermal_boundary id is none')
|
self.assertIsNotNone(thermal_boundary.id, 'thermal_boundary id is none')
|
||||||
self.assertIsNotNone(thermal_boundary.parent_surface, 'thermal_boundary surface is none')
|
self.assertIsNotNone(thermal_boundary.parent_surface, 'thermal_boundary surface is none')
|
||||||
self.assertIsNotNone(thermal_boundary.thermal_zones, 'thermal_boundary delimits no thermal zone')
|
self.assertIsNotNone(thermal_boundary.thermal_zones_from_internal_zones, 'thermal_boundary delimits no thermal zone')
|
||||||
self.assertIsNotNone(thermal_boundary.opaque_area, 'thermal_boundary area is none')
|
self.assertIsNotNone(thermal_boundary.opaque_area, 'thermal_boundary area is none')
|
||||||
self.assertIsNotNone(thermal_boundary.thickness, 'thermal_boundary thickness is none')
|
self.assertIsNotNone(thermal_boundary.thickness, 'thermal_boundary thickness is none')
|
||||||
self.assertIsNotNone(thermal_boundary.type, 'thermal_boundary type is none')
|
self.assertIsNotNone(thermal_boundary.type, 'thermal_boundary type is none')
|
||||||
|
@ -184,7 +184,7 @@ class TestConstructionFactory(TestCase):
|
||||||
for building in city.buildings:
|
for building in city.buildings:
|
||||||
for internal_zone in building.internal_zones:
|
for internal_zone in building.internal_zones:
|
||||||
self._check_thermal_zones(internal_zone)
|
self._check_thermal_zones(internal_zone)
|
||||||
for thermal_zone in internal_zone.thermal_zones:
|
for thermal_zone in internal_zone.thermal_zones_from_internal_zones:
|
||||||
self._check_thermal_boundaries(thermal_zone)
|
self._check_thermal_boundaries(thermal_zone)
|
||||||
for thermal_boundary in thermal_zone.thermal_boundaries:
|
for thermal_boundary in thermal_zone.thermal_boundaries:
|
||||||
self.assertIsNotNone(thermal_boundary.layers, 'layers is none')
|
self.assertIsNotNone(thermal_boundary.layers, 'layers is none')
|
||||||
|
@ -202,7 +202,7 @@ class TestConstructionFactory(TestCase):
|
||||||
for building in city.buildings:
|
for building in city.buildings:
|
||||||
for internal_zone in building.internal_zones:
|
for internal_zone in building.internal_zones:
|
||||||
self._check_thermal_zones(internal_zone)
|
self._check_thermal_zones(internal_zone)
|
||||||
for thermal_zone in internal_zone.thermal_zones:
|
for thermal_zone in internal_zone.thermal_zones_from_internal_zones:
|
||||||
self._check_thermal_boundaries(thermal_zone)
|
self._check_thermal_boundaries(thermal_zone)
|
||||||
for thermal_boundary in thermal_zone.thermal_boundaries:
|
for thermal_boundary in thermal_zone.thermal_boundaries:
|
||||||
self.assertIsNotNone(thermal_boundary.layers, 'layers is none')
|
self.assertIsNotNone(thermal_boundary.layers, 'layers is none')
|
||||||
|
@ -220,7 +220,7 @@ class TestConstructionFactory(TestCase):
|
||||||
for building in city.buildings:
|
for building in city.buildings:
|
||||||
for internal_zone in building.internal_zones:
|
for internal_zone in building.internal_zones:
|
||||||
self._check_thermal_zones(internal_zone)
|
self._check_thermal_zones(internal_zone)
|
||||||
for thermal_zone in internal_zone.thermal_zones:
|
for thermal_zone in internal_zone.thermal_zones_from_internal_zones:
|
||||||
self._check_thermal_boundaries(thermal_zone)
|
self._check_thermal_boundaries(thermal_zone)
|
||||||
for thermal_boundary in thermal_zone.thermal_boundaries:
|
for thermal_boundary in thermal_zone.thermal_boundaries:
|
||||||
self.assertIsNotNone(thermal_boundary.layers, 'layers is none')
|
self.assertIsNotNone(thermal_boundary.layers, 'layers is none')
|
||||||
|
@ -238,7 +238,7 @@ class TestConstructionFactory(TestCase):
|
||||||
for building in city.buildings:
|
for building in city.buildings:
|
||||||
for internal_zone in building.internal_zones:
|
for internal_zone in building.internal_zones:
|
||||||
self._check_thermal_zones(internal_zone)
|
self._check_thermal_zones(internal_zone)
|
||||||
for thermal_zone in internal_zone.thermal_zones:
|
for thermal_zone in internal_zone.thermal_zones_from_internal_zones:
|
||||||
self._check_thermal_boundaries(thermal_zone)
|
self._check_thermal_boundaries(thermal_zone)
|
||||||
for thermal_boundary in thermal_zone.thermal_boundaries:
|
for thermal_boundary in thermal_zone.thermal_boundaries:
|
||||||
self.assertIsNotNone(thermal_boundary.layers, 'layers is none')
|
self.assertIsNotNone(thermal_boundary.layers, 'layers is none')
|
||||||
|
@ -256,7 +256,7 @@ class TestConstructionFactory(TestCase):
|
||||||
for building in city.buildings:
|
for building in city.buildings:
|
||||||
for internal_zone in building.internal_zones:
|
for internal_zone in building.internal_zones:
|
||||||
self._check_thermal_zones(internal_zone)
|
self._check_thermal_zones(internal_zone)
|
||||||
for thermal_zone in internal_zone.thermal_zones:
|
for thermal_zone in internal_zone.thermal_zones_from_internal_zones:
|
||||||
self._check_thermal_boundaries(thermal_zone)
|
self._check_thermal_boundaries(thermal_zone)
|
||||||
for thermal_boundary in thermal_zone.thermal_boundaries:
|
for thermal_boundary in thermal_zone.thermal_boundaries:
|
||||||
self.assertIsNotNone(thermal_boundary.layers, 'layers is none')
|
self.assertIsNotNone(thermal_boundary.layers, 'layers is none')
|
||||||
|
@ -277,7 +277,7 @@ class TestConstructionFactory(TestCase):
|
||||||
for building in city.buildings:
|
for building in city.buildings:
|
||||||
for internal_zone in building.internal_zones:
|
for internal_zone in building.internal_zones:
|
||||||
self._check_thermal_zones(internal_zone)
|
self._check_thermal_zones(internal_zone)
|
||||||
for thermal_zone in internal_zone.thermal_zones:
|
for thermal_zone in internal_zone.thermal_zones_from_internal_zones:
|
||||||
self._check_thermal_boundaries(thermal_zone)
|
self._check_thermal_boundaries(thermal_zone)
|
||||||
for thermal_boundary in thermal_zone.thermal_boundaries:
|
for thermal_boundary in thermal_zone.thermal_boundaries:
|
||||||
self.assertIsNotNone(thermal_boundary.layers, 'layers is none')
|
self.assertIsNotNone(thermal_boundary.layers, 'layers is none')
|
||||||
|
@ -299,7 +299,7 @@ class TestConstructionFactory(TestCase):
|
||||||
for building in city.buildings:
|
for building in city.buildings:
|
||||||
for internal_zone in building.internal_zones:
|
for internal_zone in building.internal_zones:
|
||||||
self._check_thermal_zones(internal_zone)
|
self._check_thermal_zones(internal_zone)
|
||||||
for thermal_zone in internal_zone.thermal_zones:
|
for thermal_zone in internal_zone.thermal_zones_from_internal_zones:
|
||||||
self._check_thermal_boundaries(thermal_zone)
|
self._check_thermal_boundaries(thermal_zone)
|
||||||
for thermal_boundary in thermal_zone.thermal_boundaries:
|
for thermal_boundary in thermal_zone.thermal_boundaries:
|
||||||
self.assertIsNotNone(thermal_boundary.layers, 'layers is none')
|
self.assertIsNotNone(thermal_boundary.layers, 'layers is none')
|
||||||
|
@ -321,7 +321,7 @@ class TestConstructionFactory(TestCase):
|
||||||
for building in city.buildings:
|
for building in city.buildings:
|
||||||
for internal_zone in building.internal_zones:
|
for internal_zone in building.internal_zones:
|
||||||
self._check_thermal_zones(internal_zone)
|
self._check_thermal_zones(internal_zone)
|
||||||
for thermal_zone in internal_zone.thermal_zones:
|
for thermal_zone in internal_zone.thermal_zones_from_internal_zones:
|
||||||
self._check_thermal_boundaries(thermal_zone)
|
self._check_thermal_boundaries(thermal_zone)
|
||||||
for thermal_boundary in thermal_zone.thermal_boundaries:
|
for thermal_boundary in thermal_zone.thermal_boundaries:
|
||||||
self.assertIsNotNone(thermal_boundary.layers, 'layers is none')
|
self.assertIsNotNone(thermal_boundary.layers, 'layers is none')
|
||||||
|
|
|
@ -115,7 +115,7 @@ class TestExports(TestCase):
|
||||||
self.assertIsNotNone(building.basement_heated, f'building {building.name} basement_heated is none')
|
self.assertIsNotNone(building.basement_heated, f'building {building.name} basement_heated is none')
|
||||||
for internal_zone in building.internal_zones:
|
for internal_zone in building.internal_zones:
|
||||||
self.assertIsNotNone(internal_zone.area, f'internal zone {internal_zone.id} area is none')
|
self.assertIsNotNone(internal_zone.area, f'internal zone {internal_zone.id} area is none')
|
||||||
for thermal_zone in internal_zone.thermal_zones:
|
for thermal_zone in internal_zone.thermal_zones_from_internal_zones:
|
||||||
self.assertIsNotNone(thermal_zone.indirectly_heated_area_ratio, f'thermal zone {thermal_zone.id} '
|
self.assertIsNotNone(thermal_zone.indirectly_heated_area_ratio, f'thermal zone {thermal_zone.id} '
|
||||||
f'indirectly_heated_area_ratio is none')
|
f'indirectly_heated_area_ratio is none')
|
||||||
self.assertIsNotNone(thermal_zone.effective_thermal_capacity, f'thermal zone {thermal_zone.id} '
|
self.assertIsNotNone(thermal_zone.effective_thermal_capacity, f'thermal zone {thermal_zone.id} '
|
||||||
|
|
|
@ -38,7 +38,7 @@ class TestGeometryFactory(TestCase):
|
||||||
self.assertIsNot(len(internal_zone.usages), 0, 'no building usages defined')
|
self.assertIsNot(len(internal_zone.usages), 0, 'no building usages defined')
|
||||||
for usage in internal_zone.usages:
|
for usage in internal_zone.usages:
|
||||||
self.assertIsNotNone(usage.id, 'usage id is none')
|
self.assertIsNotNone(usage.id, 'usage id is none')
|
||||||
for thermal_zone in internal_zone.thermal_zones:
|
for thermal_zone in internal_zone.thermal_zones_from_internal_zones:
|
||||||
self._check_thermal_zone(thermal_zone)
|
self._check_thermal_zone(thermal_zone)
|
||||||
|
|
||||||
def _check_buildings(self, city):
|
def _check_buildings(self, city):
|
||||||
|
@ -46,7 +46,7 @@ class TestGeometryFactory(TestCase):
|
||||||
self.assertIsNotNone(building.internal_zones, 'no internal zones created')
|
self.assertIsNotNone(building.internal_zones, 'no internal zones created')
|
||||||
for internal_zone in building.internal_zones:
|
for internal_zone in building.internal_zones:
|
||||||
self.assertIsNotNone(internal_zone.usages, 'usage zones are not defined')
|
self.assertIsNotNone(internal_zone.usages, 'usage zones are not defined')
|
||||||
self.assertIsNotNone(internal_zone.thermal_zones, 'thermal zones are not defined')
|
self.assertIsNotNone(internal_zone.thermal_zones_from_internal_zones, 'thermal zones are not defined')
|
||||||
self.assertIsNone(building.basement_heated, 'building basement_heated is not none')
|
self.assertIsNone(building.basement_heated, 'building basement_heated is not none')
|
||||||
self.assertIsNone(building.attic_heated, 'building attic_heated is not none')
|
self.assertIsNone(building.attic_heated, 'building attic_heated is not none')
|
||||||
self.assertIsNotNone(building.average_storey_height, 'building average_storey_height is none')
|
self.assertIsNotNone(building.average_storey_height, 'building average_storey_height is none')
|
||||||
|
@ -105,7 +105,7 @@ class TestGeometryFactory(TestCase):
|
||||||
if usage_key == 'comnet':
|
if usage_key == 'comnet':
|
||||||
for building in city.buildings:
|
for building in city.buildings:
|
||||||
for internal_zone in building.internal_zones:
|
for internal_zone in building.internal_zones:
|
||||||
for thermal_zone in internal_zone.thermal_zones:
|
for thermal_zone in internal_zone.thermal_zones_from_internal_zones:
|
||||||
self._check_extra_thermal_zone(thermal_zone)
|
self._check_extra_thermal_zone(thermal_zone)
|
||||||
# usage factory called first
|
# usage factory called first
|
||||||
city = self._get_citygml(file)
|
city = self._get_citygml(file)
|
||||||
|
@ -117,7 +117,7 @@ class TestGeometryFactory(TestCase):
|
||||||
if usage_key == 'comnet':
|
if usage_key == 'comnet':
|
||||||
for building in city.buildings:
|
for building in city.buildings:
|
||||||
for internal_zone in building.internal_zones:
|
for internal_zone in building.internal_zones:
|
||||||
for thermal_zone in internal_zone.thermal_zones:
|
for thermal_zone in internal_zone.thermal_zones_from_internal_zones:
|
||||||
self._check_extra_thermal_zone(thermal_zone)
|
self._check_extra_thermal_zone(thermal_zone)
|
||||||
|
|
||||||
def _test_pluto(self, file):
|
def _test_pluto(self, file):
|
||||||
|
@ -135,7 +135,7 @@ class TestGeometryFactory(TestCase):
|
||||||
if usage_key == 'comnet':
|
if usage_key == 'comnet':
|
||||||
for building in city.buildings:
|
for building in city.buildings:
|
||||||
for internal_zone in building.internal_zones:
|
for internal_zone in building.internal_zones:
|
||||||
for thermal_zone in internal_zone.thermal_zones:
|
for thermal_zone in internal_zone.thermal_zones_from_internal_zones:
|
||||||
self._check_extra_thermal_zone(thermal_zone)
|
self._check_extra_thermal_zone(thermal_zone)
|
||||||
# usage factory called first
|
# usage factory called first
|
||||||
city = self._get_citygml(file)
|
city = self._get_citygml(file)
|
||||||
|
@ -147,7 +147,7 @@ class TestGeometryFactory(TestCase):
|
||||||
if usage_key == 'comnet':
|
if usage_key == 'comnet':
|
||||||
for building in city.buildings:
|
for building in city.buildings:
|
||||||
for internal_zone in building.internal_zones:
|
for internal_zone in building.internal_zones:
|
||||||
for thermal_zone in internal_zone.thermal_zones:
|
for thermal_zone in internal_zone.thermal_zones_from_internal_zones:
|
||||||
self._check_extra_thermal_zone(thermal_zone)
|
self._check_extra_thermal_zone(thermal_zone)
|
||||||
|
|
||||||
def test_enrichment(self):
|
def test_enrichment(self):
|
||||||
|
|
|
@ -62,7 +62,7 @@ class TestGeometryFactory(TestCase):
|
||||||
self.assertIsNotNone(building.internal_zones, 'building internal zones is none')
|
self.assertIsNotNone(building.internal_zones, 'building internal zones is none')
|
||||||
for internal_zone in building.internal_zones:
|
for internal_zone in building.internal_zones:
|
||||||
self.assertIsNone(internal_zone.usages, 'usage zones are defined')
|
self.assertIsNone(internal_zone.usages, 'usage zones are defined')
|
||||||
self.assertIsNone(internal_zone.thermal_zones, 'thermal zones are defined')
|
self.assertIsNone(internal_zone.thermal_zones_from_internal_zones, 'thermal zones are defined')
|
||||||
self.assertIsNone(building.basement_heated, 'building basement_heated is not none')
|
self.assertIsNone(building.basement_heated, 'building basement_heated is not none')
|
||||||
self.assertIsNone(building.attic_heated, 'building attic_heated is not none')
|
self.assertIsNone(building.attic_heated, 'building attic_heated is not none')
|
||||||
self.assertIsNone(building.terrains, 'building terrains is not none')
|
self.assertIsNone(building.terrains, 'building terrains is not none')
|
||||||
|
|
|
@ -115,7 +115,7 @@ class TestExports(TestCase):
|
||||||
self.assertIsNotNone(building.basement_heated, f'building {building.name} basement_heated is none')
|
self.assertIsNotNone(building.basement_heated, f'building {building.name} basement_heated is none')
|
||||||
for internal_zone in building.internal_zones:
|
for internal_zone in building.internal_zones:
|
||||||
self.assertIsNotNone(internal_zone.area, f'internal zone {internal_zone.id} area is none')
|
self.assertIsNotNone(internal_zone.area, f'internal zone {internal_zone.id} area is none')
|
||||||
for thermal_zone in internal_zone.thermal_zones:
|
for thermal_zone in internal_zone.thermal_zones_from_internal_zones:
|
||||||
self.assertIsNotNone(thermal_zone.indirectly_heated_area_ratio, f'thermal zone {thermal_zone.id} '
|
self.assertIsNotNone(thermal_zone.indirectly_heated_area_ratio, f'thermal zone {thermal_zone.id} '
|
||||||
f'indirectly_heated_area_ratio is none')
|
f'indirectly_heated_area_ratio is none')
|
||||||
self.assertIsNotNone(thermal_zone.effective_thermal_capacity, f'thermal zone {thermal_zone.id} '
|
self.assertIsNotNone(thermal_zone.effective_thermal_capacity, f'thermal zone {thermal_zone.id} '
|
||||||
|
|
Loading…
Reference in New Issue
Block a user