diff --git a/hub/city_model_structure/building_demand/thermal_boundary.py b/hub/city_model_structure/building_demand/thermal_boundary.py index f38049ee..d17a5b45 100644 --- a/hub/city_model_structure/building_demand/thermal_boundary.py +++ b/hub/city_model_structure/building_demand/thermal_boundary.py @@ -36,7 +36,9 @@ class ThermalBoundary: self._thickness = None self._internal_surface = None self._window_ratio = None - self._window_ratio_is_calculated = False + self._window_ratio_to_be_calculated = False + if self._windows_areas is not None: + self._window_ratio_to_be_calculated = True @property def id(self): @@ -101,18 +103,7 @@ class ThermalBoundary: :return: None or [ThermalOpening] """ if self._thermal_openings is None: - if self.window_ratio is not None: - if self.window_ratio == 0: - self._thermal_openings = [] - else: - thermal_opening = ThermalOpening() - if self.window_ratio == 1: - _area = self.opaque_area - else: - _area = self.opaque_area * self.window_ratio / (1-self.window_ratio) - thermal_opening.area = _area - self._thermal_openings = [thermal_opening] - else: + if self.windows_areas is not None: if len(self.windows_areas) > 0: self._thermal_openings = [] for window_area in self.windows_areas: @@ -121,6 +112,42 @@ class ThermalBoundary: self._thermal_openings.append(thermal_opening) else: self._thermal_openings = [] + else: + if self.window_ratio is not None: + if self.window_ratio == 0: + self._thermal_openings = [] + else: + thermal_opening = ThermalOpening() + if self.window_ratio == 1: + _area = self.opaque_area + else: + _area = self.opaque_area * self.window_ratio / (1-self.window_ratio) + thermal_opening.area = _area + self._thermal_openings = [thermal_opening] + else: + self._thermal_openings = [] + else: + if self.windows_areas is not None: + return self._thermal_openings + if self.window_ratio is not None: + if self.window_ratio == 0: + self._thermal_openings = [] + else: + if len(self._thermal_openings) == 0: + thermal_opening = ThermalOpening() + if self.window_ratio == 1: + _area = self.opaque_area + else: + _area = self.opaque_area * self.window_ratio / (1-self.window_ratio) + thermal_opening.area = _area + self._thermal_openings = [thermal_opening] + else: + for _thermal_opening in self._thermal_openings: + if self.window_ratio == 1: + _area = self.opaque_area + else: + _area = self.opaque_area * self.window_ratio / (1-self.window_ratio) + _thermal_opening.area = _area return self._thermal_openings @property @@ -174,16 +201,14 @@ class ThermalBoundary: If none of those sources are available, it returns None. :return: float """ - if self.windows_areas is not None: - if not self._window_ratio_is_calculated: - _calculated = True - if len(self.windows_areas) == 0: - self._window_ratio = 0 - else: - total_window_area = 0 - for window_area in self.windows_areas: - total_window_area += window_area - self._window_ratio = total_window_area / (self.opaque_area + total_window_area) + if self._window_ratio_to_be_calculated: + if len(self.windows_areas) == 0: + self._window_ratio = 0 + else: + total_window_area = 0 + for window_area in self.windows_areas: + total_window_area += window_area + self._window_ratio = total_window_area / (self.opaque_area + total_window_area) return self._window_ratio @window_ratio.setter @@ -192,7 +217,7 @@ class ThermalBoundary: Set thermal boundary window ratio :param value: str """ - if self._window_ratio_is_calculated: + if self._window_ratio_to_be_calculated: raise ValueError('Window ratio cannot be assigned when the windows are defined in the geometry.') self._window_ratio = float(value) diff --git a/hub/exports/building_energy/insel/insel_monthly_energy_balance.py b/hub/exports/building_energy/insel/insel_monthly_energy_balance.py index 5121f17f..ad836d62 100644 --- a/hub/exports/building_energy/insel/insel_monthly_energy_balance.py +++ b/hub/exports/building_energy/insel/insel_monthly_energy_balance.py @@ -44,25 +44,25 @@ class InselMonthlyEnergyBalance: self._insel_files_paths.append(building.name + '.insel') file_name_out = building.name + '.out' output_path = Path(self._path / file_name_out).resolve() - if building.internal_zones is not None: - for internal_zone in building.internal_zones: - if internal_zone.thermal_zones is None: - logging.warning('Building %s has missing values. Monthly Energy Balance cannot be processed', building.name) - break - self._contents.append( - self._generate_meb_template(building, output_path, self._radiation_calculation_method, self._weather_format, self._custom_insel_block) - ) + if building.thermal_zones is None: + logging.warning('Building %s has missing values. Monthly Energy Balance cannot be processed', building.name) + + self._contents.append( + self._generate_meb_template(building, output_path, self._radiation_calculation_method, self._weather_format, self._custom_insel_block) + ) self._export() @staticmethod - def _add_block(file, block_number, block_type, inputs='', parameters=''): + def _add_block(file, block_number, block_type, inputs=None, parameters=None): file += "S " + str(block_number) + " " + block_type + "\n" - for block_input in inputs: - file += str(block_input) + "\n" - if len(parameters) > 0: - file += "P " + str(block_number) + "\n" - for block_parameter in parameters: - file += str(block_parameter) + "\n" + if inputs is not None: + for block_input in inputs: + file += str(block_input) + "\n" + if parameters is not None: + if len(parameters) > 0: + file += "P " + str(block_number) + "\n" + for block_parameter in parameters: + file += str(block_parameter) + "\n" return file def _export(self): @@ -222,6 +222,7 @@ class InselMonthlyEnergyBalance: parameters.append(0.0) parameters.append(0.0) else: + print(window_area, thermal_boundary.thermal_openings) thermal_opening = thermal_boundary.thermal_openings[0] parameters.append(thermal_opening.frame_ratio) parameters.append(thermal_opening.overall_u_value)