From a41a7ef8014d4046110891c7be792b5912c9acd7 Mon Sep 17 00:00:00 2001 From: Pilar Date: Mon, 18 Oct 2021 11:37:20 -0400 Subject: [PATCH 1/2] New classes to integrate Saeeds work: heat_pump.py and the imports --- city_model_structure/EnergySystem.py | 22 +++++++ .../energy_systems/heat_pump.py | 46 +++++++-------- .../energy_systems/heat_pumps/Air Source.xlsx | Bin 0 -> 105875 bytes .../xlsx_heat_pump_parameters.py | 26 +++++++++ imports/energy_systems_factory.py | 33 +++++++++++ imports/usage/ashrae_usage_parameters.py | 55 ++++++++++++++++++ imports/usage_factory.py | 9 ++- 7 files changed, 165 insertions(+), 26 deletions(-) create mode 100644 city_model_structure/EnergySystem.py create mode 100644 data/energy_systems/heat_pumps/Air Source.xlsx create mode 100644 imports/energy_systems/xlsx_heat_pump_parameters.py create mode 100644 imports/energy_systems_factory.py create mode 100644 imports/usage/ashrae_usage_parameters.py diff --git a/city_model_structure/EnergySystem.py b/city_model_structure/EnergySystem.py new file mode 100644 index 00000000..6df539d6 --- /dev/null +++ b/city_model_structure/EnergySystem.py @@ -0,0 +1,22 @@ +""" +EnergySystem module +SPDX - License - Identifier: LGPL - 3.0 - or -later +Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +""" + +from city_model_structure.city_object import CityObject +from city_model_structure.energy_systems.heat_pump import HeatPump + + +class EnergySystem(CityObject): + """ + EnergySystem(CityObject) class + """ + def __init__(self, name, lod, surfaces, city_lower_corner): + super().__init__(name, lod, surfaces, city_lower_corner) + self._heat_pump = None + + @property + def heat_pump(self) -> HeatPump: + return self._heat_pump + diff --git a/city_model_structure/energy_systems/heat_pump.py b/city_model_structure/energy_systems/heat_pump.py index 753fa2ee..7c22f0b3 100644 --- a/city_model_structure/energy_systems/heat_pump.py +++ b/city_model_structure/energy_systems/heat_pump.py @@ -12,39 +12,35 @@ class HeatPump: HeatPump class """ def __init__(self): - self._seasonal_mean_cop = None - self._seasonal_mean_coverage_factor = None + self._model = None + self._cooling_pf = None + self._cooling_pa = None + self._cooling_qw = None + self._heating_pf = None + self._heating_pa = None + self._heating_qw = None @property - def seasonal_mean_cop(self) -> Union[None, float]: + def model(self): """ - Get seasonal mean COP (-) - :return: None or float + Get model name + :return: str """ - return self._seasonal_mean_cop - - @seasonal_mean_cop.setter - def seasonal_mean_cop(self, value): - """ - Set seasonal mean COP (-) - :param value: float - """ - if value is not None: - self._seasonal_mean_cop = float(value) + return self._model @property - def seasonal_mean_coverage_factor(self) -> Union[None, float]: + def cooling_pf(self): """ - Get percentage of demand covered by the hp (-) - :return: None or float + Get cooling capacity in kW + :return: [[float]] """ - return self._seasonal_mean_coverage_factor + return self._cooling_pf - @seasonal_mean_coverage_factor.setter - def seasonal_mean_coverage_factor(self, value): + @cooling_pf.setter + def cooling_pf(self, value): """ - Set percentage of demand covered by the hp (-) - :return: float + Set cooling capacity in kW + :param value: [[float]] """ - if value is not None: - self._seasonal_mean_coverage_factor = float(value) + if self._cooling_pf is None: + self._cooling_pf = value diff --git a/data/energy_systems/heat_pumps/Air Source.xlsx b/data/energy_systems/heat_pumps/Air Source.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..c0ea122f7ff2b916671eec40912df50c829ce43b GIT binary patch literal 105875 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 literal 0 HcmV?d00001 diff --git a/imports/energy_systems/xlsx_heat_pump_parameters.py b/imports/energy_systems/xlsx_heat_pump_parameters.py new file mode 100644 index 00000000..a93e52d3 --- /dev/null +++ b/imports/energy_systems/xlsx_heat_pump_parameters.py @@ -0,0 +1,26 @@ +""" +XlsxHeatPumpParameters import the heat pump information +SPDX - License - Identifier: LGPL - 3.0 - or -later +Copyright © 2020 Project Author +Contributor Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +""" + + +class XlsxHeatPumpParameters: + """ + XlsxHeatPumpParameters class + """ + def __init__(self, city, base_path): + self._city = city + self._base_path = (base_path / 'heat_pumps/Air source.xlsx') + + def _read_file(self): + """ + reads xlsx file containing the heat pump information + """ + + def enrich_city(self): + """ + Enriches the city with information from file + """ + return self._city diff --git a/imports/energy_systems_factory.py b/imports/energy_systems_factory.py new file mode 100644 index 00000000..ecc2f30d --- /dev/null +++ b/imports/energy_systems_factory.py @@ -0,0 +1,33 @@ +""" +EnergySystemsFactory retrieve the energy system module for the given region +SPDX - License - Identifier: LGPL - 3.0 - or -later +Copyright © 2020 Project Author Pilar Monsalvete pilar.monsalvete@concordi.ca +""" +from pathlib import Path +from imports.energy_systems.xlsx_heat_pump_parameters import XlsxHeatPumpParameters + + +class EnergySystemsFactory: + """ + EnergySystemsFactory class + """ + def __init__(self, handler, city, base_path=None): + if base_path is None: + base_path = Path(Path(__file__).parent.parent / 'data/energy_systems') + self._handler = '_' + handler.lower().replace(' ', '_') + self._city = city + self._base_path = base_path + + def _xlsxheatpump(self): + """ + Enrich the city by using xlsx heat pump information + """ + XlsxHeatPumpParameters(self._city, self._base_path).enrich_city() + + def enrich(self): + """ + Enrich the city given to the class using the class given handler + :return: None + """ + getattr(self, self._handler, lambda: None)() + diff --git a/imports/usage/ashrae_usage_parameters.py b/imports/usage/ashrae_usage_parameters.py new file mode 100644 index 00000000..1bfb98bd --- /dev/null +++ b/imports/usage/ashrae_usage_parameters.py @@ -0,0 +1,55 @@ +""" +AshraeUsageParameters model the usage properties +SPDX - License - Identifier: LGPL - 3.0 - or -later +Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +""" +import sys + +from imports.geometry.helpers.geometry_helper import GeometryHelper as gh +from city_model_structure.building_demand.usage_zone import UsageZone + + +class AshraeUsageParameters: + """ + AshraeUsageParameters class + """ + def __init__(self, city, base_path): + super().__init__(base_path, 'ashrae_archetypes.xml') + self._city = city + self._usage_archetypes = None + + def enrich_buildings(self): + """ + Returns the city with the usage parameters assigned to the buildings + :return: + """ + city = self._city + for building in city.buildings: + archetype = self._search_archetype(building.function) + if archetype is None: + sys.stderr.write(f'Building {building.name} has unknown archetype for building function:' + f' {building.function}, that assigns building usage as ' + f'{gh.usage_from_function(building.function)}\n') + continue + # todo: what to do with mix-usage usage from gml? + mix_usage = False + if not mix_usage: + # just one usage_zone + for thermal_zone in building.thermal_zones: + usage_zone = UsageZone() + usage_zone.volume = thermal_zone.volume + self._assign_values(usage_zone, archetype) + thermal_zone.usage_zones = [usage_zone] + + def _search_archetype(self, building_usage): + for building_archetype in self._usage_archetypes: + if building_archetype.usage == building_usage: + return building_archetype + return None + + @staticmethod + def _assign_values(usage_zone, archetype): + usage_zone.usage = archetype.usage + usage_zone.occupancy_density = archetype.occupancy_density + # todo: should I use this value: self._min_air_change?? + usage_zone.minimum_ventilation_rate = archetype.minimum_ventilation_rate diff --git a/imports/usage_factory.py b/imports/usage_factory.py index 8e99c6e9..763a6dba 100644 --- a/imports/usage_factory.py +++ b/imports/usage_factory.py @@ -3,11 +3,12 @@ UsageFactory retrieve the specific usage module for the given region This factory can only be called after calling the construction factory so the thermal zones are created. 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 """ from pathlib import Path from imports.usage.hft_usage_parameters import HftUsageParameters from imports.usage.ca_usage_parameters import CaUsageParameters - +from imports.usage.ashrae_usage_parameters import AshraeUsageParameters # todo: handle missing lambda and rise error. @@ -38,6 +39,12 @@ class UsageFactory: """ return CaUsageParameters(self._city, self._base_path).enrich_buildings() + def _ashrae(self): + """ + Enrich the city by using ASHRAE information + """ + AshraeUsageParameters(self._city, self._base_path).enrich_buildings() + def enrich(self): """ Enrich the city given to the class using the usage factory given handler From 5794ea09f7c96931680980b9fc2a1be0c3d58d02 Mon Sep 17 00:00:00 2001 From: Pilar Date: Mon, 18 Oct 2021 16:07:18 -0400 Subject: [PATCH 2/2] New classes for traffic group --- city_model_structure/building.py | 10 +++ .../building_demand/household.py | 31 ++++++++ .../transport/origin_destination_edge.py | 37 ++++++++++ .../transport/origin_destination_network.py | 24 ++++++ .../transport/origin_destination_node.py | 74 +++++++++++++++++++ .../transport/traffic_edge.py | 4 +- .../transport/traffic_network.py | 2 +- .../transport/traffic_node.py | 4 +- 8 files changed, 181 insertions(+), 5 deletions(-) create mode 100644 city_model_structure/building_demand/household.py create mode 100644 city_model_structure/transport/origin_destination_edge.py create mode 100644 city_model_structure/transport/origin_destination_network.py create mode 100644 city_model_structure/transport/origin_destination_node.py diff --git a/city_model_structure/building.py b/city_model_structure/building.py index 7605dc03..9e144141 100644 --- a/city_model_structure/building.py +++ b/city_model_structure/building.py @@ -13,6 +13,7 @@ from city_model_structure.building_demand.thermal_boundary import ThermalBoundar from city_model_structure.building_demand.usage_zone import UsageZone from city_model_structure.building_demand.storey import Storey from city_model_structure.city_object import CityObject +from city_model_structure.building_demand.household import Household class Building(CityObject): @@ -22,6 +23,7 @@ class Building(CityObject): def __init__(self, name, lod, surfaces, year_of_construction, function, city_lower_corner, terrains=None): super().__init__(name, lod, surfaces, city_lower_corner) + self._households = None self._basement_heated = None self._attic_heated = None self._terrains = terrains @@ -352,3 +354,11 @@ class Building(CityObject): else: self._thermal_boundaries.append(thermal_boundary) return self._thermal_boundaries + + @property + def households(self) -> List[Household]: + """ + Get the list of households inside the building + :return: List[Household] + """ + return self._households diff --git a/city_model_structure/building_demand/household.py b/city_model_structure/building_demand/household.py new file mode 100644 index 00000000..251c8dbd --- /dev/null +++ b/city_model_structure/building_demand/household.py @@ -0,0 +1,31 @@ +""" +Household module +SPDX - License - Identifier: LGPL - 3.0 - or -later +Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +""" + + +class Household: + """ + Household class + """ + + def __init__(self): + self._number_of_people = None + self._number_of_cars = None + + @property + def number_of_people(self): + """ + Get number of people leaving in the household + :return: int + """ + return self._number_of_people + + @property + def number_of_cars(self): + """ + Get number of cars owned by the householders + :return: int + """ + return self._number_of_cars diff --git a/city_model_structure/transport/origin_destination_edge.py b/city_model_structure/transport/origin_destination_edge.py new file mode 100644 index 00000000..c3d3f3c1 --- /dev/null +++ b/city_model_structure/transport/origin_destination_edge.py @@ -0,0 +1,37 @@ +""" +Origin-Destination edge module +SPDX - License - Identifier: LGPL - 3.0 - or -later +Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca + +""" + +from city_model_structure.attributes.edge import Edge +from city_model_structure.attributes.schedule import Schedule + + +class OriginDestinationEdge(Edge): + """ + OriginDestinationEdge class + Each edge is unidirectional and starts at the "from" node and ends at the "to" node + """ + + def __init__(self, name, nodes, edge_type='OriginDestinationEdge'): + super().__init__(name, nodes) + self._edge_type = edge_type + self._movement_schedule = None + + @property + def edge_type(self): + """ + Get the edge type + :return: str + """ + return self._edge_type + + @property + def movement_schedule(self) -> Schedule: + """ + Get the schedule of the movement of people along this edge + :return: Schedule + """ + return self._movement_schedule diff --git a/city_model_structure/transport/origin_destination_network.py b/city_model_structure/transport/origin_destination_network.py new file mode 100644 index 00000000..b23bb01c --- /dev/null +++ b/city_model_structure/transport/origin_destination_network.py @@ -0,0 +1,24 @@ +""" +Origin-Destination network module +SPDX - License - Identifier: LGPL - 3.0 - or -later +Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +""" + +from city_model_structure.network import Network + + +class OriginDestinationNetwork(Network): + """ + OriginDestinationNetwork(Network) class + """ + def __init__(self, name, edges=None, nodes=None): + super().__init__(name, edges, nodes) + self._type = "OriginDestinationNetwork" + + @property + def type(self): + """ + Get network type + :return: str + """ + return self._type diff --git a/city_model_structure/transport/origin_destination_node.py b/city_model_structure/transport/origin_destination_node.py new file mode 100644 index 00000000..5e46e92d --- /dev/null +++ b/city_model_structure/transport/origin_destination_node.py @@ -0,0 +1,74 @@ +""" +Origin-Destination node module +SPDX - License - Identifier: LGPL - 3.0 - or -later +Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +""" +from typing import List + +from city_model_structure.attributes.node import Node +from city_model_structure.attributes.point import Point +from city_model_structure.attributes.polygon import Polygon +from city_model_structure.city_object import CityObject + + +class OriginDestinationNode(Node): + """ + OriginDestinationNode class + """ + + def __init__(self, name, coordinates, node_type='OriginDestinationNode', edges=None, polygon=None): + super().__init__(name, edges) + self._coordinates = coordinates + self._node_type = node_type + self._polygon = polygon + self._land_use_types = None + self._city_objects = None + + @property + def node_type(self): + """ + Get node type + :return: str + """ + return self._node_type + + @property + def coordinates(self) -> Point: + """ + Get node coordinates + :return: Point + """ + return self._coordinates + + @coordinates.setter + def coordinates(self, value): + """ + Set node coordinates + :param value: Point + """ + self._coordinates = value + + @property + def polygon(self) -> Polygon: + """ + Get node polygon that defines the zone represented by the node + :return: Polygon + """ + return self._polygon + + @property + def land_use_types(self) -> dict: + """ + Get land use types inside the node polygon. It returns a dictionary with the types of land use together with the + percentage of the land that corresponds to each type + :return: {string : float} + """ + return self._land_use_types + + @property + def city_objects(self) -> List[CityObject]: + """ + Get the list of city objects place inside the zone + :return: List[CityObject] + """ + return self._city_objects diff --git a/city_model_structure/transport/traffic_edge.py b/city_model_structure/transport/traffic_edge.py index 5f8578e5..1fd77299 100644 --- a/city_model_structure/transport/traffic_edge.py +++ b/city_model_structure/transport/traffic_edge.py @@ -1,5 +1,5 @@ """ -Edge module +Traffic edge module SPDX - License - Identifier: LGPL - 3.0 - or -later Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca Contributor Milad milad.aghamohamadnia@concordia.ca @@ -13,7 +13,7 @@ from city_model_structure.transport.lane import Lane class TrafficEdge(Edge): """ - Edge class + TrafficEdge class Each edge is unidirectional and starts at the "from" node and ends at the "to" node """ diff --git a/city_model_structure/transport/traffic_network.py b/city_model_structure/transport/traffic_network.py index 5b5406d1..27e30096 100644 --- a/city_model_structure/transport/traffic_network.py +++ b/city_model_structure/transport/traffic_network.py @@ -11,7 +11,7 @@ from city_model_structure.network import Network class TrafficNetwork(Network): """ - TrafficNetwork(CityObject) class + TrafficNetwork(Network) class """ def __init__(self, name, edges=None, nodes=None): super().__init__(name, edges, nodes) diff --git a/city_model_structure/transport/traffic_node.py b/city_model_structure/transport/traffic_node.py index 375660bb..3008cf97 100644 --- a/city_model_structure/transport/traffic_node.py +++ b/city_model_structure/transport/traffic_node.py @@ -1,5 +1,5 @@ """ -Node module +TrafficNode module SPDX - License - Identifier: LGPL - 3.0 - or -later Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca Contributor Milad milad.aghamohamadnia@concordia.ca @@ -17,7 +17,7 @@ from city_model_structure.transport.connection import Connection class TrafficNode(Node): """ - Node class + TrafficNode class """ def __init__(self, name, coordinates, node_type='TrafficNode', edges=None, prohibitions=None, connections=None):