solved a problem with the number of storages in the calculation of ACH

This commit is contained in:
Pilar Monsalvete 2023-05-29 14:13:57 -04:00
parent fd215d9ae9
commit 82b72e78c7
8 changed files with 35 additions and 25 deletions

View File

@ -260,6 +260,9 @@ class Building(CityObject):
Get building storeys number above ground Get building storeys number above ground
:return: None or int :return: None or int
""" """
if self._storeys_above_ground is None:
if self.eave_height is not None and self.average_storey_height is not None:
self._storeys_above_ground = int(self.eave_height / self.average_storey_height)
return self._storeys_above_ground return self._storeys_above_ground
@storeys_above_ground.setter @storeys_above_ground.setter

View File

@ -201,7 +201,6 @@ class NrcanPhysicsParameters:
@staticmethod @staticmethod
def _create_storeys(building, archetype, divide_in_storeys): def _create_storeys(building, archetype, divide_in_storeys):
building.average_storey_height = archetype.average_storey_height building.average_storey_height = archetype.average_storey_height
building.storeys_above_ground = 1
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 = thermal_zones

View File

@ -188,7 +188,6 @@ class NrelPhysicsParameters:
@staticmethod @staticmethod
def _create_storeys(building, archetype, divide_in_storeys): def _create_storeys(building, archetype, divide_in_storeys):
building.average_storey_height = archetype.average_storey_height building.average_storey_height = archetype.average_storey_height
building.storeys_above_ground = 1
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 = thermal_zones

View File

@ -49,18 +49,29 @@ class NrcanUsageParameters:
logging.error(f'Building {building.name} has unknown usage archetype for usage: {comnet_usage_name}\n') logging.error(f'Building {building.name} has unknown usage archetype for usage: {comnet_usage_name}\n')
continue continue
storeys = int(building.eave_height / building.average_storey_height)
volume_per_area = building.volume / building.floor_area / storeys
for internal_zone in building.internal_zones: for internal_zone in building.internal_zones:
if internal_zone.area is None:
raise Exception('Internal zone area not defined, ACH cannot be calculated')
if internal_zone.volume is None:
raise Exception('Internal zone volume not defined, ACH cannot be calculated')
if internal_zone.area <= 0:
raise Exception('Internal zone area is zero, ACH cannot be calculated')
if len(building.internal_zones) > 1: if len(building.internal_zones) > 1:
volume_per_area = internal_zone.volume / internal_zone.area volume_per_area = 0
if internal_zone.area is None:
logging.error(f'Building {building.name} has internal zone area not defined, '
f'ACH cannot be calculated for usage: {usage_name}\n')
continue
if internal_zone.volume is None:
logging.error(f'Building {building.name} has internal zone volume not defined, '
f'ACH cannot be calculated for usage: {usage_name}\n')
continue
if internal_zone.area <= 0:
logging.error(f'Building {building.name} has internal zone area equal to 0, '
f'ACH cannot be calculated for usage: {usage_name}\n')
continue
volume_per_area += internal_zone.volume / internal_zone.area
else:
if building.storeys_above_ground is None:
logging.error(f'Building {building.name} no number of storeys assigned, '
f'ACH cannot be calculated for usage: {usage_name}\n')
continue
volume_per_area = building.volume / building.floor_area / building.storeys_above_ground
usage = Usage() usage = Usage()
usage.name = usage_name usage.name = usage_name
self._assign_values(usage, archetype_usage, volume_per_area, building.cold_water_temperature) self._assign_values(usage, archetype_usage, volume_per_area, building.cold_water_temperature)

View File

@ -38,9 +38,9 @@ class TestConstructionCatalog(TestCase):
constructions = catalog.names('constructions') constructions = catalog.names('constructions')
windows = catalog.names('windows') windows = catalog.names('windows')
materials = catalog.names('materials') materials = catalog.names('materials')
self.assertEqual(180, len(constructions['constructions'])) self.assertEqual(540, len(constructions['constructions']))
self.assertEqual(36, len(windows['windows'])) self.assertEqual(96, len(windows['windows']))
self.assertEqual(192, len(materials['materials'])) self.assertEqual(552, len(materials['materials']))
with self.assertRaises(ValueError): with self.assertRaises(ValueError):
catalog.names('unknown') catalog.names('unknown')

View File

