From 7af71db19df39a36f85757d6b38c6d1e715faf12 Mon Sep 17 00:00:00 2001 From: Pilar Date: Wed, 20 Oct 2021 10:24:01 -0400 Subject: [PATCH 01/17] modified name of class due to an error in the format --- city_model_structure/energy_system.py | 37 +++++---------------------- 1 file changed, 7 insertions(+), 30 deletions(-) diff --git a/city_model_structure/energy_system.py b/city_model_structure/energy_system.py index 04ab3681..6df539d6 100644 --- a/city_model_structure/energy_system.py +++ b/city_model_structure/energy_system.py @@ -2,7 +2,6 @@ EnergySystem module SPDX - License - Identifier: LGPL - 3.0 - or -later Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca -Contributor Peter Yefi peteryefi@gmail.com """ from city_model_structure.city_object import CityObject @@ -10,36 +9,14 @@ 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 - def __init__(self, name, lod, surfaces, city_lower_corner): - super().__init__(name, lod, surfaces, city_lower_corner) - self._heat_pump = None - self._type = 'energy_system' + @property + def heat_pump(self) -> HeatPump: + return self._heat_pump - @property - def heat_pump(self) -> HeatPump: - """ - Heat pump energy system - :return: - """ - return self._heat_pump - - @heat_pump.setter - def heat_pump(self, value): - """ - Set heat pumm for energy system - :param value: HeatPump - """ - if self._heat_pump is None: - self._heat_pump = value - - @property - def type(self) -> str: - """ - Type of city object - :return: str - """ - return self._type From 41f79b189ac2eafaf2e5b7df3c57d44f4c454002 Mon Sep 17 00:00:00 2001 From: Pilar Date: Fri, 22 Oct 2021 11:28:22 -0400 Subject: [PATCH 02/17] added the belonging specific edges and nodes to origind-destination and traffic networks --- .../transport/origin_destination_network.py | 19 +++++++++++++++++++ .../transport/traffic_network.py | 19 +++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/city_model_structure/transport/origin_destination_network.py b/city_model_structure/transport/origin_destination_network.py index b23bb01c..973317c6 100644 --- a/city_model_structure/transport/origin_destination_network.py +++ b/city_model_structure/transport/origin_destination_network.py @@ -4,7 +4,10 @@ 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.network import Network +from city_model_structure.transport.origin_destination_edge import OriginDestinationEdge +from city_model_structure.transport.origin_destination_node import OriginDestinationNode class OriginDestinationNetwork(Network): @@ -22,3 +25,19 @@ class OriginDestinationNetwork(Network): :return: str """ return self._type + + @property + def edges(self) -> List[OriginDestinationEdge]: + """ + Get network edges + :return: [OriginDestinationEdge] + """ + return self._edges + + @property + def nodes(self) -> List[OriginDestinationNode]: + """ + Get network nodes + :return: [OriginDestinationNode] + """ + return self._nodes diff --git a/city_model_structure/transport/traffic_network.py b/city_model_structure/transport/traffic_network.py index 27e30096..e473f6da 100644 --- a/city_model_structure/transport/traffic_network.py +++ b/city_model_structure/transport/traffic_network.py @@ -6,7 +6,10 @@ Contributor Milad milad.aghamohamadnia@concordia.ca Contributor Guille guille.gutierrezmorote@concordia.ca """ +from typing import List from city_model_structure.network import Network +from city_model_structure.transport.traffic_edge import TrafficEdge +from city_model_structure.transport.traffic_node import TrafficNode class TrafficNetwork(Network): @@ -24,3 +27,19 @@ class TrafficNetwork(Network): :return: str """ return self._type + + @property + def edges(self) -> List[TrafficEdge]: + """ + Get network edges + :return: [TrafficEdge] + """ + return self._edges + + @property + def nodes(self) -> List[TrafficNode]: + """ + Get network nodes + :return: [TrafficNode] + """ + return self._nodes From 0a75cf46e67b31831563c18eaad43981d1b5b36d Mon Sep 17 00:00:00 2001 From: Pilar Date: Fri, 22 Oct 2021 13:13:12 -0400 Subject: [PATCH 03/17] added many new classes needed for the transportation group models. The documentation is not done because it is needed the students feed-back --- city_model_structure/attributes/edge.py | 2 +- city_model_structure/attributes/node.py | 8 ++- city_model_structure/attributes/record.py | 28 ++++++++ .../attributes/time_series.py | 26 +++++++ city_model_structure/bus_system.py | 40 +++++++++++ city_model_structure/energy_system.py | 2 +- city_model_structure/network.py | 3 +- city_model_structure/transport/bus.py | 70 +++++++++++++++++++ city_model_structure/transport/bus_depot.py | 26 +++++++ city_model_structure/transport/bus_edge.py | 41 +++++++++++ city_model_structure/transport/bus_network.py | 43 ++++++++++++ city_model_structure/transport/bus_node.py | 54 ++++++++++++++ city_model_structure/transport/bus_stop.py | 39 +++++++++++ city_model_structure/transport/connection.py | 2 +- city_model_structure/transport/crossing.py | 2 +- .../transport/fast_charging_infrastructure.py | 23 ++++++ city_model_structure/transport/join.py | 2 +- city_model_structure/transport/lane.py | 2 +- .../transport/origin_destination_edge.py | 12 +++- .../transport/origin_destination_network.py | 2 +- .../transport/origin_destination_node.py | 11 ++- city_model_structure/transport/phase.py | 2 +- .../transport/traffic_edge.py | 11 ++- .../transport/traffic_light.py | 2 +- .../transport/traffic_network.py | 2 +- .../transport/traffic_node.py | 14 +++- .../transport/walkway_node.py | 2 +- 27 files changed, 452 insertions(+), 19 deletions(-) create mode 100644 city_model_structure/attributes/record.py create mode 100644 city_model_structure/attributes/time_series.py create mode 100644 city_model_structure/bus_system.py create mode 100644 city_model_structure/transport/bus.py create mode 100644 city_model_structure/transport/bus_depot.py create mode 100644 city_model_structure/transport/bus_edge.py create mode 100644 city_model_structure/transport/bus_network.py create mode 100644 city_model_structure/transport/bus_node.py create mode 100644 city_model_structure/transport/bus_stop.py create mode 100644 city_model_structure/transport/fast_charging_infrastructure.py diff --git a/city_model_structure/attributes/edge.py b/city_model_structure/attributes/edge.py index 2235f096..3a156ed8 100644 --- a/city_model_structure/attributes/edge.py +++ b/city_model_structure/attributes/edge.py @@ -1,7 +1,7 @@ """ Node module SPDX - License - Identifier: LGPL - 3.0 - or -later -Copyright © 2020 Project Author Guille Gutierrez guillermo.gutierrezmorote@concordia.ca +Copyright © 2021 Project Author Guille Gutierrez guillermo.gutierrezmorote@concordia.ca Contributor Milad milad.aghamohamadnia@concordia.ca """ import uuid diff --git a/city_model_structure/attributes/node.py b/city_model_structure/attributes/node.py index 65e769fd..50b617c6 100644 --- a/city_model_structure/attributes/node.py +++ b/city_model_structure/attributes/node.py @@ -1,12 +1,13 @@ """ Node module SPDX - License - Identifier: LGPL - 3.0 - or -later -Copyright © 2020 Project Author Guille Gutierrez guillermo.gutierrezmorote@concordia.ca +Copyright © 2021 Project Author Guille Gutierrez guillermo.gutierrezmorote@concordia.ca Contributor Milad milad.aghamohamadnia@concordia.ca """ import uuid from typing import List, TypeVar +from city_model_structure.attributes.time_series import TimeSeries Edge = TypeVar('Edge') @@ -21,6 +22,7 @@ class Node: self._name = name self._id = None self._edges = edges + self._time_series = None @property def name(self): @@ -47,3 +49,7 @@ class Node: :return: [Edge] """ return self._edges + + @property + def time_series(self) -> TimeSeries: + return self._time_series diff --git a/city_model_structure/attributes/record.py b/city_model_structure/attributes/record.py new file mode 100644 index 00000000..294bb8b9 --- /dev/null +++ b/city_model_structure/attributes/record.py @@ -0,0 +1,28 @@ +""" +Record module +SPDX - License - Identifier: LGPL - 3.0 - or -later +Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +""" + + +class Record: + """ + Record class + """ + + def __init__(self, time=None, value=None, flag=None): + self._time = time + self._value = value + self._flag = flag + + @property + def time(self): + return self._time + + @property + def value(self): + return self._value + + @property + def flag(self): + return self._flag diff --git a/city_model_structure/attributes/time_series.py b/city_model_structure/attributes/time_series.py new file mode 100644 index 00000000..83301bb5 --- /dev/null +++ b/city_model_structure/attributes/time_series.py @@ -0,0 +1,26 @@ +""" +Time series module +SPDX - License - Identifier: LGPL - 3.0 - or -later +Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +""" + +from typing import List +from city_model_structure.attributes.record import Record + + +class TimeSeries: + """ + TimeSeries class + """ + + def __init__(self, time_series_type=None, records=None): + self._time_series_type = time_series_type + self._records = records + + @property + def time_series_type(self): + return self._time_series_type + + @property + def records(self) -> List[Record]: + return self._records diff --git a/city_model_structure/bus_system.py b/city_model_structure/bus_system.py new file mode 100644 index 00000000..171903e6 --- /dev/null +++ b/city_model_structure/bus_system.py @@ -0,0 +1,40 @@ +""" +Bus system module +SPDX - License - Identifier: LGPL - 3.0 - or -later +Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +""" + +from typing import List +from city_model_structure.city_object import CityObject +from city_model_structure.attributes.polygon import Polygon +from city_model_structure.transport.bus_network import BusNetwork +from city_model_structure.transport.bus_node import BusNode +from city_model_structure.transport.bus import Bus + + +class BusSystem(CityObject): + """ + BusSystem(CityObject) class + """ + def __init__(self, name, lod, surfaces, city_lower_corner): + super().__init__(name, lod, surfaces, city_lower_corner) + self._bus_routes = None + self._bus_network = None + self._buses = None + self._restricted_polygons = None + + @property + def bus_routes(self) -> List[BusNode]: + return self._bus_routes + + @property + def bus_network(self) -> BusNetwork: + return self._bus_network + + @property + def buses(self) -> List[Bus]: + return self._buses + + @property + def restricted_polygons(self) -> List[Polygon]: + return self._restricted_polygons diff --git a/city_model_structure/energy_system.py b/city_model_structure/energy_system.py index 6df539d6..f648001a 100644 --- a/city_model_structure/energy_system.py +++ b/city_model_structure/energy_system.py @@ -1,7 +1,7 @@ """ EnergySystem module SPDX - License - Identifier: LGPL - 3.0 - or -later -Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca """ from city_model_structure.city_object import CityObject diff --git a/city_model_structure/network.py b/city_model_structure/network.py index 869c7107..ae3d0186 100644 --- a/city_model_structure/network.py +++ b/city_model_structure/network.py @@ -1,9 +1,10 @@ """ Network module SPDX - License - Identifier: LGPL - 3.0 - or -later -Copyright © 2020 Project Author Guille Gutierrez guillermo.gutierrezmorote@concordia.ca +Copyright © 2021 Project Author Guille Gutierrez guillermo.gutierrezmorote@concordia.ca Contributor Milad milad.aghamohamadnia@concordia.ca """ + import uuid from typing import List diff --git a/city_model_structure/transport/bus.py b/city_model_structure/transport/bus.py new file mode 100644 index 00000000..708d0a6d --- /dev/null +++ b/city_model_structure/transport/bus.py @@ -0,0 +1,70 @@ +""" +Bus module +SPDX - License - Identifier: LGPL - 3.0 - or -later +Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +""" + +from city_model_structure.attributes.schedule import Schedule + + +class Bus: + """ + Bus class + """ + + def __init__(self): + self._maintenance_time = None + self._charging_time = None + self._recovery_time = None + self._vehicle_type = None + self._energy_consumption = None + self._trips_schedule = None + self._capacity = None + self._maintenance_cost = None + self._investment_cost = None + self._charging_range = None + self._maximum_travel_range = None + + @property + def maintenance_time(self): + return self._maintenance_time + + @property + def charging_time(self): + return self._charging_time + + @property + def recovery_time(self): + return self.maintenance_time + self.charging_time + + @property + def vehicle_type(self): + return self._vehicle_type + + @property + def energy_consumption(self): + return self._energy_consumption + + @property + def trips_schedule(self) -> Schedule: + return self._trips_schedule + + @property + def capacity(self): + return self._capacity + + @property + def maintenance_cost(self): + return self._maintenance_cost + + @property + def investment_cost(self): + return self._investment_cost + + @property + def charging_range(self): + return self._charging_range + + @property + def maximum_travel_range(self): + return self._maximum_travel_range diff --git a/city_model_structure/transport/bus_depot.py b/city_model_structure/transport/bus_depot.py new file mode 100644 index 00000000..3bda6c66 --- /dev/null +++ b/city_model_structure/transport/bus_depot.py @@ -0,0 +1,26 @@ +""" +Bus depot module +SPDX - License - Identifier: LGPL - 3.0 - or -later +Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +""" + +from city_model_structure.transport.bus_node import BusNode + + +class BusDepot(BusNode): + """ + BusDepot class + """ + + def __init__(self, name, coordinates, edges=None): + super().__init__(name, coordinates, edges=edges, node_type='BusDepot') + self._number_of_charging_poles = None + self._number_of_available_buses = None + + @property + def number_of_charging_poles(self): + return self._number_of_charging_poles + + @property + def number_of_available_buses(self): + return self._number_of_available_buses diff --git a/city_model_structure/transport/bus_edge.py b/city_model_structure/transport/bus_edge.py new file mode 100644 index 00000000..9d9f967a --- /dev/null +++ b/city_model_structure/transport/bus_edge.py @@ -0,0 +1,41 @@ +""" +Bus edge module +SPDX - License - Identifier: LGPL - 3.0 - or -later +Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +""" + +from typing import List +from city_model_structure.attributes.edge import Edge +from city_model_structure.transport.bus_node import BusNode + + +class BusEdge(Edge): + """ + BusEdge class + Each edge is unidirectional and starts at the "from" node and ends at the "to" node + """ + + def __init__(self, name, nodes, edge_type='BusEdge'): + super().__init__(name, nodes) + self._edge_type = edge_type + self._average_travel_time = None + + @property + def edge_type(self): + """ + Get the edge type + :return: str + """ + return self._edge_type + + @property + def nodes(self) -> List[BusNode]: + """ + Get delimiting nodes for the edge + :return: [BusNode] + """ + return self._nodes + + @property + def average_travel_time(self): + return self._average_travel_time diff --git a/city_model_structure/transport/bus_network.py b/city_model_structure/transport/bus_network.py new file mode 100644 index 00000000..6f3dfbd8 --- /dev/null +++ b/city_model_structure/transport/bus_network.py @@ -0,0 +1,43 @@ +""" +Bus network module +SPDX - License - Identifier: LGPL - 3.0 - or -later +Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +""" + +from typing import List +from city_model_structure.network import Network +from city_model_structure.transport.bus_edge import BusEdge +from city_model_structure.transport.bus_node import BusNode + + +class BusNetwork(Network): + """ + BusNetwork(Network) class + """ + def __init__(self, name, edges=None, nodes=None): + super().__init__(name, edges, nodes) + self._type = "BusNetwork" + + @property + def type(self): + """ + Get network type + :return: str + """ + return self._type + + @property + def edges(self) -> List[BusEdge]: + """ + Get network edges + :return: [BusEdge] + """ + return self._edges + + @property + def nodes(self) -> List[BusNode]: + """ + Get network nodes + :return: [BusNode] + """ + return self._nodes diff --git a/city_model_structure/transport/bus_node.py b/city_model_structure/transport/bus_node.py new file mode 100644 index 00000000..03113fdf --- /dev/null +++ b/city_model_structure/transport/bus_node.py @@ -0,0 +1,54 @@ +""" +Bus node module +SPDX - License - Identifier: LGPL - 3.0 - or -later +Copyright © 2021 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.transport.bus_edge import BusEdge + + +class BusNode(Node): + """ + BusNode class + """ + + def __init__(self, name, coordinates, node_type='BusNode', edges=None): + super().__init__(name, edges) + self._coordinates = coordinates + self._node_type = node_type + + @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 edges(self) -> List[BusEdge]: + """ + get edges delimited by the node + :return: [BusEdge] + """ + return self._edges diff --git a/city_model_structure/transport/bus_stop.py b/city_model_structure/transport/bus_stop.py new file mode 100644 index 00000000..7aed89eb --- /dev/null +++ b/city_model_structure/transport/bus_stop.py @@ -0,0 +1,39 @@ +""" +Bus stop module +SPDX - License - Identifier: LGPL - 3.0 - or -later +Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +""" + +from typing import Union +from city_model_structure.transport.bus_node import BusNode +from city_model_structure.transport.fast_charging_infrastructure import FastChargingInfrastructure +from city_model_structure.attributes.schedule import Schedule + + +class BusStop(BusNode): + """ + BusStop class + """ + + def __init__(self, name, coordinates, edges=None): + super().__init__(name, coordinates, edges=edges, node_type='BusStop') + self._time_table = None + self._average_hourly_passengers_demand = None + self._fast_charging_infrastructure = None + self._waiting_time = None + + @property + def time_table(self): + return self._time_table + + @property + def average_hourly_passengers_demand(self) -> Schedule: + return self._average_hourly_passengers_demand + + @property + def fast_charging_infrastructure(self) -> Union[None, FastChargingInfrastructure]: + return self._fast_charging_infrastructure + + @property + def waiting_time(self): + return self._waiting_time diff --git a/city_model_structure/transport/connection.py b/city_model_structure/transport/connection.py index 093fb4b8..0f023cd4 100644 --- a/city_model_structure/transport/connection.py +++ b/city_model_structure/transport/connection.py @@ -1,7 +1,7 @@ """ Connection module SPDX - License - Identifier: LGPL - 3.0 - or -later -Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca Contributor Milad milad.aghamohamadnia@concordia.ca Contributor Guille guille.gutierrezmorote@concordia.ca """ diff --git a/city_model_structure/transport/crossing.py b/city_model_structure/transport/crossing.py index 9a28c8f8..0b740355 100644 --- a/city_model_structure/transport/crossing.py +++ b/city_model_structure/transport/crossing.py @@ -1,7 +1,7 @@ """ Crossing module SPDX - License - Identifier: LGPL - 3.0 - or -later -Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca Contributor Milad milad.aghamohamadnia@concordia.ca Contributor Guille guille.gutierrezmorote@concordia.ca """ diff --git a/city_model_structure/transport/fast_charging_infrastructure.py b/city_model_structure/transport/fast_charging_infrastructure.py new file mode 100644 index 00000000..16b4b6e5 --- /dev/null +++ b/city_model_structure/transport/fast_charging_infrastructure.py @@ -0,0 +1,23 @@ +""" +Fast charging infrastructure module +SPDX - License - Identifier: LGPL - 3.0 - or -later +Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +""" + + +class FastChargingInfrastructure: + """ + FastChargingInfrastructure class + """ + + def __init__(self): + self._electrical_demand = None + self._losses_in_grid = None + + @property + def electrical_demand(self): + return self._electrical_demand + + @property + def losses_in_grid(self): + return self._losses_in_grid diff --git a/city_model_structure/transport/join.py b/city_model_structure/transport/join.py index a7f609b8..3e1cd143 100644 --- a/city_model_structure/transport/join.py +++ b/city_model_structure/transport/join.py @@ -1,7 +1,7 @@ """ Join module SPDX - License - Identifier: LGPL - 3.0 - or -later -Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca Contributor Milad milad.aghamohamadnia@concordia.ca Contributor Guille guille.gutierrezmorote@concordia.ca """ diff --git a/city_model_structure/transport/lane.py b/city_model_structure/transport/lane.py index d68bcca0..417f986a 100644 --- a/city_model_structure/transport/lane.py +++ b/city_model_structure/transport/lane.py @@ -1,7 +1,7 @@ """ Lane module SPDX - License - Identifier: LGPL - 3.0 - or -later -Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca Contributor Milad milad.aghamohamadnia@concordia.ca """ diff --git a/city_model_structure/transport/origin_destination_edge.py b/city_model_structure/transport/origin_destination_edge.py index c3d3f3c1..664bdd81 100644 --- a/city_model_structure/transport/origin_destination_edge.py +++ b/city_model_structure/transport/origin_destination_edge.py @@ -1,11 +1,13 @@ """ 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 +Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca """ +from typing import List from city_model_structure.attributes.edge import Edge +from city_model_structure.transport.origin_destination_node import OriginDestinationNode from city_model_structure.attributes.schedule import Schedule @@ -28,6 +30,14 @@ class OriginDestinationEdge(Edge): """ return self._edge_type + @property + def nodes(self) -> List[OriginDestinationNode]: + """ + Get delimiting nodes for the edge + :return: [OriginDestinationNode] + """ + return self._nodes + @property def movement_schedule(self) -> Schedule: """ diff --git a/city_model_structure/transport/origin_destination_network.py b/city_model_structure/transport/origin_destination_network.py index 973317c6..9090f983 100644 --- a/city_model_structure/transport/origin_destination_network.py +++ b/city_model_structure/transport/origin_destination_network.py @@ -1,7 +1,7 @@ """ 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 +Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca """ from typing import List diff --git a/city_model_structure/transport/origin_destination_node.py b/city_model_structure/transport/origin_destination_node.py index 5e46e92d..eabf06fb 100644 --- a/city_model_structure/transport/origin_destination_node.py +++ b/city_model_structure/transport/origin_destination_node.py @@ -1,7 +1,7 @@ """ 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 +Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca """ from typing import List @@ -9,6 +9,7 @@ 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 +from city_model_structure.transport.origin_destination_edge import OriginDestinationEdge class OriginDestinationNode(Node): @@ -48,6 +49,14 @@ class OriginDestinationNode(Node): """ self._coordinates = value + @property + def edges(self) -> List[OriginDestinationEdge]: + """ + get edges delimited by the node + :return: [OriginDestinationEdge] + """ + return self._edges + @property def polygon(self) -> Polygon: """ diff --git a/city_model_structure/transport/phase.py b/city_model_structure/transport/phase.py index 559e0834..66d2d59b 100644 --- a/city_model_structure/transport/phase.py +++ b/city_model_structure/transport/phase.py @@ -1,7 +1,7 @@ """ Phase module SPDX - License - Identifier: LGPL - 3.0 - or -later -Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca Contributor Milad milad.aghamohamadnia@concordia.ca """ diff --git a/city_model_structure/transport/traffic_edge.py b/city_model_structure/transport/traffic_edge.py index 1fd77299..e507e0ba 100644 --- a/city_model_structure/transport/traffic_edge.py +++ b/city_model_structure/transport/traffic_edge.py @@ -1,13 +1,14 @@ """ Traffic edge module SPDX - License - Identifier: LGPL - 3.0 - or -later -Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca Contributor Milad milad.aghamohamadnia@concordia.ca Contributor Guille guille.gutierrezmorote@concordia.ca """ from typing import List, Union from city_model_structure.attributes.edge import Edge +from city_model_structure.transport.traffic_node import TrafficNode from city_model_structure.transport.lane import Lane @@ -37,6 +38,14 @@ class TrafficEdge(Edge): """ return self._edge_type + @property + def nodes(self) -> List[TrafficNode]: + """ + Get delimiting nodes for the edge + :return: [TrafficNode] + """ + return self._nodes + @property def lanes(self) -> List[Lane]: """ diff --git a/city_model_structure/transport/traffic_light.py b/city_model_structure/transport/traffic_light.py index 7b7d4621..89827a62 100644 --- a/city_model_structure/transport/traffic_light.py +++ b/city_model_structure/transport/traffic_light.py @@ -1,7 +1,7 @@ """ Traffic light module SPDX - License - Identifier: LGPL - 3.0 - or -later -Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca Contributor Milad milad.aghamohamadnia@concordia.ca Contributor Guille guille.gutierrezmorote@concordia.ca """ diff --git a/city_model_structure/transport/traffic_network.py b/city_model_structure/transport/traffic_network.py index e473f6da..eef5a4e9 100644 --- a/city_model_structure/transport/traffic_network.py +++ b/city_model_structure/transport/traffic_network.py @@ -1,7 +1,7 @@ """ Traffic network module SPDX - License - Identifier: LGPL - 3.0 - or -later -Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca Contributor Milad milad.aghamohamadnia@concordia.ca Contributor Guille guille.gutierrezmorote@concordia.ca """ diff --git a/city_model_structure/transport/traffic_node.py b/city_model_structure/transport/traffic_node.py index 3008cf97..6391750e 100644 --- a/city_model_structure/transport/traffic_node.py +++ b/city_model_structure/transport/traffic_node.py @@ -1,17 +1,17 @@ """ TrafficNode module SPDX - License - Identifier: LGPL - 3.0 - or -later -Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca Contributor Milad milad.aghamohamadnia@concordia.ca Contributor Guille guille.gutierrezmorote@concordia.ca """ + from typing import List from city_model_structure.attributes.edge import Edge from city_model_structure.attributes.node import Node from city_model_structure.attributes.point import Point - - +from city_model_structure.transport.traffic_edge import TrafficEdge from city_model_structure.transport.connection import Connection @@ -55,6 +55,14 @@ class TrafficNode(Node): """ self._coordinates = value + @property + def edges(self) -> List[TrafficEdge]: + """ + get edges delimited by the node + :return: [TrafficEdge] + """ + return self._edges + @property def prohibitions(self) -> [(Edge, Edge)]: """ diff --git a/city_model_structure/transport/walkway_node.py b/city_model_structure/transport/walkway_node.py index 36ec90c6..e884f976 100644 --- a/city_model_structure/transport/walkway_node.py +++ b/city_model_structure/transport/walkway_node.py @@ -1,7 +1,7 @@ """ Walkway node module SPDX - License - Identifier: LGPL - 3.0 - or -later -Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca Contributor Milad milad.aghamohamadnia@concordia.ca Contributor Guille guille.gutierrezmorote@concordia.ca """ From 2c5490d13892bc6c548573a6dacb789ebb9594a3 Mon Sep 17 00:00:00 2001 From: Pilar Date: Mon, 25 Oct 2021 13:33:08 -0400 Subject: [PATCH 04/17] added many new classes needed for the transportation group models. The documentation is not done because it is needed the students feed-back --- city_model_structure/attributes/node.py | 6 +- city_model_structure/attributes/record.py | 12 ++ .../attributes/time_series.py | 8 ++ city_model_structure/bus_system.py | 16 +++ city_model_structure/transport/bus.py | 44 +++++++ city_model_structure/transport/bus_depot.py | 8 ++ city_model_structure/transport/bus_edge.py | 4 + city_model_structure/transport/bus_stop.py | 16 +++ .../transport/fast_charging_infrastructure.py | 8 ++ data/customized_imports/ashrae_archetypes.xml | 123 ++++++++++++++++++ .../sanam_customized_usage_parameters.py} | 6 +- imports/customized_imports_factory.py | 29 +++++ imports/usage_factory.py | 7 - 13 files changed, 276 insertions(+), 11 deletions(-) create mode 100644 data/customized_imports/ashrae_archetypes.xml rename imports/{usage/ashrae_usage_parameters.py => customized_imports/sanam_customized_usage_parameters.py} (92%) create mode 100644 imports/customized_imports_factory.py diff --git a/city_model_structure/attributes/node.py b/city_model_structure/attributes/node.py index 50b617c6..39154182 100644 --- a/city_model_structure/attributes/node.py +++ b/city_model_structure/attributes/node.py @@ -45,11 +45,15 @@ class Node: @property def edges(self) -> List[Edge]: """ - get edges delimited by the node + Get edges delimited by the node :return: [Edge] """ return self._edges @property def time_series(self) -> TimeSeries: + """ + Add explanation here + :return: add type of variable here + """ return self._time_series diff --git a/city_model_structure/attributes/record.py b/city_model_structure/attributes/record.py index 294bb8b9..e7261ddb 100644 --- a/city_model_structure/attributes/record.py +++ b/city_model_structure/attributes/record.py @@ -17,12 +17,24 @@ class Record: @property def time(self): + """ + Add explanation here + :return: add type of variable here + """ return self._time @property def value(self): + """ + Add explanation here + :return: add type of variable here + """ return self._value @property def flag(self): + """ + Add explanation here + :return: add type of variable here + """ return self._flag diff --git a/city_model_structure/attributes/time_series.py b/city_model_structure/attributes/time_series.py index 83301bb5..20c4d5dd 100644 --- a/city_model_structure/attributes/time_series.py +++ b/city_model_structure/attributes/time_series.py @@ -19,8 +19,16 @@ class TimeSeries: @property def time_series_type(self): + """ + Add explanation here + :return: add type of variable here + """ return self._time_series_type @property def records(self) -> List[Record]: + """ + Add explanation here + :return: List[Record] + """ return self._records diff --git a/city_model_structure/bus_system.py b/city_model_structure/bus_system.py index 171903e6..c254a55e 100644 --- a/city_model_structure/bus_system.py +++ b/city_model_structure/bus_system.py @@ -25,16 +25,32 @@ class BusSystem(CityObject): @property def bus_routes(self) -> List[BusNode]: + """ + Add explanation here + :return: [BusNode] + """ return self._bus_routes @property def bus_network(self) -> BusNetwork: + """ + Add explanation here + :return: BusNetwork + """ return self._bus_network @property def buses(self) -> List[Bus]: + """ + Add explanation here + :return: [Bus] + """ return self._buses @property def restricted_polygons(self) -> List[Polygon]: + """ + Add explanation here + :return: [Polygon] + """ return self._restricted_polygons diff --git a/city_model_structure/transport/bus.py b/city_model_structure/transport/bus.py index 708d0a6d..ea7acb47 100644 --- a/city_model_structure/transport/bus.py +++ b/city_model_structure/transport/bus.py @@ -27,44 +27,88 @@ class Bus: @property def maintenance_time(self): + """ + Add explanation here + :return: add type of variable here + """ return self._maintenance_time @property def charging_time(self): + """ + Add explanation here + :return: add type of variable here + """ return self._charging_time @property def recovery_time(self): + """ + Add explanation here + :return: add type of variable here + """ return self.maintenance_time + self.charging_time @property def vehicle_type(self): + """ + Add explanation here + :return: add type of variable here + """ return self._vehicle_type @property def energy_consumption(self): + """ + Add explanation here + :return: add type of variable here + """ return self._energy_consumption @property def trips_schedule(self) -> Schedule: + """ + Add explanation here + :return: add type of variable here + """ return self._trips_schedule @property def capacity(self): + """ + Add explanation here + :return: add type of variable here + """ return self._capacity @property def maintenance_cost(self): + """ + Add explanation here + :return: add type of variable here + """ return self._maintenance_cost @property def investment_cost(self): + """ + Add explanation here + :return: add type of variable here + """ return self._investment_cost @property def charging_range(self): + """ + Add explanation here + :return: add type of variable here + """ return self._charging_range @property def maximum_travel_range(self): + """ + Add explanation here + :return: add type of variable here + """ return self._maximum_travel_range diff --git a/city_model_structure/transport/bus_depot.py b/city_model_structure/transport/bus_depot.py index 3bda6c66..0b617275 100644 --- a/city_model_structure/transport/bus_depot.py +++ b/city_model_structure/transport/bus_depot.py @@ -19,8 +19,16 @@ class BusDepot(BusNode): @property def number_of_charging_poles(self): + """ + Add explanation here + :return: add type of variable here + """ return self._number_of_charging_poles @property def number_of_available_buses(self): + """ + Add explanation here + :return: add type of variable here + """ return self._number_of_available_buses diff --git a/city_model_structure/transport/bus_edge.py b/city_model_structure/transport/bus_edge.py index 9d9f967a..d886b4a3 100644 --- a/city_model_structure/transport/bus_edge.py +++ b/city_model_structure/transport/bus_edge.py @@ -38,4 +38,8 @@ class BusEdge(Edge): @property def average_travel_time(self): + """ + Add explanation here + :return: add type of variable here + """ return self._average_travel_time diff --git a/city_model_structure/transport/bus_stop.py b/city_model_structure/transport/bus_stop.py index 7aed89eb..b4fccd62 100644 --- a/city_model_structure/transport/bus_stop.py +++ b/city_model_structure/transport/bus_stop.py @@ -24,16 +24,32 @@ class BusStop(BusNode): @property def time_table(self): + """ + Add explanation here + :return: add type of variable here + """ return self._time_table @property def average_hourly_passengers_demand(self) -> Schedule: + """ + Add explanation here + :return: Schedule + """ return self._average_hourly_passengers_demand @property def fast_charging_infrastructure(self) -> Union[None, FastChargingInfrastructure]: + """ + Add explanation here + :return: FastChargingInfrastructure + """ return self._fast_charging_infrastructure @property def waiting_time(self): + """ + Add explanation here + :return: add type of variable here + """ return self._waiting_time diff --git a/city_model_structure/transport/fast_charging_infrastructure.py b/city_model_structure/transport/fast_charging_infrastructure.py index 16b4b6e5..a3369a91 100644 --- a/city_model_structure/transport/fast_charging_infrastructure.py +++ b/city_model_structure/transport/fast_charging_infrastructure.py @@ -16,8 +16,16 @@ class FastChargingInfrastructure: @property def electrical_demand(self): + """ + Add explanation here + :return: add type of variable here + """ return self._electrical_demand @property def losses_in_grid(self): + """ + Add explanation here + :return: add type of variable here + """ return self._losses_in_grid diff --git a/data/customized_imports/ashrae_archetypes.xml b/data/customized_imports/ashrae_archetypes.xml new file mode 100644 index 00000000..17569df2 --- /dev/null +++ b/data/customized_imports/ashrae_archetypes.xml @@ -0,0 +1,123 @@ + + + Ashrae values + Library created by Sanam from ANSI/ASHRAE Standard 62-2001 + + assembly + + 0.15 + + + + 5 + + + + + health + + 0.1 + + + + 20 + + + + + hotel + + 0.11 + + + + 5 + + + + + manufacturing + + 0.07 + + + + 10 + + + + + office + + 0.05 + + + + 5 + + + + + restaurant + + 0.7 + + + + 7.5 + + + + + retail + + 0.2 + + + + 7.5 + + + + + school + + 0.25 + + + + 10 + + + + + lab + + 0.25 + + + + 10 + + + + + residential + + + 5 + + + + + gymnasium + + 0.3 + + + + 7.5 + + + + diff --git a/imports/usage/ashrae_usage_parameters.py b/imports/customized_imports/sanam_customized_usage_parameters.py similarity index 92% rename from imports/usage/ashrae_usage_parameters.py rename to imports/customized_imports/sanam_customized_usage_parameters.py index 1bfb98bd..58dbdef0 100644 --- a/imports/usage/ashrae_usage_parameters.py +++ b/imports/customized_imports/sanam_customized_usage_parameters.py @@ -1,5 +1,5 @@ """ -AshraeUsageParameters model the usage properties +SanamCustomizedUsageParameters add two parameters to usage properties from ASHRAE SPDX - License - Identifier: LGPL - 3.0 - or -later Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca """ @@ -9,9 +9,9 @@ from imports.geometry.helpers.geometry_helper import GeometryHelper as gh from city_model_structure.building_demand.usage_zone import UsageZone -class AshraeUsageParameters: +class SanamCustomizedUsageParameters: """ - AshraeUsageParameters class + SanamCustomizedUsageParameters class """ def __init__(self, city, base_path): super().__init__(base_path, 'ashrae_archetypes.xml') diff --git a/imports/customized_imports_factory.py b/imports/customized_imports_factory.py new file mode 100644 index 00000000..520cf853 --- /dev/null +++ b/imports/customized_imports_factory.py @@ -0,0 +1,29 @@ +""" +CustomizedImportsFactory is used to import any information using user customized formats +This factory can only be called after calling the construction factory. +SPDX - License - Identifier: LGPL - 3.0 - or -later +Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +""" +from pathlib import Path + + +class CustomizedImportsFactory: + """ + CustomizedImportsFactory class + """ + def __init__(self, city, importer_class, base_path): + if base_path is None: + base_path = Path(Path(__file__).parent.parent / 'data/customized_imports') + self._city = city + self._importer_class = importer_class + self._base_path = base_path + for building in city.buildings: + if len(building.thermal_zones) == 0: + raise Exception('It seems that the customized imports factory is being called before the construction factory. ' + 'Please ensure that the construction factory is called first.') + + def enrich(self): + """ + Enrich the city given to the class using the given importer class + :return: None + """ diff --git a/imports/usage_factory.py b/imports/usage_factory.py index 763a6dba..a886c197 100644 --- a/imports/usage_factory.py +++ b/imports/usage_factory.py @@ -8,7 +8,6 @@ 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. @@ -39,12 +38,6 @@ 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 beec60822944c8a039efa94df22d842b269988ae Mon Sep 17 00:00:00 2001 From: guille Date: Mon, 25 Oct 2021 13:28:43 -0400 Subject: [PATCH 05/17] import changes into typevar to avoid circular references when documentation is created --- city_model_structure/attributes/node.py | 1 - city_model_structure/transport/bus_edge.py | 5 +- city_model_structure/transport/bus_node.py | 5 +- .../transport/origin_destination_edge.py | 5 +- .../transport/origin_destination_node.py | 5 +- .../transport/traffic_node.py | 7 +- helpers/configuration_helper.py | 2 +- imports/geometry/rhino.py | 77 +++++++++++++++++++ imports/geometry_factory.py | 17 ++++ requirements.txt | 3 +- 10 files changed, 113 insertions(+), 14 deletions(-) create mode 100644 imports/geometry/rhino.py diff --git a/city_model_structure/attributes/node.py b/city_model_structure/attributes/node.py index 39154182..86e6b514 100644 --- a/city_model_structure/attributes/node.py +++ b/city_model_structure/attributes/node.py @@ -8,7 +8,6 @@ Contributor Milad milad.aghamohamadnia@concordia.ca import uuid from typing import List, TypeVar from city_model_structure.attributes.time_series import TimeSeries - Edge = TypeVar('Edge') diff --git a/city_model_structure/transport/bus_edge.py b/city_model_structure/transport/bus_edge.py index d886b4a3..98c31dc0 100644 --- a/city_model_structure/transport/bus_edge.py +++ b/city_model_structure/transport/bus_edge.py @@ -4,9 +4,10 @@ SPDX - License - Identifier: LGPL - 3.0 - or -later Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca """ -from typing import List +from typing import List, TypeVar from city_model_structure.attributes.edge import Edge -from city_model_structure.transport.bus_node import BusNode + +BusNode = TypeVar('BusNode') class BusEdge(Edge): diff --git a/city_model_structure/transport/bus_node.py b/city_model_structure/transport/bus_node.py index 03113fdf..17274a4f 100644 --- a/city_model_structure/transport/bus_node.py +++ b/city_model_structure/transport/bus_node.py @@ -4,11 +4,12 @@ SPDX - License - Identifier: LGPL - 3.0 - or -later Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca """ -from typing import List +from typing import List, TypeVar from city_model_structure.attributes.node import Node from city_model_structure.attributes.point import Point -from city_model_structure.transport.bus_edge import BusEdge + +BusEdge = TypeVar('BusEdge') class BusNode(Node): diff --git a/city_model_structure/transport/origin_destination_edge.py b/city_model_structure/transport/origin_destination_edge.py index 664bdd81..32fa7cbb 100644 --- a/city_model_structure/transport/origin_destination_edge.py +++ b/city_model_structure/transport/origin_destination_edge.py @@ -5,11 +5,12 @@ Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.mons """ -from typing import List +from typing import List, TypeVar from city_model_structure.attributes.edge import Edge -from city_model_structure.transport.origin_destination_node import OriginDestinationNode from city_model_structure.attributes.schedule import Schedule +OriginDestinationNode = TypeVar('OriginDestinationNode') + class OriginDestinationEdge(Edge): """ diff --git a/city_model_structure/transport/origin_destination_node.py b/city_model_structure/transport/origin_destination_node.py index eabf06fb..ea84bd5c 100644 --- a/city_model_structure/transport/origin_destination_node.py +++ b/city_model_structure/transport/origin_destination_node.py @@ -3,13 +3,14 @@ Origin-Destination node module SPDX - License - Identifier: LGPL - 3.0 - or -later Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca """ -from typing import List +from typing import List, TypeVar 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 -from city_model_structure.transport.origin_destination_edge import OriginDestinationEdge + +OriginDestinationEdge = TypeVar('OriginDestinationEdge') class OriginDestinationNode(Node): diff --git a/city_model_structure/transport/traffic_node.py b/city_model_structure/transport/traffic_node.py index 6391750e..6188e6e5 100644 --- a/city_model_structure/transport/traffic_node.py +++ b/city_model_structure/transport/traffic_node.py @@ -6,13 +6,14 @@ Contributor Milad milad.aghamohamadnia@concordia.ca Contributor Guille guille.gutierrezmorote@concordia.ca """ -from typing import List +from typing import List, TypeVar from city_model_structure.attributes.edge import Edge from city_model_structure.attributes.node import Node from city_model_structure.attributes.point import Point -from city_model_structure.transport.traffic_edge import TrafficEdge -from city_model_structure.transport.connection import Connection + +Connection = TypeVar('Connection') +TrafficEdge = TypeVar('TrafficEdge') class TrafficNode(Node): diff --git a/helpers/configuration_helper.py b/helpers/configuration_helper.py index 0a9b2d6c..de99f24a 100644 --- a/helpers/configuration_helper.py +++ b/helpers/configuration_helper.py @@ -38,4 +38,4 @@ class ConfigurationHelper: Get configured maximal coordinate value :return: 1.7976931348623157e+308 """ - return self._config.getfloat('buildings', 'max_coordinate') + return self._config.getfloat('buildings', 'max_coordinate').real diff --git a/imports/geometry/rhino.py b/imports/geometry/rhino.py new file mode 100644 index 00000000..66f200d8 --- /dev/null +++ b/imports/geometry/rhino.py @@ -0,0 +1,77 @@ +""" +Rhino module parses rhino files and import the geometry into the city model structure +SPDX - License - Identifier: LGPL - 3.0 - or -later +Copyright © 2020 Project Author Guille Gutierrez guillermo.gutierrezmorote@concordia.ca +""" +from rhino3dm import * +from rhino3dm._rhino3dm import MeshType +import numpy as np + +import helpers.configuration_helper +from city_model_structure.attributes.polygon import Polygon +from city_model_structure.building import Building +from city_model_structure.city import City +from city_model_structure.building_demand.surface import Surface as LibsSurface +from imports.geometry.helpers.geometry_helper import GeometryHelper +from helpers.configuration_helper import ConfigurationHelper + + +class Rhino: + def __init__(self, path): + self._model = File3dm.Read(str(path)) + max_float = 1.7976931348623157e+308 + min_float = -1.7976931348623157e+308 + self._min_x = self._min_y = self._min_z = max_float + self._max_x = self._max_y = self._max_z = min_float + print('init') + + @staticmethod + def _solid_points(coordinates) -> np.ndarray: + solid_points = np.fromstring(coordinates, dtype=float, sep=' ') + solid_points = GeometryHelper.to_points_matrix(solid_points) + return solid_points + + def _lower_corner(self, x, y, z): + if x < self._min_x: + self._min_x = x + if y < self._min_y: + self._min_y = y + if z < self._min_z: + self._min_z = z + if x > self._max_x: + self._max_x = x + if y > self._max_y: + self._max_y = y + if z > self._max_z: + self._max_z = z + + @property + def city(self) -> City: + buildings = [] + print('city') + for obj in self._model.Objects: + name = obj.Attributes.Id + surfaces = [] + for face in obj.Geometry.Faces: + if face is None: + break + _mesh = face.GetMesh(MeshType.Default) + for i in range(0, len(_mesh.Faces)): + faces = _mesh.Faces[i] + _points = '' + + for index in faces: + self._lower_corner(_mesh.Vertices[index].X, _mesh.Vertices[index].Y, _mesh.Vertices[index].Z) + _points = _points + f'{_mesh.Vertices[index].X} {_mesh.Vertices[index].Y} {_mesh.Vertices[index].Z} ' + polygon_points = Rhino._solid_points(_points.strip()) + print(_points) + surfaces.append(LibsSurface(Polygon(polygon_points), Polygon(polygon_points))) + buildings.append(Building(name, 3, surfaces, 'unknown', 'unknown', (self._min_x, self._min_y, self._min_z), [])) + lower_corner = (self._min_x, self._min_y, self._min_z) + upper_corner = (self._max_x, self._max_y, self._max_z) + city = City(lower_corner, upper_corner, 'Montreal') + for building in buildings: + city.add_city_object(building) + return city + + diff --git a/imports/geometry_factory.py b/imports/geometry_factory.py index ae2c3e29..d24199bf 100644 --- a/imports/geometry_factory.py +++ b/imports/geometry_factory.py @@ -8,6 +8,7 @@ from city_model_structure.city import City from imports.geometry.citygml import CityGml from imports.geometry.obj import Obj from imports.geometry.osm_subway import OsmSubway +from imports.geometry.rhino import Rhino class GeometryFactory: @@ -42,6 +43,14 @@ class GeometryFactory: """ return OsmSubway(self._path).city + @property + def _rhino(self) -> City: + """ + Enrich the city by using OpenStreetMap information as data source + :return: City + """ + return Rhino(self._path).city + @property def city(self) -> City: """ @@ -49,3 +58,11 @@ class GeometryFactory: :return: City """ return getattr(self, self._file_type, lambda: None) + + @property + def city_debug(self) -> City: + """ + Enrich the city given to the class using the class given handler + :return: City + """ + return Rhino(self._path).city diff --git a/requirements.txt b/requirements.txt index 8a6287d3..abd62d1a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -14,4 +14,5 @@ networkx~=2.5.1 parseidf~=1.0.0 ply~=3.11 scipy==1.7.1 -PyYAML==6.0 \ No newline at end of file +PyYAML==6.0 +rhino3dm~=7.7.0 \ No newline at end of file From 2af8bf5db3fdc415aff2e72422d4bc48f3dd8edb Mon Sep 17 00:00:00 2001 From: Pilar Date: Mon, 25 Oct 2021 18:05:51 -0400 Subject: [PATCH 06/17] created customized imports factory and correspondent test --- .../sanam_customized_usage_parameters.py | 37 +++++++++++---- imports/customized_imports_factory.py | 10 ++-- imports/usage/ca_usage_parameters.py | 2 +- unittests/test_customized_imports_factory.py | 47 +++++++++++++++++++ 4 files changed, 83 insertions(+), 13 deletions(-) create mode 100644 unittests/test_customized_imports_factory.py diff --git a/imports/customized_imports/sanam_customized_usage_parameters.py b/imports/customized_imports/sanam_customized_usage_parameters.py index 58dbdef0..80d2e063 100644 --- a/imports/customized_imports/sanam_customized_usage_parameters.py +++ b/imports/customized_imports/sanam_customized_usage_parameters.py @@ -3,9 +3,11 @@ SanamCustomizedUsageParameters add two parameters to usage properties from ASHRA SPDX - License - Identifier: LGPL - 3.0 - or -later Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca """ -import sys +import sys +import xmltodict from imports.geometry.helpers.geometry_helper import GeometryHelper as gh +from imports.usage.data_classes.hft_usage_zone_archetype import HftUsageZoneArchetype as huza from city_model_structure.building_demand.usage_zone import UsageZone @@ -14,9 +16,17 @@ class SanamCustomizedUsageParameters: SanamCustomizedUsageParameters class """ def __init__(self, city, base_path): - super().__init__(base_path, 'ashrae_archetypes.xml') + file = 'ashrae_archetypes.xml' + path = str(base_path / file) + self._usage_archetypes = [] + with open(path) as xml: + self._archetypes = xmltodict.parse(xml.read(), force_list=('zoneUsageVariant', 'zoneUsageType')) + for zone_usage_type in self._archetypes['buildingUsageLibrary']['zoneUsageType']: + usage = zone_usage_type['id'] + usage_archetype = self._parse_zone_usage_type(usage, zone_usage_type) + self._usage_archetypes.append(usage_archetype) + self._city = city - self._usage_archetypes = None def enrich_buildings(self): """ @@ -25,20 +35,19 @@ class SanamCustomizedUsageParameters: """ city = self._city for building in city.buildings: - archetype = self._search_archetype(building.function) + archetype = self._search_archetype(building.function) # todo: building.function or other translation??????? 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) + usage_zone.volume = thermal_zone.volume thermal_zone.usage_zones = [usage_zone] def _search_archetype(self, building_usage): @@ -50,6 +59,18 @@ class SanamCustomizedUsageParameters: @staticmethod def _assign_values(usage_zone, archetype): usage_zone.usage = archetype.usage + # Due to the fact that python is not a typed language, the wrong object type is assigned to + # usage_zone.internal_gains when writing usage_zone.internal_gains = archetype.internal_gains. + # Therefore, this walk around has been done. 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 + usage_zone.mechanical_air_change = archetype.mechanical_air_change + + @staticmethod + def _parse_zone_usage_type(usage, zone_usage_type): + occupancy_density = None + if 'occupancy' in zone_usage_type: + occupancy_density = zone_usage_type['occupancy']['occupancyDensity'] + mechanical_air_change = zone_usage_type['endUses']['ventilation']['minimumVentilationRate'] + usage_zone_archetype = huza(usage=usage, occupancy_density=occupancy_density, + mechanical_air_change=mechanical_air_change) + return usage_zone_archetype diff --git a/imports/customized_imports_factory.py b/imports/customized_imports_factory.py index 520cf853..bca8a87c 100644 --- a/imports/customized_imports_factory.py +++ b/imports/customized_imports_factory.py @@ -11,11 +11,11 @@ class CustomizedImportsFactory: """ CustomizedImportsFactory class """ - def __init__(self, city, importer_class, base_path): + def __init__(self, importer_class, city, base_path=None): if base_path is None: base_path = Path(Path(__file__).parent.parent / 'data/customized_imports') - self._city = city self._importer_class = importer_class + self._city = city self._base_path = base_path for building in city.buildings: if len(building.thermal_zones) == 0: @@ -24,6 +24,8 @@ class CustomizedImportsFactory: def enrich(self): """ - Enrich the city given to the class using the given importer class - :return: None + Returns the class that will enrich the city given + :return: Class """ + importer = self._importer_class(self._city, self._base_path) + return importer.enrich_buildings() diff --git a/imports/usage/ca_usage_parameters.py b/imports/usage/ca_usage_parameters.py index 1bbe5d58..01cc85a5 100644 --- a/imports/usage/ca_usage_parameters.py +++ b/imports/usage/ca_usage_parameters.py @@ -41,8 +41,8 @@ class CaUsageParameters(HftUsageInterface): # 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) + usage_zone.volume = thermal_zone.volume thermal_zone.usage_zones = [usage_zone] def _search_archetype(self, building_usage): diff --git a/unittests/test_customized_imports_factory.py b/unittests/test_customized_imports_factory.py new file mode 100644 index 00000000..7b98784a --- /dev/null +++ b/unittests/test_customized_imports_factory.py @@ -0,0 +1,47 @@ +""" +TestCustomizedImportsFactory tests and validates the factory to import customized data +SPDX - License - Identifier: LGPL - 3.0 - or -later +Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +""" +from pathlib import Path +from unittest import TestCase + +from imports.geometry_factory import GeometryFactory +from imports.construction_factory import ConstructionFactory +from imports.customized_imports_factory import CustomizedImportsFactory +from imports.customized_imports.sanam_customized_usage_parameters import SanamCustomizedUsageParameters as scp + + +class TestCustomizedImportsFactory(TestCase): + """ + TestCustomizedImportsFactory TestCase + """ + def setUp(self) -> None: + """ + Configure test environment + :return: + """ + self._example_path = (Path(__file__).parent / 'tests_data').resolve() + + def _get_citygml(self, file): + file_path = (self._example_path / file).resolve() + _city = GeometryFactory('citygml', file_path).city + self.assertIsNotNone(_city, 'city is none') + ConstructionFactory('nrel', _city).enrich() + + return _city + + def test_city_with_customized_data(self): + """ + Enrich the city with the usage information and verify it + :return: None + """ + + file = 'one_building_in_kelowna.gml' + city = self._get_citygml(file) + + CustomizedImportsFactory(scp, city).enrich() + for building in city.buildings: + self.assertIsNot(len(building.usage_zones), 0, 'no building usage_zones defined') + for usage_zone in building.usage_zones: + self.assertIsNotNone(usage_zone.mechanical_air_change, 'usage is none') From 3adf8c9604edc4f6a0d777149d753abeb10edcee Mon Sep 17 00:00:00 2001 From: Pilar Date: Fri, 5 Nov 2021 10:16:35 -0400 Subject: [PATCH 07/17] created customized imports factory and correspondent test --- city_model_structure/building.py | 11 +++++ data/customized_imports/ashrae_archetypes.xml | 42 +++++++++---------- helpers/constants.py | 4 ++ helpers/enrich_city.py | 5 ++- imports/construction/us_physics_parameters.py | 1 + .../helpers/sanam_customized_usage_helper.py | 38 +++++++++++++++++ .../sanam_customized_usage_parameters.py | 34 ++++++++------- imports/geometry_factory.py | 30 ++++++------- unittests/test_customized_imports_factory.py | 2 + 9 files changed, 116 insertions(+), 51 deletions(-) create mode 100644 imports/customized_imports/helpers/sanam_customized_usage_helper.py diff --git a/city_model_structure/building.py b/city_model_structure/building.py index 9e144141..423d5ab8 100644 --- a/city_model_structure/building.py +++ b/city_model_structure/building.py @@ -174,6 +174,8 @@ class Building(CityObject): :return: [ThermalZone] """ if len(self._thermal_zones) == 0: + if self.storeys is None: + return [] for storey in self.storeys: self._thermal_zones.append(storey.thermal_zone) return self._thermal_zones @@ -194,6 +196,15 @@ class Building(CityObject): """ return self._year_of_construction + @year_of_construction.setter + def year_of_construction(self, value): + """ + Set building year of construction + :param value: int + """ + if value is not None: + self._year_of_construction = value + @property def function(self) -> Union[None, str]: """ diff --git a/data/customized_imports/ashrae_archetypes.xml b/data/customized_imports/ashrae_archetypes.xml index 17569df2..df281f3a 100644 --- a/data/customized_imports/ashrae_archetypes.xml +++ b/data/customized_imports/ashrae_archetypes.xml @@ -5,99 +5,99 @@ assembly - 0.15 + 0.15 - 5 + 5 health - 0.1 + 0.1 - 20 + 20 hotel - 0.11 + 0.11 - 5 + 5 manufacturing - 0.07 + 0.07 - 10 + 10 office - 0.05 + 0.05 - 5 + 5 restaurant - 0.7 + 0.7 - 7.5 + 7.5 retail - 0.2 + 0.2 - 7.5 + 7.5 school - 0.25 + 0.25 - 10 + 10 lab - 0.25 + 0.25 - 10 + 10 @@ -105,18 +105,18 @@ residential - 5 + 5 gymnasium - 0.3 + 0.3 - 7.5 + 7.5 diff --git a/helpers/constants.py b/helpers/constants.py index 0f571a50..50a35eb7 100644 --- a/helpers/constants.py +++ b/helpers/constants.py @@ -7,6 +7,10 @@ Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.mons # universal constants KELVIN = 273.15 +# converters +HOUR_TO_MINUTES = 60 +METERS_TO_FEET = 3.28084 + # time SECOND = 'second' MINUTE = 'minute' diff --git a/helpers/enrich_city.py b/helpers/enrich_city.py index e19bcf41..cc5067a1 100644 --- a/helpers/enrich_city.py +++ b/helpers/enrich_city.py @@ -55,10 +55,13 @@ class EnrichCity: def _construction(self, construction_format): ConstructionFactory(construction_format, self._city).enrich() + for building in self._city.buildings: # infiltration_rate_system_off is a mandatory parameter. # If it is not returned, extract the building from the calculation list - if building.thermal_zones[0].infiltration_rate_system_off is None: + if len(building.thermal_zones) == 0: + self._city.remove_city_object(building) + elif building.thermal_zones[0].infiltration_rate_system_off is None: self._city.remove_city_object(building) if self._city.buildings is None: self._errors.append('no archetype found per construction') diff --git a/imports/construction/us_physics_parameters.py b/imports/construction/us_physics_parameters.py index 50b0b8ca..f45e0f29 100644 --- a/imports/construction/us_physics_parameters.py +++ b/imports/construction/us_physics_parameters.py @@ -31,6 +31,7 @@ class UsPhysicsParameters(NrelPhysicsInterface): # it is assumed that all buildings have the same archetypes' keys for building in city.buildings: building_type = ConstructionHelper.nrel_from_function(building.function) + print(building_type) if building_type is None: return archetype = self._search_archetype(building_type, diff --git a/imports/customized_imports/helpers/sanam_customized_usage_helper.py b/imports/customized_imports/helpers/sanam_customized_usage_helper.py new file mode 100644 index 00000000..a0d981b8 --- /dev/null +++ b/imports/customized_imports/helpers/sanam_customized_usage_helper.py @@ -0,0 +1,38 @@ +""" +Sanam's customized importer Usage helper +SPDX - License - Identifier: LGPL - 3.0 - or -later +Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +""" +import sys +import helpers.constants as cte + + +class SanamCustomizedUsageHelper: + """ + SanamCustomizedUsage class + """ + usage_to_customized = { + cte.RESIDENTIAL: 'residential', + cte.INDUSTRY: 'manufacturing', + cte.OFFICE_ADMINISTRATION: 'office', + cte.HOTEL: 'hotel', + cte.HEALTH_CARE: 'health', + cte.RETAIL: 'retail', + cte.HALL: 'assembly', + cte.RESTAURANT: 'restaurant', + cte.EDUCATION: 'school' + } + customized_default_value = 'residential' + + @staticmethod + def customized_from_usage(usage): + """ + Get customized usage from the given internal usage key + :param usage: str + :return: str + """ + try: + return SanamCustomizedUsageHelper.usage_to_customized[usage] + except KeyError: + sys.stderr.write('Error: keyword not found. Returned default HfT usage "residential"\n') + return SanamCustomizedUsageHelper.customized_default_value diff --git a/imports/customized_imports/sanam_customized_usage_parameters.py b/imports/customized_imports/sanam_customized_usage_parameters.py index 80d2e063..6604a8e5 100644 --- a/imports/customized_imports/sanam_customized_usage_parameters.py +++ b/imports/customized_imports/sanam_customized_usage_parameters.py @@ -8,7 +8,7 @@ import sys import xmltodict from imports.geometry.helpers.geometry_helper import GeometryHelper as gh from imports.usage.data_classes.hft_usage_zone_archetype import HftUsageZoneArchetype as huza -from city_model_structure.building_demand.usage_zone import UsageZone +import helpers.constants as cte class SanamCustomizedUsageParameters: @@ -36,6 +36,11 @@ class SanamCustomizedUsageParameters: city = self._city for building in city.buildings: archetype = self._search_archetype(building.function) # todo: building.function or other translation??????? + height = building.average_storey_height + if height is None: + raise Exception('Average storey height not defined, ACH cannot be calculated') + if height <= 0: + raise Exception('Average storey height is zero, ACH cannot be calculated') 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 ' @@ -44,11 +49,8 @@ class SanamCustomizedUsageParameters: mix_usage = False if not mix_usage: # just one usage_zone - for thermal_zone in building.thermal_zones: - usage_zone = UsageZone() - self._assign_values(usage_zone, archetype) - usage_zone.volume = thermal_zone.volume - thermal_zone.usage_zones = [usage_zone] + for usage_zone in building.usage_zones: + self._assign_values(usage_zone, archetype, height) def _search_archetype(self, building_usage): for building_archetype in self._usage_archetypes: @@ -57,20 +59,24 @@ class SanamCustomizedUsageParameters: return None @staticmethod - def _assign_values(usage_zone, archetype): + def _assign_values(usage_zone, archetype, height): usage_zone.usage = archetype.usage # Due to the fact that python is not a typed language, the wrong object type is assigned to # usage_zone.internal_gains when writing usage_zone.internal_gains = archetype.internal_gains. # Therefore, this walk around has been done. - usage_zone.occupancy_density = archetype.occupancy_density - usage_zone.mechanical_air_change = archetype.mechanical_air_change + if archetype.occupancy_density is not None: + usage_zone.occupancy_density = archetype.occupancy_density + archetype_mechanical_air_change = float(archetype.mechanical_air_change) * float(usage_zone.occupancy_density) \ + * cte.HOUR_TO_MINUTES / cte.METERS_TO_FEET**3 / height + usage_zone.mechanical_air_change = archetype_mechanical_air_change @staticmethod def _parse_zone_usage_type(usage, zone_usage_type): - occupancy_density = None + mechanical_air_change = zone_usage_type['endUses']['ventilation']['minimumVentilationRate']['#text'] if 'occupancy' in zone_usage_type: - occupancy_density = zone_usage_type['occupancy']['occupancyDensity'] - mechanical_air_change = zone_usage_type['endUses']['ventilation']['minimumVentilationRate'] - usage_zone_archetype = huza(usage=usage, occupancy_density=occupancy_density, - mechanical_air_change=mechanical_air_change) + occupancy_density = zone_usage_type['occupancy']['occupancyDensity']['#text'] + usage_zone_archetype = huza(usage=usage, occupancy_density=occupancy_density, + mechanical_air_change=mechanical_air_change) + else: + usage_zone_archetype = huza(usage=usage, mechanical_air_change=mechanical_air_change) return usage_zone_archetype diff --git a/imports/geometry_factory.py b/imports/geometry_factory.py index d24199bf..da35c334 100644 --- a/imports/geometry_factory.py +++ b/imports/geometry_factory.py @@ -8,7 +8,7 @@ from city_model_structure.city import City from imports.geometry.citygml import CityGml from imports.geometry.obj import Obj from imports.geometry.osm_subway import OsmSubway -from imports.geometry.rhino import Rhino +#from imports.geometry.rhino import Rhino class GeometryFactory: @@ -43,13 +43,13 @@ class GeometryFactory: """ return OsmSubway(self._path).city - @property - def _rhino(self) -> City: - """ - Enrich the city by using OpenStreetMap information as data source - :return: City - """ - return Rhino(self._path).city +# @property +# def _rhino(self) -> City: +# """ +# Enrich the city by using OpenStreetMap information as data source +# :return: City +# """ +# return Rhino(self._path).city @property def city(self) -> City: @@ -59,10 +59,10 @@ class GeometryFactory: """ return getattr(self, self._file_type, lambda: None) - @property - def city_debug(self) -> City: - """ - Enrich the city given to the class using the class given handler - :return: City - """ - return Rhino(self._path).city +# @property +# def city_debug(self) -> City: +# """ +# Enrich the city given to the class using the class given handler +# :return: City +# """ +# return Rhino(self._path).city diff --git a/unittests/test_customized_imports_factory.py b/unittests/test_customized_imports_factory.py index 7b98784a..80373480 100644 --- a/unittests/test_customized_imports_factory.py +++ b/unittests/test_customized_imports_factory.py @@ -8,6 +8,7 @@ from unittest import TestCase from imports.geometry_factory import GeometryFactory from imports.construction_factory import ConstructionFactory +from imports.usage_factory import UsageFactory from imports.customized_imports_factory import CustomizedImportsFactory from imports.customized_imports.sanam_customized_usage_parameters import SanamCustomizedUsageParameters as scp @@ -28,6 +29,7 @@ class TestCustomizedImportsFactory(TestCase): _city = GeometryFactory('citygml', file_path).city self.assertIsNotNone(_city, 'city is none') ConstructionFactory('nrel', _city).enrich() + UsageFactory('hft', _city).enrich() return _city From e5e339841c60dc9b8e68b17e1cbc0cb009d66991 Mon Sep 17 00:00:00 2001 From: guille Date: Thu, 11 Nov 2021 11:50:07 -0500 Subject: [PATCH 08/17] testing something with sanam --- requirements.txt | 1 - unittests/test_doe_idf.py | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index abd62d1a..15593f09 100644 --- a/requirements.txt +++ b/requirements.txt @@ -9,7 +9,6 @@ geomeppy~=0.11.8 pathlib~=1.0.1 PyWavefront~=1.3.3 xlrd~=2.0.1 -openpyxl~=3.0.7 networkx~=2.5.1 parseidf~=1.0.0 ply~=3.11 diff --git a/unittests/test_doe_idf.py b/unittests/test_doe_idf.py index 8c930656..3aedcfdf 100644 --- a/unittests/test_doe_idf.py +++ b/unittests/test_doe_idf.py @@ -2,6 +2,7 @@ Building test SPDX - License - Identifier: LGPL - 3.0 - or -later Copyright © 2020 Project Author Guille Gutierrez Morote Guillermo.GutierrezMorote@concordia.ca +this is my change """ from pathlib import Path from unittest import TestCase From b87cfea50902831b5020560a5c767e72d1a660db Mon Sep 17 00:00:00 2001 From: Guillermo Gutierrez Morote Date: Thu, 11 Nov 2021 16:49:21 +0000 Subject: [PATCH 09/17] Update test_doe_idf.py --- unittests/test_doe_idf.py | 1 - 1 file changed, 1 deletion(-) diff --git a/unittests/test_doe_idf.py b/unittests/test_doe_idf.py index 3aedcfdf..8c930656 100644 --- a/unittests/test_doe_idf.py +++ b/unittests/test_doe_idf.py @@ -2,7 +2,6 @@ Building test SPDX - License - Identifier: LGPL - 3.0 - or -later Copyright © 2020 Project Author Guille Gutierrez Morote Guillermo.GutierrezMorote@concordia.ca -this is my change """ from pathlib import Path from unittest import TestCase From 9837bb84279c573cbf2f74c5cde8c368e6cc8263 Mon Sep 17 00:00:00 2001 From: guille Date: Fri, 12 Nov 2021 04:41:17 -0500 Subject: [PATCH 10/17] Base implementation for the fuel life cicle analisis --- city_model_structure/city.py | 458 ++++++++++---------- city_model_structure/fuel.py | 41 ++ data/life_cicle_analize/lca_data.xml | 573 +++++++++++++++++++++++++ imports/life_cicle_analize/lca_fuel.py | 24 ++ imports/life_cicle_analyze_factory.py | 33 ++ unittests/tests_data/lca_data.xml | 573 +++++++++++++++++++++++++ 6 files changed, 1478 insertions(+), 224 deletions(-) create mode 100644 city_model_structure/fuel.py create mode 100644 data/life_cicle_analize/lca_data.xml create mode 100644 imports/life_cicle_analize/lca_fuel.py create mode 100644 imports/life_cicle_analyze_factory.py create mode 100644 unittests/tests_data/lca_data.xml diff --git a/city_model_structure/city.py b/city_model_structure/city.py index 9f6b0e0a..9465f368 100644 --- a/city_model_structure/city.py +++ b/city_model_structure/city.py @@ -2,7 +2,6 @@ City module SPDX - License - Identifier: LGPL - 3.0 - or -later Copyright © 2020 Project Author Guille Gutierrez guillermo.gutierrezmorote@concordia.ca -Contributor Peter Yefi peteryefi@gmail.com """ from __future__ import annotations import sys @@ -19,361 +18,372 @@ from city_model_structure.city_objects_cluster import CityObjectsCluster from city_model_structure.buildings_cluster import BuildingsCluster from city_model_structure.parts_consisting_building import PartsConsistingBuilding from city_model_structure.subway_entrance import SubwayEntrance +from city_model_structure.fuel import Fuel from helpers.geometry_helper import GeometryHelper from helpers.location import Location from city_model_structure.energy_system import EnergySystem class City: - """ + """ City class """ - def __init__(self, lower_corner, upper_corner, srs_name): - self._name = None - self._lower_corner = lower_corner - self._upper_corner = upper_corner - self._buildings = None - self._subway_entrances = None - self._srs_name = srs_name - self._geometry = GeometryHelper() - # todo: right now extracted at city level, in the future should be extracted also at building level if exist - self._location = None - self._country_code = None - self._climate_reference_city = None - self._climate_file = None - self._latitude = None - self._longitude = None - self._time_zone = None - self._buildings_clusters = None - self._parts_consisting_buildings = None - self._city_objects_clusters = None - self._city_objects = None - self._energy_systems = None + def __init__(self, lower_corner, upper_corner, srs_name): + self._name = None + self._lower_corner = lower_corner + self._upper_corner = upper_corner + self._buildings = None + self._subway_entrances = None + self._srs_name = srs_name + self._geometry = GeometryHelper() + # todo: right now extracted at city level, in the future should be extracted also at building level if exist + self._location = None + self._country_code = None + self._climate_reference_city = None + self._climate_file = None + self._latitude = None + self._longitude = None + self._time_zone = None + self._buildings_clusters = None + self._parts_consisting_buildings = None + self._city_objects_clusters = None + self._city_objects = None + self._energy_systems = None + self._fuels = None - def _get_location(self) -> Location: - if self._location is None: - gps = pyproj.CRS('EPSG:4326') # LatLon with WGS84 datum used by GPS units and Google Earth - try: - input_reference = pyproj.CRS(self.srs_name) # Projected coordinate system from input data - except pyproj.exceptions.CRSError: - sys.stderr.write('Invalid projection reference system, please check the input data. ' - '(e.g. in CityGML files: srs_name)\n') - sys.exit() - transformer = Transformer.from_crs(input_reference, gps) - coordinates = transformer.transform(self.lower_corner[0], self.lower_corner[1]) - self._location = GeometryHelper.get_location(coordinates[0], coordinates[1]) - return self._location + @property + def fuels(self) -> [Fuel]: + return self._fuels - @property - def country_code(self): - """ + @fuels.setter + def fuels(self, value): + self._fuels = value + + + def _get_location(self) -> Location: + if self._location is None: + gps = pyproj.CRS('EPSG:4326') # LatLon with WGS84 datum used by GPS units and Google Earth + try: + input_reference = pyproj.CRS(self.srs_name) # Projected coordinate system from input data + except pyproj.exceptions.CRSError: + sys.stderr.write('Invalid projection reference system, please check the input data. ' + '(e.g. in CityGML files: srs_name)\n') + sys.exit() + transformer = Transformer.from_crs(input_reference, gps) + coordinates = transformer.transform(self.lower_corner[0], self.lower_corner[1]) + self._location = GeometryHelper.get_location(coordinates[0], coordinates[1]) + return self._location + + @property + def country_code(self): + """ Get city country code :return: str """ - return self._get_location().country + return self._get_location().country - @property - def name(self): - """ + @property + def name(self): + """ Get city name :return: str """ - return self._get_location().city + return self._get_location().city - @property - def climate_reference_city(self) -> Union[None, str]: - """ + @property + def climate_reference_city(self) -> Union[None, str]: + """ Get the name for the climatic information reference city :return: None or str """ - return self._climate_reference_city + return self._climate_reference_city - @climate_reference_city.setter - def climate_reference_city(self, value): - """ + @climate_reference_city.setter + def climate_reference_city(self, value): + """ Set the name for the climatic information reference city :param value: str """ - if value is not None: - self._climate_reference_city = str(value) + if value is not None: + self._climate_reference_city = str(value) - @property - def climate_file(self) -> Union[None, Path]: - """ + @property + def climate_file(self) -> Union[None, Path]: + """ Get the climate file full path :return: None or Path """ - return self._climate_file + return self._climate_file - @climate_file.setter - def climate_file(self, value): - """ + @climate_file.setter + def climate_file(self, value): + """ Set the climate file full path :param value: Path """ - if value is not None: - self._climate_file = Path(value) + if value is not None: + self._climate_file = Path(value) - @property - def city_objects(self) -> Union[List[CityObject], None]: - """ + @property + def city_objects(self) -> Union[List[CityObject], None]: + """ Get the city objects belonging to the city :return: None or [CityObject] """ - if self._city_objects is None: - if self.city_objects_clusters is None: - self._city_objects = [] - else: - self._city_objects = self.city_objects_clusters - if self.buildings is not None: - for building in self.buildings: - self._city_objects.append(building) - if self.subway_entrances is not None: - for subway_entrance in self.subway_entrances: - self._city_objects.append(subway_entrance) - if self.energy_systems is not None: - for energy_system in self.energy_systems: - self._city_objects.append(energy_system) - return self._city_objects + if self._city_objects is None: + if self.city_objects_clusters is None: + self._city_objects = [] + else: + self._city_objects = self.city_objects_clusters + if self.buildings is not None: + for building in self.buildings: + self._city_objects.append(building) + if self.subway_entrances is not None: + for subway_entrance in self.subway_entrances: + self._city_objects.append(subway_entrance) + if self.energy_systems is not None: + for energy_system in self.energy_systems: + self._city_objects.append(energy_system) + return self._city_objects - @property - def buildings(self) -> Union[List[Building], None]: - """ + @property + def buildings(self) -> Union[List[Building], None]: + """ Get the buildings belonging to the city :return: None or [Building] """ - return self._buildings + return self._buildings - @property - def subway_entrances(self) -> Union[List[SubwayEntrance], None]: - """ + @property + def subway_entrances(self) -> Union[List[SubwayEntrance], None]: + """ Get the subway entrances belonging to the city :return: a list of subway entrances objects or none """ - return self._subway_entrances + return self._subway_entrances - @property - def lower_corner(self) -> List[float]: - """ + @property + def lower_corner(self) -> List[float]: + """ Get city lower corner :return: [x,y,z] """ - return self._lower_corner + return self._lower_corner - @property - def upper_corner(self) -> List[float]: - """ + @property + def upper_corner(self) -> List[float]: + """ Get city upper corner :return: [x,y,z] """ - return self._upper_corner + return self._upper_corner - def city_object(self, name) -> Union[CityObject, None]: - """ + def city_object(self, name) -> Union[CityObject, None]: + """ Retrieve the city CityObject with the given name :param name:str :return: None or CityObject """ - for city_object in self.buildings: - if city_object.name == name: - return city_object - return None + for city_object in self.buildings: + if city_object.name == name: + return city_object + return None - def add_city_object(self, new_city_object): - """ + def add_city_object(self, new_city_object): + """ Add a CityObject to the city :param new_city_object:CityObject :return: None or not implemented error """ - if new_city_object.type == 'building': - if self._buildings is None: - self._buildings = [] - self._buildings.append(new_city_object) - elif new_city_object.type == 'subway_entrance': - if self._subway_entrances is None: - self._subway_entrances = [] - self._subway_entrances.append(new_city_object) - elif new_city_object.type == 'energy_system': - if self._energy_systems is None: - self._energy_systems = [] - self._energy_systems.append(new_city_object) - else: - raise NotImplementedError(new_city_object.type) + if new_city_object.type == 'building': + if self._buildings is None: + self._buildings = [] + self._buildings.append(new_city_object) + elif new_city_object.type == 'subway_entrance': + if self._subway_entrances is None: + self._subway_entrances = [] + self._subway_entrances.append(new_city_object) + elif new_city_object.type == 'energy_system': + if self._energy_systems is None: + self._energy_systems = [] + self._energy_systems.append(new_city_object) + else: + raise NotImplementedError(new_city_object.type) - def remove_city_object(self, city_object): - """ + def remove_city_object(self, city_object): + """ Remove a CityObject from the city :param city_object:CityObject :return: None """ - if city_object.type != 'building': - raise NotImplementedError(city_object.type) - if self._buildings is None or self._buildings == []: - sys.stderr.write('Warning: impossible to remove city_object, the city is empty\n') - else: - if city_object in self._buildings: - self._buildings.remove(city_object) + if city_object.type != 'building': + raise NotImplementedError(city_object.type) + if self._buildings is None or self._buildings == []: + sys.stderr.write('Warning: impossible to remove city_object, the city is empty\n') + else: + if city_object in self._buildings: + self._buildings.remove(city_object) - @property - def srs_name(self) -> Union[None, str]: - """ + @property + def srs_name(self) -> Union[None, str]: + """ Get city srs name :return: None or str """ - return self._srs_name + return self._srs_name - @name.setter - def name(self, value): - """ + @name.setter + def name(self, value): + """ Set city name :param value:str """ - if value is not None: - self._name = str(value) + if value is not None: + self._name = str(value) - @staticmethod - def load(city_filename) -> City: - """ + @staticmethod + def load(city_filename) -> City: + """ Load a city saved with city.save(city_filename) :param city_filename: city filename :return: City """ - with open(city_filename, 'rb') as file: - return pickle.load(file) + with open(city_filename, 'rb') as file: + return pickle.load(file) - def save(self, city_filename): - """ + def save(self, city_filename): + """ Save a city into the given filename :param city_filename: destination city filename :return: None """ - with open(city_filename, 'wb') as file: - pickle.dump(self, file) + with open(city_filename, 'wb') as file: + pickle.dump(self, file) - def region(self, center, radius) -> City: - """ + def region(self, center, radius) -> City: + """ Get a region from the city :param center: specific point in space [x, y, z] :param radius: distance to center of the sphere selected in meters :return: selected_region_city """ - selected_region_lower_corner = [center[0] - radius, center[1] - radius, center[2] - radius] - selected_region_upper_corner = [center[0] + radius, center[1] + radius, center[2] + radius] - selected_region_city = City(selected_region_lower_corner, selected_region_upper_corner, srs_name=self.srs_name) - selected_region_city.climate_file = self.climate_file - # selected_region_city.climate_reference_city = self.climate_reference_city - for city_object in self.city_objects: - location = city_object.centroid - if location is not None: - distance = math.sqrt(math.pow(location[0] - center[0], 2) + math.pow(location[1] - center[1], 2) - + math.pow(location[2] - center[2], 2)) - if distance < radius: - selected_region_city.add_city_object(city_object) - return selected_region_city + selected_region_lower_corner = [center[0] - radius, center[1] - radius, center[2] - radius] + selected_region_upper_corner = [center[0] + radius, center[1] + radius, center[2] + radius] + selected_region_city = City(selected_region_lower_corner, selected_region_upper_corner, srs_name=self.srs_name) + selected_region_city.climate_file = self.climate_file +# selected_region_city.climate_reference_city = self.climate_reference_city + for city_object in self.city_objects: + location = city_object.centroid + if location is not None: + distance = math.sqrt(math.pow(location[0]-center[0], 2) + math.pow(location[1]-center[1], 2) + + math.pow(location[2]-center[2], 2)) + if distance < radius: + selected_region_city.add_city_object(city_object) + return selected_region_city - @property - def latitude(self) -> Union[None, float]: - """ + @property + def latitude(self) -> Union[None, float]: + """ Get city latitude in degrees :return: None or float """ - return self._latitude + return self._latitude - @latitude.setter - def latitude(self, value): - """ + @latitude.setter + def latitude(self, value): + """ Set city latitude in degrees :parameter value: float """ - if value is not None: - self._latitude = float(value) + if value is not None: + self._latitude = float(value) - @property - def longitude(self) -> Union[None, float]: - """ + @property + def longitude(self) -> Union[None, float]: + """ Get city longitude in degrees :return: None or float """ - return self._longitude + return self._longitude - @longitude.setter - def longitude(self, value): - """ + @longitude.setter + def longitude(self, value): + """ Set city longitude in degrees :parameter value: float """ - if value is not None: - self._longitude = float(value) + if value is not None: + self._longitude = float(value) - @property - def time_zone(self) -> Union[None, float]: - """ + @property + def time_zone(self) -> Union[None, float]: + """ Get city time_zone :return: None or float """ - return self._time_zone + return self._time_zone - @time_zone.setter - def time_zone(self, value): - """ + @time_zone.setter + def time_zone(self, value): + """ Set city time_zone :parameter value: float """ - if value is not None: - self._time_zone = float(value) + if value is not None: + self._time_zone = float(value) - @property - def buildings_clusters(self) -> Union[List[BuildingsCluster], None]: - """ + @property + def buildings_clusters(self) -> Union[List[BuildingsCluster], None]: + """ Get buildings clusters belonging to the city :return: None or [BuildingsCluster] """ - return self._buildings_clusters + return self._buildings_clusters - @property - def parts_consisting_buildings(self) -> Union[List[PartsConsistingBuilding], None]: - """ + @property + def parts_consisting_buildings(self) -> Union[List[PartsConsistingBuilding], None]: + """ Get parts consisting buildings belonging to the city :return: None or [PartsConsistingBuilding] """ - return self._parts_consisting_buildings + return self._parts_consisting_buildings - @property - def energy_systems(self) -> Union[List[EnergySystem], None]: - """ - Get energy systems belonging to the city - :return: None or [EnergySystem] - """ - return self._energy_systems + @property + def energy_systems(self) -> Union[List[EnergySystem], None]: + """ + Get energy systems belonging to the city + :return: None or [EnergySystem] + """ + return self._energy_systems - @property - def city_objects_clusters(self) -> Union[List[CityObjectsCluster], None]: - """ + @property + def city_objects_clusters(self) -> Union[List[CityObjectsCluster], None]: + """ Get city objects clusters belonging to the city :return: None or [CityObjectsCluster] """ - if self.buildings_clusters is None: - self._city_objects_clusters = [] - else: - self._city_objects_clusters = self.buildings_clusters - if self.parts_consisting_buildings is not None: - self._city_objects_clusters.append(self.parts_consisting_buildings) - return self._city_objects_clusters + if self.buildings_clusters is None: + self._city_objects_clusters = [] + else: + self._city_objects_clusters = self.buildings_clusters + if self.parts_consisting_buildings is not None: + self._city_objects_clusters.append(self.parts_consisting_buildings) + return self._city_objects_clusters - def add_city_objects_cluster(self, new_city_objects_cluster): - """ + def add_city_objects_cluster(self, new_city_objects_cluster): + """ Add a CityObject to the city :param new_city_objects_cluster:CityObjectsCluster :return: None or NotImplementedError """ - if new_city_objects_cluster.type == 'buildings': - if self._buildings_clusters is None: - self._buildings_clusters = [] - self._buildings_clusters.append(new_city_objects_cluster) - elif new_city_objects_cluster.type == 'building_parts': - if self._parts_consisting_buildings is None: - self._parts_consisting_buildings = [] - self._parts_consisting_buildings.append(new_city_objects_cluster) - else: - raise NotImplementedError + if new_city_objects_cluster.type == 'buildings': + if self._buildings_clusters is None: + self._buildings_clusters = [] + self._buildings_clusters.append(new_city_objects_cluster) + elif new_city_objects_cluster.type == 'building_parts': + if self._parts_consisting_buildings is None: + self._parts_consisting_buildings = [] + self._parts_consisting_buildings.append(new_city_objects_cluster) + else: + raise NotImplementedError diff --git a/city_model_structure/fuel.py b/city_model_structure/fuel.py new file mode 100644 index 00000000..e78a9f76 --- /dev/null +++ b/city_model_structure/fuel.py @@ -0,0 +1,41 @@ +""" +ConstructionFactory (before PhysicsFactory) retrieve the specific construction module for the given region +SPDX - License - Identifier: LGPL - 3.0 - or -later +Copyright © 2020 Project Author Atiya +""" + +class Fuel: + def __init__(self, fuel_id, name, carbon_emission_factor, unit): + self._fuel_id = fuel_id + self._name = name + self._carbon_emission_factor = carbon_emission_factor + self._unit = unit + + @property + def id(self): + """ + Get fuel id + """ + return self._fuel_id + + @property + def name(self): + """ + Get fuel name + """ + return self._name + + @property + def carbon_emission_factor(self): + """ + Get fuel carbon emission factor + """ + return self._carbon_emission_factor + + @property + def unit(self): + """ + Get fuel units + """ + return self._unit + diff --git a/data/life_cicle_analize/lca_data.xml b/data/life_cicle_analize/lca_data.xml new file mode 100644 index 00000000..bc3ab8ee --- /dev/null +++ b/data/life_cicle_analize/lca_data.xml @@ -0,0 +1,573 @@ + + + + + 0.32 + + + 0.4 + + + 0.4 + + + 0.5 + + + 0.18 + + + 0.39 + + + 0.27 + + + 4.16 + + + 2.24 + + + 0.2 + + + 3.19 + + + 3.53 + + + 0.27 + + + 0.21 + + + 1.69 + + + 0.21 + + + 0.35 + + + 0.18 + + + 0.81 + + + 1.21 + + + 1.61 + + + 0.11 + + + 0.3 + + + 1.16 + + + 0.61 + + + + + 0.347 + 16.5 + 0.918 + + + 0.033 + 25.2 + 4.16 + + + 0.027 + 16.8 + 2.239 + + + 0.023 + 16.8 + 2.239 + + + 0.109 + 25.2 + 2.239 + + + 0.003 + 16.4 + 4.16 + + + 0.002 + 11 + 0.918 + + + 0.002 + 90 + 0.918 + + + 0.002 + 10 + 0.918 + + + 0.002 + 11 + 0.918 + + + 0.002 + 132 + 0.918 + + + 0.002 + 15 + 0.918 + + + 0.002 + 5.5 + 0.918 + + + 0.002 + 22.5 + 0.918 + + + + + 0.0123 + 2.239 + + + 0.042 + 0.918 + + + 0.01 + 1.00000 + + + 1.3 + 1.00000 + + + + + + 1.8 + 560 + 0.8 + 0.3 + 0.7 + 0.2 + .... + + + 1.2 + 310 + 0.8 + 0.3 + 0.7 + 0.2 + .... + + + 2 + 3080 + 0.8 + 0.3 + 0.7 + 0.2 + .... + + + 1.4 + 300 + 0.8 + 0.3 + 0.7 + 0.2 + .... + + + + + 1.6 + 900 + 0.8 + 0 + 1 + 0.2 + .... + + + 1.6 + 2340 + 0.8 + 0 + 1 + 0.2 + .... + + + 1.6 + 1570 + 0.8 + 0 + 1 + 0.2 + .... + + + 1.4 + 1840 + 0.8 + 0 + 1 + 0.2 + .... + + + 1.3 + 410 + 0.8 + 0 + 1 + 0.2 + .... + + + 2.3 + 160 + 0.8 + 0 + 1 + 0.2 + .... + + + 2.3 + 170 + 0.8 + 0 + 1 + 0.2 + .... + + + 2.3 + 230 + 0.8 + 0 + 1 + 0.2 + .... + + + 2.4 + 240 + 0.8 + 0 + 1 + 0.2 + .... + + + 2.4 + 280 + 0.8 + 0 + 1 + 0.2 + .... + + + 2.3 + 170 + 0.8 + 0 + 1 + 0.2 + .... + + + 1.2 + 440 + 0.8 + 0 + 1 + 0.2 + .... + + + + + 2.58 + 2660 + 0.95 + 0 + 1 + 0.05 + .... + + + 2.58 + 5260 + 0.95 + 0 + 1 + 0.05 + .... + + + + + 0.06 + 1760 + 0.9 + 0 + 1 + 0.1 + .... + + + 0.122 + 3080 + 0.9 + 0 + 1 + 0.1 + .... + + + 0.028 + 3180 + 0.9 + 0 + 1 + 0.1 + .... + + + 0.024 + 5140 + 0.9 + 0 + 1 + 0.1 + .... + + + 0.1 + 6040 + 0.9 + 0 + 1 + 0.1 + .... + + + 0.3 + 5380 + 0.9 + 0 + 1 + 0.1 + .... + + + 0.032 + 2150 + 0.9 + 0 + 1 + 0.1 + .... + + + + + 0.9 + 3420 + 0.6 + 0 + 1 + 0.4 + .... + + + 0.7 + 1430 + 0.6 + 0 + 1 + 0.4 + .... + + + 0.65 + 2780 + 0.6 + 0 + 1 + 0.4 + .... + + + 0.72 + 2190 + 0.6 + 0 + 1 + 0.4 + .... + + + + + 1.43 + 1070 + 0 + 0 + 0 + 1 + .... + + + 1.43 + 240 + 0 + 0 + 0 + 1 + .... + + + 1.43 + 430 + 0 + 0 + 0 + 1 + .... + + + 1.43 + 340 + 0 + 0 + 0 + 1 + .... + + + 1.2 + 440 + 0.8 + 0 + 1 + 0.2 + .... + + + 2.1 + 1410 + 0.8 + 0 + 1 + 0.2 + .... + + + 1.43 + 250 + 0 + 0 + 0 + 1 + .... + + + 1.44 + 1480 + 0.8 + 0 + 1 + 0.2 + .... + + + 1.44 + 2220 + 0.8 + 0 + 1 + 0.2 + .... + + + 1.27 + 3960 + 0.8 + 0 + 1 + 0.2 + .... + + + 1.15 + 760 + 0.8 + 0 + 1 + 0.2 + .... + + + + + 8 + 3160 + 0.98 + 0 + 1 + 0.02 + .... + + + 2.7 + 5370 + 0.98 + 0 + 1 + 0.02 + .... + + + 7.85 + 3910 + 0.98 + 0 + 1 + 0.02 + .... + + + + \ No newline at end of file diff --git a/imports/life_cicle_analize/lca_fuel.py b/imports/life_cicle_analize/lca_fuel.py new file mode 100644 index 00000000..c35e0749 --- /dev/null +++ b/imports/life_cicle_analize/lca_fuel.py @@ -0,0 +1,24 @@ +""" +CityGml module parses citygml_classes files and import the geometry into the city model structure +SPDX - License - Identifier: LGPL - 3.0 - or -later +Copyright © 2020 Project Author Atiya +""" +import xmltodict +from pathlib import Path +from city_model_structure.fuel import Fuel + +class LcaFuel: + def __init__(self, city, base_path): + self._city = city + self._base_path = base_path + self._lca = None + + def enrich(self): + self._city.fuels = [] + path = Path(self._base_path / 'lca_data.xml').resolve() + + with open(path) as xml: + self._lca = xmltodict.parse(xml.read()) + for fuel in self._lca["library"]["Fuels"]['fuel']: + self._city.fuels.append(Fuel(fuel['@id'], fuel['@name'], fuel['carbon_emission_factor']['#text'], + fuel['carbon_emission_factor']['@unit'])) diff --git a/imports/life_cicle_analyze_factory.py b/imports/life_cicle_analyze_factory.py new file mode 100644 index 00000000..7a09097a --- /dev/null +++ b/imports/life_cicle_analyze_factory.py @@ -0,0 +1,33 @@ +""" +ConstructionFactory (before PhysicsFactory) retrieve the specific construction module for the given region +SPDX - License - Identifier: LGPL - 3.0 - or -later +Copyright © 2020 Project Author Atiya +""" + +from pathlib import Path +from imports.life_cicle_analize.lca_fuel import LcaFuel + + +class LifeCicleAnalizeFactory: + """ + Life cicle analize factory class + """ + def __init__(self, handler, city, base_path=None): + if base_path is None: + base_path = Path(Path(__file__).parent.parent / 'data/construction') + self._handler = '_' + handler.lower().replace(' ', '_') + self._city = city + self._base_path = base_path + + def _fuel(self): + """ + Enrich the city by adding the fuel carbon information + """ + LcaFuel(self._city, self._base_path).enrich() + + 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/unittests/tests_data/lca_data.xml b/unittests/tests_data/lca_data.xml new file mode 100644 index 00000000..bc3ab8ee --- /dev/null +++ b/unittests/tests_data/lca_data.xml @@ -0,0 +1,573 @@ + + + + + 0.32 + + + 0.4 + + + 0.4 + + + 0.5 + + + 0.18 + + + 0.39 + + + 0.27 + + + 4.16 + + + 2.24 + + + 0.2 + + + 3.19 + + + 3.53 + + + 0.27 + + + 0.21 + + + 1.69 + + + 0.21 + + + 0.35 + + + 0.18 + + + 0.81 + + + 1.21 + + + 1.61 + + + 0.11 + + + 0.3 + + + 1.16 + + + 0.61 + + + + + 0.347 + 16.5 + 0.918 + + + 0.033 + 25.2 + 4.16 + + + 0.027 + 16.8 + 2.239 + + + 0.023 + 16.8 + 2.239 + + + 0.109 + 25.2 + 2.239 + + + 0.003 + 16.4 + 4.16 + + + 0.002 + 11 + 0.918 + + + 0.002 + 90 + 0.918 + + + 0.002 + 10 + 0.918 + + + 0.002 + 11 + 0.918 + + + 0.002 + 132 + 0.918 + + + 0.002 + 15 + 0.918 + + + 0.002 + 5.5 + 0.918 + + + 0.002 + 22.5 + 0.918 + + + + + 0.0123 + 2.239 + + + 0.042 + 0.918 + + + 0.01 + 1.00000 + + + 1.3 + 1.00000 + + + + + + 1.8 + 560 + 0.8 + 0.3 + 0.7 + 0.2 + .... + + + 1.2 + 310 + 0.8 + 0.3 + 0.7 + 0.2 + .... + + + 2 + 3080 + 0.8 + 0.3 + 0.7 + 0.2 + .... + + + 1.4 + 300 + 0.8 + 0.3 + 0.7 + 0.2 + .... + + + + + 1.6 + 900 + 0.8 + 0 + 1 + 0.2 + .... + + + 1.6 + 2340 + 0.8 + 0 + 1 + 0.2 + .... + + + 1.6 + 1570 + 0.8 + 0 + 1 + 0.2 + .... + + + 1.4 + 1840 + 0.8 + 0 + 1 + 0.2 + .... + + + 1.3 + 410 + 0.8 + 0 + 1 + 0.2 + .... + + + 2.3 + 160 + 0.8 + 0 + 1 + 0.2 + .... + + + 2.3 + 170 + 0.8 + 0 + 1 + 0.2 + .... + + + 2.3 + 230 + 0.8 + 0 + 1 + 0.2 + .... + + + 2.4 + 240 + 0.8 + 0 + 1 + 0.2 + .... + + + 2.4 + 280 + 0.8 + 0 + 1 + 0.2 + .... + + + 2.3 + 170 + 0.8 + 0 + 1 + 0.2 + .... + + + 1.2 + 440 + 0.8 + 0 + 1 + 0.2 + .... + + + + + 2.58 + 2660 + 0.95 + 0 + 1 + 0.05 + .... + + + 2.58 + 5260 + 0.95 + 0 + 1 + 0.05 + .... + + + + + 0.06 + 1760 + 0.9 + 0 + 1 + 0.1 + .... + + + 0.122 + 3080 + 0.9 + 0 + 1 + 0.1 + .... + + + 0.028 + 3180 + 0.9 + 0 + 1 + 0.1 + .... + + + 0.024 + 5140 + 0.9 + 0 + 1 + 0.1 + .... + + + 0.1 + 6040 + 0.9 + 0 + 1 + 0.1 + .... + + + 0.3 + 5380 + 0.9 + 0 + 1 + 0.1 + .... + + + 0.032 + 2150 + 0.9 + 0 + 1 + 0.1 + .... + + + + + 0.9 + 3420 + 0.6 + 0 + 1 + 0.4 + .... + + + 0.7 + 1430 + 0.6 + 0 + 1 + 0.4 + .... + + + 0.65 + 2780 + 0.6 + 0 + 1 + 0.4 + .... + + + 0.72 + 2190 + 0.6 + 0 + 1 + 0.4 + .... + + + + + 1.43 + 1070 + 0 + 0 + 0 + 1 + .... + + + 1.43 + 240 + 0 + 0 + 0 + 1 + .... + + + 1.43 + 430 + 0 + 0 + 0 + 1 + .... + + + 1.43 + 340 + 0 + 0 + 0 + 1 + .... + + + 1.2 + 440 + 0.8 + 0 + 1 + 0.2 + .... + + + 2.1 + 1410 + 0.8 + 0 + 1 + 0.2 + .... + + + 1.43 + 250 + 0 + 0 + 0 + 1 + .... + + + 1.44 + 1480 + 0.8 + 0 + 1 + 0.2 + .... + + + 1.44 + 2220 + 0.8 + 0 + 1 + 0.2 + .... + + + 1.27 + 3960 + 0.8 + 0 + 1 + 0.2 + .... + + + 1.15 + 760 + 0.8 + 0 + 1 + 0.2 + .... + + + + + 8 + 3160 + 0.98 + 0 + 1 + 0.02 + .... + + + 2.7 + 5370 + 0.98 + 0 + 1 + 0.02 + .... + + + 7.85 + 3910 + 0.98 + 0 + 1 + 0.02 + .... + + + + \ No newline at end of file From 068a780ebb17d05e3ae9b53ecf45192c6d494f26 Mon Sep 17 00:00:00 2001 From: Pilar Date: Thu, 11 Nov 2021 17:25:53 -0500 Subject: [PATCH 11/17] Added comnet usage library, including import factory. Some modifications on internal_gains.py and hft_internal_gains_archetypes.py were required. Also created a class to pass from daily schedules to yearly schedule. --- .../building_demand/internal_gains.py | 20 ++- data/usage/comnet_archetypes.xlsx | Bin 0 -> 299386 bytes helpers/constants.py | 13 +- helpers/yearly_from_daily_schedules.py | 44 +++++ imports/construction/us_physics_parameters.py | 1 - imports/usage/comnet_usage_parameters.py | 162 ++++++++++++++++++ .../hft_internal_gains_archetype.py | 21 ++- imports/usage/helpers/usage_helper.py | 26 +++ imports/usage/hft_usage_interface.py | 6 +- imports/usage_factory.py | 7 + 10 files changed, 289 insertions(+), 11 deletions(-) create mode 100644 data/usage/comnet_archetypes.xlsx create mode 100644 helpers/yearly_from_daily_schedules.py create mode 100644 imports/usage/comnet_usage_parameters.py diff --git a/city_model_structure/building_demand/internal_gains.py b/city_model_structure/building_demand/internal_gains.py index d2342a98..75e60cb7 100644 --- a/city_model_structure/building_demand/internal_gains.py +++ b/city_model_structure/building_demand/internal_gains.py @@ -13,11 +13,29 @@ class InternalGains: """ def __init__(self): + self._type = None self._average_internal_gain = None self._convective_fraction = None self._radiative_fraction = None self._latent_fraction = None + @property + def type(self) -> Union[None, str]: + """ + Get internal gains type + :return: None or string + """ + return self._type + + @type.setter + def type(self, value): + """ + Set internal gains type + :param value: string + """ + if value is not None: + self._type = str(value) + @property def average_internal_gain(self) -> Union[None, float]: """ @@ -30,7 +48,7 @@ class InternalGains: def average_internal_gain(self, value): """ Set internal gains average internal gain in W/m2 - :param value:float + :param value: float """ if value is not None: self._average_internal_gain = float(value) diff --git a/data/usage/comnet_archetypes.xlsx b/data/usage/comnet_archetypes.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..8e04fc172f0162f8c1be9e1226508daa6cc9bf88 GIT binary patch literal 299386 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

)m`1yYhA0awHJCAtE|ZobxhQc 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­vvJ8il$%stZfv`1 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 z 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 N76`=Q1teI|{{tq@Llpo3 literal 0 HcmV?d00001 diff --git a/helpers/constants.py b/helpers/constants.py index 50a35eb7..00416177 100644 --- a/helpers/constants.py +++ b/helpers/constants.py @@ -10,6 +10,7 @@ KELVIN = 273.15 # converters HOUR_TO_MINUTES = 60 METERS_TO_FEET = 3.28084 +BTU_H_TO_WATTS = 0.29307107 # time SECOND = 'second' @@ -40,7 +41,6 @@ TEMPERATURE = 'temperature' HUMIDITY = 'humidity' CONTROL_TYPE = 'control_type' -# todo: modify code to use global constants instead of hard-coded values # surface types WALL = 'Wall' GROUND_WALL = 'Ground wall' @@ -80,7 +80,10 @@ HALL = 'hall' RESTAURANT = 'restaurant' EDUCATION = 'education' - - - - +LIGHTING = 'Lights' +OCCUPANCY = 'Occupancy' +RECEPTACLE = 'Receptacle' +HVAC_AVAILABILITY = 'HVAC Avail' +INFILTRATION = 'Infiltration' +COOLING_SET_POINT = 'ClgSetPt' +HEATING_SET_POINT = 'HtgSetPt' diff --git a/helpers/yearly_from_daily_schedules.py b/helpers/yearly_from_daily_schedules.py new file mode 100644 index 00000000..c7c3bac5 --- /dev/null +++ b/helpers/yearly_from_daily_schedules.py @@ -0,0 +1,44 @@ +""" +Yearly from daily schedules module +SPDX - License - Identifier: LGPL - 3.0 - or -later +Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +""" +import calendar as cal +import helpers.constants as cte +from city_model_structure.attributes.schedule import Schedule + + +class YearlyFromDailySchedules: + """ + YearlyFromDailySchedules class + """ + def __init__(self, daily_schedules, year): + self._daily_schedules = daily_schedules + self._year = year + + @property + def yearly_schedule(self) -> Schedule: + """ + Creates a yearly schedule out of a set of daily schedules + :return: Schedule + """ + yearly_schedule = Schedule() + weekly_schedules = [0, 0, 0, 0, 0, 0, 0] + day_types = dict({cte.MONDAY: 0, cte.TUESDAY: 1, cte.WEDNESDAY: 2, cte.THURSDAY: 3, + cte.FRIDAY: 4, cte.SATURDAY: 5, cte.SUNDAY: 6}) + for daily_schedule in self._daily_schedules: + for day_type in daily_schedule.day_types: + weekly_schedules[day_types[day_type]] = daily_schedule.values + + values = [] + for month in range(1, 13): + for day in range(1, cal.monthlen(self._year, month)+1): + week_day = cal.weekday(self._year, month, day) + values.extend(weekly_schedules[week_day]) + yearly_schedule.type = self._daily_schedules[0].type + yearly_schedule.data_type = self._daily_schedules[0].data_type + yearly_schedule.time_range = cte.YEAR + yearly_schedule.time_step = cte.HOUR + yearly_schedule.values = values + + return yearly_schedule diff --git a/imports/construction/us_physics_parameters.py b/imports/construction/us_physics_parameters.py index f45e0f29..50b0b8ca 100644 --- a/imports/construction/us_physics_parameters.py +++ b/imports/construction/us_physics_parameters.py @@ -31,7 +31,6 @@ class UsPhysicsParameters(NrelPhysicsInterface): # it is assumed that all buildings have the same archetypes' keys for building in city.buildings: building_type = ConstructionHelper.nrel_from_function(building.function) - print(building_type) if building_type is None: return archetype = self._search_archetype(building_type, diff --git a/imports/usage/comnet_usage_parameters.py b/imports/usage/comnet_usage_parameters.py new file mode 100644 index 00000000..5d10312c --- /dev/null +++ b/imports/usage/comnet_usage_parameters.py @@ -0,0 +1,162 @@ +""" +ComnetUsageParameters model the usage properties +SPDX - License - Identifier: LGPL - 3.0 - or -later +Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +""" +import sys +from typing import Dict +import pandas as pd + +import helpers.constants as cte +from helpers.configuration_helper import ConfigurationHelper as ch +from imports.geometry.helpers.geometry_helper import GeometryHelper +from imports.usage.helpers.usage_helper import UsageHelper +from city_model_structure.building_demand.usage_zone import UsageZone +from city_model_structure.building_demand.internal_gains import InternalGains +from imports.usage.data_classes.hft_usage_zone_archetype import HftUsageZoneArchetype as huza +from imports.usage.data_classes.hft_internal_gains_archetype import HftInternalGainsArchetype as higa + + +class ComnetUsageParameters: + """ + ComnetUsageParameters class + """ + def __init__(self, city, base_path): + self._city = city + self._base_path = str(base_path / 'comnet_archetypes.xlsx') + self._usage_archetypes = [] + data = self._read_file() + for item in data['lighting']: + for usage in UsageHelper.usage_to_comnet: + comnet_usage = UsageHelper.usage_to_comnet[usage] + if comnet_usage == item: + usage_archetype = self._parse_zone_usage_type(comnet_usage, data) + self._usage_archetypes.append(usage_archetype) + + def _read_file(self) -> Dict: + """ + reads xlsx file containing usage information into a dictionary + :return : Dict + """ + number_usage_types = 33 + xl_file = pd.ExcelFile(self._base_path) + file_data = pd.read_excel(xl_file, sheet_name="Modeling Data", skiprows=[0, 1, 2], + nrows=number_usage_types, usecols="A:Z") + + lighting_data = {} + plug_loads_data = {} + occupancy_data = {} + ventilation_rate = {} + water_heating = {} + process_data = {} + + for j in range(0, number_usage_types): + usage_parameters = file_data.iloc[j] + usage_type = usage_parameters[0] + lighting_data[usage_type] = usage_parameters[1:6].values.tolist() + plug_loads_data[usage_type] = usage_parameters[8:13].values.tolist() + occupancy_data[usage_type] = usage_parameters[17:20].values.tolist() + ventilation_rate[usage_type] = usage_parameters[20:21].values.tolist() + water_heating[usage_type] = usage_parameters[23:24].values.tolist() + process_data[usage_type] = usage_parameters[24:26].values.tolist() + + return {'lighting': lighting_data, + 'plug loads': plug_loads_data, + 'occupancy': occupancy_data, + 'ventilation rate': ventilation_rate, + 'water heating': water_heating, + 'process': process_data} + + @staticmethod + def _parse_zone_usage_type(usage, data): + if data['occupancy'][usage][0] <= 0: + occupancy_density = 0 + else: + occupancy_density = 1 / data['occupancy'][usage][0] + mechanical_air_change = data['ventilation rate'][usage][0] + internal_gains = [] + # lighting + latent_fraction = ch().comnet_lighting_latent + convective_fraction = ch().comnet_lighting_convective + radiative_fraction = ch().comnet_lighting_radiant + average_internal_gain = data['lighting'][usage][4] + internal_gains.append(higa(internal_gains_type=cte.LIGHTING, average_internal_gain=average_internal_gain, + convective_fraction=convective_fraction, radiative_fraction=radiative_fraction, + latent_fraction=latent_fraction)) + # occupancy + latent_fraction = data['occupancy'][usage][2] / (data['occupancy'][usage][1] + data['occupancy'][usage][2]) + sensible_fraction = float(1 - latent_fraction) + convective_fraction = sensible_fraction * ch().comnet_occupancy_sensible_convective + radiative_fraction = sensible_fraction * ch().comnet_occupancy_sensible_radiant + average_internal_gain = (data['occupancy'][usage][1] + data['occupancy'][usage][2]) \ + * occupancy_density * cte.BTU_H_TO_WATTS + internal_gains.append(higa(internal_gains_type=cte.OCCUPANCY, average_internal_gain=average_internal_gain, + convective_fraction=convective_fraction, radiative_fraction=radiative_fraction, + latent_fraction=latent_fraction)) + # plug loads + if data['plug loads'][usage][0] != 'n.a.': + latent_fraction = ch().comnet_plugs_latent + convective_fraction = ch().comnet_plugs_convective + radiative_fraction = ch().comnet_plugs_radiant + average_internal_gain = data['plug loads'][usage][0] + internal_gains.append(higa(internal_gains_type=cte.RECEPTACLE, average_internal_gain=average_internal_gain, + convective_fraction=convective_fraction, radiative_fraction=radiative_fraction, + latent_fraction=latent_fraction)) + + usage_zone_archetype = huza(usage=usage, internal_gains=internal_gains, + occupancy_density=occupancy_density, + mechanical_air_change=mechanical_air_change) + return usage_zone_archetype + + def enrich_buildings(self): + """ + Returns the city with the usage parameters assigned to the buildings + :return: + """ + city = self._city + for building in city.buildings: + usage = GeometryHelper.usage_from_function(building.function) + height = building.average_storey_height + if height is None: + raise Exception('Average storey height not defined, ACH cannot be calculated') + if height <= 0: + raise Exception('Average storey height is zero, ACH cannot be calculated') + archetype = self._search_archetype(UsageHelper.comnet_from_usage(usage)) + 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'{GeometryHelper.usage_from_function(building.function)}\n') + continue + + # just one usage_zone + for thermal_zone in building.thermal_zones: + usage_zone = UsageZone() + usage_zone.usage = usage + self._assign_values(usage_zone, archetype, height) + usage_zone.volume = thermal_zone.volume + 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, height): + # Due to the fact that python is not a typed language, the wrong object type is assigned to + # usage_zone.internal_gains when writing usage_zone.internal_gains = archetype.internal_gains. + # Therefore, this walk around has been done. + internal_gains = [] + for archetype_internal_gain in archetype.internal_gains: + internal_gain = InternalGains() + internal_gain.type = archetype_internal_gain.type + internal_gain.average_internal_gain = archetype_internal_gain.average_internal_gain * cte.METERS_TO_FEET**2 + internal_gain.convective_fraction = archetype_internal_gain.convective_fraction + internal_gain.radiative_fraction = archetype_internal_gain.radiative_fraction + internal_gain.latent_fraction = archetype_internal_gain.latent_fraction + internal_gains.append(internal_gain) + usage_zone.internal_gains = internal_gains + usage_zone.occupancy_density = archetype.occupancy_density * cte.METERS_TO_FEET**2 + usage_zone.mechanical_air_change = archetype.mechanical_air_change * usage_zone.occupancy_density \ + * cte.HOUR_TO_MINUTES / cte.METERS_TO_FEET**3 / height diff --git a/imports/usage/data_classes/hft_internal_gains_archetype.py b/imports/usage/data_classes/hft_internal_gains_archetype.py index c9de13b0..cc21a77a 100644 --- a/imports/usage/data_classes/hft_internal_gains_archetype.py +++ b/imports/usage/data_classes/hft_internal_gains_archetype.py @@ -9,13 +9,30 @@ class HftInternalGainsArchetype: """ HftInternalGainsArchetype class """ - def __init__(self, average_internal_gain=None, convective_fraction=None, radiative_fraction=None, - latent_fraction=None): + def __init__(self, internal_gains_type=None, average_internal_gain=None, convective_fraction=None, \ + radiative_fraction=None, latent_fraction=None): + self._type = internal_gains_type self._average_internal_gain = average_internal_gain self._convective_fraction = convective_fraction self._radiative_fraction = radiative_fraction self._latent_fraction = latent_fraction + @property + def type(self): + """ + Get internal gains type + :return: string + """ + return self._type + + @type.setter + def type(self, value): + """ + Set internal gains type + :param value: string + """ + self._type = value + @property def average_internal_gain(self): """ diff --git a/imports/usage/helpers/usage_helper.py b/imports/usage/helpers/usage_helper.py index b46b08d3..310b4888 100644 --- a/imports/usage/helpers/usage_helper.py +++ b/imports/usage/helpers/usage_helper.py @@ -36,3 +36,29 @@ class UsageHelper: except KeyError: sys.stderr.write('Error: keyword not found. Returned default HfT usage "residential"\n') return UsageHelper.hft_default_value + + usage_to_comnet = { + cte.RESIDENTIAL: 'BA Multifamily', + cte.INDUSTRY: 'BA Manufacturing Facility', + cte.OFFICE_ADMINISTRATION: 'BA Office', + cte.HOTEL: 'BA Hotel', + cte.HEALTH_CARE: 'BA Hospital', + cte.RETAIL: 'BA Retail', + cte.HALL: 'BA Town Hall', + cte.RESTAURANT: 'BA Dining: Bar Lounge/Leisure', + cte.EDUCATION: 'BA School/University' + } + comnet_default_value = 'BA Multifamily' + + @staticmethod + def comnet_from_usage(usage): + """ + Get Comnet usage from the given internal usage key + :param usage: str + :return: str + """ + try: + return UsageHelper.usage_to_comnet[usage] + except KeyError: + sys.stderr.write('Error: keyword not found. Returned default Comnet usage "BA Multifamily"\n') + return UsageHelper.comnet_default_value diff --git a/imports/usage/hft_usage_interface.py b/imports/usage/hft_usage_interface.py index b6223295..3da6457d 100644 --- a/imports/usage/hft_usage_interface.py +++ b/imports/usage/hft_usage_interface.py @@ -68,7 +68,8 @@ class HftUsageInterface: average_internal_gain = 0 radiative_fraction = 0 - internal_gains.append(higa(average_internal_gain, convective_fraction, radiative_fraction, latent_fraction)) + internal_gains.append(higa(average_internal_gain=average_internal_gain, convective_fraction=convective_fraction, + radiative_fraction=radiative_fraction, latent_fraction=latent_fraction)) usage_zone_archetype = huza(usage=usage, internal_gains=internal_gains, heating_set_point=heating_setpoint, heating_set_back=heating_setback, cooling_set_point=cooling_setpoint, occupancy_density=occupancy_density, hours_day=hours_day, days_year=days_year, @@ -130,7 +131,8 @@ class HftUsageInterface: average_internal_gain = usage_zone_variant['schedules']['internGains']['averageInternGainPerSqm'] if 'radiantFraction' in usage_zone_variant['schedules']['internGains']: radiative_fraction = usage_zone_variant['schedules']['internGains']['radiantFraction'] - internal_gains.append(higa(average_internal_gain, convective_fraction, radiative_fraction, latent_fraction)) + internal_gains.append(higa(average_internal_gain=average_internal_gain, convective_fraction=convective_fraction, + radiative_fraction=radiative_fraction, latent_fraction=latent_fraction)) usage_zone_archetype = huza(usage=usage, internal_gains=internal_gains, heating_set_point=heating_setpoint, heating_set_back=heating_setback, cooling_set_point=cooling_setpoint, occupancy_density=occupancy_density, hours_day=hours_day, days_year=days_year, diff --git a/imports/usage_factory.py b/imports/usage_factory.py index a886c197..0e2875de 100644 --- a/imports/usage_factory.py +++ b/imports/usage_factory.py @@ -8,6 +8,7 @@ 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.comnet_usage_parameters import ComnetUsageParameters # todo: handle missing lambda and rise error. @@ -38,6 +39,12 @@ class UsageFactory: """ return CaUsageParameters(self._city, self._base_path).enrich_buildings() + def _comnet(self): + """ + Enrich the city with COMNET usage library + """ + return ComnetUsageParameters(self._city, self._base_path).enrich_buildings() + def enrich(self): """ Enrich the city given to the class using the usage factory given handler From da17cd5d823066730ded676885f669df74374abc Mon Sep 17 00:00:00 2001 From: Pilar Date: Thu, 11 Nov 2021 17:27:19 -0500 Subject: [PATCH 12/17] Changed hard-coded values to constant values --- imports/schedules/helpers/schedules_helper.py | 32 +++++++++---------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/imports/schedules/helpers/schedules_helper.py b/imports/schedules/helpers/schedules_helper.py index a36c2fa6..fa47b343 100644 --- a/imports/schedules/helpers/schedules_helper.py +++ b/imports/schedules/helpers/schedules_helper.py @@ -33,28 +33,26 @@ class SchedulesHelper: # usage function_to_usage = { - 'full service restaurant': 'restaurant', + 'full service restaurant': cte.RESTAURANT, 'high-rise apartment': cte.RESIDENTIAL, - 'hospital': 'health care', - 'large hotel': 'hotel', - 'large office': 'office and administration', - 'medium office': 'office and administration', + 'hospital': cte.HEALTH_CARE, + 'large hotel': cte.HOTEL, + 'large office': cte.OFFICE_ADMINISTRATION, + 'medium office': cte.OFFICE_ADMINISTRATION, 'midrise apartment': cte.RESIDENTIAL, - 'outpatient healthcare': 'health care', - 'primary school': 'education', - 'quick service restaurant': 'restaurant', - 'secondary school': 'education', - 'small hotel': 'hotel', - 'small office': 'office and administration', - 'stand-alone-retail': 'retail', - 'strip mall': 'hall', - 'supermarket': 'retail', - 'warehouse': 'industry', + 'outpatient healthcare': cte.HEALTH_CARE, + 'primary school': cte.EDUCATION, + 'quick service restaurant': cte.RESTAURANT, + 'secondary school': cte.EDUCATION, + 'small hotel': cte.HOTEL, + 'small office': cte.OFFICE_ADMINISTRATION, + 'stand-alone-retail': cte.RETAIL, + 'strip mall': cte.HALL, + 'supermarket': cte.RETAIL, + 'warehouse': cte.INDUSTRY, 'residential': cte.RESIDENTIAL } - - @staticmethod def comnet_from_usage(usage): """ From 61e5e95c0c403eff87e715a343f2443abfa92e80 Mon Sep 17 00:00:00 2001 From: Pilar Date: Thu, 11 Nov 2021 17:28:28 -0500 Subject: [PATCH 13/17] Added new values to configuration.ini for comnet usage --- config/configuration.ini | 8 ++++ helpers/configuration_helper.py | 66 +++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+) diff --git a/config/configuration.ini b/config/configuration.ini index 394c1c61..b2ddfb04 100644 --- a/config/configuration.ini +++ b/config/configuration.ini @@ -3,3 +3,11 @@ max_location_distance_for_shared_walls = 5.0 min_coordinate = -1.7976931348623157e+308 max_coordinate = 1.7976931348623157e+308 +comnet_lighting_latent = 0 +comnet_lighting_convective = 0.5 +comnet_lighting_radiant = 0.5 +comnet_occupancy_sensible_convective = 0.9 +comnet_occupancy_sensible_radiant = 0.1 +comnet_plugs_latent = 0 +comnet_plugs_convective = 0.75 +comnet_plugs_radiant = 0.25 diff --git a/helpers/configuration_helper.py b/helpers/configuration_helper.py index de99f24a..85677ceb 100644 --- a/helpers/configuration_helper.py +++ b/helpers/configuration_helper.py @@ -39,3 +39,69 @@ class ConfigurationHelper: :return: 1.7976931348623157e+308 """ return self._config.getfloat('buildings', 'max_coordinate').real + + @property + def comnet_lighting_latent(self) -> float: + """ + Get configured latent ratio of internal gains do to lighting used for Comnet (ASHRAE) standard + :return: 0 + """ + return self._config.getfloat('buildings', 'comnet_lighting_latent').real + + @property + def comnet_lighting_convective(self) -> float: + """ + Get configured convective ratio of internal gains do to lighting used for Comnet (ASHRAE) standard + :return: 0.5 + """ + return self._config.getfloat('buildings', 'comnet_lighting_convective').real + + @property + def comnet_lighting_radiant(self) -> float: + """ + Get configured radiant ratio of internal gains do to lighting used for Comnet (ASHRAE) standard + :return: 0.5 + """ + return self._config.getfloat('buildings', 'comnet_lighting_radiant').real + + @property + def comnet_plugs_latent(self) -> float: + """ + Get configured latent ratio of internal gains do to electrical appliances used for Comnet (ASHRAE) standard + :return: 0 + """ + return self._config.getfloat('buildings', 'comnet_plugs_latent').real + + @property + def comnet_plugs_convective(self) -> float: + """ + Get configured convective ratio of internal gains do to electrical appliances used for Comnet (ASHRAE) standard + :return: 0.75 + """ + return self._config.getfloat('buildings', 'comnet_plugs_convective').real + + @property + def comnet_plugs_radiant(self) -> float: + """ + Get configured radiant ratio of internal gains do to electrical appliances used for Comnet (ASHRAE) standard + :return: 0.25 + """ + return self._config.getfloat('buildings', 'comnet_plugs_radiant').real + + @property + def comnet_occupancy_sensible_convective(self) -> float: + """ + Get configured convective ratio of the sensible part of internal gains do to occupancy + used for Comnet (ASHRAE) standard + :return: 0.9 + """ + return self._config.getfloat('buildings', 'comnet_occupancy_sensible_convective').real + + @property + def comnet_occupancy_sensible_radiant(self) -> float: + """ + Get configured radiant ratio of the sensible part of internal gains do to occupancy + used for Comnet (ASHRAE) standard + :return: 0.1 + """ + return self._config.getfloat('buildings', 'comnet_occupancy_sensible_radiant').real From cc56c19aa0d3c48d951a7e411b394b67110f334d Mon Sep 17 00:00:00 2001 From: atiya Date: Sat, 13 Nov 2021 00:55:04 -0500 Subject: [PATCH 14/17] added Machine and Vehicle classes to Life Cycle Assessment --- city_model_structure/machine.py | 78 +++++++++++++++++++ city_model_structure/vehicle.py | 61 +++++++++++++++ .../lca_fuel.py | 2 +- imports/life_cycle_assessment/lca_machine.py | 26 +++++++ imports/life_cycle_assessment/lca_vehicle.py | 25 ++++++ ...ry.py => life_cycle_assessment_factory.py} | 20 ++++- .../test_life_cycle_assessment_factory.py | 50 ++++++++++++ 7 files changed, 258 insertions(+), 4 deletions(-) create mode 100644 city_model_structure/machine.py create mode 100644 city_model_structure/vehicle.py rename imports/{life_cicle_analize => life_cycle_assessment}/lca_fuel.py (93%) create mode 100644 imports/life_cycle_assessment/lca_machine.py create mode 100644 imports/life_cycle_assessment/lca_vehicle.py rename imports/{life_cicle_analyze_factory.py => life_cycle_assessment_factory.py} (56%) create mode 100644 unittests/test_life_cycle_assessment_factory.py diff --git a/city_model_structure/machine.py b/city_model_structure/machine.py new file mode 100644 index 00000000..5c25fc71 --- /dev/null +++ b/city_model_structure/machine.py @@ -0,0 +1,78 @@ +""" +LifeCycleAssessment retrieve the specific Life Cycle Assessment module for the given region +SPDX - License - Identifier: LGPL - 3.0 - or -later +Copyright © 2020 Project Author Atiya +""" + +class Machine: + """ + Machine class + """ + + def __init__(self, machine_id, name, work_efficiency, work_efficiency_unit, energy_consumption_rate, energy_consumption_unit, + carbon_emission_factor, carbon_emission_unit): + self._machine_id = machine_id + self._name = name + self._work_efficiency = work_efficiency + self._work_efficiency_unit = work_efficiency_unit + self._energy_consumption_rate = energy_consumption_rate + self._energy_consumption_unit = energy_consumption_unit + self._carbon_emission_factor = carbon_emission_factor + self._carbon_emission_unit = carbon_emission_unit + + @property + def id(self): + """ + Get machine id + """ + return self._machine_id + + @property + def name(self): + """ + Get machine name + """ + return self._name + + @property + def work_efficiency(self): + """ + Get machine work efficiency + """ + return self._work_efficiency + + @property + def work_efficiency_unit(self): + """ + Get machine work efficiency unit + """ + return self._work_efficiency_unit + + @property + def energy_consumption_rate(self): + """ + Get energy consumption rate + """ + return self._energy_consumption_rate + + @property + def energy_consumption_unit(self): + """ + Get energy consumption unit + """ + return self._energy_consumption_unit + + @property + def carbon_emission_factor(self): + """ + Get carbon emission factor + """ + return self._carbon_emission_factor + + @property + def carbon_emission_unit(self): + """ + Get carbon emission unit + """ + return self._carbon_emission_unit + diff --git a/city_model_structure/vehicle.py b/city_model_structure/vehicle.py new file mode 100644 index 00000000..95aff94a --- /dev/null +++ b/city_model_structure/vehicle.py @@ -0,0 +1,61 @@ +""" +LifeCycleAssessment retrieve the specific Life Cycle Assessment module for the given region +SPDX - License - Identifier: LGPL - 3.0 - or -later +Copyright © 2020 Project Author Atiya +""" + +class Vehicle: + """ + Vehicle class + """ + + def __init__(self, vehicle_id, name, fuel_consumption_rate, fuel_consumption_unit, carbon_emission_factor, carbon_emission_factor_unit): + self._vehicle_id = vehicle_id + self._name = name + self._fuel_consumption_rate = fuel_consumption_rate + self._fuel_consumption_unit = fuel_consumption_unit + self._carbon_emission_factor = carbon_emission_factor + self._carbon_emission_factor_unit = carbon_emission_factor_unit + + @property + def id(self): + """ + Get vehicle id + """ + return self._vehicle_id + + @property + def name(self): + """ + Get vehicle name + """ + return self._name + + @property + def fuel_consumption_rate(self): + """ + Get vehicle fuel consumption rate + """ + return self._fuel_consumption_rate + + @property + def fuel_consumption_unit(self): + """ + Get fuel consumption unit + """ + return self._fuel_consumption_unit + + @property + def carbon_emission_factor(self): + """ + Get vehicle carbon emission factor + """ + return self._carbon_emission_factor + + @property + def carbon_emission_unit(self): + """ + Get carbon emission units + """ + return self._carbon_emission_unit + diff --git a/imports/life_cicle_analize/lca_fuel.py b/imports/life_cycle_assessment/lca_fuel.py similarity index 93% rename from imports/life_cicle_analize/lca_fuel.py rename to imports/life_cycle_assessment/lca_fuel.py index c35e0749..2ffbcb37 100644 --- a/imports/life_cicle_analize/lca_fuel.py +++ b/imports/life_cycle_assessment/lca_fuel.py @@ -19,6 +19,6 @@ class LcaFuel: with open(path) as xml: self._lca = xmltodict.parse(xml.read()) - for fuel in self._lca["library"]["Fuels"]['fuel']: + for fuel in self._lca["library"]["fuels"]['fuel']: self._city.fuels.append(Fuel(fuel['@id'], fuel['@name'], fuel['carbon_emission_factor']['#text'], fuel['carbon_emission_factor']['@unit'])) diff --git a/imports/life_cycle_assessment/lca_machine.py b/imports/life_cycle_assessment/lca_machine.py new file mode 100644 index 00000000..ae90c03c --- /dev/null +++ b/imports/life_cycle_assessment/lca_machine.py @@ -0,0 +1,26 @@ +""" +CityGml module parses citygml_classes files and import the geometry into the city model structure +SPDX - License - Identifier: LGPL - 3.0 - or -later +Copyright © 2020 Project Author Atiya +""" +import xmltodict +from pathlib import Path +from city_model_structure.machine import Machine + +class LcaMachine: + def __init__(self, city, base_path): + self._city = city + self._base_path = base_path + self._lca = None + + def enrich(self): + self._city.machines = [] + path = Path(self._base_path / 'lca_data.xml').resolve() + + with open(path) as xml: + self._lca = xmltodict.parse(xml.read()) + for machine in self._lca["library"]["machines"]['machine']: + self._city.machines.append(Machine(machine['@id'], machine['@name'], machine['work_efficiency']['#text'], + machine['work_efficiency']['@unit'], machine['energy_consumption_rate']['#text'], + machine['energy_consumption_rate']['@unit'], machine['carbon_emission_factor']['#text'], + machine['carbon_emission_factor']['@unit'])) diff --git a/imports/life_cycle_assessment/lca_vehicle.py b/imports/life_cycle_assessment/lca_vehicle.py new file mode 100644 index 00000000..79da498f --- /dev/null +++ b/imports/life_cycle_assessment/lca_vehicle.py @@ -0,0 +1,25 @@ +""" +CityGml module parses citygml_classes files and import the geometry into the city model structure +SPDX - License - Identifier: LGPL - 3.0 - or -later +Copyright © 2020 Project Author Atiya +""" +import xmltodict +from pathlib import Path +from city_model_structure.vehicle import Vehicle + +class LcaVehicle: + def __init__(self, city, base_path): + self._city = city + self._base_path = base_path + self._lca = None + + def enrich(self): + self._city.vehicles = [] + path = Path(self._base_path / 'lca_data.xml').resolve() + + with open(path) as xml: + self._lca = xmltodict.parse(xml.read()) + for vehicle in self._lca["library"]["vehicles"]['vehicle']: + self._city.vehicles.append(Vehicle(vehicle['@id'], vehicle['@name'], vehicle['fuel_consumption_rate']['#text'], + vehicle['fuel_consumption_rate']['@unit'], vehicle['carbon_emission_factor']['#text'], + vehicle['carbon_emission_factor']['@unit'])) diff --git a/imports/life_cicle_analyze_factory.py b/imports/life_cycle_assessment_factory.py similarity index 56% rename from imports/life_cicle_analyze_factory.py rename to imports/life_cycle_assessment_factory.py index 7a09097a..3aff1fe4 100644 --- a/imports/life_cicle_analyze_factory.py +++ b/imports/life_cycle_assessment_factory.py @@ -5,16 +5,18 @@ Copyright © 2020 Project Author Atiya """ from pathlib import Path -from imports.life_cicle_analize.lca_fuel import LcaFuel +from imports.life_cycle_assessment.lca_fuel import LcaFuel +from imports.life_cycle_assessment.lca_vehicle import LcaVehicle +from imports.life_cycle_assessment.lca_machine import LcaMachine -class LifeCicleAnalizeFactory: +class LifeCycleAssessment: """ Life cicle analize factory class """ def __init__(self, handler, city, base_path=None): if base_path is None: - base_path = Path(Path(__file__).parent.parent / 'data/construction') + base_path = Path(Path(__file__).parent.parent / 'data/life_cycle_assessment') self._handler = '_' + handler.lower().replace(' ', '_') self._city = city self._base_path = base_path @@ -25,6 +27,18 @@ class LifeCicleAnalizeFactory: """ LcaFuel(self._city, self._base_path).enrich() + def _vehicle(self): + """ + Enrich the city by adding the vehicle carbon information + """ + LcaVehicle(self._city, self._base_path).enrich() + + def _machine(self): + """ + Enrich the city by adding the machine carbon information + """ + LcaMachine(self._city, self._base_path).enrich() + def enrich(self): """ Enrich the city given to the class using the class given handler diff --git a/unittests/test_life_cycle_assessment_factory.py b/unittests/test_life_cycle_assessment_factory.py new file mode 100644 index 00000000..32e3453e --- /dev/null +++ b/unittests/test_life_cycle_assessment_factory.py @@ -0,0 +1,50 @@ +""" +Building test +SPDX - License - Identifier: LGPL - 3.0 - or -later +Copyright © 2020 Project Author Guille Gutierrez Morote Guillermo.GutierrezMorote@concordia.ca +""" +from pathlib import Path +from unittest import TestCase +from imports.geometry_factory import GeometryFactory +from imports.life_cycle_assessment_factory import LifeCycleAssessment + + +class TestLifeCycleAssessment(TestCase): + """ + TestBuilding TestCase 1 + """ + def setUp(self) -> None: + """ + Test setup + :return: None + """ + self._city_gml = None + self._example_path = (Path(__file__).parent / 'tests_data').resolve() + + def test_fuel(self): + city_file = "../unittests/tests_data/C40_Final.gml" + city = GeometryFactory('citygml', city_file).city + LifeCycleAssessment('fuel', city).enrich() + for fuel in city.fuels: + # print(fuel.name) + self.assertTrue(len(city.fuels) > 0) + + def test_vehicle(self): + city_file = "../unittests/tests_data/C40_Final.gml" + city = GeometryFactory('citygml', city_file).city + LifeCycleAssessment('vehicle', city).enrich() + for vehicle in city.vehicles: + # print(vehicle.name) + self.assertTrue(len(city.vehicles) > 0) + + def test_machine(self): + city_file = "../unittests/tests_data/C40_Final.gml" + city = GeometryFactory('citygml', city_file).city + LifeCycleAssessment('machine', city).enrich() + for machine in city.machines: + # print(machine.name) + self.assertTrue(len(city.machines) > 0) + + + + From d76ea58b74b011642fed34e336a28d82eebd5234 Mon Sep 17 00:00:00 2001 From: atiya Date: Mon, 15 Nov 2021 08:24:03 -0500 Subject: [PATCH 15/17] Added LCA formulas --- city_model_structure/lca_calculations.py | 23 ++++ city_model_structure/material.py | 118 ++++++++++++++++++ imports/life_cycle_assessment_factory.py | 7 ++ .../test_life_cycle_assessment_factory.py | 8 ++ 4 files changed, 156 insertions(+) create mode 100644 city_model_structure/lca_calculations.py create mode 100644 city_model_structure/material.py diff --git a/city_model_structure/lca_calculations.py b/city_model_structure/lca_calculations.py new file mode 100644 index 00000000..032edcd6 --- /dev/null +++ b/city_model_structure/lca_calculations.py @@ -0,0 +1,23 @@ +""" +LifeCycleAssessment retrieve the specific Life Cycle Assessment module for the given region +SPDX - License - Identifier: LGPL - 3.0 - or -later +Copyright © 2020 Project Author Atiya +""" +from city_model_structure.machine import Machine + +class LcaCalculations: + """ + LCA Calculations class + """ + + def __init__(self): + print("lca calculations class") + + def emission_disposal_machines(self, ): + return Machine.work_efficiency * Machine.energy_consumption_rate * Machine.carbon_emission_factor + + def emission_transportation(self, weight, distance ): + return weight * distance * Machine.energy_consumption_rate * Machine.carbon_emission_factor + + + diff --git a/city_model_structure/material.py b/city_model_structure/material.py new file mode 100644 index 00000000..d0ef2c53 --- /dev/null +++ b/city_model_structure/material.py @@ -0,0 +1,118 @@ +""" +LifeCycleAssessment retrieve the specific Life Cycle Assessment module for the given region +SPDX - License - Identifier: LGPL - 3.0 - or -later +Copyright © 2020 Project Author Atiya +""" + +class Material: + """ + LCA Material class + """ + + def __init__(self, material_name, material_id, type, density, density_unit, embodied_carbon, embodied_carbon_unit, recycling_ratio, + onsite_recycling_ratio, company_recycling_ratio, landfilling_ratio, cost, cost_unit): + self._material_name = material_name + self._material_id = material_id + self._type = type + self._density = density + self._density_unit = density_unit + self._embodied_carbon = embodied_carbon + self._embodied_carbon_unit = embodied_carbon_unit + self._recycling_ratio = recycling_ratio + self._onsite_recycling_ratio = onsite_recycling_ratio + self._company_recycling_ratio = company_recycling_ratio + self._landfilling_ratio = landfilling_ratio + self._cost = cost + self._cost_unit = cost_unit + + @property + def material_name(self): + """ + Get material name + """ + return self._material_name + + @property + def id(self): + """ + Get material id + """ + return self._material_id + + @property + def type(self): + """ + Get material type + """ + return self._type + + @property + def density(self): + """ + Get material density + """ + return self._density + + @property + def density_unit(self): + """ + Get material density unit + """ + return self._density_unit + + @property + def embodied_carbon(self): + """ + Get material embodied carbon + """ + return self._embodied_carbon + + @property + def embodied_carbon_unit(self): + """ + Get material embodied carbon unit + """ + return self._embodied_carbon_unit + + @property + def recycling_ratio(self): + """ + Get material recycling ratio + """ + return self._recycling_ratio + + @property + def onsite_recycling_ratio(self): + """ + Get material onsite recycling ratio + """ + return self._onsite_recycling_ratio + + @property + def company_recycling_ratio(self): + """ + Get material company recycling ratio + """ + return self._company_recycling_ratio + + @property + def landfilling_ratio(self): + """ + Get material landfilling ratio + """ + return self._landfilling_ratio + + @property + def cost(self): + """ + Get material cost + """ + return self._cost + + @property + def cost_unit(self): + """ + Get material cost unit + """ + return self._cost_unit + diff --git a/imports/life_cycle_assessment_factory.py b/imports/life_cycle_assessment_factory.py index 3aff1fe4..cb99b981 100644 --- a/imports/life_cycle_assessment_factory.py +++ b/imports/life_cycle_assessment_factory.py @@ -8,6 +8,7 @@ from pathlib import Path from imports.life_cycle_assessment.lca_fuel import LcaFuel from imports.life_cycle_assessment.lca_vehicle import LcaVehicle from imports.life_cycle_assessment.lca_machine import LcaMachine +from imports.life_cycle_assessment.lca_material import LcaMaterial class LifeCycleAssessment: @@ -39,6 +40,12 @@ class LifeCycleAssessment: """ LcaMachine(self._city, self._base_path).enrich() + def _material(self): + """ + Enrich the city by adding the material carbon information + """ + LcaMaterial(self._city, self._base_path).enrich() + def enrich(self): """ Enrich the city given to the class using the class given handler diff --git a/unittests/test_life_cycle_assessment_factory.py b/unittests/test_life_cycle_assessment_factory.py index 32e3453e..3245d56b 100644 --- a/unittests/test_life_cycle_assessment_factory.py +++ b/unittests/test_life_cycle_assessment_factory.py @@ -45,6 +45,14 @@ class TestLifeCycleAssessment(TestCase): # print(machine.name) self.assertTrue(len(city.machines) > 0) + def test_material(self): + city_file = "../unittests/tests_data/C40_Final.gml" + city = GeometryFactory('citygml', city_file).city + LifeCycleAssessment('material', city).enrich() + for material in city.materials: + print(material.material_name) + self.assertTrue(len(city.materials) > 0) + From 155daa47b7e713d14cf85b5dfcbf0ba8adf5e5d8 Mon Sep 17 00:00:00 2001 From: guille Date: Tue, 16 Nov 2021 07:37:27 -0500 Subject: [PATCH 16/17] Correct merge mistake --- city_model_structure/energy_system.py | 18 ++++++++++++++++++ .../xlsx_heat_pump_parameters.py | 2 +- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/city_model_structure/energy_system.py b/city_model_structure/energy_system.py index f648001a..ce4d0c14 100644 --- a/city_model_structure/energy_system.py +++ b/city_model_structure/energy_system.py @@ -2,6 +2,7 @@ EnergySystem module SPDX - License - Identifier: LGPL - 3.0 - or -later Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +Contributor Peter Yefi peteryefi@gmail.com """ from city_model_structure.city_object import CityObject @@ -15,8 +16,25 @@ class EnergySystem(CityObject): def __init__(self, name, lod, surfaces, city_lower_corner): super().__init__(name, lod, surfaces, city_lower_corner) self._heat_pump = None + self._type = 'energy_system' @property def heat_pump(self) -> HeatPump: return self._heat_pump + @heat_pump.setter + def heat_pump(self, value): + """ + Set heat pump for energy system + :param value: HeatPump + """ + if self._heat_pump is None: + self._heat_pump = value + + @property + def type(self) -> str: + """ + Type of city object + :return: str + """ + return self._type diff --git a/imports/energy_systems/xlsx_heat_pump_parameters.py b/imports/energy_systems/xlsx_heat_pump_parameters.py index b1b96e70..d148d010 100644 --- a/imports/energy_systems/xlsx_heat_pump_parameters.py +++ b/imports/energy_systems/xlsx_heat_pump_parameters.py @@ -22,7 +22,7 @@ class XlsxHeatPumpParameters: def __init__(self, city, base_path): self._city = city - self._base_path = (base_path / 'heat_pumps/Air source.xlsx') + self._base_path = (base_path / 'heat_pumps/Air Source.xlsx') def _read_file(self) -> Dict: """ From a692f9c22a933f62149bf506ca704d16a946360d Mon Sep 17 00:00:00 2001 From: guille Date: Tue, 16 Nov 2021 07:57:47 -0500 Subject: [PATCH 17/17] Test driven partial corrections --- .../lca_data.xml | 0 imports/geometry/obj.py | 4 ++-- imports/life_cycle_assessment/lca_fuel.py | 2 +- imports/life_cycle_assessment/lca_machine.py | 2 +- imports/life_cycle_assessment/lca_vehicle.py | 2 +- imports/life_cycle_assessment_factory.py | 2 +- unittests/test_exports.py | 2 +- unittests/test_usage_factory.py | 5 +++-- 8 files changed, 10 insertions(+), 9 deletions(-) rename data/{life_cicle_analize => life_cycle_assessment}/lca_data.xml (100%) diff --git a/data/life_cicle_analize/lca_data.xml b/data/life_cycle_assessment/lca_data.xml similarity index 100% rename from data/life_cicle_analize/lca_data.xml rename to data/life_cycle_assessment/lca_data.xml diff --git a/imports/geometry/obj.py b/imports/geometry/obj.py index 5c7fdd5b..6349921b 100644 --- a/imports/geometry/obj.py +++ b/imports/geometry/obj.py @@ -21,8 +21,8 @@ class Obj: with open(path, 'r') as file: self._scene = trimesh.exchange.load.load(file, file_type='obj', force='scene') self._corners = self._scene.bounds_corners - _bound_corner_min = [] - _bound_corner_max = [] + _bound_corner_min = None + _bound_corner_max = None for corner in self._corners: if _bound_corner_min is None: _bound_corner_min = corner diff --git a/imports/life_cycle_assessment/lca_fuel.py b/imports/life_cycle_assessment/lca_fuel.py index 2ffbcb37..c35e0749 100644 --- a/imports/life_cycle_assessment/lca_fuel.py +++ b/imports/life_cycle_assessment/lca_fuel.py @@ -19,6 +19,6 @@ class LcaFuel: with open(path) as xml: self._lca = xmltodict.parse(xml.read()) - for fuel in self._lca["library"]["fuels"]['fuel']: + for fuel in self._lca["library"]["Fuels"]['fuel']: self._city.fuels.append(Fuel(fuel['@id'], fuel['@name'], fuel['carbon_emission_factor']['#text'], fuel['carbon_emission_factor']['@unit'])) diff --git a/imports/life_cycle_assessment/lca_machine.py b/imports/life_cycle_assessment/lca_machine.py index ae90c03c..0ecae0c8 100644 --- a/imports/life_cycle_assessment/lca_machine.py +++ b/imports/life_cycle_assessment/lca_machine.py @@ -19,7 +19,7 @@ class LcaMachine: with open(path) as xml: self._lca = xmltodict.parse(xml.read()) - for machine in self._lca["library"]["machines"]['machine']: + for machine in self._lca["library"]["Machines"]['machine']: self._city.machines.append(Machine(machine['@id'], machine['@name'], machine['work_efficiency']['#text'], machine['work_efficiency']['@unit'], machine['energy_consumption_rate']['#text'], machine['energy_consumption_rate']['@unit'], machine['carbon_emission_factor']['#text'], diff --git a/imports/life_cycle_assessment/lca_vehicle.py b/imports/life_cycle_assessment/lca_vehicle.py index 79da498f..55cef922 100644 --- a/imports/life_cycle_assessment/lca_vehicle.py +++ b/imports/life_cycle_assessment/lca_vehicle.py @@ -19,7 +19,7 @@ class LcaVehicle: with open(path) as xml: self._lca = xmltodict.parse(xml.read()) - for vehicle in self._lca["library"]["vehicles"]['vehicle']: + for vehicle in self._lca["library"]["Vehicles"]['vehicle']: self._city.vehicles.append(Vehicle(vehicle['@id'], vehicle['@name'], vehicle['fuel_consumption_rate']['#text'], vehicle['fuel_consumption_rate']['@unit'], vehicle['carbon_emission_factor']['#text'], vehicle['carbon_emission_factor']['@unit'])) diff --git a/imports/life_cycle_assessment_factory.py b/imports/life_cycle_assessment_factory.py index cb99b981..66e1f609 100644 --- a/imports/life_cycle_assessment_factory.py +++ b/imports/life_cycle_assessment_factory.py @@ -8,7 +8,7 @@ from pathlib import Path from imports.life_cycle_assessment.lca_fuel import LcaFuel from imports.life_cycle_assessment.lca_vehicle import LcaVehicle from imports.life_cycle_assessment.lca_machine import LcaMachine -from imports.life_cycle_assessment.lca_material import LcaMaterial +# from imports.life_cycle_assessment.lca_material import LcaMaterial class LifeCycleAssessment: diff --git a/unittests/test_exports.py b/unittests/test_exports.py index 5b25b4e1..b4c38be1 100644 --- a/unittests/test_exports.py +++ b/unittests/test_exports.py @@ -45,7 +45,7 @@ class TestExports(TestCase): else: file_path = (self._example_path / 'one_building_in_kelowna.gml').resolve() self._complete_city = self._get_citygml(file_path) - ConstructionFactory('ca', self._complete_city).enrich() + ConstructionFactory('nrel', self._complete_city).enrich() UsageFactory('ca', self._complete_city).enrich() SchedulesFactory('comnet', self._complete_city).enrich() cli = 'C:\\Users\\Pilar\\PycharmProjects\\monthlyenergybalance\\tests_data\\weather\\inseldb_Summerland.cli' diff --git a/unittests/test_usage_factory.py b/unittests/test_usage_factory.py index 82c692a1..7281f86d 100644 --- a/unittests/test_usage_factory.py +++ b/unittests/test_usage_factory.py @@ -9,6 +9,7 @@ from unittest import TestCase from imports.geometry_factory import GeometryFactory from imports.usage_factory import UsageFactory from imports.geometry.helpers.geometry_helper import GeometryHelper +from imports.construction_factory import ConstructionFactory class TestUsageFactory(TestCase): @@ -38,7 +39,7 @@ class TestUsageFactory(TestCase): city = self._get_citygml(file) for building in city.buildings: building.function = GeometryHelper.pluto_to_function[building.function] - + ConstructionFactory('nrel', city).enrich() UsageFactory('hft', city).enrich() for building in city.buildings: self.assertIsNot(len(building.usage_zones), 0, 'no building usage_zones defined') @@ -61,7 +62,7 @@ class TestUsageFactory(TestCase): # case 2: CA file = 'one_building_in_kelowna.gml' city = self._get_citygml(file) - + ConstructionFactory('nrel', city).enrich() UsageFactory('ca', city).enrich() for building in city.buildings: self.assertIsNot(len(building.usage_zones), 0, 'no building usage_zones defined')