@ -253,6 +253,7 @@ TestDBFactory
control.database.delete_city(city_id) control.database.delete_city(city_id)
@classmethod @classmethod
@unittest.skipIf(control.skip_test, control.skip_reason)
def tearDownClass(cls): def tearDownClass(cls):
control.database.delete_application(control.application_uuid) control.database.delete_application(control.application_uuid)
control.database.delete_user(control.user_id) control.database.delete_user(control.user_id)

View File

@ -91,9 +91,10 @@ class TestGeometryFactory(TestCase):
def _test_hft(self, file): def _test_hft(self, file):
_construction_keys = ['nrel'] _construction_keys = ['nrel']
_usage_keys = ['comnet', 'nrcan'] _usage_keys = ['comnet']
for construction_key in _construction_keys: for construction_key in _construction_keys:
for usage_key in _usage_keys: for usage_key in _usage_keys:
print(construction_key, usage_key)
# construction factory called first # construction factory called first
city = self._get_citygml(file) city = self._get_citygml(file)
for building in city.buildings: for building in city.buildings:
@ -151,12 +152,10 @@ class TestGeometryFactory(TestCase):
def test_enrichment(self): def test_enrichment(self):
""" """
Test enrichment of the city with different order and all possible combinations Test enrichment of the city with different orders
:return: None :return: None
""" """
file_1 = 'one_building_in_kelowna.gml' file_1 = 'one_building_in_kelowna.gml'
self._test_hft(file_1) self._test_hft(file_1)
file_2 = 'pluto_building.gml' file_2 = 'C40_Final.gml'
self._test_pluto(file_2) self._test_hft(file_2)
file_3 = 'C40_Final.gml'
self._test_hft(file_3)

View File

@ -8,6 +8,7 @@ from pathlib import Path
from unittest import TestCase from unittest import TestCase
from hub.imports.geometry_factory import GeometryFactory from hub.imports.geometry_factory import GeometryFactory
from hub.imports.construction_factory import ConstructionFactory
from hub.imports.usage_factory import UsageFactory from hub.imports.usage_factory import UsageFactory
from hub.helpers.dictionaries import Dictionaries from hub.helpers.dictionaries import Dictionaries
@ -53,20 +54,16 @@ class TestUsageFactory(TestCase):
for internal_zone in building.internal_zones: for internal_zone in building.internal_zones:
if internal_zone.usages is not None: if internal_zone.usages is not None:
self.assertTrue(len(internal_zone.usages) > 0, 'usage zones are not defined') self.assertTrue(len(internal_zone.usages) > 0, 'usage zones are not defined')
self.assertIsNone(internal_zone.thermal_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')
self.assertIsNotNone(building.year_of_construction, 'building year_of_construction is none') self.assertIsNotNone(building.year_of_construction, 'building year_of_construction is none')
self.assertIsNotNone(building.function, 'building function is none') self.assertIsNotNone(building.function, 'building function is none')
self.assertIsNone(building.average_storey_height, 'building average_storey_height is not none')
self.assertIsNone(building.storeys_above_ground, 'building storeys_above_ground is not none')
self.assertEqual(len(building.heating), 0, 'building heating is not none') self.assertEqual(len(building.heating), 0, 'building heating is not none')
self.assertEqual(len(building.cooling), 0, 'building cooling is not none') self.assertEqual(len(building.cooling), 0, 'building cooling is not none')
self.assertIsNotNone(building.eave_height, 'building eave height is none') self.assertIsNotNone(building.eave_height, 'building eave height is none')
self.assertIsNotNone(building.roof_type, 'building roof type is none') self.assertIsNotNone(building.roof_type, 'building roof type is none')
self.assertIsNotNone(building.floor_area, 'building floor_area is none') self.assertIsNotNone(building.floor_area, 'building floor_area is none')
self.assertIsNone(building.households, 'building households is not none')
def _check_usage(self, usage): def _check_usage(self, usage):
self.assertIsNotNone(usage.name, 'usage is none') self.assertIsNotNone(usage.name, 'usage is none')
@ -142,6 +139,7 @@ class TestUsageFactory(TestCase):
function_field='CODE_UTILI', function_field='CODE_UTILI',
function_to_hub=Dictionaries().montreal_function_to_hub_function).city function_to_hub=Dictionaries().montreal_function_to_hub_function).city
ConstructionFactory('nrcan', city).enrich()
UsageFactory('nrcan', city).enrich() UsageFactory('nrcan', city).enrich()
self._check_buildings(city) self._check_buildings(city)
for building in city.buildings: for building in city.buildings: