Merge pull request 'retrofit_project' (#24) from retrofit_project into main
Reviewed-on: https://nextgenerations-cities.encs.concordia.ca/gitea/CERC/hub/pulls/24
This commit is contained in:
commit
909b453036
|
@ -90,7 +90,7 @@ pylint --rcfile=pylintrc myfile.py
|
|||
|
||||
Before any pull request, the code must been manually and automatically tested to ensure at least some quality minimum. There are a few practices for unit tests that we believe are important, so we encourage you to follow it.
|
||||
|
||||
* The test should be self-contained, which implies that your tests will prepare and clean up everything before and after the test execution.
|
||||
* The test should be cls-contained, which implies that your tests will prepare and clean up everything before and after the test execution.
|
||||
* We encourage you to create if possible functional tests that cover the complete workflow of the implemented functionality.
|
||||
* Maximize your code coverage by ensuring that you are testing as much of your code as possible.
|
||||
|
||||
|
|
|
@ -58,7 +58,7 @@ section in persistence/README.md file.
|
|||
as shown below:
|
||||
|
||||
```python
|
||||
from hub.exports.db_factory import DBFactory
|
||||
from hub.persistence.db_control import DBFactory
|
||||
from pathlib import Path
|
||||
|
||||
dotenv_path = (Path(__file__).parent / '.env').resolve()
|
||||
|
|
|
@ -48,11 +48,11 @@ Use properties whenever it is possible. Encapsulate the access to all the calcul
|
|||
```python
|
||||
|
||||
@property
|
||||
def object_attribute(self):
|
||||
if self._object_attribute is None:
|
||||
self._object_attribute = ...
|
||||
def object_attribute(cls):
|
||||
if cls._object_attribute is None:
|
||||
cls._object_attribute = ...
|
||||
...
|
||||
return self._object_attribute
|
||||
return cls._object_attribute
|
||||
|
||||
```
|
||||
|
||||
|
@ -61,12 +61,12 @@ And like in the following example for read and write properties:
|
|||
```python
|
||||
|
||||
@property
|
||||
def object_changeable_attribute(self):
|
||||
return self._object_changeable_attribute
|
||||
def object_changeable_attribute(cls):
|
||||
return cls._object_changeable_attribute
|
||||
|
||||
@object_changeable_attribute.setter
|
||||
def object_changeable_attribute(self, value):
|
||||
self._object_changeable_attribute = value
|
||||
def object_changeable_attribute(cls, value):
|
||||
cls._object_changeable_attribute = value
|
||||
|
||||
```
|
||||
|
||||
|
@ -75,11 +75,11 @@ If your method or attribute returns a complex object, use type hints as in this
|
|||
```python
|
||||
|
||||
@property
|
||||
def complex_object(self) -> ComplexObject:
|
||||
return self._object_changeable_attribute
|
||||
def complex_object(cls) -> ComplexObject:
|
||||
return cls._object_changeable_attribute
|
||||
|
||||
def new_complex_object(self, first_param, second_param) -> ComplexObject:
|
||||
other_needed_property = self.other_needed_property
|
||||
def new_complex_object(cls, first_param, second_param) -> ComplexObject:
|
||||
other_needed_property = cls.other_needed_property
|
||||
return ComplexObject(first_param, second_param, other_needed_property)
|
||||
|
||||
```
|
||||
|
@ -89,11 +89,11 @@ Always access your variable through the method and avoid to access directly.
|
|||
```python
|
||||
|
||||
@property
|
||||
def object_attribute(self):
|
||||
return self._object_attribute
|
||||
def object_attribute(cls):
|
||||
return cls._object_attribute
|
||||
|
||||
def operation(self, first_param, second_param):
|
||||
return self.object_attribute * 2
|
||||
def operation(cls, first_param, second_param):
|
||||
return cls.object_attribute * 2
|
||||
|
||||
```
|
||||
|
||||
|
@ -110,23 +110,23 @@ All public classes, properties, and methods must have code comments. Code commen
|
|||
MyClass class perform models class operations
|
||||
"""
|
||||
|
||||
def __init__(self):
|
||||
def __init__(cls):
|
||||
|
||||
|
||||
@property
|
||||
def object_attribute(self):
|
||||
def object_attribute(cls):
|
||||
"""
|
||||
Get my class object attribute
|
||||
:return: int
|
||||
"""
|
||||
return self._object_attribute
|
||||
return cls._object_attribute
|
||||
|
||||
def operation(self, first_param, second_param):
|
||||
def operation(cls, first_param, second_param):
|
||||
"""
|
||||
Multiplies object_attribute by two
|
||||
:return: int
|
||||
"""
|
||||
return self.object_attribute * 2
|
||||
return cls.object_attribute * 2
|
||||
|
||||
```
|
||||
|
||||
|
@ -135,20 +135,20 @@ Comments at getters and setters always start with Get and Set, and identity the
|
|||
```python
|
||||
|
||||
@property
|
||||
def object_attribute(self):
|
||||
def object_attribute(cls):
|
||||
"""
|
||||
Get object attribute
|
||||
:return: int
|
||||
"""
|
||||
return self._object_attribute
|
||||
return cls._object_attribute
|
||||
|
||||
@object_attribute.setter
|
||||
def object_attribute(self, value):
|
||||
def object_attribute(cls, value):
|
||||
"""
|
||||
Set object attribute
|
||||
:param value: int
|
||||
"""
|
||||
self._object_attribute = value
|
||||
cls._object_attribute = value
|
||||
|
||||
```
|
||||
|
||||
|
@ -157,12 +157,12 @@ Attributes with known units should be explicit in method's comment.
|
|||
```python
|
||||
|
||||
@property
|
||||
def distance(self):
|
||||
def distance(cls):
|
||||
"""
|
||||
My class distance in meters
|
||||
:return: float
|
||||
"""
|
||||
return self._distance
|
||||
return cls._distance
|
||||
```
|
||||
|
||||
#### To do's.
|
||||
|
|
0
hub/catalog_factories/__init__.py
Normal file
0
hub/catalog_factories/__init__.py
Normal file
0
hub/catalog_factories/construction/__init__.py
Normal file
0
hub/catalog_factories/construction/__init__.py
Normal file
|
@ -112,16 +112,19 @@ class NrelCatalog(Catalog):
|
|||
function = archetype['@building_type']
|
||||
name = f"{function} {archetype['@climate_zone']} {archetype['@reference_standard']}"
|
||||
climate_zone = archetype['@climate_zone']
|
||||
construction_period = \
|
||||
ConstructionHelper().reference_standard_to_construction_period[archetype['@reference_standard']]
|
||||
construction_period = ConstructionHelper().reference_standard_to_construction_period[
|
||||
archetype['@reference_standard']
|
||||
]
|
||||
average_storey_height = float(archetype['average_storey_height']['#text'])
|
||||
thermal_capacity = float(archetype['thermal_capacity']['#text']) * 1000
|
||||
extra_loses_due_to_thermal_bridges = float(archetype['extra_loses_due_to_thermal_bridges']['#text'])
|
||||
indirect_heated_ratio = float(archetype['indirect_heated_ratio']['#text'])
|
||||
infiltration_rate_for_ventilation_system_off = \
|
||||
float(archetype['infiltration_rate_for_ventilation_system_off']['#text'])
|
||||
infiltration_rate_for_ventilation_system_on = \
|
||||
float(archetype['infiltration_rate_for_ventilation_system_on']['#text'])
|
||||
infiltration_rate_for_ventilation_system_off = float(
|
||||
archetype['infiltration_rate_for_ventilation_system_off']['#text']
|
||||
)
|
||||
infiltration_rate_for_ventilation_system_on = float(
|
||||
archetype['infiltration_rate_for_ventilation_system_on']['#text']
|
||||
)
|
||||
|
||||
archetype_constructions = []
|
||||
for archetype_construction in archetype['constructions']['construction']:
|
||||
|
|
|
@ -4,26 +4,22 @@ SPDX - License - Identifier: LGPL - 3.0 - or -later
|
|||
Copyright © 2022 Concordia CERC group
|
||||
Project Coder Guille Gutierrez guillermo.gutierrezmorote@concordia.ca
|
||||
"""
|
||||
import logging
|
||||
|
||||
from pathlib import Path
|
||||
from typing import TypeVar
|
||||
from hub.catalog_factories.construction.nrel_catalog import NrelCatalog
|
||||
from hub.hub_logger import logger
|
||||
from hub.helpers.utils import validate_import_export_type
|
||||
from hub.catalog_factories.construction.nrcan_catalog import NrcanCatalog
|
||||
Catalog = TypeVar('Catalog')
|
||||
|
||||
|
||||
class ConstructionCatalogFactory:
|
||||
def __init__(self, file_type, base_path=None):
|
||||
def __init__(self, handler, base_path=None):
|
||||
if base_path is None:
|
||||
base_path = Path(Path(__file__).parent.parent / 'data/construction')
|
||||
self._catalog_type = '_' + file_type.lower()
|
||||
class_funcs = validate_import_export_type(ConstructionCatalogFactory)
|
||||
if self._catalog_type not in class_funcs:
|
||||
err_msg = f"Wrong import type. Valid functions include {class_funcs}"
|
||||
logger.error(err_msg)
|
||||
raise Exception(err_msg)
|
||||
self._handler = '_' + handler.lower()
|
||||
validate_import_export_type(ConstructionCatalogFactory, handler)
|
||||
self._path = base_path
|
||||
|
||||
@property
|
||||
|
@ -46,4 +42,4 @@ class ConstructionCatalogFactory:
|
|||
Enrich the city given to the class using the class given handler
|
||||
:return: Catalog
|
||||
"""
|
||||
return getattr(self, self._catalog_type, lambda: None)
|
||||
return getattr(self, self._handler, lambda: None)
|
||||
|
|
0
hub/catalog_factories/cost/__init__.py
Normal file
0
hub/catalog_factories/cost/__init__.py
Normal file
|
@ -15,7 +15,6 @@ from hub.catalog_factories.data_models.cost.item_description import ItemDescript
|
|||
from hub.catalog_factories.data_models.cost.operational_cost import OperationalCost
|
||||
from hub.catalog_factories.data_models.cost.fuel import Fuel
|
||||
from hub.catalog_factories.data_models.cost.income import Income
|
||||
from hub.catalog_factories.data_models.cost.cost_helper import CostHelper
|
||||
|
||||
|
||||
class MontrealCustomCatalog(Catalog):
|
||||
|
@ -53,7 +52,6 @@ class MontrealCustomCatalog(Catalog):
|
|||
|
||||
def _get_capital_costs(self, entry):
|
||||
general_chapters = []
|
||||
chapters_titles = CostHelper().chapters_in_lod1
|
||||
shell = entry['B_shell']
|
||||
items_list = []
|
||||
item_type = 'B10_superstructure'
|
||||
|
@ -125,9 +123,9 @@ class MontrealCustomCatalog(Catalog):
|
|||
for archetype in archetypes:
|
||||
function = archetype['@function']
|
||||
municipality = archetype['@municipality']
|
||||
country = 'CA'#archetype['@country']
|
||||
lod = 0 #float(archetype['@lod'])
|
||||
currency = 'CAD'#archetype['currency']
|
||||
country = archetype['@country']
|
||||
lod = float(archetype['@lod'])
|
||||
currency = archetype['currency']
|
||||
capital_cost = self._get_capital_costs(archetype['capital_cost'])
|
||||
operational_cost = self._get_operational_costs(archetype['operational_cost'])
|
||||
end_of_life_cost = float(archetype['end_of_life_cost']['#text'])
|
||||
|
|
0
hub/catalog_factories/data_models/__init__.py
Normal file
0
hub/catalog_factories/data_models/__init__.py
Normal file
|
@ -64,4 +64,3 @@ class Construction:
|
|||
:return: Window
|
||||
"""
|
||||
return self._window
|
||||
|
||||
|
|
0
hub/catalog_factories/data_models/cost/__init__.py
Normal file
0
hub/catalog_factories/data_models/cost/__init__.py
Normal file
|
@ -1,48 +0,0 @@
|
|||
"""
|
||||
Cost helper
|
||||
SPDX - License - Identifier: LGPL - 3.0 - or -later
|
||||
Copyright © 2023 Concordia CERC group
|
||||
Project Coder Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
|
||||
"""
|
||||
|
||||
import hub.helpers.constants as cte
|
||||
from typing import Dict
|
||||
|
||||
|
||||
class CostHelper:
|
||||
"""
|
||||
Cost helper class
|
||||
"""
|
||||
_costs_units = {
|
||||
'currency/m2': cte.CURRENCY_PER_SQM,
|
||||
'currency/m3': cte.CURRENCY_PER_CBM,
|
||||
'currency/kW': cte.CURRENCY_PER_KW,
|
||||
'currency/kWh': cte.CURRENCY_PER_KWH,
|
||||
'currency/month': cte.CURRENCY_PER_MONTH,
|
||||
'currency/l': cte.CURRENCY_PER_LITRE,
|
||||
'currency/kg': cte.CURRENCY_PER_KG,
|
||||
'currency/(m3/h)': cte.CURRENCY_PER_CBM_PER_HOUR,
|
||||
'%': cte.PERCENTAGE
|
||||
}
|
||||
|
||||
_chapters_in_lod1 = {
|
||||
'B_shell': cte.SUPERSTRUCTURE,
|
||||
'D_services': cte.ENVELOPE,
|
||||
'Z_allowances_overhead_profit': cte.ALLOWANCES_OVERHEAD_PROFIT
|
||||
}
|
||||
|
||||
@property
|
||||
def costs_units(self) -> Dict:
|
||||
"""
|
||||
List of supported costs units
|
||||
:return: dict
|
||||
"""
|
||||
return self._costs_units
|
||||
|
||||
@property
|
||||
def chapters_in_lod1(self) -> Dict:
|
||||
"""
|
||||
List of chapters included in lod 1
|
||||
:return: dict
|
||||
"""
|
||||
return self._chapters_in_lod1
|
|
@ -0,0 +1,42 @@
|
|||
"""
|
||||
Energy System catalog archetype
|
||||
SPDX - License - Identifier: LGPL - 3.0 - or -later
|
||||
Copyright © 2023 Concordia CERC group
|
||||
Project Coder Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
|
||||
"""
|
||||
|
||||
from typing import List
|
||||
|
||||
from hub.catalog_factories.data_models.energy_systems.system import System
|
||||
|
||||
|
||||
class Archetype:
|
||||
def __init__(self, lod, name, systems):
|
||||
|
||||
self._lod = lod
|
||||
self._name = name
|
||||
self._systems = systems
|
||||
|
||||
@property
|
||||
def lod(self):
|
||||
"""
|
||||
Get level of detail of the catalog
|
||||
:return: string
|
||||
"""
|
||||
return self._lod
|
||||
|
||||
@property
|
||||
def name(self):
|
||||
"""
|
||||
Get name
|
||||
:return: string
|
||||
"""
|
||||
return f'{self._name}_lod{self._lod}'
|
||||
|
||||
@property
|
||||
def systems(self) -> List[System]:
|
||||
"""
|
||||
Get list of equipments that compose the total energy system
|
||||
:return: [Equipment]
|
||||
"""
|
||||
return self._systems
|
50
hub/catalog_factories/data_models/energy_systems/content.py
Normal file
50
hub/catalog_factories/data_models/energy_systems/content.py
Normal file
|
@ -0,0 +1,50 @@
|
|||
"""
|
||||
Energy System catalog content
|
||||
SPDX - License - Identifier: LGPL - 3.0 - or -later
|
||||
Copyright © 2023 Concordia CERC group
|
||||
Project Coder Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
|
||||
"""
|
||||
|
||||
|
||||
class Content:
|
||||
def __init__(self, archetypes, systems, generations, distributions, emissions):
|
||||
self._archetypes = archetypes
|
||||
self._systems = systems
|
||||
self._generations = generations
|
||||
self._distributions = distributions
|
||||
self._emissions = emissions
|
||||
|
||||
@property
|
||||
def archetypes(self):
|
||||
"""
|
||||
All archetype system clusters in the catalog
|
||||
"""
|
||||
return self._archetypes
|
||||
|
||||
@property
|
||||
def systems(self):
|
||||
"""
|
||||
All systems in the catalog
|
||||
"""
|
||||
return self._systems
|
||||
|
||||
@property
|
||||
def generation_equipments(self):
|
||||
"""
|
||||
All generation equipments in the catalog
|
||||
"""
|
||||
return self._generations
|
||||
|
||||
@property
|
||||
def distribution_equipments(self):
|
||||
"""
|
||||
All distribution equipments in the catalog
|
||||
"""
|
||||
return self._distributions
|
||||
|
||||
@property
|
||||
def emission_equipments(self):
|
||||
"""
|
||||
All emission equipments in the catalog
|
||||
"""
|
||||
return self._emissions
|
|
@ -0,0 +1,92 @@
|
|||
"""
|
||||
Energy System catalog distribution system
|
||||
SPDX - License - Identifier: LGPL - 3.0 - or -later
|
||||
Copyright © 2023 Concordia CERC group
|
||||
Project Coder Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
|
||||
"""
|
||||
|
||||
|
||||
class DistributionSystem:
|
||||
def __init__(self, system_id, name, system_type, supply_temperature, distribution_consumption_fix_flow,
|
||||
distribution_consumption_variable_flow, heat_losses):
|
||||
|
||||
self._system_id = system_id
|
||||
self._name = name
|
||||
self._type = system_type
|
||||
self._supply_temperature = supply_temperature
|
||||
self._distribution_consumption_fix_flow = distribution_consumption_fix_flow
|
||||
self._distribution_consumption_variable_flow = distribution_consumption_variable_flow
|
||||
self._heat_losses = heat_losses
|
||||
|
||||
@property
|
||||
def id(self):
|
||||
"""
|
||||
Get system id
|
||||
:return: float
|
||||
"""
|
||||
return self._system_id
|
||||
|
||||
@id.setter
|
||||
def id(self, value):
|
||||
"""
|
||||
Set system id
|
||||
:param value: float
|
||||
"""
|
||||
self._system_id = value
|
||||
|
||||
@property
|
||||
def name(self):
|
||||
"""
|
||||
Get name
|
||||
:return: string
|
||||
"""
|
||||
return self._name
|
||||
|
||||
@name.setter
|
||||
def name(self, value):
|
||||
"""
|
||||
Set name
|
||||
:param value: string
|
||||
"""
|
||||
self._name = value
|
||||
|
||||
@property
|
||||
def type(self):
|
||||
"""
|
||||
Get type from [air, water, refrigerant]
|
||||
:return: string
|
||||
"""
|
||||
return self._type
|
||||
|
||||
@property
|
||||
def supply_temperature(self):
|
||||
"""
|
||||
Get supply_temperature in degree Celsius
|
||||
:return: float
|
||||
"""
|
||||
return self._supply_temperature
|
||||
|
||||
@property
|
||||
def distribution_consumption_fix_flow(self):
|
||||
"""
|
||||
Get distribution_consumption if the pump or fan work at fix mass or volume flow in ratio over peak power (W/W)
|
||||
:return: float
|
||||
"""
|
||||
return self._distribution_consumption_fix_flow
|
||||
|
||||
@property
|
||||
def distribution_consumption_variable_flow(self):
|
||||
"""
|
||||
Get distribution_consumption if the pump or fan work at variable mass or volume flow in ratio
|
||||
over energy produced (Wh/Wh)
|
||||
:return: float
|
||||
"""
|
||||
return self._distribution_consumption_variable_flow
|
||||
|
||||
@property
|
||||
def heat_losses(self):
|
||||
"""
|
||||
Get heat_losses in ratio over energy produced
|
||||
:return: float
|
||||
"""
|
||||
return self._heat_losses
|
|
@ -0,0 +1,63 @@
|
|||
"""
|
||||
Energy System catalog emission system
|
||||
SPDX - License - Identifier: LGPL - 3.0 - or -later
|
||||
Copyright © 2023 Concordia CERC group
|
||||
Project Coder Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
|
||||
"""
|
||||
|
||||
|
||||
class EmissionSystem:
|
||||
def __init__(self, system_id, name, system_type, parasitic_energy_consumption):
|
||||
|
||||
self._system_id = system_id
|
||||
self._name = name
|
||||
self._type = system_type
|
||||
self._parasitic_energy_consumption = parasitic_energy_consumption
|
||||
|
||||
@property
|
||||
def id(self):
|
||||
"""
|
||||
Get system id
|
||||
:return: float
|
||||
"""
|
||||
return self._system_id
|
||||
|
||||
@id.setter
|
||||
def id(self, value):
|
||||
"""
|
||||
Set system id
|
||||
:param value: float
|
||||
"""
|
||||
self._system_id = value
|
||||
|
||||
@property
|
||||
def name(self):
|
||||
"""
|
||||
Get name
|
||||
:return: string
|
||||
"""
|
||||
return self._name
|
||||
|
||||
@name.setter
|
||||
def name(self, value):
|
||||
"""
|
||||
Set name
|
||||
:param value: string
|
||||
"""
|
||||
self._name = value
|
||||
|
||||
@property
|
||||
def type(self):
|
||||
"""
|
||||
Get type
|
||||
:return: string
|
||||
"""
|
||||
return self._type
|
||||
|
||||
@property
|
||||
def parasitic_energy_consumption(self):
|
||||
"""
|
||||
Get parasitic_energy_consumption in ratio (Wh/Wh)
|
||||
:return: float
|
||||
"""
|
||||
return self._parasitic_energy_consumption
|
|
@ -0,0 +1,139 @@
|
|||
"""
|
||||
Energy System catalog generation system
|
||||
SPDX - License - Identifier: LGPL - 3.0 - or -later
|
||||
Copyright © 2023 Concordia CERC group
|
||||
Project Coder Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
from typing import Union
|
||||
|
||||
|
||||
class GenerationSystem:
|
||||
def __init__(self, system_id, name, system_type, fuel_type, source_types, heat_efficiency, cooling_efficiency,
|
||||
electricity_efficiency, source_temperature, source_mass_flow, storage, auxiliary_equipment):
|
||||
|
||||
self._system_id = system_id
|
||||
self._name = name
|
||||
self._type = system_type
|
||||
self._fuel_type = fuel_type
|
||||
self._source_types = source_types
|
||||
self._heat_efficiency = heat_efficiency
|
||||
self._cooling_efficiency = cooling_efficiency
|
||||
self._electricity_efficiency = electricity_efficiency
|
||||
self._source_temperature = source_temperature
|
||||
self._source_mass_flow = source_mass_flow
|
||||
self._storage = storage
|
||||
self._auxiliary_equipment = auxiliary_equipment
|
||||
|
||||
@property
|
||||
def id(self):
|
||||
"""
|
||||
Get system id
|
||||
:return: float
|
||||
"""
|
||||
return self._system_id
|
||||
|
||||
@id.setter
|
||||
def id(self, value):
|
||||
"""
|
||||
Set system id
|
||||
:param value: float
|
||||
"""
|
||||
self._system_id = value
|
||||
|
||||
@property
|
||||
def name(self):
|
||||
"""
|
||||
Get name
|
||||
:return: string
|
||||
"""
|
||||
return self._name
|
||||
|
||||
@name.setter
|
||||
def name(self, value):
|
||||
"""
|
||||
Set name
|
||||
:param value: string
|
||||
"""
|
||||
self._name = value
|
||||
|
||||
@property
|
||||
def type(self):
|
||||
"""
|
||||
Get type
|
||||
:return: string
|
||||
"""
|
||||
return self._type
|
||||
|
||||
@property
|
||||
def fuel_type(self):
|
||||
"""
|
||||
Get fuel_type from [renewable, gas, diesel, electricity, wood, coal]
|
||||
:return: string
|
||||
"""
|
||||
return self._fuel_type
|
||||
|
||||
@property
|
||||
def source_types(self):
|
||||
"""
|
||||
Get source_type from [air, water, geothermal, district_heating, grid, on_site_electricity]
|
||||
:return: [string]
|
||||
"""
|
||||
return self._source_types
|
||||
|
||||
@property
|
||||
def heat_efficiency(self):
|
||||
"""
|
||||
Get heat_efficiency
|
||||
:return: float
|
||||
"""
|
||||
return self._heat_efficiency
|
||||
|
||||
@property
|
||||
def cooling_efficiency(self):
|
||||
"""
|
||||
Get cooling_efficiency
|
||||
:return: float
|
||||
"""
|
||||
return self._cooling_efficiency
|
||||
|
||||
@property
|
||||
def electricity_efficiency(self):
|
||||
"""
|
||||
Get electricity_efficiency
|
||||
:return: float
|
||||
"""
|
||||
return self._electricity_efficiency
|
||||
|
||||
@property
|
||||
def source_temperature(self):
|
||||
"""
|
||||
Get source_temperature in degree Celsius
|
||||
:return: float
|
||||
"""
|
||||
return self._source_temperature
|
||||
|
||||
@property
|
||||
def source_mass_flow(self):
|
||||
"""
|
||||
Get source_mass_flow in kg/s
|
||||
:return: float
|
||||
"""
|
||||
return self._source_mass_flow
|
||||
|
||||
@property
|
||||
def storage(self):
|
||||
"""
|
||||
Get boolean storage exists
|
||||
:return: bool
|
||||
"""
|
||||
return self._storage
|
||||
|
||||
@property
|
||||
def auxiliary_equipment(self) -> Union[None, GenerationSystem]:
|
||||
"""
|
||||
Get auxiliary_equipment
|
||||
:return: GenerationSystem
|
||||
"""
|
||||
return self._auxiliary_equipment
|
87
hub/catalog_factories/data_models/energy_systems/system.py
Normal file
87
hub/catalog_factories/data_models/energy_systems/system.py
Normal file
|
@ -0,0 +1,87 @@
|
|||
"""
|
||||
Energy System catalog equipment
|
||||
SPDX - License - Identifier: LGPL - 3.0 - or -later
|
||||
Copyright © 2023 Concordia CERC group
|
||||
Project Coder Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
|
||||
"""
|
||||
|
||||
from typing import Union
|
||||
|
||||
from hub.catalog_factories.data_models.energy_systems.generation_system import GenerationSystem
|
||||
from hub.catalog_factories.data_models.energy_systems.distribution_system import DistributionSystem
|
||||
from hub.catalog_factories.data_models.energy_systems.emission_system import EmissionSystem
|
||||
|
||||
|
||||
class System:
|
||||
def __init__(self,
|
||||
lod,
|
||||
system_id,
|
||||
name,
|
||||
demand_types,
|
||||
generation_system,
|
||||
distribution_system,
|
||||
emission_system):
|
||||
|
||||
self._lod = lod
|
||||
self._system_id = system_id
|
||||
self._name = name
|
||||
self._demand_types = demand_types
|
||||
self._generation_system = generation_system
|
||||
self._distribution_system = distribution_system
|
||||
self._emission_system = emission_system
|
||||
|
||||
@property
|
||||
def lod(self):
|
||||
"""
|
||||
Get level of detail of the catalog
|
||||
:return: string
|
||||
"""
|
||||
return self._lod
|
||||
|
||||
@property
|
||||
def id(self):
|
||||
"""
|
||||
Get equipment id
|
||||
:return: string
|
||||
"""
|
||||
return self._system_id
|
||||
|
||||
@property
|
||||
def name(self):
|
||||
"""
|
||||
Get name
|
||||
:return: string
|
||||
"""
|
||||
return f'{self._name}_lod{self._lod}'
|
||||
|
||||
@property
|
||||
def demand_types(self):
|
||||
"""
|
||||
Get demand able to cover from [heating, cooling, domestic_hot_water, electricity]
|
||||
:return: [string]
|
||||
"""
|
||||
return self._demand_types
|
||||
|
||||
@property
|
||||
def generation_system(self) -> GenerationSystem:
|
||||
"""
|
||||
Get generation system
|
||||
:return: GenerationSystem
|
||||
"""
|
||||
return self._generation_system
|
||||
|
||||
@property
|
||||
def distribution_system(self) -> Union[None, DistributionSystem]:
|
||||
"""
|
||||
Get distribution system
|
||||
:return: DistributionSystem
|
||||
"""
|
||||
return self._distribution_system
|
||||
|
||||
@property
|
||||
def emission_system(self) -> Union[None, EmissionSystem]:
|
||||
"""
|
||||
Get emission system
|
||||
:return: EmissionSystem
|
||||
"""
|
||||
return self._emission_system
|
|
@ -32,4 +32,3 @@ class Content:
|
|||
All soils in the catalog
|
||||
"""
|
||||
return self._soils
|
||||
|
||||
|
|
|
@ -5,10 +5,10 @@ Copyright © 2022 Concordia CERC group
|
|||
Project Coder Guille Gutierrez guillermo.gutierrezmorote@concordia.ca
|
||||
"""
|
||||
|
||||
from hub.catalog_factories.data_models.greenery.plant import Plant as libs_plant
|
||||
from hub.catalog_factories.data_models.greenery.plant import Plant as hub_plant
|
||||
|
||||
|
||||
class PlantPercentage(libs_plant):
|
||||
class PlantPercentage(hub_plant):
|
||||
|
||||
def __init__(self, percentage, plant_category, plant):
|
||||
super().__init__(plant_category, plant)
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
Usage catalog domestic hot water
|
||||
SPDX - License - Identifier: LGPL - 3.0 - or -later
|
||||
Copyright © 2023 Concordia CERC group
|
||||
Project Coder Pilar Monsalvete Álvarez de Uribarri pilar.monsalvete@concordia.ca
|
||||
Project Coder Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
|
||||
"""
|
||||
|
||||
from typing import Union, List
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
Usage catalog occupancy
|
||||
SPDX - License - Identifier: LGPL - 3.0 - or -later
|
||||
Copyright © 2022 Concordia CERC group
|
||||
Project Coder Guille Gutierrez Morote Guillermo.GutierrezMorote@concordia.ca
|
||||
Project Coder Guille Gutierrez Guillermo.GutierrezMorote@concordia.ca
|
||||
"""
|
||||
from typing import Union, List
|
||||
|
||||
|
|
|
@ -73,4 +73,3 @@ class Schedule:
|
|||
:return: None or [str]
|
||||
"""
|
||||
return self._day_types
|
||||
|
||||
|
|
|
@ -18,8 +18,7 @@ class ThermalControl:
|
|||
hvac_availability_schedules,
|
||||
heating_set_point_schedules,
|
||||
cooling_set_point_schedules):
|
||||
#todo: eliminate negative value
|
||||
deltaTsetpoint=0
|
||||
|
||||
self._mean_heating_set_point = mean_heating_set_point
|
||||
self._heating_set_back = heating_set_back
|
||||
self._mean_cooling_set_point = mean_cooling_set_point
|
||||
|
|
|
@ -29,7 +29,6 @@ class Usage:
|
|||
self._days_year = days_year
|
||||
self._mechanical_air_change = mechanical_air_change
|
||||
self._ventilation_rate = ventilation_rate
|
||||
# classes
|
||||
self._occupancy = occupancy
|
||||
self._lighting = lighting
|
||||
self._appliances = appliances
|
||||
|
|
0
hub/catalog_factories/energy_systems/__init__.py
Normal file
0
hub/catalog_factories/energy_systems/__init__.py
Normal file
248
hub/catalog_factories/energy_systems/montreal_custom_catalog.py
Normal file
248
hub/catalog_factories/energy_systems/montreal_custom_catalog.py
Normal file
|
@ -0,0 +1,248 @@
|
|||
"""
|
||||
Montreal custom energy systems catalog
|
||||
SPDX - License - Identifier: LGPL - 3.0 - or -later
|
||||
Copyright © 2022 Concordia CERC group
|
||||
Project Coder Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
|
||||
"""
|
||||
|
||||
import xmltodict
|
||||
|
||||
from hub.catalog_factories.catalog import Catalog
|
||||
from hub.catalog_factories.data_models.energy_systems.system import System
|
||||
from hub.catalog_factories.data_models.energy_systems.content import Content
|
||||
from hub.catalog_factories.data_models.energy_systems.generation_system import GenerationSystem
|
||||
from hub.catalog_factories.data_models.energy_systems.distribution_system import DistributionSystem
|
||||
from hub.catalog_factories.data_models.energy_systems.emission_system import EmissionSystem
|
||||
from hub.catalog_factories.data_models.energy_systems.archetype import Archetype
|
||||
|
||||
|
||||
class MontrealCustomCatalog(Catalog):
|
||||
def __init__(self, path):
|
||||
path = str(path / 'montreal_custom_systems.xml')
|
||||
with open(path) as xml:
|
||||
self._archetypes = xmltodict.parse(xml.read(), force_list=('system', 'system_cluster', 'equipment',
|
||||
'demand', 'system_id'))
|
||||
|
||||
self._lod = float(self._archetypes['catalog']['@lod'])
|
||||
|
||||
self._catalog_generation_equipments = self._load_generation_equipments()
|
||||
self._catalog_distribution_equipments = self._load_distribution_equipments()
|
||||
self._catalog_emission_equipments = self._load_emission_equipments()
|
||||
self._catalog_systems = self._load_systems()
|
||||
self._catalog_archetypes = self._load_archetypes()
|
||||
|
||||
# store the full catalog data model in self._content
|
||||
self._content = Content(self._catalog_archetypes,
|
||||
self._catalog_systems,
|
||||
self._catalog_generation_equipments,
|
||||
self._catalog_distribution_equipments,
|
||||
self._catalog_emission_equipments)
|
||||
|
||||
def _load_generation_equipments(self):
|
||||
_equipments = []
|
||||
equipments = self._archetypes['catalog']['generation_equipments']['equipment']
|
||||
for equipment in equipments:
|
||||
equipment_id = float(equipment['@id'])
|
||||
equipment_type = equipment['@type']
|
||||
fuel_type = equipment['@fuel_type']
|
||||
name = equipment['name']
|
||||
heating_efficiency = None
|
||||
if 'heating_efficiency' in equipment:
|
||||
heating_efficiency = float(equipment['heating_efficiency'])
|
||||
cooling_efficiency = None
|
||||
if 'cooling_efficiency' in equipment:
|
||||
cooling_efficiency = float(equipment['cooling_efficiency'])
|
||||
electricity_efficiency = None
|
||||
if 'electrical_efficiency' in equipment:
|
||||
electricity_efficiency = float(equipment['electrical_efficiency'])
|
||||
storage = eval(equipment['storage'].capitalize())
|
||||
generation_system = GenerationSystem(equipment_id,
|
||||
name,
|
||||
equipment_type,
|
||||
fuel_type,
|
||||
None,
|
||||
heating_efficiency,
|
||||
cooling_efficiency,
|
||||
electricity_efficiency,
|
||||
None,
|
||||
None,
|
||||
storage,
|
||||
None)
|
||||
|
||||
_equipments.append(generation_system)
|
||||
return _equipments
|
||||
|
||||
def _load_distribution_equipments(self):
|
||||
_equipments = []
|
||||
equipments = self._archetypes['catalog']['distribution_equipments']['equipment']
|
||||
for equipment in equipments:
|
||||
equipment_id = float(equipment['@id'])
|
||||
equipment_type = equipment['@type']
|
||||
name = equipment['name']
|
||||
distribution_heat_losses = None
|
||||
if 'distribution_heat_losses' in equipment:
|
||||
distribution_heat_losses = float(equipment['distribution_heat_losses']['#text']) / 100
|
||||
distribution_consumption_fix_flow = None
|
||||
if 'distribution_consumption_fix_flow' in equipment:
|
||||
distribution_consumption_fix_flow = float(equipment['distribution_consumption_fix_flow']['#text']) / 100
|
||||
distribution_consumption_variable_flow = None
|
||||
if 'distribution_consumption_variable_flow' in equipment:
|
||||
distribution_consumption_variable_flow = float(equipment['distribution_consumption_variable_flow']['#text']) / 100
|
||||
|
||||
distribution_system = DistributionSystem(equipment_id,
|
||||
name,
|
||||
equipment_type,
|
||||
None,
|
||||
distribution_consumption_fix_flow,
|
||||
distribution_consumption_variable_flow,
|
||||
distribution_heat_losses)
|
||||
|
||||
_equipments.append(distribution_system)
|
||||
return _equipments
|
||||
|
||||
def _load_emission_equipments(self):
|
||||
_equipments = []
|
||||
equipments = self._archetypes['catalog']['dissipation_equipments']['equipment']
|
||||
for equipment in equipments:
|
||||
equipment_id = float(equipment['@id'])
|
||||
equipment_type = equipment['@type']
|
||||
name = equipment['name']
|
||||
parasitic_consumption = None
|
||||
if 'parasitic_consumption' in equipment:
|
||||
parasitic_consumption = float(equipment['parasitic_consumption']['#text']) / 100
|
||||
|
||||
emission_system = EmissionSystem(equipment_id,
|
||||
name,
|
||||
equipment_type,
|
||||
parasitic_consumption)
|
||||
|
||||
_equipments.append(emission_system)
|
||||
return _equipments
|
||||
|
||||
def _load_systems(self):
|
||||
_catalog_systems = []
|
||||
systems = self._archetypes['catalog']['systems']['system']
|
||||
for system in systems:
|
||||
system_id = float(system['@id'])
|
||||
name = system['name']
|
||||
demands = system['demands']['demand']
|
||||
generation_equipment = system['equipments']['generation_id']
|
||||
_generation_equipment = None
|
||||
for equipment_archetype in self._catalog_generation_equipments:
|
||||
if int(equipment_archetype.id) == int(generation_equipment):
|
||||
_generation_equipment = equipment_archetype
|
||||
distribution_equipment = system['equipments']['distribution_id']
|
||||
_distribution_equipment = None
|
||||
for equipment_archetype in self._catalog_distribution_equipments:
|
||||
if int(equipment_archetype.id) == int(distribution_equipment):
|
||||
_distribution_equipment = equipment_archetype
|
||||
emission_equipment = system['equipments']['dissipation_id']
|
||||
_emission_equipment = None
|
||||
for equipment_archetype in self._catalog_emission_equipments:
|
||||
if int(equipment_archetype.id) == int(emission_equipment):
|
||||
_emission_equipment = equipment_archetype
|
||||
|
||||
_catalog_systems.append(System(self._lod,
|
||||
system_id,
|
||||
name,
|
||||
demands,
|
||||
_generation_equipment,
|
||||
_distribution_equipment,
|
||||
_emission_equipment))
|
||||
return _catalog_systems
|
||||
|
||||
def _load_archetypes(self):
|
||||
_catalog_archetypes = []
|
||||
system_clusters = self._archetypes['catalog']['system_clusters']['system_cluster']
|
||||
for system_cluster in system_clusters:
|
||||
name = system_cluster['@name']
|
||||
systems = system_cluster['systems']['system_id']
|
||||
_systems = []
|
||||
for system in systems:
|
||||
for system_archetype in self._catalog_systems:
|
||||
if int(system_archetype.id) == int(system):
|
||||
_systems.append(system_archetype)
|
||||
_catalog_archetypes.append(Archetype(self._lod, name, _systems))
|
||||
return _catalog_archetypes
|
||||
|
||||
def names(self, category=None):
|
||||
"""
|
||||
Get the catalog elements names
|
||||
:parm: optional category filter
|
||||
"""
|
||||
if category is None:
|
||||
_names = {'archetypes': [], 'systems': [], 'generation_equipments': [], 'distribution_equipments': [],
|
||||
'emission_equipments':[]}
|
||||
for archetype in self._content.archetypes:
|
||||
_names['archetypes'].append(archetype.name)
|
||||
for system in self._content.systems:
|
||||
_names['systems'].append(system.name)
|
||||
for equipment in self._content.generation_equipments:
|
||||
_names['generation_equipments'].append(equipment.name)
|
||||
for equipment in self._content.distribution_equipments:
|
||||
_names['distribution_equipments'].append(equipment.name)
|
||||
for equipment in self._content.emission_equipments:
|
||||
_names['emission_equipments'].append(equipment.name)
|
||||
else:
|
||||
_names = {category: []}
|
||||
if category.lower() == 'archetypes':
|
||||
for archetype in self._content.archetypes:
|
||||
_names[category].append(archetype.name)
|
||||
elif category.lower() == 'systems':
|
||||
for system in self._content.systems:
|
||||
_names[category].append(system.name)
|
||||
elif category.lower() == 'generation_equipments':
|
||||
for system in self._content.generation_equipments:
|
||||
_names[category].append(system.name)
|
||||
elif category.lower() == 'distribution_equipments':
|
||||
for system in self._content.distribution_equipments:
|
||||
_names[category].append(system.name)
|
||||
elif category.lower() == 'emission_equipments':
|
||||
for system in self._content.emission_equipments:
|
||||
_names[category].append(system.name)
|
||||
else:
|
||||
raise ValueError(f'Unknown category [{category}]')
|
||||
return _names
|
||||
|
||||
def entries(self, category=None):
|
||||
"""
|
||||
Get the catalog elements
|
||||
:parm: optional category filter
|
||||
"""
|
||||
if category is None:
|
||||
return self._content
|
||||
else:
|
||||
if category.lower() == 'archetypes':
|
||||
return self._content.archetypes
|
||||
elif category.lower() == 'systems':
|
||||
return self._content.systems
|
||||
elif category.lower() == 'generation_equipments':
|
||||
return self._content.generation_equipments
|
||||
elif category.lower() == 'distribution_equipments':
|
||||
return self._content.distribution_equipments
|
||||
elif category.lower() == 'emission_equipments':
|
||||
return self._content.emission_equipments
|
||||
else:
|
||||
raise ValueError(f'Unknown category [{category}]')
|
||||
|
||||
def get_entry(self, name):
|
||||
"""
|
||||
Get one catalog element by names
|
||||
:parm: entry name
|
||||
"""
|
||||
for entry in self._content.archetypes:
|
||||
if entry.name.lower() == name.lower():
|
||||
return entry
|
||||
for entry in self._content.systems:
|
||||
if entry.name.lower() == name.lower():
|
||||
return entry
|
||||
for entry in self._content.generation_equipments:
|
||||
if entry.name.lower() == name.lower():
|
||||
return entry
|
||||
for entry in self._content.distribution_equipments:
|
||||
if entry.name.lower() == name.lower():
|
||||
return entry
|
||||
for entry in self._content.emission_equipments:
|
||||
if entry.name.lower() == name.lower():
|
||||
return entry
|
||||
raise IndexError(f"{name} doesn't exists in the catalog")
|
|
@ -1,190 +0,0 @@
|
|||
"""
|
||||
NRCAN energy systems catalog
|
||||
SPDX - License - Identifier: LGPL - 3.0 - or -later
|
||||
Copyright © 2022 Concordia CERC group
|
||||
Project Coder Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
|
||||
"""
|
||||
|
||||
import json
|
||||
import urllib.request
|
||||
import xmltodict
|
||||
|
||||
import hub.helpers.constants as cte
|
||||
from hub.catalog_factories.catalog import Catalog
|
||||
from hub.catalog_factories.data_models.usages.appliances import Appliances
|
||||
from hub.catalog_factories.data_models.usages.content import Content
|
||||
from hub.catalog_factories.data_models.usages.lighting import Lighting
|
||||
from hub.catalog_factories.data_models.usages.ocupancy import Occupancy
|
||||
from hub.catalog_factories.data_models.usages.schedule import Schedule
|
||||
from hub.catalog_factories.data_models.usages.thermal_control import ThermalControl
|
||||
from hub.catalog_factories.data_models.usages.usage import Usage
|
||||
from hub.catalog_factories.usage.usage_helper import UsageHelper
|
||||
|
||||
|
||||
class NrcanCatalog(Catalog):
|
||||
def __init__(self, path):
|
||||
path = str(path / 'nrcan.xml')
|
||||
self._content = None
|
||||
self._schedules = {}
|
||||
with open(path) as xml:
|
||||
self._metadata = xmltodict.parse(xml.read())
|
||||
self._base_url = self._metadata['nrcan']['@base_url']
|
||||
self._load_schedules()
|
||||
self._content = Content(self._load_archetypes())
|
||||
|
||||
def _load_archetypes(self):
|
||||
usages = []
|
||||
name = self._metadata['nrcan']
|
||||
url = f'{self._base_url}{name["space_types_location"]}'
|
||||
with urllib.request.urlopen(url) as json_file:
|
||||
space_types = json.load(json_file)['tables']['space_types']['table']
|
||||
# space_types = [st for st in space_types if st['building_type'] == 'Space Function']
|
||||
space_types = [st for st in space_types if st['space_type'] == 'WholeBuilding']
|
||||
for space_type in space_types:
|
||||
# usage_type = space_type['space_type']
|
||||
usage_type = space_type['building_type']
|
||||
occupancy_schedule_name = space_type['occupancy_schedule']
|
||||
lighting_schedule_name = space_type['lighting_schedule']
|
||||
appliance_schedule_name = space_type['electric_equipment_schedule']
|
||||
hvac_schedule_name = space_type['exhaust_schedule']
|
||||
if 'FAN' in hvac_schedule_name:
|
||||
hvac_schedule_name = hvac_schedule_name.replace('FAN', 'Fan')
|
||||
#todo: get -1 out of the setpoint
|
||||
heating_setpoint_schedule_name = space_type['heating_setpoint_schedule']-1
|
||||
cooling_setpoint_schedule_name = space_type['cooling_setpoint_schedule']
|
||||
occupancy_schedule = self._get_schedules(occupancy_schedule_name)
|
||||
lighting_schedule = self._get_schedules(lighting_schedule_name)
|
||||
appliance_schedule = self._get_schedules(appliance_schedule_name)
|
||||
heating_schedule = self._get_schedules(heating_setpoint_schedule_name)
|
||||
cooling_schedule = self._get_schedules(cooling_setpoint_schedule_name)
|
||||
hvac_availability = self._get_schedules(hvac_schedule_name)
|
||||
|
||||
occupancy_density = space_type['occupancy_per_area']
|
||||
|
||||
# ACH
|
||||
mechanical_air_change = space_type['ventilation_air_changes']
|
||||
# cfm/ft2 to m3/m2.s
|
||||
ventilation_rate = space_type['ventilation_per_area'] / (cte.METERS_TO_FEET * cte.MINUTES_TO_SECONDS)
|
||||
if ventilation_rate == 0:
|
||||
# cfm/person to m3/m2.s
|
||||
ventilation_rate = space_type['ventilation_per_person'] / occupancy_density\
|
||||
/ (cte.METERS_TO_FEET * cte.MINUTES_TO_SECONDS)
|
||||
|
||||
# W/sqft to W/m2
|
||||
lighting_density = space_type['lighting_per_area'] * cte.METERS_TO_FEET * cte.METERS_TO_FEET
|
||||
lighting_radiative_fraction = space_type['lighting_fraction_radiant']
|
||||
lighting_convective_fraction = 0
|
||||
if lighting_radiative_fraction is not None:
|
||||
lighting_convective_fraction = 1 - lighting_radiative_fraction
|
||||
lighting_latent_fraction = 0
|
||||
# W/sqft to W/m2
|
||||
appliances_density = space_type['electric_equipment_per_area'] * cte.METERS_TO_FEET * cte.METERS_TO_FEET
|
||||
appliances_radiative_fraction = space_type['electric_equipment_fraction_radiant']
|
||||
appliances_latent_fraction = space_type['electric_equipment_fraction_latent']
|
||||
appliances_convective_fraction = 0
|
||||
if appliances_radiative_fraction is not None and appliances_latent_fraction is not None:
|
||||
appliances_convective_fraction = 1 - appliances_radiative_fraction - appliances_latent_fraction
|
||||
|
||||
occupancy = Occupancy(occupancy_density,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
occupancy_schedule)
|
||||
lighting = Lighting(lighting_density,
|
||||
lighting_convective_fraction,
|
||||
lighting_radiative_fraction,
|
||||
lighting_latent_fraction,
|
||||
lighting_schedule)
|
||||
appliances = Appliances(appliances_density,
|
||||
appliances_convective_fraction,
|
||||
appliances_radiative_fraction,
|
||||
appliances_latent_fraction,
|
||||
appliance_schedule)
|
||||
thermal_control = ThermalControl(None,
|
||||
None,
|
||||
None,
|
||||
hvac_availability,
|
||||
heating_schedule,
|
||||
cooling_schedule)
|
||||
hours_day = None
|
||||
days_year = None
|
||||
usages.append(Usage(usage_type,
|
||||
hours_day,
|
||||
days_year,
|
||||
mechanical_air_change,
|
||||
ventilation_rate,
|
||||
occupancy,
|
||||
lighting,
|
||||
appliances,
|
||||
thermal_control))
|
||||
return usages
|
||||
|
||||
def names(self, category=None):
|
||||
"""
|
||||
Get the catalog elements names
|
||||
:parm: optional category filter
|
||||
"""
|
||||
if category is None:
|
||||
_names = {'archetypes': [], 'constructions': [], 'materials': [], 'windows': []}
|
||||
for archetype in self._content.archetypes:
|
||||
_names['archetypes'].append(archetype.name)
|
||||
for construction in self._content.constructions:
|
||||
_names['constructions'].append(construction.name)
|
||||
for material in self._content.materials:
|
||||
_names['materials'].append(material.name)
|
||||
for window in self._content.windows:
|
||||
_names['windows'].append(window.name)
|
||||
else:
|
||||
_names = {category: []}
|
||||
if category.lower() == 'archetypes':
|
||||
for archetype in self._content.archetypes:
|
||||
_names[category].append(archetype.name)
|
||||
elif category.lower() == 'constructions':
|
||||
for construction in self._content.constructions:
|
||||
_names[category].append(construction.name)
|
||||
elif category.lower() == 'materials':
|
||||
for material in self._content.materials:
|
||||
_names[category].append(material.name)
|
||||
elif category.lower() == 'windows':
|
||||
for window in self._content.windows:
|
||||
_names[category].append(window.name)
|
||||
else:
|
||||
raise ValueError(f'Unknown category [{category}]')
|
||||
|
||||
def entries(self, category=None):
|
||||
"""
|
||||
Get the catalog elements
|
||||
:parm: optional category filter
|
||||
"""
|
||||
if category is None:
|
||||
return self._content
|
||||
else:
|
||||
if category.lower() == 'archetypes':
|
||||
return self._content.archetypes
|
||||
elif category.lower() == 'constructions':
|
||||
return self._content.constructions
|
||||
elif category.lower() == 'materials':
|
||||
return self._content.materials
|
||||
elif category.lower() == 'windows':
|
||||
return self._content.windows
|
||||
else:
|
||||
raise ValueError(f'Unknown category [{category}]')
|
||||
|
||||
def get_entry(self, name):
|
||||
"""
|
||||
Get one catalog element by names
|
||||
:parm: entry name
|
||||
"""
|
||||
for entry in self._content.archetypes:
|
||||
if entry.name.lower() == name.lower():
|
||||
return entry
|
||||
for entry in self._content.constructions:
|
||||
if entry.name.lower() == name.lower():
|
||||
return entry
|
||||
for entry in self._content.materials:
|
||||
if entry.name.lower() == name.lower():
|
||||
return entry
|
||||
for entry in self._content.windows:
|
||||
if entry.name.lower() == name.lower():
|
||||
return entry
|
||||
raise IndexError(f"{name} doesn't exists in the catalog")
|
|
@ -1,37 +1,32 @@
|
|||
"""
|
||||
Usage catalog factory, publish the usage information
|
||||
Energy Systems catalog factory, publish the energy systems information
|
||||
SPDX - License - Identifier: LGPL - 3.0 - or -later
|
||||
Copyright © 2022 Concordia CERC group
|
||||
Project Coder Pilar Monsalvete Álvarez de Uribarri pilar.monsalvete@concordia.ca
|
||||
"""
|
||||
import logging
|
||||
|
||||
from pathlib import Path
|
||||
from typing import TypeVar
|
||||
from hub.catalog_factories.energy_systems.nrcan_catalog import NrcanCatalog
|
||||
from hub.hub_logger import logger
|
||||
from hub.catalog_factories.energy_systems.montreal_custom_catalog import MontrealCustomCatalog
|
||||
from hub.helpers.utils import validate_import_export_type
|
||||
Catalog = TypeVar('Catalog')
|
||||
|
||||
|
||||
class UsageCatalogFactory:
|
||||
def __init__(self, file_type, base_path=None):
|
||||
class EnergySystemsCatalogFactory:
|
||||
def __init__(self, handler, base_path=None):
|
||||
if base_path is None:
|
||||
base_path = Path(Path(__file__).parent.parent / 'data/energy_systems')
|
||||
self._catalog_type = '_' + file_type.lower()
|
||||
class_funcs = validate_import_export_type(UsageCatalogFactory)
|
||||
if self._catalog_type not in class_funcs:
|
||||
err_msg = f"Wrong import type. Valid functions include {class_funcs}"
|
||||
logger.error(err_msg)
|
||||
raise Exception(err_msg)
|
||||
self._handler = '_' + handler.lower()
|
||||
validate_import_export_type(EnergySystemsCatalogFactory, handler)
|
||||
self._path = base_path
|
||||
|
||||
@property
|
||||
def _nrcan(self):
|
||||
def _montreal_custom(self):
|
||||
"""
|
||||
Retrieve NRCAN catalog
|
||||
"""
|
||||
# nrcan retrieves the data directly from github
|
||||
return NrcanCatalog(self._path)
|
||||
return MontrealCustomCatalog(self._path)
|
||||
|
||||
@property
|
||||
def catalog(self) -> Catalog:
|
||||
|
@ -39,4 +34,4 @@ class UsageCatalogFactory:
|
|||
Enrich the city given to the class using the class given handler
|
||||
:return: Catalog
|
||||
"""
|
||||
return getattr(self, self._catalog_type, lambda: None)
|
||||
return getattr(self, self._handler, lambda: None)
|
||||
|
|
0
hub/catalog_factories/greenery/__init__.py
Normal file
0
hub/catalog_factories/greenery/__init__.py
Normal file
|
@ -45,7 +45,7 @@ class GreeneryCatalog(Catalog):
|
|||
if plant.name == plant_percentage.plant.name:
|
||||
plant_category = plant.category
|
||||
break
|
||||
plant_percentages.append(libs_pp(plant_percentage.percentage,plant_category, plant_percentage.plant))
|
||||
plant_percentages.append(libs_pp(plant_percentage.percentage, plant_category, plant_percentage.plant))
|
||||
vegetations.append(libs_vegetation(name, vegetation, plant_percentages))
|
||||
plants = []
|
||||
for plant_category in catalog_data.plantCategories:
|
||||
|
|
|
@ -7,9 +7,9 @@ Project Coder Guille Gutierrez guillermo.gutierrezmorote@concordia.ca
|
|||
|
||||
from pathlib import Path
|
||||
from typing import TypeVar
|
||||
|
||||
from hub.catalog_factories.greenery.greenery_catalog import GreeneryCatalog
|
||||
from hub.hub_logger import logger
|
||||
from hub.helpers.utils import validate_import_export_type
|
||||
|
||||
Catalog = TypeVar('Catalog')
|
||||
|
||||
|
||||
|
@ -17,15 +17,10 @@ class GreeneryCatalogFactory:
|
|||
"""
|
||||
GreeneryCatalogFactory class
|
||||
"""
|
||||
def __init__(self, file_type, base_path=None):
|
||||
def __init__(self, handler, base_path=None):
|
||||
if base_path is None:
|
||||
base_path = Path(Path(__file__).parent.parent / 'data/greenery')
|
||||
self._catalog_type = '_' + file_type.lower()
|
||||
class_funcs = validate_import_export_type(GreeneryCatalogFactory)
|
||||
if self._catalog_type not in class_funcs:
|
||||
err_msg = f"Wrong import type. Valid functions include {class_funcs}"
|
||||
logger.error(err_msg)
|
||||
raise Exception(err_msg)
|
||||
base_path = (Path(__file__).parent.parent / 'data/greenery').resolve()
|
||||
self._handler = '_' + handler.lower()
|
||||
self._path = base_path
|
||||
|
||||
@property
|
||||
|
@ -42,4 +37,4 @@ class GreeneryCatalogFactory:
|
|||
Enrich the city given to the class using the class given handler
|
||||
:return: Catalog
|
||||
"""
|
||||
return getattr(self, self._catalog_type, lambda: None)
|
||||
return getattr(self, self._handler, lambda: None)
|
||||
|
|
0
hub/catalog_factories/usage/__init__.py
Normal file
0
hub/catalog_factories/usage/__init__.py
Normal file
|
@ -4,6 +4,7 @@ SPDX - License - Identifier: LGPL - 3.0 - or -later
|
|||
Copyright © 2022 Concordia CERC group
|
||||
Project Coder Guille Gutierrez guillermo.gutierrezmorote@concordia.ca
|
||||
"""
|
||||
import io
|
||||
from typing import Dict
|
||||
|
||||
import pandas as pd
|
||||
|
@ -129,8 +130,12 @@ class ComnetCatalog(Catalog):
|
|||
for usage_name in comnet_usages:
|
||||
if usage_name == 'C-13 Data Center':
|
||||
continue
|
||||
_extracted_data = pd.read_excel(self._comnet_schedules_path, sheet_name=comnet_usages[usage_name],
|
||||
skiprows=[0, 1, 2, 3], nrows=39, usecols="A:AA")
|
||||
with open(self._comnet_schedules_path, 'rb') as xls:
|
||||
_extracted_data = pd.read_excel(
|
||||
io.BytesIO(xls.read()),
|
||||
sheet_name=comnet_usages[usage_name],
|
||||
skiprows=[0, 1, 2, 3], nrows=39, usecols="A:AA"
|
||||
)
|
||||
_schedules = {}
|
||||
for row in range(0, 39, 3):
|
||||
_schedule_values = {}
|
||||
|
@ -143,13 +148,13 @@ class ComnetCatalog(Catalog):
|
|||
if day == cte.SATURDAY:
|
||||
start = start + 1
|
||||
end = end + 1
|
||||
elif day == cte.SUNDAY or day == cte.HOLIDAY:
|
||||
elif day in (cte.SUNDAY, cte.HOLIDAY):
|
||||
start = start + 2
|
||||
end = end + 2
|
||||
_schedule_values[day] = _extracted_data.iloc[start:end, 3:27].to_numpy().tolist()[0]
|
||||
_schedule = []
|
||||
for day in _schedule_values:
|
||||
if schedule_name == 'ClgSetPt' or schedule_name == 'HtgSetPt' or schedule_name == 'WtrHtrSetPt':
|
||||
if schedule_name in ('ClgSetPt', 'HtgSetPt', 'WtrHtrSetPt'):
|
||||
# to celsius
|
||||
if 'n.a.' in _schedule_values[day]:
|
||||
_schedule_values[day] = None
|
||||
|
@ -166,9 +171,13 @@ class ComnetCatalog(Catalog):
|
|||
:return : Dict
|
||||
"""
|
||||
number_usage_types = 33
|
||||
xl_file = pd.ExcelFile(self._comnet_archetypes_path)
|
||||
file_data = pd.read_excel(xl_file, sheet_name="Modeling Data", skiprows=[0, 1, 2, 24],
|
||||
nrows=number_usage_types, usecols="A:AB")
|
||||
with open(self._comnet_archetypes_path, 'rb') as xls:
|
||||
_extracted_data = pd.read_excel(
|
||||
io.BytesIO(xls.read()),
|
||||
sheet_name="Modeling Data",
|
||||
skiprows=[0, 1, 2, 24],
|
||||
nrows=number_usage_types, usecols="A:AB"
|
||||
)
|
||||
|
||||
lighting_data = {}
|
||||
plug_loads_data = {}
|
||||
|
@ -178,7 +187,7 @@ class ComnetCatalog(Catalog):
|
|||
process_data = {}
|
||||
schedules_key = {}
|
||||
for j in range(0, number_usage_types-1):
|
||||
usage_parameters = file_data.iloc[j]
|
||||
usage_parameters = _extracted_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()
|
||||
|
|
|
@ -94,8 +94,7 @@ class NrcanCatalog(Catalog):
|
|||
# W/m2
|
||||
appliances_density = space_type['electric_equipment_per_area_w_per_m2']
|
||||
# peak flow in gallons/h/m2
|
||||
domestic_hot_water_peak_flow = space_type['service_water_heating_peak_flow_per_area'] \
|
||||
* cte.GALLONS_TO_QUBIC_METERS / cte.HOUR_TO_SECONDS
|
||||
domestic_hot_water_peak_flow = space_type['service_water_heating_peak_flow_per_area'] * cte.GALLONS_TO_QUBIC_METERS / cte.HOUR_TO_SECONDS
|
||||
space_types_dictionary[usage_type] = {'occupancy_per_area': occupancy_density,
|
||||
'lighting_per_area': lighting_density,
|
||||
'electric_equipment_per_area': appliances_density,
|
||||
|
@ -132,8 +131,9 @@ class NrcanCatalog(Catalog):
|
|||
# cfm/ft2 to m3/m2.s
|
||||
ventilation_rate = space_type['ventilation_per_area'] / (cte.METERS_TO_FEET * cte.MINUTES_TO_SECONDS)
|
||||
# cfm/person to m3/m2.s
|
||||
ventilation_rate += space_type['ventilation_per_person'] / (pow(cte.METERS_TO_FEET, 3) * cte.MINUTES_TO_SECONDS)\
|
||||
* occupancy_density
|
||||
ventilation_rate += space_type['ventilation_per_person'] / (
|
||||
pow(cte.METERS_TO_FEET, 3) * cte.MINUTES_TO_SECONDS
|
||||
) * occupancy_density
|
||||
|
||||
lighting_radiative_fraction = space_type['lighting_fraction_radiant']
|
||||
lighting_convective_fraction = 0
|
||||
|
|
|
@ -4,10 +4,10 @@ SPDX - License - Identifier: LGPL - 3.0 - or -later
|
|||
Copyright © 2022 Concordia CERC group
|
||||
Project Coder Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
|
||||
"""
|
||||
import sys
|
||||
import hub.helpers.constants as cte
|
||||
from typing import Dict
|
||||
|
||||
import hub.helpers.constants as cte
|
||||
|
||||
|
||||
class UsageHelper:
|
||||
"""
|
||||
|
@ -17,8 +17,8 @@ class UsageHelper:
|
|||
'Lighting': cte.LIGHTING,
|
||||
'Occupancy': cte.OCCUPANCY,
|
||||
'Equipment': cte.APPLIANCES,
|
||||
'Thermostat Setpoint Cooling': cte.COOLING_SET_POINT, # Compose 'Thermostat Setpoint' + 'Cooling'
|
||||
'Thermostat Setpoint Heating': cte.HEATING_SET_POINT, # Compose 'Thermostat Setpoint' + 'Heating'
|
||||
'Thermostat Setpoint Cooling': cte.COOLING_SET_POINT,
|
||||
'Thermostat Setpoint Heating': cte.HEATING_SET_POINT,
|
||||
'Fan': cte.HVAC_AVAILABILITY,
|
||||
'Service Water Heating': cte.DOMESTIC_HOT_WATER
|
||||
}
|
||||
|
@ -92,41 +92,49 @@ class UsageHelper:
|
|||
|
||||
@property
|
||||
def nrcan_day_type_to_hub_days(self):
|
||||
"""
|
||||
Get a dictionary to convert nrcan day types to hub day types
|
||||
"""
|
||||
return self._nrcan_day_type_to_hub_days
|
||||
|
||||
@property
|
||||
def nrcan_schedule_type_to_hub_schedule_type(self):
|
||||
"""
|
||||
Get a dictionary to convert nrcan schedule types to hub schedule types
|
||||
"""
|
||||
return self._nrcan_schedule_type_to_hub_schedule_type
|
||||
|
||||
@property
|
||||
def nrcan_data_type_to_hub_data_type(self):
|
||||
"""
|
||||
Get a dictionary to convert nrcan data types to hub data types
|
||||
"""
|
||||
return self._nrcan_data_type_to_hub_data_type
|
||||
|
||||
@property
|
||||
def nrcan_time_to_hub_time(self):
|
||||
"""
|
||||
Get a dictionary to convert nrcan time to hub time
|
||||
"""
|
||||
return self._nrcan_time_to_hub_time
|
||||
|
||||
@property
|
||||
def comnet_data_type_to_hub_data_type(self):
|
||||
def comnet_data_type_to_hub_data_type(self) -> Dict:
|
||||
"""
|
||||
Get a dictionary to convert comnet data types to hub data types
|
||||
"""
|
||||
return self._comnet_data_type_to_hub_data_type
|
||||
|
||||
@property
|
||||
def comnet_schedules_key_to_comnet_schedules(self) -> Dict:
|
||||
"""
|
||||
Get a dictionary to convert hub schedules to comnet schedules
|
||||
"""
|
||||
return self._comnet_schedules_key_to_comnet_schedules
|
||||
|
||||
@property
|
||||
def comnet_days(self):
|
||||
def comnet_days(self) -> [str]:
|
||||
"""
|
||||
Get the list of days used in comnet
|
||||
"""
|
||||
return self._comnet_days
|
||||
|
||||
@staticmethod
|
||||
def schedules_key(usage):
|
||||
"""
|
||||
Get Comnet schedules key from the list found in the Comnet usage file
|
||||
:param usage: str
|
||||
:return: str
|
||||
"""
|
||||
try:
|
||||
return UsageHelper._comnet_schedules_key_to_comnet_schedules[usage]
|
||||
except KeyError:
|
||||
sys.stderr.write('Error: Comnet keyword not found. An update of the Comnet files might have been '
|
||||
'done changing the keywords.\n')
|
||||
|
|
|
@ -4,26 +4,22 @@ SPDX - License - Identifier: LGPL - 3.0 - or -later
|
|||
Copyright © 2022 Concordia CERC group
|
||||
Project Coder Guille Gutierrez guillermo.gutierrezmorote@concordia.ca
|
||||
"""
|
||||
import logging
|
||||
|
||||
from pathlib import Path
|
||||
from typing import TypeVar
|
||||
from hub.catalog_factories.usage.comnet_catalog import ComnetCatalog
|
||||
from hub.catalog_factories.usage.nrcan_catalog import NrcanCatalog
|
||||
from hub.hub_logger import logger
|
||||
from hub.helpers.utils import validate_import_export_type
|
||||
Catalog = TypeVar('Catalog')
|
||||
|
||||
|
||||
class UsageCatalogFactory:
|
||||
def __init__(self, file_type, base_path=None):
|
||||
def __init__(self, handler, base_path=None):
|
||||
if base_path is None:
|
||||
base_path = Path(Path(__file__).parent.parent / 'data/usage')
|
||||
self._catalog_type = '_' + file_type.lower()
|
||||
class_funcs = validate_import_export_type(UsageCatalogFactory)
|
||||
if self._catalog_type not in class_funcs:
|
||||
err_msg = f"Wrong import type. Valid functions include {class_funcs}"
|
||||
logger.error(err_msg)
|
||||
raise Exception(err_msg)
|
||||
self._catalog_type = '_' + handler.lower()
|
||||
validate_import_export_type(UsageCatalogFactory, handler)
|
||||
self._path = base_path
|
||||
|
||||
@property
|
||||
|
|
0
hub/city_model_structure/__init__.py
Normal file
0
hub/city_model_structure/__init__.py
Normal file
0
hub/city_model_structure/attributes/__init__.py
Normal file
0
hub/city_model_structure/attributes/__init__.py
Normal file
|
@ -45,14 +45,13 @@ class Plane:
|
|||
:return: (A, B, C, D)
|
||||
"""
|
||||
if self._equation is None:
|
||||
|
||||
a = self.normal[0]
|
||||
b = self.normal[1]
|
||||
c = self.normal[2]
|
||||
d = ((-1 * self.origin.coordinates[0]) * self.normal[0])
|
||||
d += ((-1 * self.origin.coordinates[1]) * self.normal[1])
|
||||
d += ((-1 * self.origin.coordinates[2]) * self.normal[2])
|
||||
self._equation = (a, b, c, d)
|
||||
d = -1 * self.origin.coordinates[0] * self.normal[0]
|
||||
d += -1 * self.origin.coordinates[1] * self.normal[1]
|
||||
d += -1 * self.origin.coordinates[2] * self.normal[2]
|
||||
self._equation = a, b, c, d
|
||||
return self._equation
|
||||
|
||||
def distance_to_point(self, point):
|
||||
|
|
|
@ -31,7 +31,7 @@ class Point:
|
|||
:return: float
|
||||
"""
|
||||
power = 0
|
||||
for dimension in range(0, len(self.coordinates)):
|
||||
for dimension in enumerate(self.coordinates):
|
||||
power += math.pow(other_point.coordinates[dimension]-self.coordinates[dimension], 2)
|
||||
distance = math.sqrt(power)
|
||||
return distance
|
||||
|
|
|
@ -6,20 +6,21 @@ Project Coder Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
|
|||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import logging
|
||||
import math
|
||||
import sys
|
||||
from typing import List
|
||||
from hub.hub_logger import logger
|
||||
|
||||
import numpy as np
|
||||
from trimesh import Trimesh
|
||||
import trimesh.intersections
|
||||
import trimesh.creation
|
||||
import trimesh.geometry
|
||||
import trimesh.intersections
|
||||
from shapely.geometry.polygon import Polygon as shapley_polygon
|
||||
from trimesh import Trimesh
|
||||
|
||||
from hub.city_model_structure.attributes.plane import Plane
|
||||
from hub.city_model_structure.attributes.point import Point
|
||||
import hub.helpers.constants as cte
|
||||
|
||||
|
||||
class Polygon:
|
||||
|
@ -69,44 +70,6 @@ class Polygon:
|
|||
"""
|
||||
return self._coordinates
|
||||
|
||||
def contains_point(self, point):
|
||||
"""
|
||||
Determines if the given point is contained by the current polygon
|
||||
:return: boolean
|
||||
"""
|
||||
# fixme: This method doesn't seems to work.
|
||||
n = len(self.vertices)
|
||||
angle_sum = 0
|
||||
for i in range(0, n):
|
||||
vector_0 = self.vertices[i]
|
||||
vector_1 = self.vertices[(i+1) % n]
|
||||
# set to origin
|
||||
vector_0[0] = vector_0[0] - point.coordinates[0]
|
||||
vector_0[1] = vector_0[1] - point.coordinates[1]
|
||||
vector_0[2] = vector_0[2] - point.coordinates[2]
|
||||
vector_1[0] = vector_1[0] - point.coordinates[0]
|
||||
vector_1[1] = vector_1[1] - point.coordinates[1]
|
||||
vector_1[2] = vector_1[2] - point.coordinates[2]
|
||||
module = np.linalg.norm(vector_0) * np.linalg.norm(vector_1)
|
||||
|
||||
scalar_product = np.dot(vector_0, vector_1)
|
||||
angle = np.pi/2
|
||||
if module != 0:
|
||||
angle = abs(np.arcsin(scalar_product / module))
|
||||
angle_sum += angle
|
||||
return abs(angle_sum - math.pi*2) < cte.EPSILON
|
||||
|
||||
def contains_polygon(self, polygon):
|
||||
"""
|
||||
Determines if the given polygon is contained by the current polygon
|
||||
:return: boolean
|
||||
"""
|
||||
|
||||
for point in polygon.points:
|
||||
if not self.contains_point(point):
|
||||
return False
|
||||
return True
|
||||
|
||||
@property
|
||||
def points_list(self) -> np.ndarray:
|
||||
"""
|
||||
|
@ -142,12 +105,12 @@ class Polygon:
|
|||
if self._area is None:
|
||||
self._area = 0
|
||||
for triangle in self.triangles:
|
||||
ab = np.zeros(3)
|
||||
ac = np.zeros(3)
|
||||
a_b = np.zeros(3)
|
||||
a_c = np.zeros(3)
|
||||
for i in range(0, 3):
|
||||
ab[i] = triangle.coordinates[1][i] - triangle.coordinates[0][i]
|
||||
ac[i] = triangle.coordinates[2][i] - triangle.coordinates[0][i]
|
||||
self._area += np.linalg.norm(np.cross(ab, ac)) / 2
|
||||
a_b[i] = triangle.coordinates[1][i] - triangle.coordinates[0][i]
|
||||
a_c[i] = triangle.coordinates[2][i] - triangle.coordinates[0][i]
|
||||
self._area += np.linalg.norm(np.cross(a_b, a_c)) / 2
|
||||
return self._area
|
||||
|
||||
@area.setter
|
||||
|
@ -217,7 +180,11 @@ class Polygon:
|
|||
return -alpha
|
||||
|
||||
@staticmethod
|
||||
def triangle_mesh(vertices, normal):
|
||||
def triangle_mesh(vertices, normal) -> Trimesh:
|
||||
"""
|
||||
Get the triangulated mesh for the polygon
|
||||
:return: Trimesh
|
||||
"""
|
||||
min_x = 1e16
|
||||
min_y = 1e16
|
||||
min_z = 1e16
|
||||
|
@ -246,7 +213,8 @@ class Polygon:
|
|||
polygon = shapley_polygon(coordinates)
|
||||
|
||||
try:
|
||||
vertices_2d, faces = trimesh.creation.triangulate_polygon(polygon, engine='triangle')
|
||||
_, faces = trimesh.creation.triangulate_polygon(polygon, engine='triangle')
|
||||
|
||||
mesh = Trimesh(vertices=vertices, faces=faces)
|
||||
|
||||
# check orientation
|
||||
|
@ -262,18 +230,20 @@ class Polygon:
|
|||
new_face.append(face[len(face)-i-1])
|
||||
new_faces.append(new_face)
|
||||
mesh = Trimesh(vertices=vertices, faces=new_faces)
|
||||
|
||||
return mesh
|
||||
|
||||
except ValueError:
|
||||
logger.error(f'Not able to triangulate polygon\n')
|
||||
sys.stderr.write(f'Not able to triangulate polygon\n')
|
||||
logging.error('Not able to triangulate polygon\n')
|
||||
_vertices = [[0, 0, 0], [0, 0, 1], [0, 1, 0]]
|
||||
_faces = [[0, 1, 2]]
|
||||
return Trimesh(vertices=_vertices, faces=_faces)
|
||||
|
||||
@property
|
||||
def triangles(self) -> List[Polygon]:
|
||||
"""
|
||||
Triangulate the polygon and return a list of triangular polygons
|
||||
:return: [Polygon]
|
||||
"""
|
||||
if self._triangles is None:
|
||||
self._triangles = []
|
||||
_mesh = self.triangle_mesh(self.coordinates, self.normal)
|
||||
|
@ -336,7 +306,7 @@ class Polygon:
|
|||
|
||||
def _reshape(self, triangles) -> Polygon:
|
||||
edges_list = []
|
||||
for i in range(0, len(triangles)):
|
||||
for i in enumerate(triangles):
|
||||
for edge in triangles[i].edges:
|
||||
if not self._edge_in_edges_list(edge, edges_list):
|
||||
edges_list.append(edge)
|
||||
|
@ -421,7 +391,8 @@ class Polygon:
|
|||
if len(points) != 3:
|
||||
sub_polygons = polygon.triangles
|
||||
# todo: I modified this! To be checked @Guille
|
||||
if len(sub_polygons) >= 1:
|
||||
if len(sub_polygons) < 1:
|
||||
continue
|
||||
for sub_polygon in sub_polygons:
|
||||
face = []
|
||||
points = sub_polygon.coordinates
|
||||
|
@ -440,7 +411,7 @@ class Polygon:
|
|||
:return: int
|
||||
"""
|
||||
vertices = self.vertices
|
||||
for i in range(len(vertices)):
|
||||
for i in enumerate(vertices):
|
||||
# ensure not duplicated vertex
|
||||
power = 0
|
||||
vertex2 = vertices[i]
|
||||
|
|
|
@ -41,10 +41,10 @@ class Polyhedron:
|
|||
:return: int
|
||||
"""
|
||||
vertices = self.vertices
|
||||
for i in range(len(vertices)):
|
||||
for i, vertex in enumerate(vertices):
|
||||
# ensure not duplicated vertex
|
||||
power = 0
|
||||
vertex2 = vertices[i]
|
||||
vertex2 = vertex
|
||||
for dimension in range(0, 3):
|
||||
power += math.pow(vertex2[dimension] - point[dimension], 2)
|
||||
distance = math.sqrt(power)
|
||||
|
@ -92,8 +92,8 @@ class Polyhedron:
|
|||
points = polygon.coordinates
|
||||
if len(points) != 3:
|
||||
sub_polygons = polygon.triangles
|
||||
# todo: I modified this! To be checked @Guille
|
||||
if len(sub_polygons) >= 1:
|
||||
if len(sub_polygons) < 1:
|
||||
continue
|
||||
for sub_polygon in sub_polygons:
|
||||
face = []
|
||||
points = sub_polygon.coordinates
|
||||
|
|
|
@ -6,27 +6,31 @@ Project Coder Guille Gutierrez guillermo.gutierrezmorote@concordia.ca
|
|||
Code contributors: Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
|
||||
"""
|
||||
|
||||
import sys
|
||||
from typing import List, Union
|
||||
import logging
|
||||
from typing import List, Union, TypeVar
|
||||
|
||||
import numpy as np
|
||||
import pandas as pd
|
||||
|
||||
from hub.hub_logger import logger
|
||||
import hub.helpers.constants as cte
|
||||
import hub.helpers.peak_loads as pl
|
||||
from hub.city_model_structure.building_demand.surface import Surface
|
||||
from hub.city_model_structure.city_object import CityObject
|
||||
from hub.city_model_structure.attributes.polyhedron import Polyhedron
|
||||
from hub.city_model_structure.building_demand.household import Household
|
||||
from hub.city_model_structure.building_demand.internal_zone import InternalZone
|
||||
from hub.city_model_structure.attributes.polyhedron import Polyhedron
|
||||
from hub.city_model_structure.building_demand.surface import Surface
|
||||
from hub.city_model_structure.city_object import CityObject
|
||||
from hub.city_model_structure.energy_systems.energy_system import EnergySystem
|
||||
from hub.helpers.peak_loads import PeakLoads
|
||||
|
||||
City = TypeVar('City')
|
||||
|
||||
|
||||
class Building(CityObject):
|
||||
"""
|
||||
Building(CityObject) class
|
||||
"""
|
||||
def __init__(self, name, surfaces, year_of_construction, function, terrains=None):
|
||||
def __init__(self, name, surfaces, year_of_construction, function, terrains=None, city=None):
|
||||
super().__init__(name, surfaces)
|
||||
self._city = city
|
||||
self._households = None
|
||||
self._basement_heated = None
|
||||
self._attic_heated = None
|
||||
|
@ -39,15 +43,22 @@ class Building(CityObject):
|
|||
self._roof_type = None
|
||||
self._internal_zones = None
|
||||
self._shell = None
|
||||
self._alias = None
|
||||
self._aliases = None
|
||||
self._type = 'building'
|
||||
self._cold_water_temperature = dict()
|
||||
self._heating = dict()
|
||||
self._cooling = dict()
|
||||
self._lighting_electrical_demand = dict()
|
||||
self._appliances_electrical_demand = dict()
|
||||
self._domestic_hot_water_heat_demand = dict()
|
||||
self._cold_water_temperature = {}
|
||||
self._heating = {}
|
||||
self._cooling = {}
|
||||
self._lighting_electrical_demand = {}
|
||||
self._appliances_electrical_demand = {}
|
||||
self._domestic_hot_water_heat_demand = {}
|
||||
self._heating_consumption = {}
|
||||
self._cooling_consumption = {}
|
||||
self._domestic_hot_water_consumption = {}
|
||||
self._distribution_systems_electrical_consumption = {}
|
||||
self._onsite_electrical_production = {}
|
||||
self._eave_height = None
|
||||
self._energy_systems = None
|
||||
self._systems_archetype_name = None
|
||||
self._grounds = []
|
||||
self._roofs = []
|
||||
self._walls = []
|
||||
|
@ -75,8 +86,8 @@ class Building(CityObject):
|
|||
elif surface.type == cte.INTERIOR_SLAB:
|
||||
self._interior_slabs.append(surface)
|
||||
else:
|
||||
logger.error(f'Building {self.name} [alias {self.alias}] has an unexpected surface type {surface.type}.\n')
|
||||
sys.stderr.write(f'Building {self.name} [alias {self.alias}] has an unexpected surface type {surface.type}.\n')
|
||||
error = f'Building {self.name} [{self.aliases}] has an unexpected surface type {surface.type}.\n'
|
||||
logging.error(error)
|
||||
|
||||
@property
|
||||
def shell(self) -> Polyhedron:
|
||||
|
@ -193,14 +204,6 @@ class Building(CityObject):
|
|||
if value is not None:
|
||||
self._basement_heated = int(value)
|
||||
|
||||
@property
|
||||
def heated_volume(self):
|
||||
"""
|
||||
Raises not implemented error
|
||||
"""
|
||||
# todo: this need to be calculated based on the basement and attic heated values
|
||||
raise NotImplementedError
|
||||
|
||||
@property
|
||||
def year_of_construction(self):
|
||||
"""
|
||||
|
@ -258,6 +261,9 @@ class Building(CityObject):
|
|||
Get building storeys number above ground
|
||||
:return: None or int
|
||||
"""
|
||||
if self._storeys_above_ground is None:
|
||||
if self.eave_height is not None and self.average_storey_height is not None:
|
||||
self._storeys_above_ground = int(self.eave_height / self.average_storey_height)
|
||||
return self._storeys_above_ground
|
||||
|
||||
@storeys_above_ground.setter
|
||||
|
@ -366,33 +372,38 @@ class Building(CityObject):
|
|||
self._domestic_hot_water_heat_demand = value
|
||||
|
||||
@property
|
||||
def heating_peak_load(self) -> dict:
|
||||
def heating_peak_load(self) -> Union[None, dict]:
|
||||
"""
|
||||
Get heating peak load in W
|
||||
:return: dict{DataFrame(float)}
|
||||
"""
|
||||
results = {}
|
||||
if cte.HOUR in self.heating:
|
||||
monthly_values = pl.peak_loads_from_hourly(self.heating[cte.HOUR][next(iter(self.heating[cte.HOUR]))].values)
|
||||
monthly_values = PeakLoads().\
|
||||
peak_loads_from_hourly(self.heating[cte.HOUR][next(iter(self.heating[cte.HOUR]))])
|
||||
else:
|
||||
monthly_values = pl.heating_peak_loads_from_methodology(self)
|
||||
results[cte.MONTH] = pd.DataFrame(monthly_values, columns=['heating peak loads'])
|
||||
results[cte.YEAR] = pd.DataFrame([max(monthly_values)], columns=['heating peak loads'])
|
||||
monthly_values = PeakLoads(self).heating_peak_loads_from_methodology
|
||||
if monthly_values is None:
|
||||
return None
|
||||
results[cte.MONTH] = pd.DataFrame(monthly_values, columns=[cte.HEATING_PEAK_LOAD])
|
||||
results[cte.YEAR] = pd.DataFrame([max(monthly_values)], columns=[cte.HEATING_PEAK_LOAD])
|
||||
return results
|
||||
|
||||
@property
|
||||
def cooling_peak_load(self) -> dict:
|
||||
def cooling_peak_load(self) -> Union[None, dict]:
|
||||
"""
|
||||
Get cooling peak load in W
|
||||
:return: dict{DataFrame(float)}
|
||||
"""
|
||||
results = {}
|
||||
if cte.HOUR in self.cooling:
|
||||
monthly_values = pl.peak_loads_from_hourly(self.cooling[cte.HOUR][next(iter(self.cooling[cte.HOUR]))])
|
||||
monthly_values = PeakLoads().peak_loads_from_hourly(self.cooling[cte.HOUR][next(iter(self.cooling[cte.HOUR]))])
|
||||
else:
|
||||
monthly_values = pl.cooling_peak_loads_from_methodology(self)
|
||||
results[cte.MONTH] = pd.DataFrame(monthly_values, columns=['cooling peak loads'])
|
||||
results[cte.YEAR] = pd.DataFrame([max(monthly_values)], columns=['cooling peak loads'])
|
||||
monthly_values = PeakLoads(self).cooling_peak_loads_from_methodology
|
||||
if monthly_values is None:
|
||||
return None
|
||||
results[cte.MONTH] = pd.DataFrame(monthly_values, columns=[cte.COOLING_PEAK_LOAD])
|
||||
results[cte.YEAR] = pd.DataFrame([max(monthly_values)], columns=[cte.COOLING_PEAK_LOAD])
|
||||
return results
|
||||
|
||||
@property
|
||||
|
@ -467,19 +478,38 @@ class Building(CityObject):
|
|||
return False
|
||||
|
||||
@property
|
||||
def alias(self):
|
||||
def aliases(self):
|
||||
"""
|
||||
Get the alias name for the building
|
||||
:return: str
|
||||
"""
|
||||
return self._alias
|
||||
return self._aliases
|
||||
|
||||
@alias.setter
|
||||
def alias(self, value):
|
||||
def add_alias(self, value):
|
||||
"""
|
||||
Set the alias name for the building
|
||||
Add a new alias for the building
|
||||
"""
|
||||
self._alias = value
|
||||
if self._aliases is None:
|
||||
self._aliases = [value]
|
||||
else:
|
||||
self._aliases.append(value)
|
||||
if self.city is not None:
|
||||
self.city.add_building_alias(self, value)
|
||||
|
||||
@property
|
||||
def city(self) -> City:
|
||||
"""
|
||||
Get the city containing the building
|
||||
:return: City
|
||||
"""
|
||||
return self._city
|
||||
|
||||
@city.setter
|
||||
def city(self, value):
|
||||
"""
|
||||
Set the city containing the building
|
||||
"""
|
||||
self._city = value
|
||||
|
||||
@property
|
||||
def usages_percentage(self):
|
||||
|
@ -488,6 +518,207 @@ class Building(CityObject):
|
|||
"""
|
||||
_usage = ''
|
||||
for internal_zone in self.internal_zones:
|
||||
if internal_zone.usages is None:
|
||||
continue
|
||||
for usage in internal_zone.usages:
|
||||
_usage = f'{_usage}{usage.name}_{usage.percentage} '
|
||||
return _usage.rstrip()
|
||||
|
||||
@property
|
||||
def energy_systems(self) -> Union[None, List[EnergySystem]]:
|
||||
"""
|
||||
Get list of energy systems installed to cover the building demands
|
||||
:return: [EnergySystem]
|
||||
"""
|
||||
return self._energy_systems
|
||||
|
||||
@energy_systems.setter
|
||||
def energy_systems(self, value):
|
||||
"""
|
||||
Set list of energy systems installed to cover the building demands
|
||||
:param value: [EnergySystem]
|
||||
"""
|
||||
self._energy_systems = value
|
||||
|
||||
@property
|
||||
def energy_systems_archetype_name(self):
|
||||
"""
|
||||
Get energy systems archetype name
|
||||
:return: str
|
||||
"""
|
||||
return self._systems_archetype_name
|
||||
|
||||
@energy_systems_archetype_name.setter
|
||||
def energy_systems_archetype_name(self, value):
|
||||
"""
|
||||
Set energy systems archetype name
|
||||
:param value: str
|
||||
"""
|
||||
self._systems_archetype_name = value
|
||||
|
||||
@property
|
||||
def heating_consumption(self):
|
||||
"""
|
||||
Get energy consumption for heating according to the heating system installed in Wh
|
||||
return: dict
|
||||
"""
|
||||
if len(self._heating_consumption) == 0:
|
||||
for heating_demand_key in self.heating:
|
||||
demand = self.heating[heating_demand_key][cte.INSEL_MEB]
|
||||
consumption_type = cte.HEATING
|
||||
final_energy_consumed = self._calculate_consumption(consumption_type, demand)
|
||||
self._heating_consumption[heating_demand_key] = final_energy_consumed
|
||||
return self._heating_consumption
|
||||
|
||||
@property
|
||||
def cooling_consumption(self):
|
||||
"""
|
||||
Get energy consumption for cooling according to the cooling system installed in Wh
|
||||
return: dict
|
||||
"""
|
||||
if len(self._cooling_consumption) == 0:
|
||||
for cooling_demand_key in self.cooling:
|
||||
demand = self.cooling[cooling_demand_key][cte.INSEL_MEB]
|
||||
consumption_type = cte.COOLING
|
||||
final_energy_consumed = self._calculate_consumption(consumption_type, demand)
|
||||
self._cooling_consumption[cooling_demand_key] = final_energy_consumed
|
||||
return self._cooling_consumption
|
||||
|
||||
@property
|
||||
def domestic_hot_water_consumption(self):
|
||||
"""
|
||||
Get energy consumption for domestic according to the domestic hot water system installed in Wh
|
||||
return: dict
|
||||
"""
|
||||
if len(self._domestic_hot_water_consumption) == 0:
|
||||
for domestic_hot_water_demand_key in self.domestic_hot_water_heat_demand:
|
||||
demand = self.domestic_hot_water_heat_demand[domestic_hot_water_demand_key][cte.INSEL_MEB]
|
||||
consumption_type = cte.DOMESTIC_HOT_WATER
|
||||
final_energy_consumed = self._calculate_consumption(consumption_type, demand)
|
||||
self._domestic_hot_water_consumption[domestic_hot_water_demand_key] = final_energy_consumed
|
||||
return self._domestic_hot_water_consumption
|
||||
|
||||
def _calculate_working_hours(self):
|
||||
_working_hours = {}
|
||||
for internal_zone in self.internal_zones:
|
||||
for thermal_zone in internal_zone.thermal_zones:
|
||||
_working_hours_per_thermal_zone = {}
|
||||
for schedule in thermal_zone.thermal_control.hvac_availability_schedules:
|
||||
_working_hours_per_schedule = [0] * len(schedule.values)
|
||||
for i, value in enumerate(schedule.values):
|
||||
if value > 0:
|
||||
_working_hours_per_schedule[i] = 1
|
||||
for day_type in schedule.day_types:
|
||||
_working_hours_per_thermal_zone[day_type] = _working_hours_per_schedule
|
||||
if len(_working_hours) == 0:
|
||||
_working_hours = _working_hours_per_thermal_zone
|
||||
else:
|
||||
for key, item in _working_hours.items():
|
||||
saved_values = _working_hours_per_thermal_zone[key]
|
||||
for i, value in enumerate(item):
|
||||
if saved_values[i] == 1:
|
||||
value = 1
|
||||
_total_hours = 0
|
||||
for key in _working_hours:
|
||||
_total_hours += _working_hours[key] * cte.DAYS_A_YEAR[key]
|
||||
return _total_hours
|
||||
|
||||
@property
|
||||
def distribution_systems_electrical_consumption(self):
|
||||
"""
|
||||
Get total electricity consumption for distribution and emission systems in Wh
|
||||
return: dict
|
||||
"""
|
||||
if len(self._distribution_systems_electrical_consumption) != 0:
|
||||
return self._distribution_systems_electrical_consumption
|
||||
_peak_load = self.heating_peak_load[cte.YEAR]['heating peak loads'][0]
|
||||
_peak_load_type = cte.HEATING
|
||||
if _peak_load < self.cooling_peak_load[cte.YEAR]['cooling peak loads'][0]:
|
||||
_peak_load = self.cooling_peak_load[cte.YEAR]['cooling peak loads'][0]
|
||||
_peak_load_type = cte.COOLING
|
||||
|
||||
_consumption_fix_flow = 0
|
||||
for energy_system in self.energy_systems:
|
||||
emission_system = energy_system.emission_system.generic_emission_system
|
||||
parasitic_energy_consumption = emission_system.parasitic_energy_consumption
|
||||
distribution_system = energy_system.distribution_system.generic_distribution_system
|
||||
consumption_variable_flow = distribution_system.distribution_consumption_variable_flow
|
||||
for demand_type in energy_system.demand_types:
|
||||
if demand_type.lower() == cte.HEATING:
|
||||
if _peak_load_type == cte.HEATING:
|
||||
_consumption_fix_flow = distribution_system.distribution_consumption_fix_flow
|
||||
for heating_demand_key in self.heating:
|
||||
_consumption = [0]*len(self.heating)
|
||||
_demand = self.heating[heating_demand_key][cte.INSEL_MEB]
|
||||
for i in enumerate(_consumption):
|
||||
_consumption[i] += (parasitic_energy_consumption + consumption_variable_flow) * _demand[i]
|
||||
self._distribution_systems_electrical_consumption[heating_demand_key] = _consumption
|
||||
if demand_type.lower() == cte.COOLING:
|
||||
if _peak_load_type == cte.COOLING:
|
||||
_consumption_fix_flow = distribution_system.distribution_consumption_fix_flow
|
||||
for demand_key in self.cooling:
|
||||
_consumption = self._distribution_systems_electrical_consumption[demand_key]
|
||||
_demand = self.cooling[demand_key][cte.INSEL_MEB]
|
||||
for i in enumerate(_consumption):
|
||||
_consumption[i] += (parasitic_energy_consumption + consumption_variable_flow) * _demand[i]
|
||||
self._distribution_systems_electrical_consumption[demand_key] = _consumption
|
||||
|
||||
for key, item in self._distribution_systems_electrical_consumption.items():
|
||||
for i in range(0, len(item)):
|
||||
self._distribution_systems_electrical_consumption[key][i] += _peak_load * _consumption_fix_flow \
|
||||
* self._calculate_working_hours()
|
||||
return self._distribution_systems_electrical_consumption
|
||||
|
||||
def _calculate_consumption(self, consumption_type, demand):
|
||||
# todo: modify when COP depends on the hour
|
||||
coefficient_of_performance = 0
|
||||
for energy_system in self.energy_systems:
|
||||
for demand_type in energy_system.demand_types:
|
||||
if demand_type.lower() == consumption_type.lower():
|
||||
if consumption_type in (cte.HEATING, cte.DOMESTIC_HOT_WATER):
|
||||
coefficient_of_performance = energy_system.generation_system.generic_generation_system.heat_efficiency
|
||||
elif consumption_type == cte.COOLING:
|
||||
coefficient_of_performance = energy_system.generation_system.generic_generation_system.cooling_efficiency
|
||||
elif consumption_type == cte.ELECTRICITY:
|
||||
coefficient_of_performance = \
|
||||
energy_system.generation_system.generic_generation_system.electricity_efficiency
|
||||
if coefficient_of_performance == 0:
|
||||
values = [0]*len(demand)
|
||||
final_energy_consumed = values
|
||||
else:
|
||||
final_energy_consumed = []
|
||||
for demand_value in demand:
|
||||
final_energy_consumed.append(demand_value / coefficient_of_performance)
|
||||
return final_energy_consumed
|
||||
|
||||
@property
|
||||
def onsite_electrical_production(self):
|
||||
"""
|
||||
Get total electricity produced onsite in Wh
|
||||
return: dict
|
||||
"""
|
||||
|
||||
# Add other systems whenever new ones appear
|
||||
orientation_losses_factor = {cte.MONTH: {'north': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||
'east': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||
'south': [2.137931, 1.645503, 1.320946, 1.107817, 0.993213, 0.945175,
|
||||
0.967949, 1.065534, 1.24183, 1.486486, 1.918033, 2.210526],
|
||||
'west': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]},
|
||||
cte.YEAR: {'north': [0],
|
||||
'east': [0],
|
||||
'south': [1.212544],
|
||||
'west': [0]}
|
||||
}
|
||||
for energy_system in self.energy_systems:
|
||||
if energy_system.generation_system.generic_generation_system.type == cte.PHOTOVOLTAIC:
|
||||
_efficiency = energy_system.generation_system.generic_generation_system.electricity_efficiency
|
||||
self._onsite_electrical_production = {}
|
||||
for _key in self.roofs[0].global_irradiance.keys():
|
||||
_results = [0 for _ in range(0, len(self.roofs[0].global_irradiance[_key][cte.SRA]))]
|
||||
for surface in self.roofs:
|
||||
_results = [x + y * _efficiency * surface.perimeter_area
|
||||
* surface.solar_collectors_area_reduction_factor * z
|
||||
for x, y, z in zip(_results, surface.global_irradiance[_key][cte.SRA],
|
||||
orientation_losses_factor[cte.MONTH]['south'])]
|
||||
self._onsite_electrical_production[_key] = _results
|
||||
return self._onsite_electrical_production
|
||||
|
|
|
@ -7,9 +7,11 @@ Code contributors: Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concord
|
|||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import math
|
||||
import uuid
|
||||
import numpy as np
|
||||
from typing import List, Union
|
||||
import numpy as np
|
||||
from hub.city_model_structure.attributes.polygon import Polygon
|
||||
from hub.city_model_structure.attributes.plane import Plane
|
||||
from hub.city_model_structure.attributes.point import Point
|
||||
|
@ -32,7 +34,7 @@ class Surface:
|
|||
self._area = None
|
||||
self._lower_corner = None
|
||||
self._upper_corner = None
|
||||
self._global_irradiance = dict()
|
||||
self._global_irradiance = {}
|
||||
self._perimeter_polygon = perimeter_polygon
|
||||
self._holes_polygons = holes_polygons
|
||||
self._solid_polygon = solid_polygon
|
||||
|
@ -42,6 +44,7 @@ class Surface:
|
|||
self._associated_thermal_boundaries = []
|
||||
self._vegetation = None
|
||||
self._percentage_shared = None
|
||||
self._solar_collectors_area_reduction_factor = None
|
||||
|
||||
@property
|
||||
def name(self):
|
||||
|
@ -134,7 +137,7 @@ class Surface:
|
|||
@property
|
||||
def azimuth(self):
|
||||
"""
|
||||
Get surface azimuth in radians
|
||||
Get surface azimuth in radians (north = 0)
|
||||
:return: float
|
||||
"""
|
||||
if self._azimuth is None:
|
||||
|
@ -145,7 +148,7 @@ class Surface:
|
|||
@property
|
||||
def inclination(self):
|
||||
"""
|
||||
Get surface inclination in radians
|
||||
Get surface inclination in radians (zenith = 0, horizon = pi/2)
|
||||
:return: float
|
||||
"""
|
||||
if self._inclination is None:
|
||||
|
@ -161,10 +164,12 @@ class Surface:
|
|||
:return: str
|
||||
"""
|
||||
if self._type is None:
|
||||
grad = np.rad2deg(self.inclination)
|
||||
if grad >= 170:
|
||||
inclination_cos = math.cos(self.inclination)
|
||||
# 170 degrees
|
||||
if inclination_cos <= -0.98:
|
||||
self._type = 'Ground'
|
||||
elif 80 <= grad <= 100:
|
||||
# between 80 and 100 degrees
|
||||
elif abs(inclination_cos) <= 0.17:
|
||||
self._type = 'Wall'
|
||||
else:
|
||||
self._type = 'Roof'
|
||||
|
@ -346,3 +351,36 @@ class Surface:
|
|||
:param value: float
|
||||
"""
|
||||
self._percentage_shared = value
|
||||
|
||||
@property
|
||||
def solar_collectors_area_reduction_factor(self):
|
||||
"""
|
||||
Get factor area collector per surface area if set or calculate using Romero Rodriguez, L. et al (2017) model if not
|
||||
:return: float
|
||||
"""
|
||||
if self._solar_collectors_area_reduction_factor is None:
|
||||
if self.type == cte.ROOF:
|
||||
_protected_building_restriction = 1
|
||||
# 10 degrees range
|
||||
if abs(math.sin(self.inclination)) < 0.17:
|
||||
# horizontal
|
||||
_construction_restriction = 0.8
|
||||
_separation_of_panels = 0.46
|
||||
_shadow_between_panels = 0.7
|
||||
else:
|
||||
# tilted
|
||||
_construction_restriction = 0.9
|
||||
_separation_of_panels = 0.9
|
||||
_shadow_between_panels = 1
|
||||
self._solar_collectors_area_reduction_factor = (
|
||||
_protected_building_restriction * _construction_restriction * _separation_of_panels * _shadow_between_panels
|
||||
)
|
||||
return self._solar_collectors_area_reduction_factor
|
||||
|
||||
@solar_collectors_area_reduction_factor.setter
|
||||
def solar_collectors_area_reduction_factor(self, value):
|
||||
"""
|
||||
Set factor area collector per surface area
|
||||
:param value: float
|
||||
"""
|
||||
self._solar_collectors_area_reduction_factor = value
|
||||
|
|
|
@ -226,7 +226,7 @@ class ThermalBoundary:
|
|||
r_value += float(layer.thickness) / float(layer.material.conductivity)
|
||||
self._u_value = 1.0/r_value
|
||||
except TypeError:
|
||||
raise Exception('Constructions layers are not initialized') from TypeError
|
||||
raise TypeError('Constructions layers are not initialized') from TypeError
|
||||
return self._u_value
|
||||
|
||||
@u_value.setter
|
||||
|
|
|
@ -8,8 +8,9 @@ Code contributors: Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concord
|
|||
|
||||
import uuid
|
||||
import copy
|
||||
import numpy
|
||||
from typing import List, Union, TypeVar
|
||||
import numpy
|
||||
|
||||
from hub.city_model_structure.building_demand.occupancy import Occupancy
|
||||
from hub.city_model_structure.building_demand.appliances import Appliances
|
||||
from hub.city_model_structure.building_demand.lighting import Lighting
|
||||
|
@ -59,7 +60,11 @@ class ThermalZone:
|
|||
|
||||
@property
|
||||
def usages(self):
|
||||
# example 70-office_30-residential
|
||||
"""
|
||||
Get the thermal zone usages including percentage with the format [percentage]-usage_[percentage]-usage...
|
||||
Eg: 70-office_30-residential
|
||||
:return: str
|
||||
"""
|
||||
if self._usage_from_parent:
|
||||
self._usages = copy.deepcopy(self._parent_internal_zone.usages)
|
||||
else:
|
||||
|
@ -324,19 +329,19 @@ class ThermalZone:
|
|||
_occupancy_reference = self.usages[0].occupancy
|
||||
if _occupancy_reference.occupancy_schedules is not None:
|
||||
_schedules = []
|
||||
for i_schedule in range(0, len(_occupancy_reference.occupancy_schedules)):
|
||||
for schedule_index, schedule_value in enumerate(_occupancy_reference.occupancy_schedules):
|
||||
schedule = Schedule()
|
||||
schedule.type = _occupancy_reference.occupancy_schedules[i_schedule].type
|
||||
schedule.day_types = _occupancy_reference.occupancy_schedules[i_schedule].day_types
|
||||
schedule.data_type = _occupancy_reference.occupancy_schedules[i_schedule].data_type
|
||||
schedule.time_step = _occupancy_reference.occupancy_schedules[i_schedule].time_step
|
||||
schedule.time_range = _occupancy_reference.occupancy_schedules[i_schedule].time_range
|
||||
schedule.type = schedule_value.type
|
||||
schedule.day_types = schedule_value.day_types
|
||||
schedule.data_type = schedule_value.data_type
|
||||
schedule.time_step = schedule_value.time_step
|
||||
schedule.time_range = schedule_value.time_range
|
||||
|
||||
new_values = []
|
||||
for i_value in range(0, len(_occupancy_reference.occupancy_schedules[i_schedule].values)):
|
||||
for i_value, _ in enumerate(schedule_value.values):
|
||||
_new_value = 0
|
||||
for usage in self.usages:
|
||||
_new_value += usage.percentage * usage.occupancy.occupancy_schedules[i_schedule].values[i_value]
|
||||
_new_value += usage.percentage * usage.occupancy.occupancy_schedules[schedule_index].values[i_value]
|
||||
new_values.append(_new_value)
|
||||
schedule.values = new_values
|
||||
_schedules.append(schedule)
|
||||
|
@ -363,12 +368,15 @@ class ThermalZone:
|
|||
return None
|
||||
_lighting_density += usage.percentage * usage.lighting.density
|
||||
if usage.lighting.convective_fraction is not None:
|
||||
_convective_part += usage.percentage * usage.lighting.density \
|
||||
* usage.lighting.convective_fraction
|
||||
_radiative_part += usage.percentage * usage.lighting.density \
|
||||
* usage.lighting.radiative_fraction
|
||||
_latent_part += usage.percentage * usage.lighting.density \
|
||||
* usage.lighting.latent_fraction
|
||||
_convective_part += (
|
||||
usage.percentage * usage.lighting.density * usage.lighting.convective_fraction
|
||||
)
|
||||
_radiative_part += (
|
||||
usage.percentage * usage.lighting.density * usage.lighting.radiative_fraction
|
||||
)
|
||||
_latent_part += (
|
||||
usage.percentage * usage.lighting.density * usage.lighting.latent_fraction
|
||||
)
|
||||
self._lighting.density = _lighting_density
|
||||
if _lighting_density > 0:
|
||||
self._lighting.convective_fraction = _convective_part / _lighting_density
|
||||
|
@ -382,19 +390,19 @@ class ThermalZone:
|
|||
_lighting_reference = self.usages[0].lighting
|
||||
if _lighting_reference.schedules is not None:
|
||||
_schedules = []
|
||||
for i_schedule in range(0, len(_lighting_reference.schedules)):
|
||||
for schedule_index, schedule_value in enumerate(_lighting_reference.schedules):
|
||||
schedule = Schedule()
|
||||
schedule.type = _lighting_reference.schedules[i_schedule].type
|
||||
schedule.day_types = _lighting_reference.schedules[i_schedule].day_types
|
||||
schedule.data_type = _lighting_reference.schedules[i_schedule].data_type
|
||||
schedule.time_step = _lighting_reference.schedules[i_schedule].time_step
|
||||
schedule.time_range = _lighting_reference.schedules[i_schedule].time_range
|
||||
schedule.type = schedule_value.type
|
||||
schedule.day_types = schedule_value.day_types
|
||||
schedule.data_type = schedule_value.data_type
|
||||
schedule.time_step = schedule_value.time_step
|
||||
schedule.time_range = schedule_value.time_range
|
||||
|
||||
new_values = []
|
||||
for i_value in range(0, len(_lighting_reference.schedules[i_schedule].values)):
|
||||
for i_value, _ in enumerate(schedule_value.values):
|
||||
_new_value = 0
|
||||
for usage in self.usages:
|
||||
_new_value += usage.percentage * usage.lighting.schedules[i_schedule].values[i_value]
|
||||
_new_value += usage.percentage * usage.lighting.schedules[schedule_index].values[i_value]
|
||||
new_values.append(_new_value)
|
||||
schedule.values = new_values
|
||||
_schedules.append(schedule)
|
||||
|
@ -421,12 +429,15 @@ class ThermalZone:
|
|||
return None
|
||||
_appliances_density += usage.percentage * usage.appliances.density
|
||||
if usage.appliances.convective_fraction is not None:
|
||||
_convective_part += usage.percentage * usage.appliances.density \
|
||||
* usage.appliances.convective_fraction
|
||||
_radiative_part += usage.percentage * usage.appliances.density \
|
||||
* usage.appliances.radiative_fraction
|
||||
_latent_part += usage.percentage * usage.appliances.density \
|
||||
* usage.appliances.latent_fraction
|
||||
_convective_part += (
|
||||
usage.percentage * usage.appliances.density * usage.appliances.convective_fraction
|
||||
)
|
||||
_radiative_part += (
|
||||
usage.percentage * usage.appliances.density * usage.appliances.radiative_fraction
|
||||
)
|
||||
_latent_part += (
|
||||
usage.percentage * usage.appliances.density * usage.appliances.latent_fraction
|
||||
)
|
||||
self._appliances.density = _appliances_density
|
||||
if _appliances_density > 0:
|
||||
self._appliances.convective_fraction = _convective_part / _appliances_density
|
||||
|
@ -440,19 +451,19 @@ class ThermalZone:
|
|||
_appliances_reference = self.usages[0].appliances
|
||||
if _appliances_reference.schedules is not None:
|
||||
_schedules = []
|
||||
for i_schedule in range(0, len(_appliances_reference.schedules)):
|
||||
for schedule_index, schedule_value in enumerate(_appliances_reference.schedules):
|
||||
schedule = Schedule()
|
||||
schedule.type = _appliances_reference.schedules[i_schedule].type
|
||||
schedule.day_types = _appliances_reference.schedules[i_schedule].day_types
|
||||
schedule.data_type = _appliances_reference.schedules[i_schedule].data_type
|
||||
schedule.time_step = _appliances_reference.schedules[i_schedule].time_step
|
||||
schedule.time_range = _appliances_reference.schedules[i_schedule].time_range
|
||||
schedule.type = schedule_value.type
|
||||
schedule.day_types = schedule_value.day_types
|
||||
schedule.data_type = schedule_value.data_type
|
||||
schedule.time_step = schedule_value.time_step
|
||||
schedule.time_range = schedule_value.time_range
|
||||
|
||||
new_values = []
|
||||
for i_value in range(0, len(_appliances_reference.schedules[i_schedule].values)):
|
||||
for i_value, _ in enumerate(schedule_value.values):
|
||||
_new_value = 0
|
||||
for usage in self.usages:
|
||||
_new_value += usage.percentage * usage.appliances.schedules[i_schedule].values[i_value]
|
||||
_new_value += usage.percentage * usage.appliances.schedules[schedule_index].values[i_value]
|
||||
new_values.append(_new_value)
|
||||
schedule.values = new_values
|
||||
_schedules.append(schedule)
|
||||
|
@ -486,12 +497,15 @@ class ThermalZone:
|
|||
for usage in self.usages:
|
||||
for internal_gain in usage.internal_gains:
|
||||
_average_internal_gain += internal_gain.average_internal_gain * usage.percentage
|
||||
_convective_fraction += internal_gain.average_internal_gain * usage.percentage \
|
||||
* internal_gain.convective_fraction
|
||||
_radiative_fraction += internal_gain.average_internal_gain * usage.percentage \
|
||||
* internal_gain.radiative_fraction
|
||||
_latent_fraction += internal_gain.average_internal_gain * usage.percentage \
|
||||
* internal_gain.latent_fraction
|
||||
_convective_fraction += (
|
||||
internal_gain.average_internal_gain * usage.percentage * internal_gain.convective_fraction
|
||||
)
|
||||
_radiative_fraction += (
|
||||
internal_gain.average_internal_gain * usage.percentage * internal_gain.radiative_fraction
|
||||
)
|
||||
_latent_fraction += (
|
||||
internal_gain.average_internal_gain * usage.percentage * internal_gain.latent_fraction
|
||||
)
|
||||
for usage in self.usages:
|
||||
for internal_gain in usage.internal_gains:
|
||||
if internal_gain.schedules is None:
|
||||
|
@ -501,12 +515,12 @@ class ThermalZone:
|
|||
_schedules_defined = False
|
||||
break
|
||||
for day, _schedule in enumerate(internal_gain.schedules):
|
||||
for v, value in enumerate(_schedule.values):
|
||||
values[v, day] += value * usage.percentage
|
||||
for v_index, value in enumerate(_schedule.values):
|
||||
values[v_index, day] += value * usage.percentage
|
||||
|
||||
if _schedules_defined:
|
||||
_schedules = []
|
||||
for day in range(0, len(_days)):
|
||||
for day, _ in enumerate(_days):
|
||||
_schedule = copy.deepcopy(_base_schedule)
|
||||
_schedule.day_types = [_days[day]]
|
||||
_schedule.values = values[:day]
|
||||
|
@ -534,7 +548,8 @@ class ThermalZone:
|
|||
if self.usages is None:
|
||||
return None
|
||||
|
||||
if self._thermal_control is None:
|
||||
if self._thermal_control is not None:
|
||||
return self._thermal_control
|
||||
self._thermal_control = ThermalControl()
|
||||
_mean_heating_set_point = 0
|
||||
_heating_set_back = 0
|
||||
|
@ -556,19 +571,19 @@ class ThermalZone:
|
|||
if _thermal_control_reference.cooling_set_point_schedules is not None:
|
||||
_types_reference.append([cte.COOLING_SET_POINT, _thermal_control_reference.cooling_set_point_schedules])
|
||||
|
||||
for i_type in range(0, len(_types_reference)):
|
||||
for i_type, _ in enumerate(_types_reference):
|
||||
_schedules = []
|
||||
_schedule_type = _types_reference[i_type][1]
|
||||
for i_schedule in range(0, len(_schedule_type)):
|
||||
for i_schedule, schedule_value in enumerate(_schedule_type):
|
||||
schedule = Schedule()
|
||||
schedule.type = _schedule_type[i_schedule].type
|
||||
schedule.day_types = _schedule_type[i_schedule].day_types
|
||||
schedule.data_type = _schedule_type[i_schedule].data_type
|
||||
schedule.time_step = _schedule_type[i_schedule].time_step
|
||||
schedule.time_range = _schedule_type[i_schedule].time_range
|
||||
schedule.type = schedule_value.type
|
||||
schedule.day_types = schedule_value.day_types
|
||||
schedule.data_type = schedule_value.data_type
|
||||
schedule.time_step = schedule_value.time_step
|
||||
schedule.time_range = schedule_value.time_range
|
||||
|
||||
new_values = []
|
||||
for i_value in range(0, len(_schedule_type[i_schedule].values)):
|
||||
for i_value, _ in enumerate(schedule_value.values):
|
||||
_new_value = 0
|
||||
for usage in self.usages:
|
||||
if _types_reference[i_type][0] == cte.HVAC_AVAILABILITY:
|
||||
|
@ -589,7 +604,6 @@ class ThermalZone:
|
|||
self._thermal_control.heating_set_point_schedules = _schedules
|
||||
elif i_type == 2:
|
||||
self._thermal_control.cooling_set_point_schedules = _schedules
|
||||
|
||||
return self._thermal_control
|
||||
|
||||
@property
|
||||
|
@ -613,19 +627,19 @@ class ThermalZone:
|
|||
_domestic_hot_water_reference = self.usages[0].domestic_hot_water
|
||||
if _domestic_hot_water_reference.schedules is not None:
|
||||
_schedules = []
|
||||
for i_schedule in range(0, len(_domestic_hot_water_reference.schedules)):
|
||||
for schedule_index, schedule_value in enumerate(_domestic_hot_water_reference.schedules):
|
||||
schedule = Schedule()
|
||||
schedule.type = _domestic_hot_water_reference.schedules[i_schedule].type
|
||||
schedule.day_types = _domestic_hot_water_reference.schedules[i_schedule].day_types
|
||||
schedule.data_type = _domestic_hot_water_reference.schedules[i_schedule].data_type
|
||||
schedule.time_step = _domestic_hot_water_reference.schedules[i_schedule].time_step
|
||||
schedule.time_range = _domestic_hot_water_reference.schedules[i_schedule].time_range
|
||||
schedule.type = schedule_value.type
|
||||
schedule.day_types = schedule_value.day_types
|
||||
schedule.data_type = schedule_value.data_type
|
||||
schedule.time_step = schedule_value.time_step
|
||||
schedule.time_range = schedule_value.time_range
|
||||
|
||||
new_values = []
|
||||
for i_value in range(0, len(_domestic_hot_water_reference.schedules[i_schedule].values)):
|
||||
for i_value, _ in enumerate(schedule_value.values):
|
||||
_new_value = 0
|
||||
for usage in self.usages:
|
||||
_new_value += usage.percentage * usage.domestic_hot_water.schedules[i_schedule].values[i_value]
|
||||
_new_value += usage.percentage * usage.domestic_hot_water.schedules[schedule_index].values[i_value]
|
||||
new_values.append(_new_value)
|
||||
schedule.values = new_values
|
||||
_schedules.append(schedule)
|
||||
|
|
|
@ -8,28 +8,27 @@ Code contributors: Peter Yefi peteryefi@gmail.com
|
|||
from __future__ import annotations
|
||||
|
||||
import bz2
|
||||
import sys
|
||||
import pickle
|
||||
import math
|
||||
import copy
|
||||
import pyproj
|
||||
from typing import List, Union
|
||||
from pyproj import Transformer
|
||||
import logging
|
||||
import math
|
||||
import pickle
|
||||
from pathlib import Path
|
||||
from typing import List, Union
|
||||
|
||||
import pyproj
|
||||
from pandas import DataFrame
|
||||
from pyproj import Transformer
|
||||
|
||||
from hub.city_model_structure.building import Building
|
||||
from hub.city_model_structure.buildings_cluster import BuildingsCluster
|
||||
from hub.city_model_structure.city_object import CityObject
|
||||
from hub.city_model_structure.city_objects_cluster import CityObjectsCluster
|
||||
from hub.city_model_structure.buildings_cluster import BuildingsCluster
|
||||
from hub.city_model_structure.fuel import Fuel
|
||||
from hub.city_model_structure.energy_system import EnergySystem
|
||||
from hub.city_model_structure.iot.station import Station
|
||||
from hub.city_model_structure.level_of_detail import LevelOfDetail
|
||||
from hub.city_model_structure.machine import Machine
|
||||
from hub.city_model_structure.parts_consisting_building import PartsConsistingBuilding
|
||||
from hub.helpers.geometry_helper import GeometryHelper
|
||||
from hub.helpers.location import Location
|
||||
from hub.city_model_structure.energy_system import EnergySystem
|
||||
from hub.city_model_structure.lca_material import LcaMaterial
|
||||
import pandas as pd
|
||||
|
||||
|
||||
class City:
|
||||
|
@ -61,34 +60,20 @@ class City:
|
|||
self._lca_materials = None
|
||||
self._level_of_detail = LevelOfDetail()
|
||||
self._city_objects_dictionary = {}
|
||||
|
||||
@property
|
||||
def fuels(self) -> [Fuel]:
|
||||
return self._fuels
|
||||
|
||||
@fuels.setter
|
||||
def fuels(self, value):
|
||||
self._fuels = value
|
||||
|
||||
@property
|
||||
def machines(self) -> [Machine]:
|
||||
return self._machines
|
||||
|
||||
@machines.setter
|
||||
def machines(self, value):
|
||||
self._machines = value
|
||||
self._city_objects_alias_dictionary = {}
|
||||
self._energy_systems_connection_table = None
|
||||
self._generic_energy_systems = 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:
|
||||
if self._srs_name in GeometryHelper.srs_transformations.keys():
|
||||
if self._srs_name in GeometryHelper.srs_transformations:
|
||||
self._srs_name = GeometryHelper.srs_transformations[self._srs_name]
|
||||
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()
|
||||
except pyproj.exceptions.CRSError as err:
|
||||
logging.error('Invalid projection reference system, please check the input data.')
|
||||
raise pyproj.exceptions.CRSError from err
|
||||
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])
|
||||
|
@ -103,7 +88,11 @@ class City:
|
|||
return self._get_location().country
|
||||
|
||||
@property
|
||||
def location(self):
|
||||
def location(self) -> Location:
|
||||
"""
|
||||
Get city location
|
||||
:return: Location
|
||||
"""
|
||||
return self._get_location().city
|
||||
|
||||
@property
|
||||
|
@ -204,6 +193,27 @@ class City:
|
|||
return self.buildings[self._city_objects_dictionary[name]]
|
||||
return None
|
||||
|
||||
def building_alias(self, alias) -> list[Building | list[Building]] | None:
|
||||
"""
|
||||
Retrieve the city CityObject with the given alias alias
|
||||
:alert: Building alias is not guaranteed to be unique
|
||||
:param alias:str
|
||||
:return: None or [CityObject]
|
||||
"""
|
||||
if alias in self._city_objects_alias_dictionary:
|
||||
return [self.buildings[i] for i in self._city_objects_alias_dictionary[alias]]
|
||||
return None
|
||||
|
||||
def add_building_alias(self, building, alias):
|
||||
"""
|
||||
Add an alias to the building
|
||||
"""
|
||||
building_index = self._city_objects_dictionary[building.name]
|
||||
if alias in self._city_objects_alias_dictionary:
|
||||
self._city_objects_alias_dictionary[alias].append(building_index)
|
||||
else:
|
||||
self._city_objects_alias_dictionary[alias] = [building_index]
|
||||
|
||||
def add_city_object(self, new_city_object):
|
||||
"""
|
||||
Add a CityObject to the city
|
||||
|
@ -215,6 +225,12 @@ class City:
|
|||
self._buildings = []
|
||||
self._buildings.append(new_city_object)
|
||||
self._city_objects_dictionary[new_city_object.name] = len(self._buildings) - 1
|
||||
if new_city_object.aliases is not None:
|
||||
for alias in new_city_object.aliases:
|
||||
if alias in self._city_objects_alias_dictionary:
|
||||
self._city_objects_alias_dictionary[alias].append(len(self._buildings) - 1)
|
||||
else:
|
||||
self._city_objects_alias_dictionary[alias] = [len(self._buildings) - 1]
|
||||
elif new_city_object.type == 'energy_system':
|
||||
if self._energy_systems is None:
|
||||
self._energy_systems = []
|
||||
|
@ -230,15 +246,21 @@ class City:
|
|||
"""
|
||||
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')
|
||||
if not self._buildings:
|
||||
logging.warning('impossible to remove city_object, the city is empty\n')
|
||||
else:
|
||||
if city_object in self._buildings:
|
||||
self._buildings.remove(city_object)
|
||||
# regenerate hash map
|
||||
self._city_objects_dictionary.clear()
|
||||
for i, city_object in enumerate(self._buildings):
|
||||
self._city_objects_dictionary[city_object.name] = i
|
||||
self._city_objects_alias_dictionary.clear()
|
||||
for i, _building in enumerate(self._buildings):
|
||||
self._city_objects_dictionary[_building.name] = i
|
||||
for alias in _building.aliases:
|
||||
if alias in self._city_objects_alias_dictionary:
|
||||
self._city_objects_alias_dictionary[alias].append(i)
|
||||
else:
|
||||
self._city_objects_alias_dictionary[alias] = [i]
|
||||
|
||||
@property
|
||||
def srs_name(self) -> Union[None, str]:
|
||||
|
@ -282,8 +304,8 @@ class City:
|
|||
:param city_filename: destination city filename
|
||||
:return: None
|
||||
"""
|
||||
with bz2.BZ2File(city_filename, 'wb') as f:
|
||||
pickle.dump(self, f)
|
||||
with bz2.BZ2File(city_filename, 'wb') as file:
|
||||
pickle.dump(self, file)
|
||||
|
||||
def region(self, center, radius) -> City:
|
||||
"""
|
||||
|
@ -420,31 +442,6 @@ class City:
|
|||
else:
|
||||
raise NotImplementedError
|
||||
|
||||
@property
|
||||
def lca_materials(self) -> Union[List[LcaMaterial], None]:
|
||||
"""
|
||||
Get life cycle materials for the city
|
||||
:return: [LcaMaterial] or
|
||||
"""
|
||||
return self._lca_materials
|
||||
|
||||
@lca_materials.setter
|
||||
def lca_materials(self, value):
|
||||
"""
|
||||
Set life cycle materials for the city
|
||||
"""
|
||||
self._lca_materials = value
|
||||
|
||||
def lca_material(self, lca_id) -> Union[LcaMaterial, None]:
|
||||
"""
|
||||
Get the lca material matching the given Id
|
||||
:return: LcaMaterial or None
|
||||
"""
|
||||
for lca_material in self.lca_materials:
|
||||
if str(lca_material.id) == str(lca_id):
|
||||
return lca_material
|
||||
return None
|
||||
|
||||
@property
|
||||
def copy(self) -> City:
|
||||
"""
|
||||
|
@ -453,34 +450,11 @@ class City:
|
|||
return copy.deepcopy(self)
|
||||
|
||||
def merge(self, city) -> City:
|
||||
_merge_city = self.copy
|
||||
selected_city_object = None
|
||||
building = None
|
||||
# set initial minimum radiation to a higher number
|
||||
min_radiation = 1999999
|
||||
for city_object in city.city_objects:
|
||||
if city_object.type == 'building':
|
||||
building = city_object
|
||||
building_radiation = 0
|
||||
for surface in city_object.surfaces:
|
||||
radiation = surface.global_irradiance
|
||||
if 'year' not in radiation and 'month' not in radiation:
|
||||
|
||||
continue
|
||||
elif "year" in radiation:
|
||||
building_radiation += radiation["year"].iloc[0]
|
||||
elif "month" in radiation and "year" not in radiation:
|
||||
surface.global_irradiance["year"] = pd.DataFrame({radiation["month"].sum()})
|
||||
building_radiation += radiation["year"].iloc[0]
|
||||
if building_radiation < min_radiation:
|
||||
min_radiation = building_radiation
|
||||
selected_city_object = city_object
|
||||
# merge the city object with the minimum radiation
|
||||
if selected_city_object is not None:
|
||||
_merge_city.add_city_object(selected_city_object)
|
||||
else:
|
||||
_merge_city.add_city_object(building)
|
||||
return _merge_city
|
||||
"""
|
||||
Return a merged city combining the current city and the given one
|
||||
:return: City
|
||||
"""
|
||||
raise NotImplementedError('This method needs to be reimplemented')
|
||||
|
||||
@property
|
||||
def level_of_detail(self) -> LevelOfDetail:
|
||||
|
@ -490,4 +464,36 @@ class City:
|
|||
"""
|
||||
return self._level_of_detail
|
||||
|
||||
@property
|
||||
def energy_systems_connection_table(self) -> Union[None, DataFrame]:
|
||||
"""
|
||||
Get energy systems connection table which includes at least two columns: energy_system_type and associated_building
|
||||
and may also include dimensioned_energy_system and connection_building_to_dimensioned_energy_system
|
||||
:return: DataFrame
|
||||
"""
|
||||
return self._energy_systems_connection_table
|
||||
|
||||
@energy_systems_connection_table.setter
|
||||
def energy_systems_connection_table(self, value):
|
||||
"""
|
||||
Set energy systems connection table which includes at least two columns: energy_system_type and associated_building
|
||||
and may also include dimensioned_energy_system and connection_building_to_dimensioned_energy_system
|
||||
:param value: DataFrame
|
||||
"""
|
||||
self._energy_systems_connection_table = value
|
||||
|
||||
@property
|
||||
def generic_energy_systems(self) -> dict:
|
||||
"""
|
||||
Get dictionary with generic energy systems installed in the city
|
||||
:return: dict
|
||||
"""
|
||||
return self._generic_energy_systems
|
||||
|
||||
@generic_energy_systems.setter
|
||||
def generic_energy_systems(self, value):
|
||||
"""
|
||||
Set dictionary with generic energy systems installed in the city
|
||||
:return: dict
|
||||
"""
|
||||
self._generic_energy_systems = value
|
||||
|
|
|
@ -8,6 +8,7 @@ Project Coder Guille Gutierrez guillermo.gutierrezmorote@concordia.ca
|
|||
from __future__ import annotations
|
||||
from typing import List, Union
|
||||
|
||||
from hub.city_model_structure.level_of_detail import LevelOfDetail
|
||||
from hub.city_model_structure.iot.sensor import Sensor
|
||||
from hub.city_model_structure.building_demand.surface import Surface
|
||||
from hub.city_model_structure.attributes.polyhedron import Polyhedron
|
||||
|
@ -21,6 +22,7 @@ class CityObject:
|
|||
"""
|
||||
def __init__(self, name, surfaces):
|
||||
self._name = name
|
||||
self._level_of_detail = LevelOfDetail()
|
||||
self._surfaces = surfaces
|
||||
self._type = None
|
||||
self._city_object_lower_corner = None
|
||||
|
@ -35,14 +37,22 @@ class CityObject:
|
|||
self._max_z = ConfigurationHelper().min_coordinate
|
||||
self._centroid = None
|
||||
self._volume = None
|
||||
self._external_temperature = dict()
|
||||
self._ground_temperature = dict()
|
||||
self._global_horizontal = dict()
|
||||
self._diffuse = dict()
|
||||
self._beam = dict()
|
||||
self._external_temperature = {}
|
||||
self._ground_temperature = {}
|
||||
self._global_horizontal = {}
|
||||
self._diffuse = {}
|
||||
self._beam = {}
|
||||
self._sensors = []
|
||||
self._neighbours = None
|
||||
|
||||
@property
|
||||
def level_of_detail(self) -> LevelOfDetail:
|
||||
"""
|
||||
Get level of detail of different aspects of the city: geometry, construction and usage
|
||||
:return: LevelOfDetail
|
||||
"""
|
||||
return self._level_of_detail
|
||||
|
||||
@property
|
||||
def name(self):
|
||||
"""
|
||||
|
|
0
hub/city_model_structure/energy_systems/__init__.py
Normal file
0
hub/city_model_structure/energy_systems/__init__.py
Normal file
30
hub/city_model_structure/energy_systems/control_system.py
Normal file
30
hub/city_model_structure/energy_systems/control_system.py
Normal file
|
@ -0,0 +1,30 @@
|
|||
"""
|
||||
Energy control system module
|
||||
SPDX - License - Identifier: LGPL - 3.0 - or -later
|
||||
Copyright © 2023 Concordia CERC group
|
||||
Project Coder Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
|
||||
"""
|
||||
|
||||
|
||||
class ControlSystem:
|
||||
"""
|
||||
ControlSystem class
|
||||
"""
|
||||
def __init__(self):
|
||||
self._control_type = None
|
||||
|
||||
@property
|
||||
def type(self):
|
||||
"""
|
||||
Get control type
|
||||
:return: string
|
||||
"""
|
||||
return self._control_type
|
||||
|
||||
@type.setter
|
||||
def type(self, value):
|
||||
"""
|
||||
Set control type
|
||||
:param value: string
|
||||
"""
|
||||
self._control_type = value
|
|
@ -0,0 +1,32 @@
|
|||
"""
|
||||
Energy distribution system definition
|
||||
SPDX - License - Identifier: LGPL - 3.0 - or -later
|
||||
Copyright © 2023 Concordia CERC group
|
||||
Project Coder Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
|
||||
"""
|
||||
|
||||
from hub.city_model_structure.energy_systems.generic_distribution_system import GenericDistributionSystem
|
||||
|
||||
|
||||
class DistributionSystem:
|
||||
"""
|
||||
DistributionSystem class
|
||||
"""
|
||||
def __init__(self):
|
||||
self._generic_distribution_system = None
|
||||
|
||||
@property
|
||||
def generic_distribution_system(self) -> GenericDistributionSystem:
|
||||
"""
|
||||
Get generic_distribution_system
|
||||
:return: GenericDistributionSystem
|
||||
"""
|
||||
return self._generic_distribution_system
|
||||
|
||||
@generic_distribution_system.setter
|
||||
def generic_distribution_system(self, value):
|
||||
"""
|
||||
Set associated generic_distribution_system
|
||||
:param value: GenericDistributionSystem
|
||||
"""
|
||||
self._generic_distribution_system = value
|
32
hub/city_model_structure/energy_systems/emission_system.py
Normal file
32
hub/city_model_structure/energy_systems/emission_system.py
Normal file
|
@ -0,0 +1,32 @@
|
|||
"""
|
||||
Energy emission system definition
|
||||
SPDX - License - Identifier: LGPL - 3.0 - or -later
|
||||
Copyright © 2023 Concordia CERC group
|
||||
Project Coder Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
|
||||
"""
|
||||
|
||||
from hub.city_model_structure.energy_systems.generic_emission_system import GenericEmissionSystem
|
||||
|
||||
|
||||
class EmissionSystem:
|
||||
"""
|
||||
EmissionSystem class
|
||||
"""
|
||||
def __init__(self):
|
||||
self._generic_emission_system = None
|
||||
|
||||
@property
|
||||
def generic_emission_system(self) -> GenericEmissionSystem:
|
||||
"""
|
||||
Get associated generic_emission_system
|
||||
:return: GenericEmissionSystem
|
||||
"""
|
||||
return self._generic_emission_system
|
||||
|
||||
@generic_emission_system.setter
|
||||
def generic_emission_system(self, value):
|
||||
"""
|
||||
Set associated
|
||||
:param value: GenericEmissionSystem
|
||||
"""
|
||||
self._generic_emission_system = value
|
124
hub/city_model_structure/energy_systems/energy_system.py
Normal file
124
hub/city_model_structure/energy_systems/energy_system.py
Normal file
|
@ -0,0 +1,124 @@
|
|||
"""
|
||||
Energy system definition
|
||||
SPDX - License - Identifier: LGPL - 3.0 - or -later
|
||||
Copyright © 2023 Concordia CERC group
|
||||
Project Coder Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
|
||||
"""
|
||||
|
||||
from typing import Union, List
|
||||
|
||||
from hub.city_model_structure.energy_systems.generic_energy_system import GenericEnergySystem
|
||||
from hub.city_model_structure.energy_systems.generation_system import GenerationSystem
|
||||
from hub.city_model_structure.energy_systems.distribution_system import DistributionSystem
|
||||
from hub.city_model_structure.energy_systems.emission_system import EmissionSystem
|
||||
from hub.city_model_structure.energy_systems.control_system import ControlSystem
|
||||
from hub.city_model_structure.city_object import CityObject
|
||||
|
||||
|
||||
class EnergySystem:
|
||||
"""
|
||||
EnergySystem class
|
||||
"""
|
||||
def __init__(self):
|
||||
self._generic_energy_system = None
|
||||
self._generation_system = None
|
||||
self._distribution_system = None
|
||||
self._emission_system = None
|
||||
self._connected_city_objects = None
|
||||
self._control_system = None
|
||||
|
||||
@property
|
||||
def generic_energy_system(self) -> GenericEnergySystem:
|
||||
"""
|
||||
Get associated generic_energy_system
|
||||
:return: GenericEnergySystem
|
||||
"""
|
||||
return self._generic_energy_system
|
||||
|
||||
@generic_energy_system.setter
|
||||
def generic_energy_system(self, value):
|
||||
"""
|
||||
Set associated generic_energy_system
|
||||
:param value: GenericEnergySystem
|
||||
"""
|
||||
self._generic_energy_system = value
|
||||
|
||||
@property
|
||||
def generation_system(self) -> GenerationSystem:
|
||||
"""
|
||||
Get generation system
|
||||
:return: GenerationSystem
|
||||
"""
|
||||
return self._generation_system
|
||||
|
||||
@generation_system.setter
|
||||
def generation_system(self, value):
|
||||
"""
|
||||
Set generation system
|
||||
:param value: GenerationSystem
|
||||
"""
|
||||
self._generation_system = value
|
||||
|
||||
@property
|
||||
def distribution_system(self) -> Union[None, DistributionSystem]:
|
||||
"""
|
||||
Get distribution system
|
||||
:return: DistributionSystem
|
||||
"""
|
||||
return self._distribution_system
|
||||
|
||||
@distribution_system.setter
|
||||
def distribution_system(self, value):
|
||||
"""
|
||||
Set distribution system
|
||||
:param value: DistributionSystem
|
||||
"""
|
||||
self._distribution_system = value
|
||||
|
||||
@property
|
||||
def emission_system(self) -> Union[None, EmissionSystem]:
|
||||
"""
|
||||
Get emission system
|
||||
:return: EmissionSystem
|
||||
"""
|
||||
return self._emission_system
|
||||
|
||||
@emission_system.setter
|
||||
def emission_system(self, value):
|
||||
"""
|
||||
Set emission system
|
||||
:param value: EmissionSystem
|
||||
"""
|
||||
self._emission_system = value
|
||||
|
||||
@property
|
||||
def connected_city_objects(self) -> Union[None, List[CityObject]]:
|
||||
"""
|
||||
Get list of city objects that are connected to this energy system
|
||||
:return: List[CityObject]
|
||||
"""
|
||||
return self._connected_city_objects
|
||||
|
||||
@connected_city_objects.setter
|
||||
def connected_city_objects(self, value):
|
||||
"""
|
||||
Set list of city objects that are connected to this energy system
|
||||
:param value: List[CityObject]
|
||||
"""
|
||||
self._connected_city_objects = value
|
||||
|
||||
@property
|
||||
def control_system(self) -> Union[None, ControlSystem]:
|
||||
"""
|
||||
Get control system of the energy system
|
||||
:return: ControlSystem
|
||||
"""
|
||||
return self._control_system
|
||||
|
||||
@control_system.setter
|
||||
def control_system(self, value):
|
||||
"""
|
||||
Set control system of the energy system
|
||||
:param value: ControlSystem
|
||||
"""
|
||||
self._control_system = value
|
120
hub/city_model_structure/energy_systems/generation_system.py
Normal file
120
hub/city_model_structure/energy_systems/generation_system.py
Normal file
|
@ -0,0 +1,120 @@
|
|||
"""
|
||||
Energy generation system definition
|
||||
SPDX - License - Identifier: LGPL - 3.0 - or -later
|
||||
Copyright © 2023 Concordia CERC group
|
||||
Project Coder Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
from typing import Union
|
||||
|
||||
from hub.city_model_structure.energy_systems.generic_generation_system import GenericGenerationSystem
|
||||
|
||||
|
||||
class GenerationSystem:
|
||||
"""
|
||||
GenerationSystem class
|
||||
"""
|
||||
def __init__(self):
|
||||
self._heat_power = None
|
||||
self._cooling_power = None
|
||||
self._electricity_power = None
|
||||
self._storage_capacity = None
|
||||
self._generic_generation_system = None
|
||||
self._auxiliary_equipment = None
|
||||
|
||||
@property
|
||||
def generic_generation_system(self) -> GenericGenerationSystem:
|
||||
"""
|
||||
Get associated generic_generation_system
|
||||
:return: GenericGenerationSystem
|
||||
"""
|
||||
return self._generic_generation_system
|
||||
|
||||
@generic_generation_system.setter
|
||||
def generic_generation_system(self, value):
|
||||
"""
|
||||
Set associated generic_generation_system
|
||||
:param value: GenericGenerationSystem
|
||||
"""
|
||||
self._generic_generation_system = value
|
||||
|
||||
@property
|
||||
def heat_power(self):
|
||||
"""
|
||||
Get heat_power in W
|
||||
:return: float
|
||||
"""
|
||||
return self._heat_power
|
||||
|
||||
@heat_power.setter
|
||||
def heat_power(self, value):
|
||||
"""
|
||||
Set heat_power in W
|
||||
:param value: float
|
||||
"""
|
||||
self._heat_power = value
|
||||
|
||||
@property
|
||||
def cooling_power(self):
|
||||
"""
|
||||
Get cooling_power in W
|
||||
:return: float
|
||||
"""
|
||||
return self._cooling_power
|
||||
|
||||
@cooling_power.setter
|
||||
def cooling_power(self, value):
|
||||
"""
|
||||
Set cooling_power in W
|
||||
:param value: float
|
||||
"""
|
||||
self._cooling_power = value
|
||||
|
||||
@property
|
||||
def electricity_power(self):
|
||||
"""
|
||||
Get electricity_power in W
|
||||
:return: float
|
||||
"""
|
||||
return self._electricity_power
|
||||
|
||||
@electricity_power.setter
|
||||
def electricity_power(self, value):
|
||||
"""
|
||||
Set electricity_power in W
|
||||
:param value: float
|
||||
"""
|
||||
self._electricity_power = value
|
||||
|
||||
@property
|
||||
def storage_capacity(self):
|
||||
"""
|
||||
Get storage_capacity in J
|
||||
:return: float
|
||||
"""
|
||||
return self._storage_capacity
|
||||
|
||||
@storage_capacity.setter
|
||||
def storage_capacity(self, value):
|
||||
"""
|
||||
Set storage_capacity in J
|
||||
:param value: float
|
||||
"""
|
||||
self._storage_capacity = value
|
||||
|
||||
@property
|
||||
def auxiliary_equipment(self) -> Union[None, GenerationSystem]:
|
||||
"""
|
||||
Get auxiliary_equipment
|
||||
:return: GenerationSystem
|
||||
"""
|
||||
return self._auxiliary_equipment
|
||||
|
||||
@auxiliary_equipment.setter
|
||||
def auxiliary_equipment(self, value):
|
||||
"""
|
||||
Set auxiliary_equipment
|
||||
:param value: GenerationSystem
|
||||
"""
|
||||
self._auxiliary_equipment = value
|
|
@ -0,0 +1,100 @@
|
|||
"""
|
||||
Generic energy distribution system definition
|
||||
SPDX - License - Identifier: LGPL - 3.0 - or -later
|
||||
Copyright © 2023 Concordia CERC group
|
||||
Project Coder Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
|
||||
"""
|
||||
|
||||
|
||||
class GenericDistributionSystem:
|
||||
"""
|
||||
GenericDistributionSystem class
|
||||
"""
|
||||
def __init__(self):
|
||||
self._type = None
|
||||
self._supply_temperature = None
|
||||
self._distribution_consumption_fix_flow = None
|
||||
self._distribution_consumption_variable_flow = None
|
||||
self._heat_losses = None
|
||||
|
||||
@property
|
||||
def type(self):
|
||||
"""
|
||||
Get type from [air, water, refrigerant]
|
||||
:return: string
|
||||
"""
|
||||
return self._type
|
||||
|
||||
@type.setter
|
||||
def type(self, value):
|
||||
"""
|
||||
Set type from [air, water, refrigerant]
|
||||
:param value: string
|
||||
"""
|
||||
self._type = value
|
||||
|
||||
@property
|
||||
def supply_temperature(self):
|
||||
"""
|
||||
Get supply_temperature in degree Celsius
|
||||
:return: float
|
||||
"""
|
||||
return self._supply_temperature
|
||||
|
||||
@supply_temperature.setter
|
||||
def supply_temperature(self, value):
|
||||
"""
|
||||
Set supply_temperature in degree Celsius
|
||||
:param value: float
|
||||
"""
|
||||
self._supply_temperature = value
|
||||
|
||||
@property
|
||||
def distribution_consumption_fix_flow(self):
|
||||
"""
|
||||
Get distribution_consumption if the pump or fan work at fix mass or volume flow in ratio over peak power (W/W)
|
||||
:return: float
|
||||
"""
|
||||
return self._distribution_consumption_fix_flow
|
||||
|
||||
@distribution_consumption_fix_flow.setter
|
||||
def distribution_consumption_fix_flow(self, value):
|
||||
"""
|
||||
Set distribution_consumption if the pump or fan work at fix mass or volume flow in ratio over peak power (W/W)
|
||||
:return: float
|
||||
"""
|
||||
self._distribution_consumption_fix_flow = value
|
||||
|
||||
@property
|
||||
def distribution_consumption_variable_flow(self):
|
||||
"""
|
||||
Get distribution_consumption if the pump or fan work at variable mass or volume flow in ratio
|
||||
over energy produced (Wh/Wh)
|
||||
:return: float
|
||||
"""
|
||||
return self._distribution_consumption_variable_flow
|
||||
|
||||
@distribution_consumption_variable_flow.setter
|
||||
def distribution_consumption_variable_flow(self, value):
|
||||
"""
|
||||
Set distribution_consumption if the pump or fan work at variable mass or volume flow in ratio
|
||||
over energy produced (Wh/Wh)
|
||||
:return: float
|
||||
"""
|
||||
self._distribution_consumption_variable_flow = value
|
||||
|
||||
@property
|
||||
def heat_losses(self):
|
||||
"""
|
||||
Get heat_losses in ratio over energy produced
|
||||
:return: float
|
||||
"""
|
||||
return self._heat_losses
|
||||
|
||||
@heat_losses.setter
|
||||
def heat_losses(self, value):
|
||||
"""
|
||||
Set heat_losses in ratio over energy produced
|
||||
:param value: float
|
||||
"""
|
||||
self._heat_losses = value
|
|
@ -0,0 +1,30 @@
|
|||
"""
|
||||
Generic energy emission system module
|
||||
SPDX - License - Identifier: LGPL - 3.0 - or -later
|
||||
Copyright © 2023 Concordia CERC group
|
||||
Project Coder Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
|
||||
"""
|
||||
|
||||
|
||||
class GenericEmissionSystem:
|
||||
"""
|
||||
GenericEmissionSystem class
|
||||
"""
|
||||
def __init__(self):
|
||||
self._parasitic_energy_consumption = None
|
||||
|
||||
@property
|
||||
def parasitic_energy_consumption(self):
|
||||
"""
|
||||
Get parasitic_energy_consumption in ratio (W/W)
|
||||
:return: float
|
||||
"""
|
||||
return self._parasitic_energy_consumption
|
||||
|
||||
@parasitic_energy_consumption.setter
|
||||
def parasitic_energy_consumption(self, value):
|
||||
"""
|
||||
Set parasitic_energy_consumption in ratio (W/W)
|
||||
:param value: float
|
||||
"""
|
||||
self._parasitic_energy_consumption = value
|
105
hub/city_model_structure/energy_systems/generic_energy_system.py
Normal file
105
hub/city_model_structure/energy_systems/generic_energy_system.py
Normal file
|
@ -0,0 +1,105 @@
|
|||
"""
|
||||
Generic energy system definition
|
||||
SPDX - License - Identifier: LGPL - 3.0 - or -later
|
||||
Copyright © 2023 Concordia CERC group
|
||||
Project Coder Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
|
||||
"""
|
||||
|
||||
from typing import Union
|
||||
|
||||
from hub.city_model_structure.energy_systems.generic_distribution_system import GenericDistributionSystem
|
||||
from hub.city_model_structure.energy_systems.generic_emission_system import GenericEmissionSystem
|
||||
from hub.city_model_structure.energy_systems.generic_generation_system import GenericGenerationSystem
|
||||
|
||||
|
||||
class GenericEnergySystem:
|
||||
"""
|
||||
GenericEnergySystem class
|
||||
"""
|
||||
def __init__(self):
|
||||
self._name = None
|
||||
self._demand_types = None
|
||||
self._generation_system = None
|
||||
self._distribution_system = None
|
||||
self._emission_system = None
|
||||
self._connected_city_objects = None
|
||||
|
||||
@property
|
||||
def name(self):
|
||||
"""
|
||||
Get energy system name
|
||||
:return: str
|
||||
"""
|
||||
return self._name
|
||||
|
||||
@name.setter
|
||||
def name(self, value):
|
||||
"""
|
||||
Set energy system name
|
||||
:param value:
|
||||
"""
|
||||
self._name = value
|
||||
|
||||
@property
|
||||
def demand_types(self):
|
||||
"""
|
||||
Get demand able to cover from [Heating, Cooling, Domestic Hot Water, Electricity]
|
||||
:return: [string]
|
||||
"""
|
||||
return self._demand_types
|
||||
|
||||
@demand_types.setter
|
||||
def demand_types(self, value):
|
||||
"""
|
||||
Set demand able to cover from [Heating, Cooling, Domestic Hot Water, Electricity]
|
||||
:param value: [string]
|
||||
"""
|
||||
self._demand_types = value
|
||||
|
||||
@property
|
||||
def generation_system(self) -> GenericGenerationSystem:
|
||||
"""
|
||||
Get generation system
|
||||
:return: GenerationSystem
|
||||
"""
|
||||
return self._generation_system
|
||||
|
||||
@generation_system.setter
|
||||
def generation_system(self, value):
|
||||
"""
|
||||
Set generation system
|
||||
:return: GenerationSystem
|
||||
"""
|
||||
self._generation_system = value
|
||||
|
||||
@property
|
||||
def distribution_system(self) -> Union[None, GenericDistributionSystem]:
|
||||
"""
|
||||
Get distribution system
|
||||
:return: DistributionSystem
|
||||
"""
|
||||
return self._distribution_system
|
||||
|
||||
@distribution_system.setter
|
||||
def distribution_system(self, value):
|
||||
"""
|
||||
Set distribution system
|
||||
:param value: DistributionSystem
|
||||
"""
|
||||
self._distribution_system = value
|
||||
|
||||
@property
|
||||
def emission_system(self) -> Union[None, GenericEmissionSystem]:
|
||||
"""
|
||||
Get emission system
|
||||
:return: EmissionSystem
|
||||
"""
|
||||
return self._emission_system
|
||||
|
||||
@emission_system.setter
|
||||
def emission_system(self, value):
|
||||
"""
|
||||
Set emission system
|
||||
:param value: EmissionSystem
|
||||
"""
|
||||
self._emission_system = value
|
|
@ -0,0 +1,186 @@
|
|||
"""
|
||||
Generic energy generation system definition
|
||||
SPDX - License - Identifier: LGPL - 3.0 - or -later
|
||||
Copyright © 2023 Concordia CERC group
|
||||
Project Coder Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
from typing import Union
|
||||
|
||||
|
||||
class GenericGenerationSystem:
|
||||
"""
|
||||
GenericGenerationSystem class
|
||||
"""
|
||||
def __init__(self):
|
||||
self._type = None
|
||||
self._fuel_type = None
|
||||
self._source_types = None
|
||||
self._heat_efficiency = None
|
||||
self._cooling_efficiency = None
|
||||
self._electricity_efficiency = None
|
||||
self._source_temperature = None
|
||||
self._source_mass_flow = None
|
||||
self._storage = None
|
||||
self._auxiliary_equipment = None
|
||||
|
||||
@property
|
||||
def type(self):
|
||||
"""
|
||||
Get system type
|
||||
:return: string
|
||||
"""
|
||||
return self._type
|
||||
|
||||
@type.setter
|
||||
def type(self, value):
|
||||
"""
|
||||
Set system type
|
||||
:param value: string
|
||||
"""
|
||||
self._type = value
|
||||
|
||||
@property
|
||||
def fuel_type(self):
|
||||
"""
|
||||
Get fuel_type from [Renewable, Gas, Diesel, Electricity, Wood, Coal]
|
||||
:return: string
|
||||
"""
|
||||
return self._fuel_type
|
||||
|
||||
@fuel_type.setter
|
||||
def fuel_type(self, value):
|
||||
"""
|
||||
Set fuel_type from [Renewable, Gas, Diesel, Electricity, Wood, Coal]
|
||||
:param value: string
|
||||
"""
|
||||
self._fuel_type = value
|
||||
|
||||
@property
|
||||
def source_types(self):
|
||||
"""
|
||||
Get source_type from [Air, Water, Geothermal, District Heating, Grid, Onsite Electricity]
|
||||
:return: [string]
|
||||
"""
|
||||
return self._source_types
|
||||
|
||||
@source_types.setter
|
||||
def source_types(self, value):
|
||||
"""
|
||||
Set source_type from [Air, Water, Geothermal, District Heating, Grid, Onsite Electricity]
|
||||
:param value: [string]
|
||||
"""
|
||||
self._source_types = value
|
||||
|
||||
@property
|
||||
def heat_efficiency(self):
|
||||
"""
|
||||
Get heat_efficiency
|
||||
:return: float
|
||||
"""
|
||||
return self._heat_efficiency
|
||||
|
||||
@heat_efficiency.setter
|
||||
def heat_efficiency(self, value):
|
||||
"""
|
||||
Set heat_efficiency
|
||||
:param value: float
|
||||
"""
|
||||
self._heat_efficiency = value
|
||||
|
||||
@property
|
||||
def cooling_efficiency(self):
|
||||
"""
|
||||
Get cooling_efficiency
|
||||
:return: float
|
||||
"""
|
||||
return self._cooling_efficiency
|
||||
|
||||
@cooling_efficiency.setter
|
||||
def cooling_efficiency(self, value):
|
||||
"""
|
||||
Set cooling_efficiency
|
||||
:param value: float
|
||||
"""
|
||||
self._cooling_efficiency = value
|
||||
|
||||
@property
|
||||
def electricity_efficiency(self):
|
||||
"""
|
||||
Get electricity_efficiency
|
||||
:return: float
|
||||
"""
|
||||
return self._electricity_efficiency
|
||||
|
||||
@electricity_efficiency.setter
|
||||
def electricity_efficiency(self, value):
|
||||
"""
|
||||
Set electricity_efficiency
|
||||
:param value: float
|
||||
"""
|
||||
self._electricity_efficiency = value
|
||||
|
||||
@property
|
||||
def source_temperature(self):
|
||||
"""
|
||||
Get source_temperature in degree Celsius
|
||||
:return: float
|
||||
"""
|
||||
return self._source_temperature
|
||||
|
||||
@source_temperature.setter
|
||||
def source_temperature(self, value):
|
||||
"""
|
||||
Set source_temperature in degree Celsius
|
||||
:param value: float
|
||||
"""
|
||||
self._source_temperature = value
|
||||
|
||||
@property
|
||||
def source_mass_flow(self):
|
||||
"""
|
||||
Get source_mass_flow in kg/s
|
||||
:return: float
|
||||
"""
|
||||
return self._source_mass_flow
|
||||
|
||||
@source_mass_flow.setter
|
||||
def source_mass_flow(self, value):
|
||||
"""
|
||||
Set source_mass_flow in kg/s
|
||||
:param value: float
|
||||
"""
|
||||
self._source_mass_flow = value
|
||||
|
||||
@property
|
||||
def storage(self):
|
||||
"""
|
||||
Get boolean storage exists
|
||||
:return: bool
|
||||
"""
|
||||
return self._storage
|
||||
|
||||
@storage.setter
|
||||
def storage(self, value):
|
||||
"""
|
||||
Set boolean storage exists
|
||||
:return: bool
|
||||
"""
|
||||
self._storage = value
|
||||
|
||||
@property
|
||||
def auxiliary_equipment(self) -> Union[None, GenericGenerationSystem]:
|
||||
"""
|
||||
Get auxiliary_equipment
|
||||
:return: GenerationSystem
|
||||
"""
|
||||
return self._auxiliary_equipment
|
||||
|
||||
@auxiliary_equipment.setter
|
||||
def auxiliary_equipment(self, value):
|
||||
"""
|
||||
Set auxiliary_equipment
|
||||
:return: GenerationSystem
|
||||
"""
|
||||
self._auxiliary_equipment = value
|
|
@ -46,7 +46,7 @@ class HeatPump:
|
|||
|
||||
@hp_monthly_fossil_consumption.setter
|
||||
def hp_monthly_fossil_consumption(self, value):
|
||||
if type(value) is Series:
|
||||
if isinstance(value, Series):
|
||||
self._hp_monthly_fossil_consumption = value
|
||||
|
||||
@property
|
||||
|
@ -60,5 +60,5 @@ class HeatPump:
|
|||
|
||||
@hp_monthly_electricity_demand.setter
|
||||
def hp_monthly_electricity_demand(self, value):
|
||||
if type(value) == Series:
|
||||
if isinstance(value, Series):
|
||||
self._hp_monthly_electricity_demand = value
|
||||
|
|
|
@ -30,4 +30,3 @@ class HvacTerminalUnit:
|
|||
"""
|
||||
if value is not None:
|
||||
self._type = str(value)
|
||||
|
||||
|
|
|
@ -1,45 +0,0 @@
|
|||
"""
|
||||
ConstructionFactory (before PhysicsFactory) retrieve the specific construction module for the given region
|
||||
SPDX - License - Identifier: LGPL - 3.0 - or -later
|
||||
Copyright © 2022 Concordia CERC group
|
||||
Project Coder Atiya atiya.atiya@mail.concordia.ca
|
||||
"""
|
||||
|
||||
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) -> int:
|
||||
"""
|
||||
Get fuel id
|
||||
:return: int
|
||||
"""
|
||||
return self._fuel_id
|
||||
|
||||
@property
|
||||
def name(self) -> str:
|
||||
"""
|
||||
Get fuel name
|
||||
:return: str
|
||||
"""
|
||||
return self._name
|
||||
|
||||
@property
|
||||
def carbon_emission_factor(self) -> float:
|
||||
"""
|
||||
Get fuel carbon emission factor
|
||||
:return: float
|
||||
"""
|
||||
return self._carbon_emission_factor
|
||||
|
||||
@property
|
||||
def unit(self) -> str:
|
||||
"""
|
||||
Get fuel units
|
||||
:return: str
|
||||
"""
|
||||
return self._unit
|
0
hub/city_model_structure/greenery/__init__.py
Normal file
0
hub/city_model_structure/greenery/__init__.py
Normal file
|
@ -1,5 +1,5 @@
|
|||
"""
|
||||
Plant class
|
||||
Plant module
|
||||
SPDX - License - Identifier: LGPL - 3.0 - or -later
|
||||
Copyright © 2022 Concordia CERC group
|
||||
Project Coder Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
|
||||
|
@ -10,6 +10,9 @@ from hub.city_model_structure.greenery.soil import Soil
|
|||
|
||||
|
||||
class Plant:
|
||||
"""
|
||||
Plant class
|
||||
"""
|
||||
def __init__(self, name, height, leaf_area_index, leaf_reflectivity, leaf_emissivity, minimal_stomatal_resistance,
|
||||
co2_sequestration, grows_on_soils):
|
||||
self._name = name
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
"""
|
||||
Soil class
|
||||
Soil module
|
||||
SPDX - License - Identifier: LGPL - 3.0 - or -later
|
||||
Copyright © 2022 Concordia CERC group
|
||||
Project Coder Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
|
||||
|
@ -7,6 +7,9 @@ Project Coder Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
|
|||
|
||||
|
||||
class Soil:
|
||||
"""
|
||||
Soil class
|
||||
"""
|
||||
def __init__(self, name, roughness, dry_conductivity, dry_density, dry_specific_heat, thermal_absorptance,
|
||||
solar_absorptance, visible_absorptance, saturation_volumetric_moisture_content,
|
||||
residual_volumetric_moisture_content):
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
"""
|
||||
Vegetation class
|
||||
Vegetation module
|
||||
SPDX - License - Identifier: LGPL - 3.0 - or -later
|
||||
Copyright © 2022 Concordia CERC group
|
||||
Project Coder Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
|
||||
|
@ -11,6 +11,9 @@ from hub.city_model_structure.greenery.plant import Plant
|
|||
|
||||
|
||||
class Vegetation:
|
||||
"""
|
||||
Vegetation class
|
||||
"""
|
||||
def __init__(self, name, soil, soil_thickness, plants):
|
||||
self._name = name
|
||||
self._management = None
|
||||
|
|
0
hub/city_model_structure/iot/__init__.py
Normal file
0
hub/city_model_structure/iot/__init__.py
Normal file
|
@ -7,6 +7,9 @@ Project Coder Guille Gutierrez guillermo.gutierrezmorote@concordia.ca
|
|||
|
||||
|
||||
class SensorMeasure:
|
||||
"""
|
||||
Sensor measure class
|
||||
"""
|
||||
def __init__(self, latitude, longitude, utc_timestamp, value):
|
||||
self._latitude = latitude
|
||||
self._longitude = longitude
|
||||
|
|
|
@ -9,6 +9,9 @@ from enum import Enum
|
|||
|
||||
|
||||
class SensorType(Enum):
|
||||
"""
|
||||
Sensor type enumeration
|
||||
"""
|
||||
HUMIDITY = 0
|
||||
TEMPERATURE = 1
|
||||
CO2 = 2
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
"""
|
||||
Station
|
||||
Station module
|
||||
SPDX - License - Identifier: LGPL - 3.0 - or -later
|
||||
Copyright © 2022 Concordia CERC group
|
||||
Project Coder Guille Gutierrez guillermo.gutierrezmorote@concordia.ca
|
||||
|
@ -10,6 +10,9 @@ from hub.city_model_structure.iot.sensor import Sensor
|
|||
|
||||
|
||||
class Station:
|
||||
"""
|
||||
Station class
|
||||
"""
|
||||
def __init__(self, station_id=None, _mobile=False):
|
||||
self._id = station_id
|
||||
self._mobile = _mobile
|
||||
|
@ -19,7 +22,7 @@ class Station:
|
|||
def id(self):
|
||||
"""
|
||||
Get the station id a random uuid will be assigned if no ID was provided to the constructor
|
||||
:return: Id
|
||||
:return: ID
|
||||
"""
|
||||
if self._id is None:
|
||||
self._id = uuid.uuid4()
|
||||
|
|
|
@ -1,242 +0,0 @@
|
|||
"""
|
||||
LCA Material module
|
||||
SPDX - License - Identifier: LGPL - 3.0 - or -later
|
||||
Copyright © 2022 Concordia CERC group
|
||||
Project Coder atiya.atiya@mail.concordia.ca
|
||||
"""
|
||||
|
||||
from typing import Union
|
||||
|
||||
class LcaMaterial:
|
||||
def __init__(self):
|
||||
self._id = None
|
||||
self._type = None
|
||||
self._name = None
|
||||
self._density = None
|
||||
self._density_unit = None
|
||||
self._embodied_carbon = None
|
||||
self._embodied_carbon_unit = None
|
||||
self._recycling_ratio = None
|
||||
self._company_recycling_ratio = None
|
||||
self._onsite_recycling_ratio = None
|
||||
self._landfilling_ratio = None
|
||||
self._cost = None
|
||||
self._cost_unit = None
|
||||
|
||||
@property
|
||||
def id(self):
|
||||
"""
|
||||
Get material id
|
||||
:return: int
|
||||
"""
|
||||
return self._id
|
||||
|
||||
@id.setter
|
||||
def id(self, value):
|
||||
"""
|
||||
Set material id
|
||||
:param value: int
|
||||
"""
|
||||
self._id = int(value)
|
||||
|
||||
@property
|
||||
def type(self):
|
||||
"""
|
||||
Get material type
|
||||
:return: str
|
||||
"""
|
||||
return self._type
|
||||
|
||||
@type.setter
|
||||
def type(self, value):
|
||||
"""
|
||||
Set material type
|
||||
:param value: string
|
||||
"""
|
||||
self._type = str(value)
|
||||
|
||||
@property
|
||||
def name(self):
|
||||
"""
|
||||
Get material name
|
||||
:return: str
|
||||
"""
|
||||
return self._name
|
||||
|
||||
@name.setter
|
||||
def name(self, value):
|
||||
"""
|
||||
Set material name
|
||||
:param value: string
|
||||
"""
|
||||
self._name = str(value)
|
||||
|
||||
@property
|
||||
def density(self) -> Union[None, float]:
|
||||
"""
|
||||
Get material density in kg/m3
|
||||
:return: None or float
|
||||
"""
|
||||
return self._density
|
||||
|
||||
@density.setter
|
||||
def density(self, value):
|
||||
"""
|
||||
Set material density
|
||||
:param value: float
|
||||
"""
|
||||
if value is not None:
|
||||
self._density = float(value)
|
||||
|
||||
@property
|
||||
def density_unit(self) -> Union[None, str]:
|
||||
"""
|
||||
Get material density unit
|
||||
:return: None or string
|
||||
"""
|
||||
return self._density_unit
|
||||
|
||||
@density_unit.setter
|
||||
def density_unit(self, value):
|
||||
"""
|
||||
Set material density unit
|
||||
:param value: string
|
||||
"""
|
||||
if value is not None:
|
||||
self._density_unit = str(value)
|
||||
|
||||
@property
|
||||
def embodied_carbon(self) -> Union[None, float]:
|
||||
"""
|
||||
Get material embodied carbon
|
||||
:return: None or float
|
||||
"""
|
||||
return self._embodied_carbon
|
||||
|
||||
@embodied_carbon.setter
|
||||
def embodied_carbon(self, value):
|
||||
"""
|
||||
Set material embodied carbon
|
||||
:param value: float
|
||||
"""
|
||||
if value is not None:
|
||||
self._embodied_carbon = float(value)
|
||||
|
||||
@property
|
||||
def embodied_carbon_unit(self) -> Union[None, str]:
|
||||
"""
|
||||
Get material embodied carbon unit
|
||||
:return: None or string
|
||||
"""
|
||||
return self._embodied_carbon
|
||||
|
||||
@embodied_carbon_unit.setter
|
||||
def embodied_carbon_unit(self, value):
|
||||
"""
|
||||
Set material embodied carbon unit
|
||||
:param value: string
|
||||
"""
|
||||
if value is not None:
|
||||
self._embodied_carbon_unit = str(value)
|
||||
|
||||
@property
|
||||
def recycling_ratio(self) -> Union[None, float]:
|
||||
"""
|
||||
Get material recycling ratio
|
||||
:return: None or float
|
||||
"""
|
||||
return self._recycling_ratio
|
||||
|
||||
@recycling_ratio.setter
|
||||
def recycling_ratio(self, value):
|
||||
"""
|
||||
Set material recycling ratio
|
||||
:param value: float
|
||||
"""
|
||||
if value is not None:
|
||||
self._recycling_ratio = float(value)
|
||||
|
||||
@property
|
||||
def onsite_recycling_ratio(self) -> Union[None, float]:
|
||||
"""
|
||||
Get material onsite recycling ratio
|
||||
:return: None or float
|
||||
"""
|
||||
return self._onsite_recycling_ratio
|
||||
|
||||
@onsite_recycling_ratio.setter
|
||||
def onsite_recycling_ratio(self, value):
|
||||
"""
|
||||
Set material onsite recycling ratio
|
||||
:param value: float
|
||||
"""
|
||||
if value is not None:
|
||||
self._onsite_recycling_ratio = float(value)
|
||||
|
||||
@property
|
||||
def company_recycling_ratio(self) -> Union[None, float]:
|
||||
"""
|
||||
Get material company recycling ratio
|
||||
:return: None or float
|
||||
"""
|
||||
return self._company_recycling_ratio
|
||||
|
||||
@company_recycling_ratio.setter
|
||||
def company_recycling_ratio(self, value):
|
||||
"""
|
||||
Set material company recycling ratio
|
||||
:param value: float
|
||||
"""
|
||||
if value is not None:
|
||||
self._company_recycling_ratio = float(value)
|
||||
|
||||
@property
|
||||
def landfilling_ratio(self) -> Union[None, float]:
|
||||
"""
|
||||
Get material landfilling ratio
|
||||
:return: None or float
|
||||
"""
|
||||
return self._landfilling_ratio
|
||||
|
||||
@landfilling_ratio.setter
|
||||
def landfilling_ratio(self, value):
|
||||
"""
|
||||
Set material landfilling ratio
|
||||
:param value: float
|
||||
"""
|
||||
if value is not None:
|
||||
self._landfilling_ratio = float(value)
|
||||
|
||||
@property
|
||||
def cost(self) -> Union[None, float]:
|
||||
"""
|
||||
Get material cost
|
||||
:return: None or float
|
||||
"""
|
||||
return self._cost
|
||||
|
||||
@cost.setter
|
||||
def cost(self, value):
|
||||
"""
|
||||
Set material cost
|
||||
:param value: float
|
||||
"""
|
||||
if value is not None:
|
||||
self._cost = float(value)
|
||||
|
||||
@property
|
||||
def cost_unit(self) -> Union[None, str]:
|
||||
"""
|
||||
Get material cost unit
|
||||
:return: None or string
|
||||
"""
|
||||
return self._cost_unit
|
||||
|
||||
@cost_unit.setter
|
||||
def cost_unit(self, value):
|
||||
"""
|
||||
Set material cost unit
|
||||
:param value: string
|
||||
"""
|
||||
if value is not None:
|
||||
self._cost_unit = float(value)
|
|
@ -16,6 +16,7 @@ class LevelOfDetail:
|
|||
self._usage = None
|
||||
self._weather = None
|
||||
self._surface_radiation = None
|
||||
self._energy_systems = None
|
||||
|
||||
@property
|
||||
def geometry(self):
|
||||
|
@ -75,7 +76,7 @@ class LevelOfDetail:
|
|||
"""
|
||||
Set the city minimal weather level of detail, 0 (yearly), 1 (monthly), 2 (hourly)
|
||||
"""
|
||||
self._usage = value
|
||||
self._weather = value
|
||||
|
||||
@property
|
||||
def surface_radiation(self):
|
||||
|
@ -91,3 +92,18 @@ class LevelOfDetail:
|
|||
Set the city minimal surface radiation level of detail, 0 (yearly), 1 (monthly), 2 (hourly)
|
||||
"""
|
||||
self._surface_radiation = value
|
||||
|
||||
@property
|
||||
def energy_systems(self):
|
||||
"""
|
||||
Get the city minimal energy systems level of detail, 1 or 2
|
||||
:return: int
|
||||
"""
|
||||
return self._energy_systems
|
||||
|
||||
@energy_systems.setter
|
||||
def energy_systems(self, value):
|
||||
"""
|
||||
Set the city minimal energy systems level of detail, 1 or 2
|
||||
"""
|
||||
self._energy_systems = value
|
||||
|
|
|
@ -1,87 +0,0 @@
|
|||
"""
|
||||
LifeCycleAssessment retrieve the specific Life Cycle Assessment module for the given region
|
||||
SPDX - License - Identifier: LGPL - 3.0 - or -later
|
||||
Copyright © 2022 Concordia CERC group
|
||||
Project Coder Atiya atiya.atiya@mail.concordia.ca
|
||||
"""
|
||||
|
||||
|
||||
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) -> int:
|
||||
"""
|
||||
Get machine id
|
||||
:return: int
|
||||
"""
|
||||
return self._machine_id
|
||||
|
||||
@property
|
||||
def name(self) -> str:
|
||||
"""
|
||||
Get machine name
|
||||
:return: str
|
||||
"""
|
||||
return self._name
|
||||
|
||||
@property
|
||||
def work_efficiency(self) -> float:
|
||||
"""
|
||||
Get machine work efficiency
|
||||
:return: float
|
||||
"""
|
||||
return self._work_efficiency
|
||||
|
||||
@property
|
||||
def work_efficiency_unit(self) -> str:
|
||||
"""
|
||||
Get machine work efficiency unit
|
||||
:return: str
|
||||
"""
|
||||
return self._work_efficiency_unit
|
||||
|
||||
@property
|
||||
def energy_consumption_rate(self) -> float:
|
||||
"""
|
||||
Get energy consumption rate
|
||||
:return: float
|
||||
"""
|
||||
return self._energy_consumption_rate
|
||||
|
||||
@property
|
||||
def energy_consumption_unit(self) -> str:
|
||||
"""
|
||||
Get energy consumption unit
|
||||
:return: str
|
||||
"""
|
||||
return self._energy_consumption_unit
|
||||
|
||||
@property
|
||||
def carbon_emission_factor(self) -> float:
|
||||
"""
|
||||
Get carbon emission factor
|
||||
:return: float
|
||||
"""
|
||||
return self._carbon_emission_factor
|
||||
|
||||
@property
|
||||
def carbon_emission_unit(self) -> str:
|
||||
"""
|
||||
Get carbon emission unit
|
||||
:return: str
|
||||
"""
|
||||
return self._carbon_emission_unit
|
0
hub/city_model_structure/transport/__init__.py
Normal file
0
hub/city_model_structure/transport/__init__.py
Normal file
|
@ -1,68 +0,0 @@
|
|||
"""
|
||||
LifeCycleAssessment retrieve the specific Life Cycle Assessment module for the given region
|
||||
SPDX - License - Identifier: LGPL - 3.0 - or -later
|
||||
Copyright © 2022 Concordia CERC group
|
||||
Project Coder Atiya atiya.atiya@mail.concordia.ca
|
||||
"""
|
||||
|
||||
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) -> int:
|
||||
"""
|
||||
Get vehicle id
|
||||
:return: int
|
||||
"""
|
||||
return self._vehicle_id
|
||||
|
||||
@property
|
||||
def name(self) -> str:
|
||||
"""
|
||||
Get vehicle name
|
||||
:return: str
|
||||
"""
|
||||
return self._name
|
||||
|
||||
@property
|
||||
def fuel_consumption_rate(self) -> float:
|
||||
"""
|
||||
Get vehicle fuel consumption rate
|
||||
:return: float
|
||||
"""
|
||||
return self._fuel_consumption_rate
|
||||
|
||||
@property
|
||||
def fuel_consumption_unit(self) -> str:
|
||||
"""
|
||||
Get fuel consumption unit
|
||||
:return: str
|
||||
"""
|
||||
return self._fuel_consumption_unit
|
||||
|
||||
@property
|
||||
def carbon_emission_factor(self) -> float:
|
||||
"""
|
||||
Get vehicle carbon emission factor
|
||||
:return: float
|
||||
"""
|
||||
return self._carbon_emission_factor
|
||||
|
||||
@property
|
||||
def carbon_emission_factor_unit(self) -> str:
|
||||
"""
|
||||
Get carbon emission units
|
||||
:return: str
|
||||
"""
|
||||
return self._carbon_emission_factor_unit
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -1,166 +0,0 @@
|
|||
<archetypes>
|
||||
<archetype function="residential" municipality="montreal" currency="CAD">
|
||||
<capital_cost>
|
||||
<ASubstructure>
|
||||
<A10sub_structural cost_unit="currency/m2"> 15.89 </A10sub_structural>
|
||||
<A20structural cost_unit="currency/m3"> 215.90 </A20structural>
|
||||
</ASubstructure>
|
||||
<BShell>
|
||||
<B10superstructure>
|
||||
<reposition cost_unit="currency/m2"> 0 </reposition>
|
||||
<initial_investment cost_unit="currency/m2"> 0 </initial_investment>
|
||||
<lifetime_equipment lifetime="years"> 50 </lifetime_equipment>
|
||||
</B10superstructure>
|
||||
<B20envelope>
|
||||
<B2010opaquewalls>
|
||||
<reposition cost_unit="currency/m2"> 304 </reposition>
|
||||
<initial_investment cost_unit="currency/m2"> 304 </initial_investment>
|
||||
<lifetime_equipment lifetime="years"> 50 </lifetime_equipment>
|
||||
</B2010opaquewalls>
|
||||
<B2020transparent>
|
||||
<reposition cost_unit="currency/m2"> 857.14 </reposition>
|
||||
<initial_investment cost_unit="currency/m2"> 857.14 </initial_investment>
|
||||
<lifetime_equipment lifetime="years"> 20 </lifetime_equipment>
|
||||
</B2020transparent>
|
||||
</B20envelope>
|
||||
<B30roofing>
|
||||
<B3010opaqueroof>
|
||||
<reposition cost_unit="currency/m2"> 118 </reposition>
|
||||
<initial_investment cost_unit="currency/m2"> 118 </initial_investment>
|
||||
<lifetime_equipment lifetime="years"> 50 </lifetime_equipment>
|
||||
</B3010opaqueroof>
|
||||
<B3020transparentroof>
|
||||
<reposition cost_unit="currency/m2"> 857.14 </reposition>
|
||||
<initial_investment cost_unit="currency/m2"> 857.14 </initial_investment>
|
||||
<lifetime_equipment lifetime="years"> 20 </lifetime_equipment>
|
||||
</B3020transparentroof>
|
||||
</B30roofing>
|
||||
</BShell>
|
||||
<CInteriors>
|
||||
<C10Interiorconstruction>
|
||||
<reposition cost_unit="currency/m2"> 0 </reposition>
|
||||
<initial_investment cost_unit="currency/m2"> 0 </initial_investment>
|
||||
<lifetime_equipment lifetime="years"> 50 </lifetime_equipment>
|
||||
</C10Interiorconstruction>
|
||||
<C20Stairs>
|
||||
<reposition cost_unit="currency/m2"> 0 </reposition>
|
||||
<initial_investment cost_unit="currency/m2"> 0 </initial_investment>
|
||||
<lifetime_equipment lifetime="years"> 50 </lifetime_equipment>
|
||||
</C20Stairs>
|
||||
<C30Interiorfinishes>
|
||||
<C3010Walls>
|
||||
<reposition cost_unit="currency/m2"> 50 </reposition>
|
||||
<initial_investment cost_unit="currency/m2"> 50 </initial_investment>
|
||||
<lifetime_equipment lifetime="years"> 20 </lifetime_equipment>
|
||||
</C3010Walls>
|
||||
<C3020Floors>
|
||||
<reposition cost_unit="currency/m2"> 62 </reposition>
|
||||
<initial_investment cost_unit="currency/m2"> 62 </initial_investment>
|
||||
<lifetime_equipment lifetime="years"> 20 </lifetime_equipment>
|
||||
</C3020Floors>
|
||||
<C3030Ceilings>
|
||||
<reposition cost_unit="currency/m2"> 70 </reposition>
|
||||
<initial_investment cost_unit="currency/m2"> 70 </initial_investment>
|
||||
<lifetime_equipment lifetime="years"> 20 </lifetime_equipment>
|
||||
</C3030Ceilings>
|
||||
</C30Interiorfinishes>
|
||||
</CInteriors>
|
||||
<DServices>
|
||||
<D10Conveying cost_unit="currency/m2"> 0 </D10Conveying>
|
||||
<D20Plumbing cost_unit="currency/m2"> 100 </D20Plumbing>
|
||||
<D30HVAC>
|
||||
<D3010EnergySupply>
|
||||
<D301010photovoltaic_system>
|
||||
<initial_investment cost_unit="currency/m2"> 800 </initial_investment>
|
||||
<reposition cost_unit="currency/m2"> 800 </reposition>
|
||||
<lifetime_equipment lifetime="years"> 25 </lifetime_equipment>
|
||||
</D301010photovoltaic_system>
|
||||
</D3010EnergySupply>
|
||||
<D3020Heatgeneratingsystems>
|
||||
<initial_investment cost_unit="currency/kW"> 622.86 </initial_investment>
|
||||
<reposition cost_unit="currency/kW"> 622.86 </reposition>
|
||||
<lifetime_equipment lifetime="years"> 25 </lifetime_equipment>
|
||||
</D3020Heatgeneratingsystems>
|
||||
<D3030Coolinggenerationsystems>
|
||||
<initial_investment cost_unit="currency/kW"> 622.86 </initial_investment>
|
||||
<reposition cost_unit="currency/kW"> 622.86 </reposition>
|
||||
<lifetime_equipment lifetime="years"> 15 </lifetime_equipment>
|
||||
</D3030Coolinggenerationsystems>
|
||||
<D3040Distributionsystems>
|
||||
<initial_investment cost_unit="currency/kW"> 0 </initial_investment>
|
||||
<reposition cost_unit="currency/kW"> 0 </reposition>
|
||||
<lifetime_equipment lifetime="years"> 15 </lifetime_equipment>
|
||||
</D3040Distributionsystems>
|
||||
<D3060Controlsandinstrumentation>
|
||||
<initial_investment cost_unit="currency/kW"> 0 </initial_investment>
|
||||
<reposition cost_unit="currency/kW"> 0 </reposition>
|
||||
<lifetime_equipment lifetime="years"> 15 </lifetime_equipment>
|
||||
</D3060Controlsandinstrumentation>
|
||||
<D3080OtherHVAC_AHU>
|
||||
<initial_investment cost_unit="currency/kW"> 47.62 </initial_investment>
|
||||
<reposition cost_unit="currency/kW"> 47.62 </reposition>
|
||||
<lifetime_equipment lifetime="years"> 15 </lifetime_equipment>
|
||||
</D3080OtherHVAC_AHU>
|
||||
</D30HVAC>
|
||||
<D50Electrical>
|
||||
<D5010Electricalservicesanddistribution>
|
||||
<initial_investment cost_unit="currency/m2"> 171.43 </initial_investment>
|
||||
<reposition cost_unit="currency/m2"> 171.43 </reposition>
|
||||
<lifetime_equipment lifetime="years"> 20 </lifetime_equipment>
|
||||
</D5010Electricalservicesanddistribution>
|
||||
<D5020Lightingandbranchwiring>
|
||||
<initial_investment cost_unit="currency/kW"> 139 </initial_investment>
|
||||
<reposition cost_unit="currency/kW"> 139 </reposition>
|
||||
<lifetime_equipment lifetime="years"> 20 </lifetime_equipment>
|
||||
</D5020Lightingandbranchwiring>
|
||||
</D50Electrical>
|
||||
</DServices>
|
||||
<EEquimentsandfurnishing>
|
||||
<E10Equipments>
|
||||
<initial_investment cost_unit="currency/m2"> 0 </initial_investment>
|
||||
<reposition cost_unit="currency/m2"> 0 </reposition>
|
||||
<lifetime_equipment lifetime="years"> 15 </lifetime_equipment>
|
||||
</E10Equipments>
|
||||
<E10Furnishing>
|
||||
<initial_investment cost_unit="currency/m2"> 0 </initial_investment>
|
||||
<reposition cost_unit="currency/m2"> 0 </reposition>
|
||||
<lifetime_equipment lifetime="years"> 15 </lifetime_equipment>
|
||||
</E10Furnishing>
|
||||
</EEquimentsandfurnishing>
|
||||
<engineer cost_unit="%"> 2.5 </engineer>
|
||||
</capital_cost>
|
||||
<operational_cost>
|
||||
<fuel fuel_type="electricity">
|
||||
<fixed>
|
||||
<fixed_monthly cost_unit="currency/month"> 0 </fixed_monthly>
|
||||
<fixed_power cost_unit="currency/kW"> 0 </fixed_power>
|
||||
</fixed>
|
||||
<variable cost_unit="currency/kWh"> 5.6 </variable>
|
||||
</fuel>
|
||||
<maintenance>
|
||||
<heating_equipment cost_unit="currency/kW"> 40 </heating_equipment>
|
||||
<cooling_equipment cost_unit="currency/kW"> 40 </cooling_equipment>
|
||||
<general_hvac_equipment cost_unit="currency/(m3/h)"> 0.05 </general_hvac_equipment>
|
||||
<photovoltaic_system cost_unit="currency/m2"> 1 </photovoltaic_system>
|
||||
<other_systems cost_unit="currency/m2"> 4.6 </other_systems>
|
||||
</maintenance>
|
||||
<CO2_cost cost_unit="currency/kgCO2"> 30 </CO2_cost>
|
||||
</operational_cost>
|
||||
<end_of_life_cost cost_unit="currency/m2"> 6.3 </end_of_life_cost>
|
||||
<incomes>
|
||||
<subsidies>
|
||||
<construction_subsidy cost_unit="%"> 2 </construction_subsidy>
|
||||
<hvac_subsidy cost_unit="%"> 1.5 </hvac_subsidy>
|
||||
<photovoltaic_subsidy cost_unit="%"> 3.6 </photovoltaic_subsidy>
|
||||
</subsidies>
|
||||
<energy_exports>
|
||||
<electricity cost_unit="currency/kWh"> hourlydatatable </electricity>
|
||||
<heat cost_unit="currency/kWh"> 0 </heat>
|
||||
</energy_exports>
|
||||
<tax_reductions>
|
||||
<reductions_taxes cost_unit="%"> 2 </reductions_taxes>
|
||||
</tax_reductions>
|
||||
<CO2_income cost_unit="currency/kgCO2exported"> 0 </CO2_income>
|
||||
</incomes>
|
||||
</archetype>
|
||||
</archetypes>
|
|
@ -1,212 +0,0 @@
|
|||
<archetypes>
|
||||
<archetype function="residential" municipality="montreal" currency="CAD">
|
||||
<capital_cost>
|
||||
<B_Shell>
|
||||
<B10_superstructure>
|
||||
<refurbishment_cost_basement cost_unit="currency/m2"> 0 </refurbishment_cost_basement>
|
||||
</B10_superstructure>
|
||||
<B20_envelope>
|
||||
<B2010_opaquewalls>
|
||||
<refurbishment_cost cost_unit="currency/m2"> 304 </refurbishment_cost>
|
||||
</B2010_opaquewalls>
|
||||
<B2020_transparent>
|
||||
<refurbishment_cost cost_unit="currency/m2"> 857.14 </refurbishment_cost>
|
||||
</B2020_transparent>
|
||||
</B20_envelope>
|
||||
<B30_roofing>
|
||||
<B3010_opaqueroof>
|
||||
<refurbishment_cost cost_unit="currency/m2"> 118 </refurbishment_cost>
|
||||
</B3010_opaqueroof>
|
||||
</B30_roofing>
|
||||
</B_Shell>
|
||||
<D_Services>
|
||||
<D30_HVAC>
|
||||
<D3010_EnergySupply>
|
||||
<D301010_Photovoltaic_system>
|
||||
<initial_investment cost_unit="currency/m2"> 800 </initial_investment>
|
||||
<reposition cost_unit="currency/m2"> 800 </reposition>
|
||||
<lifetime_equipment lifetime="years"> 25 </lifetime_equipment>
|
||||
</D301010_Photovoltaic_system>
|
||||
</D3010_EnergySupply>
|
||||
<D3020_Heat_generating_systems>
|
||||
<investment_cost cost_unit="currency/kW"> 622.86 </investment_cost>
|
||||
<reposition cost_unit="currency/kW"> 622.86 </reposition>
|
||||
<lifetime_equipment lifetime="years"> 25 </lifetime_equipment>
|
||||
</D3020_Heat_generating_systems>
|
||||
<D3030_Cooling_generation_systems>
|
||||
<investment_cost cost_unit="currency/kW"> 622.86 </investment_cost>
|
||||
<reposition cost_unit="currency/kW"> 622.86 </reposition>
|
||||
<lifetime_equipment lifetime="years"> 15 </lifetime_equipment>
|
||||
</D3030_Cooling_generation_systems>
|
||||
<D3040_Distributionsystems>
|
||||
<investment_cost cost_unit="currency/kW"> 0 </investment_cost>
|
||||
<reposition cost_unit="currency/kW"> 0 </reposition>
|
||||
<lifetime_equipment lifetime="years"> 15 </lifetime_equipment>
|
||||
</D3040_Distributionsystems>
|
||||
<D3080_OtherHVAC_AHU>
|
||||
<investment_cost cost_unit="currency/kW"> 47.62 </investment_cost>
|
||||
<reposition cost_unit="currency/kW"> 47.62 </reposition>
|
||||
<lifetime_equipment lifetime="years"> 15 </lifetime_equipment>
|
||||
</D3080_OtherHVAC_AHU>
|
||||
</D30_HVAC>
|
||||
<D50_Electrical>
|
||||
<D5020Lightingandbranchwiring>
|
||||
<refurbishmentcost cost_unit="currency/kW"> 139 </refurbishmentcost>
|
||||
<reposition cost_unit="currency/kW"> 139 </reposition>
|
||||
<lifetime_equipment lifetime="years"> 20 </lifetime_equipment>
|
||||
</D5020Lightingandbranchwiring>
|
||||
</D50_Electrical>
|
||||
</D_Services>
|
||||
<Z_Allowances_overhead_profit>
|
||||
<Z10_Design_allowance cost_unit="%"> 2.5 </Z10_Design_allowance>
|
||||
<Z10_Overhead_and_profit cost_unit="%"> 14 </Z10_Overhead_and_profit>
|
||||
</Z_Allowances_overhead_profit>
|
||||
</capital_cost>
|
||||
<operational_cost>
|
||||
<fuel fuel_type="electricity">
|
||||
<fixed>
|
||||
<fixed_monthly cost_unit="currency/month"> 12.27 </fixed_monthly>
|
||||
<fixed_power cost_unit="currency/month*kW"> 0 </fixed_power>
|
||||
</fixed>
|
||||
<variable cost_unit="currency/kWh"> 0.075 </variable>
|
||||
</fuel>
|
||||
<fuel fuel_type="gas">
|
||||
<fixed>
|
||||
<fixed_monthly cost_unit="currency/month"> 17.71 </fixed_monthly>
|
||||
</fixed>
|
||||
<variable cost_unit="currency/kWh"> 0.640 </variable>
|
||||
</fuel>
|
||||
<fuel fuel_type="diesel">
|
||||
<variable cost_unit="currency/l"> 1.2 </variable>
|
||||
</fuel>
|
||||
<fuel fuel_type="biomass">
|
||||
<variable cost_unit="currency/kg"> 0.09 </variable>
|
||||
</fuel>
|
||||
<maintenance>
|
||||
<heating_equipment cost_unit="currency/kW"> 40 </heating_equipment>
|
||||
<cooling_equipment cost_unit="currency/kW"> 40 </cooling_equipment>
|
||||
<photovoltaic_system cost_unit="currency/m2"> 1 </photovoltaic_system>
|
||||
</maintenance>
|
||||
<CO2_cost cost_unit="currency/kgCO2"> 30 </CO2_cost>
|
||||
</operational_cost>
|
||||
<end_of_life_cost cost_unit="currency/m2"> 6.3 </end_of_life_cost>
|
||||
<incomes>
|
||||
<subsidies>
|
||||
<construction_subsidy cost_unit="%"> 2 </construction_subsidy>
|
||||
<hvac_subsidy cost_unit="%"> 1.5 </hvac_subsidy>
|
||||
<photovoltaic_subsidy cost_unit="%"> 3.6 </photovoltaic_subsidy>
|
||||
</subsidies>
|
||||
<energy_exports>
|
||||
<electricity cost_unit="currency/kWh"> 0 </electricity>
|
||||
</energy_exports>
|
||||
<tax_reductions>
|
||||
<reductions_taxes cost_unit="%"> 2 </reductions_taxes>
|
||||
</tax_reductions>
|
||||
</incomes>
|
||||
</archetype>
|
||||
<archetype function="non-residential" municipality="montreal" currency="CAD">
|
||||
<capital_cost>
|
||||
<B_Shell>
|
||||
<B10_superstructure>
|
||||
<refurbishmentcostbasement cost_unit="currency/m2"> 0 </refurbishmentcostbasement>
|
||||
</B10_superstructure>
|
||||
<B20_envelope>
|
||||
<B2010_opaque_walls>
|
||||
<refurbishmentcost cost_unit="currency/m2"> 304 </refurbishmentcost>
|
||||
</B2010_opaque_walls>
|
||||
<B2020_transparent>
|
||||
<refurbishmentcost cost_unit="currency/m2"> 857.14 </refurbishmentcost>
|
||||
</B2020_transparent>
|
||||
</B20_envelope>
|
||||
<B30_roofing>
|
||||
<B3010_opaqueroof>
|
||||
<refurbishmentcost cost_unit="currency/m2"> 118 </refurbishmentcost>
|
||||
</B3010_opaqueroof>
|
||||
</B30_roofing>
|
||||
</B_Shell>
|
||||
<D_Services>
|
||||
<D30_HVAC>
|
||||
<D3010EnergySupply>
|
||||
<D301010photovoltaic_system>
|
||||
<initial_investment cost_unit="currency/m2"> 800 </initial_investment>
|
||||
<reposition cost_unit="currency/m2"> 800 </reposition>
|
||||
<lifetime_equipment lifetime="years"> 25 </lifetime_equipment>
|
||||
</D301010photovoltaic_system>
|
||||
</D3010EnergySupply>
|
||||
<D3020Heatgeneratingsystems>
|
||||
<investment_cost cost_unit="currency/kW"> 622.86 </investment_cost>
|
||||
<reposition cost_unit="currency/kW"> 622.86 </reposition>
|
||||
<lifetime_equipment lifetime="years"> 25 </lifetime_equipment>
|
||||
</D3020Heatgeneratingsystems>
|
||||
<D3030_Cooling_generation_systems>
|
||||
<investment_cost cost_unit="currency/kW"> 622.86 </investment_cost>
|
||||
<reposition cost_unit="currency/kW"> 622.86 </reposition>
|
||||
<lifetime_equipment lifetime="years"> 15 </lifetime_equipment>
|
||||
</D3030_Cooling_generation_systems>
|
||||
<D3040_Distribution_systems>
|
||||
<refurbishmentcost cost_unit="currency/m2"> 0 </refurbishmentcost>
|
||||
<reposition cost_unit="currency/kW"> 0 </reposition>
|
||||
<lifetime_equipment lifetime="years"> 15 </lifetime_equipment>
|
||||
</D3040_Distribution_systems>
|
||||
<D3080_Other_HVAC_AHU>
|
||||
<investment_cost cost_unit="currency/kW"> 47.62 </investment_cost>
|
||||
<reposition cost_unit="currency/kW"> 47.62 </reposition>
|
||||
<lifetime_equipment lifetime="years"> 15 </lifetime_equipment>
|
||||
</D3080_Other_HVAC_AHU>
|
||||
</D30_HVAC>
|
||||
<D50_Electrical>
|
||||
<D5020_Lighting_and_branch_wiring>
|
||||
<refurbishmentcost cost_unit="currency/kW"> 139 </refurbishmentcost>
|
||||
<reposition cost_unit="currency/kW"> 139 </reposition>
|
||||
<lifetime_equipment lifetime="years"> 20 </lifetime_equipment>
|
||||
</D5020_Lighting_and_branch_wiring>
|
||||
</D50_Electrical>
|
||||
</D_Services>
|
||||
<Z_Allowances_overhead_profit>
|
||||
<Z10_Design_allowance cost_unit="%"> 6 </Z10_Design_allowance>
|
||||
<Z20_Overhead_profit cost_unit="%"> 14 </Z20_Overhead_profit>
|
||||
</Z_Allowances_overhead_profit>
|
||||
</capital_cost>
|
||||
<operational_cost>
|
||||
<fuel fuel_type="electricity">
|
||||
<fixed>
|
||||
<fixed_monthly cost_unit="currency/month"> 12.27 </fixed_monthly>
|
||||
<fixed_power cost_unit="currency/(month*kW)"> 0 </fixed_power>
|
||||
</fixed>
|
||||
<variable cost_unit="currency/kWh"> 0.075 </variable>
|
||||
</fuel>
|
||||
<fuel fuel_type="gas">
|
||||
<fixed>
|
||||
<fixed_monthly cost_unit="currency/month"> 17.71 </fixed_monthly>
|
||||
</fixed>
|
||||
<variable cost_unit="currency/m3"> 0.640 </variable>
|
||||
</fuel>
|
||||
<fuel fuel_type="diesel">
|
||||
<variable cost_unit="currency/l"> 1.2 </variable>
|
||||
</fuel>
|
||||
<fuel fuel_type="biomass">
|
||||
<variable cost_unit="currency/kg"> 0.09 </variable>
|
||||
</fuel>
|
||||
<maintenance>
|
||||
<heating_equipment cost_unit="currency/kW"> 40 </heating_equipment>
|
||||
<cooling_equipment cost_unit="currency/kW"> 40 </cooling_equipment>
|
||||
<photovoltaic_system cost_unit="currency/m2"> 1 </photovoltaic_system>
|
||||
</maintenance>
|
||||
<CO2_cost cost_unit="currency/kgCO2"> 30 </CO2_cost>
|
||||
</operational_cost>
|
||||
<end_of_life_cost cost_unit="currency/m2"> 6.3 </end_of_life_cost>
|
||||
<incomes>
|
||||
<subsidies>
|
||||
<construction_subsidy cost_unit="%"> 2 </construction_subsidy>
|
||||
<hvac_subsidy cost_unit="%"> 1.5 </hvac_subsidy>
|
||||
<photovoltaic_subsidy cost_unit="%"> 3.6 </photovoltaic_subsidy>
|
||||
</subsidies>
|
||||
<energy_exports>
|
||||
<electricity cost_unit="currency/kWh"> 0 </electricity>
|
||||
</energy_exports>
|
||||
<tax_reductions>
|
||||
<reductions_taxes cost_unit="%"> 2 </reductions_taxes>
|
||||
</tax_reductions>
|
||||
</incomes>
|
||||
</archetype>
|
||||
</archetypes>
|
|
@ -1,178 +0,0 @@
|
|||
<archetypes>
|
||||
<archetype function="residential" municipality="montreal" currency="CAD">
|
||||
<capital_cost>
|
||||
<ASubstructure>
|
||||
<A10sub_structural cost_unit="currency/m2"> 15.89 </A10sub_structural>
|
||||
<A20structural cost_unit="currency/m3"> 215.90 </A20structural>
|
||||
</ASubstructure>
|
||||
<BShell>
|
||||
<B10superstructure>
|
||||
<reposition cost_unit="currency/m2"> 0 </reposition>
|
||||
<initial_investment cost_unit="currency/m2"> 0 </initial_investment>
|
||||
<lifetime_equipment lifetime="years"> 50 </lifetime_equipment>
|
||||
</B10superstructure>
|
||||
<B20envelope>
|
||||
<B2010opaquewalls>
|
||||
<reposition cost_unit="currency/m2"> 304 </reposition>
|
||||
<initial_investment cost_unit="currency/m2"> 304 </initial_investment>
|
||||
<lifetime_equipment lifetime="years"> 50 </lifetime_equipment>
|
||||
</B2010opaquewalls>
|
||||
<B2020transparent>
|
||||
<reposition cost_unit="currency/m2"> 857.14 </reposition>
|
||||
<initial_investment cost_unit="currency/m2"> 857.14 </initial_investment>
|
||||
<lifetime_equipment lifetime="years"> 20 </lifetime_equipment>
|
||||
</B2020transparent>
|
||||
</B20envelope>
|
||||
<B30roofing>
|
||||
<B3010opaqueroof>
|
||||
<reposition cost_unit="currency/m2"> 118 </reposition>
|
||||
<initial_investment cost_unit="currency/m2"> 118 </initial_investment>
|
||||
<lifetime_equipment lifetime="years"> 50 </lifetime_equipment>
|
||||
</B3010opaqueroof>
|
||||
<B3020transparentroof>
|
||||
<reposition cost_unit="currency/m2"> 857.14 </reposition>
|
||||
<initial_investment cost_unit="currency/m2"> 857.14 </initial_investment>
|
||||
<lifetime_equipment lifetime="years"> 20 </lifetime_equipment>
|
||||
</B3020transparentroof>
|
||||
</B30roofing>
|
||||
</BShell>
|
||||
<CInteriors>
|
||||
<C10Interiorconstruction>
|
||||
<reposition cost_unit="currency/m2"> 0 </reposition>
|
||||
<initial_investment cost_unit="currency/m2"> 0 </initial_investment>
|
||||
<lifetime_equipment lifetime="years"> 50 </lifetime_equipment>
|
||||
</C10Interiorconstruction>
|
||||
<C20Stairs>
|
||||
<reposition cost_unit="currency/m2"> 0 </reposition>
|
||||
<initial_investment cost_unit="currency/m2"> 0 </initial_investment>
|
||||
<lifetime_equipment lifetime="years"> 50 </lifetime_equipment>
|
||||
</C20Stairs>
|
||||
<C30Interiorfinishes>
|
||||
<C3010Walls>
|
||||
<reposition cost_unit="currency/m2"> 50 </reposition>
|
||||
<initial_investment cost_unit="currency/m2"> 50 </initial_investment>
|
||||
<lifetime_equipment lifetime="years"> 20 </lifetime_equipment>
|
||||
</C3010Walls>
|
||||
<C3020Floors>
|
||||
<reposition cost_unit="currency/m2"> 62 </reposition>
|
||||
<initial_investment cost_unit="currency/m2"> 62 </initial_investment>
|
||||
<lifetime_equipment lifetime="years"> 20 </lifetime_equipment>
|
||||
</C3020Floors>
|
||||
<C3030Ceilings>
|
||||
<reposition cost_unit="currency/m2"> 70 </reposition>
|
||||
<initial_investment cost_unit="currency/m2"> 70 </initial_investment>
|
||||
<lifetime_equipment lifetime="years"> 20 </lifetime_equipment>
|
||||
</C3030Ceilings>
|
||||
</C30Interiorfinishes>
|
||||
</CInteriors>
|
||||
<DServices>
|
||||
<D10Conveying cost_unit="currency/m2"> 0 </D10Conveying>
|
||||
<D20Plumbing cost_unit="currency/m2"> 100 </D20Plumbing>
|
||||
<D30HVAC>
|
||||
<D3010EnergySupply>
|
||||
<D301010photovoltaic_system>
|
||||
<initial_investment cost_unit="currency/m2"> 800 </initial_investment>
|
||||
<reposition cost_unit="currency/m2"> 800 </reposition>
|
||||
<lifetime_equipment lifetime="years"> 25 </lifetime_equipment>
|
||||
</D301010photovoltaic_system>
|
||||
</D3010EnergySupply>
|
||||
<D3020Heatgeneratingsystems>
|
||||
<initial_investment cost_unit="currency/kW"> 622.86 </initial_investment>
|
||||
<reposition cost_unit="currency/kW"> 622.86 </reposition>
|
||||
<lifetime_equipment lifetime="years"> 25 </lifetime_equipment>
|
||||
</D3020Heatgeneratingsystems>
|
||||
<D3030Coolinggenerationsystems>
|
||||
<initial_investment cost_unit="currency/kW"> 622.86 </initial_investment>
|
||||
<reposition cost_unit="currency/kW"> 622.86 </reposition>
|
||||
<lifetime_equipment lifetime="years"> 15 </lifetime_equipment>
|
||||
</D3030Coolinggenerationsystems>
|
||||
<D3040Distributionsystems>
|
||||
<initial_investment cost_unit="currency/kW"> 0 </initial_investment>
|
||||
<reposition cost_unit="currency/kW"> 0 </reposition>
|
||||
<lifetime_equipment lifetime="years"> 15 </lifetime_equipment>
|
||||
</D3040Distributionsystems>
|
||||
<D3060Controlsandinstrumentation>
|
||||
<initial_investment cost_unit="currency/kW"> 0 </initial_investment>
|
||||
<reposition cost_unit="currency/kW"> 0 </reposition>
|
||||
<lifetime_equipment lifetime="years"> 15 </lifetime_equipment>
|
||||
</D3060Controlsandinstrumentation>
|
||||
<D3080OtherHVAC_AHU>
|
||||
<initial_investment cost_unit="currency/kW"> 47.62 </initial_investment>
|
||||
<reposition cost_unit="currency/kW"> 47.62 </reposition>
|
||||
<lifetime_equipment lifetime="years"> 15 </lifetime_equipment>
|
||||
</D3080OtherHVAC_AHU>
|
||||
</D30HVAC>
|
||||
<D50Electrical>
|
||||
<D5010Electricalservicesanddistribution>
|
||||
<initial_investment cost_unit="currency/m2"> 171.43 </initial_investment>
|
||||
<reposition cost_unit="currency/m2"> 171.43 </reposition>
|
||||
<lifetime_equipment lifetime="years"> 20 </lifetime_equipment>
|
||||
</D5010Electricalservicesanddistribution>
|
||||
<D5020Lightingandbranchwiring>
|
||||
<initial_investment cost_unit="currency/kW"> 139 </initial_investment>
|
||||
<reposition cost_unit="currency/kW"> 139 </reposition>
|
||||
<lifetime_equipment lifetime="years"> 20 </lifetime_equipment>
|
||||
</D5020Lightingandbranchwiring>
|
||||
</D50Electrical>
|
||||
</DServices>
|
||||
<EEquimentsandfurnishing>
|
||||
<E10Equipments>
|
||||
<initial_investment cost_unit="currency/m2"> 0 </initial_investment>
|
||||
<reposition cost_unit="currency/m2"> 0 </reposition>
|
||||
<lifetime_equipment lifetime="years"> 15 </lifetime_equipment>
|
||||
</E10Equipments>
|
||||
<E10Furnishing>
|
||||
<initial_investment cost_unit="currency/m2"> 0 </initial_investment>
|
||||
<reposition cost_unit="currency/m2"> 0 </reposition>
|
||||
<lifetime_equipment lifetime="years"> 15 </lifetime_equipment>
|
||||
</E10Furnishing>
|
||||
</EEquimentsandfurnishing>
|
||||
<engineer cost_unit="%"> 2.5 </engineer>
|
||||
</capital_cost>
|
||||
<operational_cost>
|
||||
<fuel fuel_type="electricity">
|
||||
<fixed>
|
||||
<fixed_monthly cost_unit="currency/month"> 12.27 </fixed_monthly>
|
||||
</fixed>
|
||||
<variable_base cost_unit="currency/kWh"> hourlydatatable1 </variable_base>
|
||||
<variable_peak cost_unit="currency/kWh"> hourlydatatable2 </variable_peak>
|
||||
</fuel>
|
||||
<fuel fuel_type="gaz">
|
||||
<fixed>
|
||||
<fixed_monthly cost_unit="currency/month"> 17.71 </fixed_monthly>
|
||||
</fixed>
|
||||
<variable cost_unit="currency/m3"> 0.640 </variable>
|
||||
</fuel>
|
||||
<fuel fuel_type="diesel">
|
||||
<variable cost_unit="currency/l"> 1.2 </variable>
|
||||
</fuel>
|
||||
<fuel fuel_type="biomass">
|
||||
<variable cost_unit="currency/kg"> 0.09 </variable>
|
||||
</fuel>
|
||||
<maintenance>
|
||||
<heating_equipment cost_unit="currency/kW"> 40 </heating_equipment>
|
||||
<cooling_equipment cost_unit="currency/kW"> 40 </cooling_equipment>
|
||||
<general_hvac_equipment cost_unit="currency/(m3/h)"> 0.05 </general_hvac_equipment>
|
||||
<photovoltaic_system cost_unit="currency/m2"> 1 </photovoltaic_system>
|
||||
<other_systems cost_unit="currency/m2"> 4.6 </other_systems>
|
||||
</maintenance>
|
||||
<CO2_cost cost_unit="currency/kgCO2"> 30 </CO2_cost>
|
||||
</operational_cost>
|
||||
<end_of_life_cost cost_unit="currency/m2"> 6.3 </end_of_life_cost>
|
||||
<incomes>
|
||||
<subsidies>
|
||||
<construction_subsidy cost_unit="%"> 2 </construction_subsidy>
|
||||
<hvac_subsidy cost_unit="%"> 1.5 </hvac_subsidy>
|
||||
<photovoltaic_subsidy cost_unit="%"> 3.6 </photovoltaic_subsidy>
|
||||
</subsidies>
|
||||
<energy_exports>
|
||||
<electricity cost_unit="currency/kWh"> hourlydatatable </electricity>
|
||||
<heat cost_unit="currency/kWh"> 0 </heat>
|
||||
</energy_exports>
|
||||
<tax_reductions>
|
||||
<reductions_taxes cost_unit="%"> 2 </reductions_taxes>
|
||||
</tax_reductions>
|
||||
<CO2_income cost_unit="currency/kgCO2exported"> 0 </CO2_income>
|
||||
</incomes>
|
||||
</archetype>
|
||||
</archetypes>
|
|
@ -97,7 +97,7 @@ P 40
|
|||
|
||||
B 41 CONST
|
||||
P 41
|
||||
$HPDisactivationTemperature % Constant value
|
||||
$HPDeactivationTemperature % Constant value
|
||||
|
||||
B 42 CONST
|
||||
P 42
|
||||
|
|
|
@ -97,7 +97,7 @@ P 30
|
|||
|
||||
B 31 CONST
|
||||
P 31
|
||||
$HPDisactivationTemperature % Constant value
|
||||
$HPDeactivationTemperature % Constant value
|
||||
|
||||
B 32 CONST
|
||||
P 32
|
||||
|
|
|
@ -339,7 +339,7 @@ P 142
|
|||
|
||||
B 143 CONST
|
||||
P 143
|
||||
$HPDisactivationTemperature % Constant value
|
||||
$HPDeactivationTemperature % Constant value
|
||||
|
||||
B 144 CONST
|
||||
P 144
|
||||
|
|
|
@ -303,7 +303,7 @@ P 106
|
|||
|
||||
B 107 CONST
|
||||
P 107
|
||||
$HPDisactivationTemperature % Constant value
|
||||
$HPDeactivationTemperature % Constant value
|
||||
|
||||
B 108 CONST
|
||||
P 108
|
||||
|
|
391
hub/data/energy_systems/montreal_custom_systems.xml
Normal file
391
hub/data/energy_systems/montreal_custom_systems.xml
Normal file
|
@ -0,0 +1,391 @@
|
|||
<catalog lod="1">
|
||||
<generation_equipments>
|
||||
<equipment id="1" type="boiler" fuel_type="gas">
|
||||
<name>Fuel-fired water boiler</name>
|
||||
<heating_efficiency>0.85</heating_efficiency>
|
||||
<storage>false</storage>
|
||||
</equipment>
|
||||
<equipment id="2" type="boiler" fuel_type="electricity">
|
||||
<name>Electric water boiler</name>
|
||||
<heating_efficiency>1</heating_efficiency>
|
||||
<storage>true</storage>
|
||||
</equipment>
|
||||
<equipment id="3" type="furnace" fuel_type="gas">
|
||||
<name>Fuel-fired furnace and fuel boiler for acs</name>
|
||||
<heating_efficiency>0.85</heating_efficiency>
|
||||
<storage>false</storage>
|
||||
</equipment>
|
||||
<equipment id="4" type="furnace" fuel_type="electricity">
|
||||
<name>Electrical furnace and fuel boiler for acs</name>
|
||||
<heating_efficiency>1</heating_efficiency>
|
||||
<storage>false</storage>
|
||||
</equipment>
|
||||
<equipment id="5" type="cooler" fuel_type="electricity">
|
||||
<name>Air cooled DX with external condenser</name>
|
||||
<cooling_efficiency>3.23</cooling_efficiency>
|
||||
<storage>false</storage>
|
||||
</equipment>
|
||||
<equipment id="6" type="electricity generator" fuel_type="renewable">
|
||||
<name>PV system</name>
|
||||
<electrical_efficiency>0.22</electrical_efficiency>
|
||||
<storage>true</storage>
|
||||
</equipment>
|
||||
</generation_equipments>
|
||||
<distribution_equipments>
|
||||
<equipment id="1" type="Water distribution heating">
|
||||
<name>Water distribution heating</name>
|
||||
<distribution_heat_losses units="%">10</distribution_heat_losses>
|
||||
<distribution_consumption_fix_flow units="%">4</distribution_consumption_fix_flow>
|
||||
<distribution_consumption_variable_flow units="%">1</distribution_consumption_variable_flow>
|
||||
</equipment>
|
||||
<equipment id="2" type="Water distribution cooling">
|
||||
<name>Water distribution cooling</name>
|
||||
<distribution_heat_losses units="%">10</distribution_heat_losses>
|
||||
<distribution_consumption_fix_flow units="%">4</distribution_consumption_fix_flow>
|
||||
<distribution_consumption_variable_flow units="%">1</distribution_consumption_variable_flow>
|
||||
</equipment>
|
||||
<equipment id="3" type="Central air distribution heating">
|
||||
<name>Central air distribution heating</name>
|
||||
<distribution_heat_losses units="%">10</distribution_heat_losses>
|
||||
<distribution_consumption_fix_flow units="%">13</distribution_consumption_fix_flow>
|
||||
<distribution_consumption_variable_flow units="%">13</distribution_consumption_variable_flow>
|
||||
</equipment>
|
||||
<equipment id="4" type="Central air distribution cooling">
|
||||
<name>Central air distribution cooling</name>
|
||||
<distribution_heat_losses units="%">10</distribution_heat_losses>
|
||||
<distribution_consumption_fix_flow units="%">13</distribution_consumption_fix_flow>
|
||||
<distribution_consumption_variable_flow units="%">13</distribution_consumption_variable_flow>
|
||||
</equipment>
|
||||
<equipment id="5" type="Local air distribution heating">
|
||||
<name>Local air distribution heating</name>
|
||||
<distribution_heat_losses units="%">10</distribution_heat_losses>
|
||||
<distribution_consumption_fix_flow units="%">8</distribution_consumption_fix_flow>
|
||||
<distribution_consumption_variable_flow units="%">8</distribution_consumption_variable_flow>
|
||||
</equipment>
|
||||
<equipment id="6" type="Local air distribution cooling">
|
||||
<name>Local air distribution cooling</name>
|
||||
<distribution_heat_losses units="%">10</distribution_heat_losses>
|
||||
<distribution_consumption_fix_flow units="%">8</distribution_consumption_fix_flow>
|
||||
<distribution_consumption_variable_flow units="%">8</distribution_consumption_variable_flow>
|
||||
</equipment>
|
||||
<equipment id="7" type="Refrigerant distribution">
|
||||
<name>Refrigerant distribution</name>
|
||||
<distribution_heat_losses units="%">1</distribution_heat_losses>
|
||||
<distribution_consumption_fix_flow units="%">1</distribution_consumption_fix_flow>
|
||||
<distribution_consumption_variable_flow units="%">2</distribution_consumption_variable_flow>
|
||||
</equipment>
|
||||
<equipment id="8" type="No distribution">
|
||||
<name>No distribution</name>
|
||||
<distribution_heat_losses units="%">0</distribution_heat_losses>
|
||||
<distribution_consumption_fix_flow units="%">0</distribution_consumption_fix_flow>
|
||||
<distribution_consumption_variable_flow units="%">0</distribution_consumption_variable_flow>
|
||||
</equipment>
|
||||
</distribution_equipments>
|
||||
<dissipation_equipments>
|
||||
<equipment id="1" type="baseboards">
|
||||
<name>Baseboards</name>
|
||||
<parasitic_consumption units="%">0</parasitic_consumption>
|
||||
</equipment>
|
||||
<equipment id="2" type="fan-coils">
|
||||
<name>fan-coils</name>
|
||||
<parasitic_consumption units="%">2</parasitic_consumption>
|
||||
</equipment>
|
||||
<equipment id="3" type="inductors">
|
||||
<name>inductors</name>
|
||||
<parasitic_consumption units="%">0</parasitic_consumption>
|
||||
</equipment>
|
||||
</dissipation_equipments>
|
||||
<systems>
|
||||
<system id = "1">
|
||||
<name>Unitary air conditioner with baseboard heater fuel fired boiler</name>
|
||||
<demands>
|
||||
<demand>heating</demand>
|
||||
<demand>domestic_hot_water</demand>
|
||||
</demands>
|
||||
<equipments>
|
||||
<generation_id>1</generation_id>
|
||||
<distribution_id>1</distribution_id>
|
||||
<dissipation_id>1</dissipation_id>
|
||||
</equipments>
|
||||
</system>
|
||||
<system id = "2">
|
||||
<name>4 pipe fan coils with fuel fired boiler</name>
|
||||
<demands>
|
||||
<demand>heating</demand>
|
||||
<demand>domestic_hot_water</demand>
|
||||
</demands>
|
||||
<equipments>
|
||||
<generation_id>1</generation_id>
|
||||
<distribution_id>1</distribution_id>
|
||||
<dissipation_id>2</dissipation_id>
|
||||
</equipments>
|
||||
</system>
|
||||
<system id="3">
|
||||
<name>4 pipe fan coils with electrical resistance water boiler</name>
|
||||
<demands>
|
||||
<demand>heating</demand>
|
||||
<demand>domestic_hot_water</demand>
|
||||
</demands>
|
||||
<equipments>
|
||||
<generation_id>2</generation_id>
|
||||
<distribution_id>1</distribution_id>
|
||||
<dissipation_id>2</dissipation_id>
|
||||
</equipments>
|
||||
</system>
|
||||
<system id="4">
|
||||
<name>Single zone packaged rooftop unit with fuel-fired furnace and baseboards and fuel boiler for acs</name>
|
||||
<demands>
|
||||
<demand>heating</demand>
|
||||
<demand>domestic_hot_water</demand>
|
||||
</demands>
|
||||
<equipments>
|
||||
<generation_id>3</generation_id>
|
||||
<distribution_id>5</distribution_id>
|
||||
<dissipation_id>1</dissipation_id>
|
||||
</equipments>
|
||||
</system>
|
||||
<system id="5">
|
||||
<name>Single zone packaged rooftop unit with electrical resistance furnace and baseboards and fuel boiler for acs</name>
|
||||
<demands>
|
||||
<demand>heating</demand>
|
||||
<demand>domestic_hot_water</demand>
|
||||
</demands>
|
||||
<equipments>
|
||||
<generation_id>4</generation_id>
|
||||
<distribution_id>5</distribution_id>
|
||||
<dissipation_id>1</dissipation_id>
|
||||
</equipments>
|
||||
</system>
|
||||
<system id="6">
|
||||
<name>Single zone make-up air unit with baseboard heating with fuel fired boiler</name>
|
||||
<demands>
|
||||
<demand>heating</demand>
|
||||
<demand>domestic_hot_water</demand>
|
||||
</demands>
|
||||
<equipments>
|
||||
<generation_id>1</generation_id>
|
||||
<distribution_id>1</distribution_id>
|
||||
<dissipation_id>1</dissipation_id>
|
||||
</equipments>
|
||||
</system>
|
||||
<system id="7">
|
||||
<name>Single zone make-up air unit with electrical baseboard heating and DHW with resistance</name>
|
||||
<demands>
|
||||
<demand>heating</demand>
|
||||
<demand>domestic_hot_water</demand>
|
||||
</demands>
|
||||
<equipments>
|
||||
<generation_id>2</generation_id>
|
||||
<distribution_id>5</distribution_id>
|
||||
<dissipation_id>3</dissipation_id>
|
||||
</equipments>
|
||||
</system>
|
||||
<system id="8">
|
||||
<name>Multi-zone built-up system with baseboard heater hydronic with fuel fired boiler</name>
|
||||
<demands>
|
||||
<demand>heating</demand>
|
||||
<demand>domestic_hot_water</demand>
|
||||
</demands>
|
||||
<equipments>
|
||||
<generation_id>2</generation_id>
|
||||
<distribution_id>1</distribution_id>
|
||||
<dissipation_id>3</dissipation_id>
|
||||
</equipments>
|
||||
</system>
|
||||
<system id="9">
|
||||
<name>Multi-zone built-up system with electrical baseboard heater and electrical hot water</name>
|
||||
<demands>
|
||||
<demand>heating</demand>
|
||||
<demand>domestic_hot_water</demand>
|
||||
</demands>
|
||||
<equipments>
|
||||
<generation_id>2</generation_id>
|
||||
<distribution_id>1</distribution_id>
|
||||
<dissipation_id>3</dissipation_id>
|
||||
</equipments>
|
||||
</system>
|
||||
<system id="10">
|
||||
<name>Unitary air conditioner air cooled DX with external condenser</name>
|
||||
<demands>
|
||||
<demand>cooling</demand>
|
||||
</demands>
|
||||
<equipments>
|
||||
<generation_id>5</generation_id>
|
||||
<distribution_id>6</distribution_id>
|
||||
<dissipation_id>3</dissipation_id>
|
||||
</equipments>
|
||||
</system>
|
||||
<system id="11">
|
||||
<name>4 pipe fan coils with water cooled, water chiller</name>
|
||||
<demands>
|
||||
<demand>cooling</demand>
|
||||
</demands>
|
||||
<equipments>
|
||||
<generation_id>5</generation_id>
|
||||
<distribution_id>2</distribution_id>
|
||||
<dissipation_id>2</dissipation_id>
|
||||
</equipments>
|
||||
</system>
|
||||
<system id="12">
|
||||
<name>Single zone packaged rooftop unit with air cooled DX</name>
|
||||
<demands>
|
||||
<demand>cooling</demand>
|
||||
</demands>
|
||||
<equipments>
|
||||
<generation_id>5</generation_id>
|
||||
<distribution_id>6</distribution_id>
|
||||
<dissipation_id>3</dissipation_id>
|
||||
</equipments>
|
||||
</system>
|
||||
<system id="13">
|
||||
<name>Single zone make-up air unit with air cooled DX</name>
|
||||
<demands>
|
||||
<demand>cooling</demand>
|
||||
</demands>
|
||||
<equipments>
|
||||
<generation_id>5</generation_id>
|
||||
<distribution_id>6</distribution_id>
|
||||
<dissipation_id>3</dissipation_id>
|
||||
</equipments>
|
||||
</system>
|
||||
<system id="14">
|
||||
<name>Multi-zone built-up system with water cooled, water chiller</name>
|
||||
<demands>
|
||||
<demand>cooling</demand>
|
||||
</demands>
|
||||
<equipments>
|
||||
<generation_id>5</generation_id>
|
||||
<distribution_id>3</distribution_id>
|
||||
<dissipation_id>3</dissipation_id>
|
||||
</equipments>
|
||||
</system>
|
||||
<system id="15">
|
||||
<name>PV system</name>
|
||||
<demands>
|
||||
<demand>electricity</demand>
|
||||
</demands>
|
||||
<equipments>
|
||||
<generation_id>6</generation_id>
|
||||
<distribution_id>5</distribution_id>
|
||||
<dissipation_id>3</dissipation_id>
|
||||
</equipments>
|
||||
</system>
|
||||
</systems>
|
||||
<system_clusters>
|
||||
<system_cluster name="system 1 gas">
|
||||
<systems>
|
||||
<system_id>1</system_id>
|
||||
<system_id>7</system_id>
|
||||
</systems>
|
||||
</system_cluster>
|
||||
<system_cluster name="system 1 gas pv">
|
||||
<systems>
|
||||
<system_id>1</system_id>
|
||||
<system_id>7</system_id>
|
||||
<system_id>15</system_id>
|
||||
</systems>
|
||||
</system_cluster>
|
||||
<system_cluster name="system 1 electricity">
|
||||
<systems>
|
||||
<system_id>1</system_id>
|
||||
<system_id>10</system_id>
|
||||
</systems>
|
||||
</system_cluster>
|
||||
<system_cluster name="system 1 electricity pv">
|
||||
<systems>
|
||||
<system_id>2</system_id>
|
||||
<system_id>10</system_id>
|
||||
<system_id>15</system_id>
|
||||
</systems>
|
||||
</system_cluster>
|
||||
<system_cluster name="system 2 gas">
|
||||
<systems>
|
||||
<system_id>2</system_id>
|
||||
<system_id>11</system_id>
|
||||
</systems>
|
||||
</system_cluster>
|
||||
<system_cluster name="system 2 gas pv">
|
||||
<systems>
|
||||
<system_id>2</system_id>
|
||||
<system_id>11</system_id>
|
||||
<system_id>15</system_id>
|
||||
</systems>
|
||||
</system_cluster>
|
||||
<system_cluster name="system 2 electricity">
|
||||
<systems>
|
||||
<system_id>3</system_id>
|
||||
<system_id>11</system_id>
|
||||
</systems>
|
||||
</system_cluster>
|
||||
<system_cluster name="system 2 electricity pv">
|
||||
<systems>
|
||||
<system_id>3</system_id>
|
||||
<system_id>11</system_id>
|
||||
<system_id>15</system_id>
|
||||
</systems>
|
||||
</system_cluster>
|
||||
<system_cluster name="system 3 and 4 gas">
|
||||
<systems>
|
||||
<system_id>4</system_id>
|
||||
<system_id>12</system_id>
|
||||
</systems>
|
||||
</system_cluster>
|
||||
<system_cluster name="system 3 and 4 gas pv">
|
||||
<systems>
|
||||
<system_id>4</system_id>
|
||||
<system_id>12</system_id>
|
||||
<system_id>15</system_id>
|
||||
</systems>
|
||||
</system_cluster>
|
||||
<system_cluster name="system 3 and 4 electricity">
|
||||
<systems>
|
||||
<system_id>5</system_id>
|
||||
<system_id>12</system_id>
|
||||
</systems>
|
||||
</system_cluster>
|
||||
<system_cluster name="system 3 and 4 electricity pv">
|
||||
<systems>
|
||||
<system_id>5</system_id>
|
||||
<system_id>12</system_id>
|
||||
<system_id>15</system_id>
|
||||
</systems>
|
||||
</system_cluster>
|
||||
<system_cluster name="system 5">
|
||||
<systems>
|
||||
<system_id>11</system_id>
|
||||
</systems>
|
||||
</system_cluster>
|
||||
<system_cluster name="system 5 pv">
|
||||
<systems>
|
||||
<system_id>11</system_id>
|
||||
<system_id>15</system_id>
|
||||
</systems>
|
||||
</system_cluster>
|
||||
<system_cluster name="system 6 gas">
|
||||
<systems>
|
||||
<system_id>8</system_id>
|
||||
<system_id>14</system_id>
|
||||
</systems>
|
||||
</system_cluster>
|
||||
<system_cluster name="system 6 gas pv">
|
||||
<systems>
|
||||
<system_id>8</system_id>
|
||||
<system_id>14</system_id>
|
||||
<system_id>15</system_id>
|
||||
</systems>
|
||||
</system_cluster>
|
||||
<system_cluster name="system 6 electricity">
|
||||
<systems>
|
||||
<system_id>9</system_id>
|
||||
<system_id>14</system_id>
|
||||
</systems>
|
||||
</system_cluster>
|
||||
<system_cluster name="system 6 electricity pv">
|
||||
<systems>
|
||||
<system_id>9</system_id>
|
||||
<system_id>14</system_id>
|
||||
<system_id>15</system_id>
|
||||
</systems>
|
||||
</system_cluster>
|
||||
</system_clusters>
|
||||
</catalog>
|
|
@ -1,11 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<nrcan base_url="https://raw.githubusercontent.com/NREL/openstudio-standards/master/lib/openstudio-standards/standards/necb/ECMS/data/">
|
||||
<boilers_location>boiler_set.json</boilers_location>
|
||||
<chillers_location>chiller_set.json</chillers_location>
|
||||
<curves_location>curves.json</curves_location>
|
||||
<furnaces_location>furnace_set.json </furnaces_location>
|
||||
<heat_pumps_location>heat_pumps.json</heat_pumps_location>
|
||||
<domestic_hot_water_systems_location>shw_set.json</domestic_hot_water_systems_location>
|
||||
<pvs_location>pv.json</pvs_location>
|
||||
<air_conditioners_location>unitary_acs.json</air_conditioners_location>
|
||||
</nrcan>
|
|
@ -1,559 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<library name="LCA">
|
||||
<fuels>
|
||||
<fuel id="1" name="Black_coal">
|
||||
<carbon_emission_factor unit="kgCO2/ kWh">0.32</carbon_emission_factor>
|
||||
</fuel>
|
||||
<fuel id="2" name="Brown_coal">
|
||||
<carbon_emission_factor unit="kgCO2/ kWh">0.4</carbon_emission_factor>
|
||||
</fuel>
|
||||
<fuel id="3" name="Brown_coal_briquette">
|
||||
<carbon_emission_factor unit="kgCO2/ kWh">0.4</carbon_emission_factor>
|
||||
</fuel>
|
||||
<fuel id="4" name="Brown_coal_coke">
|
||||
<carbon_emission_factor unit="kgCO2/ kWh">0.5</carbon_emission_factor>
|
||||
</fuel>
|
||||
<fuel id="5" name="CNG">
|
||||
<carbon_emission_factor unit="kgCO2/ kWh">0.18</carbon_emission_factor>
|
||||
</fuel>
|
||||
<fuel id="6" name="Coal_coke">
|
||||
<carbon_emission_factor unit="kgCO2/ kWh">0.39</carbon_emission_factor>
|
||||
</fuel>
|
||||
<fuel id="7" name="Crude_oil">
|
||||
<carbon_emission_factor unit="kgCO2/ kWh">0.27</carbon_emission_factor>
|
||||
</fuel>
|
||||
<fuel id="8" name="Diesel_Machine">
|
||||
<carbon_emission_factor unit="kgCO2/ liter">4.16</carbon_emission_factor>
|
||||
</fuel>
|
||||
<fuel id="9" name="Diesel_Vehicle">
|
||||
<carbon_emission_factor unit="kgCO2/ liter">2.24</carbon_emission_factor>
|
||||
</fuel>
|
||||
<fuel id="10" name="Ethane">
|
||||
<carbon_emission_factor unit="kgCO2/ kWh">0.2</carbon_emission_factor>
|
||||
</fuel>
|
||||
<fuel id="11" name="Fuel_oil">
|
||||
<carbon_emission_factor unit="kgCO2/ liter">3.19</carbon_emission_factor>
|
||||
</fuel>
|
||||
<fuel id="12" name="Gas_flared">
|
||||
<carbon_emission_factor unit="kgCO2/ kg">3.53</carbon_emission_factor>
|
||||
</fuel>
|
||||
<fuel id="13" name="Kerosene">
|
||||
<carbon_emission_factor unit="kgCO2/ kWh">0.27</carbon_emission_factor>
|
||||
</fuel>
|
||||
<fuel id="14" name="LNG">
|
||||
<carbon_emission_factor unit="kgCO2/ kWh">0.21</carbon_emission_factor>
|
||||
</fuel>
|
||||
<fuel id="15" name="LPG">
|
||||
<carbon_emission_factor unit="kgCO2/ liter">1.69</carbon_emission_factor>
|
||||
</fuel>
|
||||
<fuel id="16" name="Natural_gas">
|
||||
<carbon_emission_factor unit="kgCO2/ kWh">0.21</carbon_emission_factor>
|
||||
</fuel>
|
||||
<fuel id="17" name="Petroleum_coke">
|
||||
<carbon_emission_factor unit="kgCO2/ kWh">0.35</carbon_emission_factor>
|
||||
</fuel>
|
||||
<fuel id="18" name="UNG">
|
||||
<carbon_emission_factor unit="kgCO2/ kWh">0.18</carbon_emission_factor>
|
||||
</fuel>
|
||||
<fuel id="19" name="Biodiesel">
|
||||
<carbon_emission_factor unit="kgCO2/ liter">0.81</carbon_emission_factor>
|
||||
</fuel>
|
||||
<fuel id="20" name="Bioethanol">
|
||||
<carbon_emission_factor unit="kgCO2/ kg">1.21</carbon_emission_factor>
|
||||
</fuel>
|
||||
<fuel id="21" name="Biogas">
|
||||
<carbon_emission_factor unit="kgCO2/ kg">1.61</carbon_emission_factor>
|
||||
</fuel>
|
||||
<fuel id="22" name="Biomass">
|
||||
<carbon_emission_factor unit="kgCO2/ kg">0.11</carbon_emission_factor>
|
||||
</fuel>
|
||||
<fuel id="23" name="Methanol">
|
||||
<carbon_emission_factor unit="kgCO2/ kg">0.3</carbon_emission_factor>
|
||||
</fuel>
|
||||
<fuel id="24" name="Petrol_eightyfive_ethanol">
|
||||
<carbon_emission_factor unit="kgCO2/ kg">1.16</carbon_emission_factor>
|
||||
</fuel>
|
||||
<fuel id="25" name="Steam">
|
||||
<carbon_emission_factor unit="kgCO2/ kg">0.61</carbon_emission_factor>
|
||||
</fuel>
|
||||
</fuels>
|
||||
<machines>
|
||||
<machine id="1" name="Rock_drill">
|
||||
<work_efficiency unit="h/m3">0.347</work_efficiency>
|
||||
<energy_consumption_rate unit="kWh/h">16.5</energy_consumption_rate>
|
||||
<carbon_emission_factor unit="kgCO2/kWh">0.918</carbon_emission_factor>
|
||||
</machine>
|
||||
<machine id="2" name="Hydraulic_hammer">
|
||||
<work_efficiency unit="h/m3">0.033</work_efficiency>
|
||||
<energy_consumption_rate unit="kg_fuel/h">25.2</energy_consumption_rate>
|
||||
<carbon_emission_factor unit="kgCO2/kg_fuel">4.16 </carbon_emission_factor>
|
||||
</machine>
|
||||
<machine id="3" name="Crawler_bulldozer">
|
||||
<work_efficiency unit="h/m3">0.027</work_efficiency>
|
||||
<energy_consumption_rate unit="kg_fuel/h3">16.8</energy_consumption_rate>
|
||||
<carbon_emission_factor unit="kgCO2/kg_fuel">2.239</carbon_emission_factor>
|
||||
</machine>
|
||||
<machine id="4" name="Crawler_excavator">
|
||||
<work_efficiency unit="h/m3">0.023</work_efficiency>
|
||||
<energy_consumption_rate unit="kg_fuel/h">16.8</energy_consumption_rate>
|
||||
<carbon_emission_factor unit="kgCO2/kg_fuel">2.239</carbon_emission_factor>
|
||||
</machine>
|
||||
<machine id="5" name="Crawler_hydraulic_rock_crusher">
|
||||
<work_efficiency unit="h/m3">0.109</work_efficiency>
|
||||
<energy_consumption_rate unit="kg_fuel/h">25.2</energy_consumption_rate>
|
||||
<carbon_emission_factor unit="kgCO2/kg_fuel">2.239</carbon_emission_factor>
|
||||
</machine>
|
||||
<machine id="6" name="Mobile_recycling_equipment">
|
||||
<work_efficiency unit="h/ton">0.003</work_efficiency>
|
||||
<energy_consumption_rate unit="kg_fuel/h">16.4</energy_consumption_rate>
|
||||
<carbon_emission_factor unit="kgCO2/kg_fuel">4.16</carbon_emission_factor>
|
||||
</machine>
|
||||
<machine id="7" name="Vibration_feeder">
|
||||
<work_efficiency unit="h/ton">0.002</work_efficiency>
|
||||
<energy_consumption_rate unit="kWh/h">11</energy_consumption_rate>
|
||||
<carbon_emission_factor unit="kgCO2/kWh">0.918</carbon_emission_factor>
|
||||
</machine>
|
||||
<machine id="8" name="Jaw_crusher">
|
||||
<work_efficiency unit="h/ton">0.002</work_efficiency>
|
||||
<energy_consumption_rate unit="kWh/h">90</energy_consumption_rate>
|
||||
<carbon_emission_factor unit="kgCO2/kWh">0.918</carbon_emission_factor>
|
||||
</machine>
|
||||
<machine id="9" name="Electromagnetic_separator">
|
||||
<work_efficiency unit="h/ton">0.002</work_efficiency>
|
||||
<energy_consumption_rate unit="kWh/h">10</energy_consumption_rate>
|
||||
<carbon_emission_factor unit="kgCO2/kWh">0.918</carbon_emission_factor>
|
||||
</machine>
|
||||
<machine id="10" name="Wind_sorting_machine">
|
||||
<work_efficiency unit="h/ton">0.002</work_efficiency>
|
||||
<energy_consumption_rate unit="kWh/h">11</energy_consumption_rate>
|
||||
<carbon_emission_factor unit="kgCO2/kWh">0.918</carbon_emission_factor>
|
||||
</machine>
|
||||
<machine id="11" name="Impact_crusher">
|
||||
<work_efficiency unit="h/ton">0.002</work_efficiency>
|
||||
<energy_consumption_rate unit="kWh/h">132</energy_consumption_rate>
|
||||
<carbon_emission_factor unit="kgCO2/kWh">0.918</carbon_emission_factor>
|
||||
</machine>
|
||||
<machine id="12" name="Double_circular_vibrating_plug">
|
||||
<work_efficiency unit=" h/ton ">0.002</work_efficiency>
|
||||
<energy_consumption_rate unit="kWh/h">15</energy_consumption_rate>
|
||||
<carbon_emission_factor unit="kgCO2/kW">0.918</carbon_emission_factor>
|
||||
</machine>
|
||||
<machine id="13" name="Spiral_sand_washing_machine">
|
||||
<work_efficiency unit="h/ton">0.002</work_efficiency>
|
||||
<energy_consumption_rate unit="kWh/h">5.5</energy_consumption_rate>
|
||||
<carbon_emission_factor unit="kgCO2/kWh">0.918</carbon_emission_factor>
|
||||
</machine>
|
||||
<machine id="14" name="Conveyor_belts">
|
||||
<work_efficiency unit="h/ton">0.002</work_efficiency>
|
||||
<energy_consumption_rate unit="kWh/h">22.5</energy_consumption_rate>
|
||||
<carbon_emission_factor unit="kgCO2/kWh">0.918</carbon_emission_factor>
|
||||
</machine>
|
||||
</machines>
|
||||
<vehicles>
|
||||
<vehicle id="1" name="Freight_lorry_18_ton">
|
||||
<fuel_consumption_rate unit="kg_fuel/ton.km">0.0123</fuel_consumption_rate>
|
||||
<carbon_emission_factor unit="kgCO2/kg_fuel">2.239</carbon_emission_factor>
|
||||
</vehicle>
|
||||
<vehicle id="2" name="Freight_train">
|
||||
<fuel_consumption_rate unit="kWh/ton.km">0.042</fuel_consumption_rate>
|
||||
<carbon_emission_factor unit="kgCO2/kWh">0.918</carbon_emission_factor>
|
||||
</vehicle>
|
||||
<vehicle id="3" name="Freight_ship">
|
||||
<fuel_consumption_rate unit="kWh/ton.km">0.01</fuel_consumption_rate>
|
||||
<carbon_emission_factor unit="kgCO2/kWh">1.00000</carbon_emission_factor>
|
||||
</vehicle>
|
||||
<vehicle id="4" name="Freight_Air">
|
||||
<fuel_consumption_rate unit="kWh/ton.km">1.3</fuel_consumption_rate>
|
||||
<carbon_emission_factor unit="kgCO2/kWh">1.00000</carbon_emission_factor>
|
||||
</vehicle>
|
||||
</vehicles>
|
||||
<building_materials>
|
||||
<material type="brick" id="1" name="clay brick">
|
||||
<density unit="ton/m3">1.8</density>
|
||||
<embodied_carbon unit="kgCO2/ton">560</embodied_carbon>
|
||||
<recycling_ratio>0.8</recycling_ratio>
|
||||
<onsite_recycling_ratio>0.3</onsite_recycling_ratio>
|
||||
<company_recycling_ratio>0.7</company_recycling_ratio>
|
||||
<landfilling_ratio>0.2</landfilling_ratio>
|
||||
<cost unit="CAD">0.1</cost>
|
||||
</material>
|
||||
<material type="brick" id="2" name="light clay brick">
|
||||
<density unit="ton/m3">1.2</density>
|
||||
<embodied_carbon unit="kgCO2/ton">310</embodied_carbon>
|
||||
<recycling_ratio>0.8</recycling_ratio>
|
||||
<onsite_recycling_ratio>0.3</onsite_recycling_ratio>
|
||||
<company_recycling_ratio>0.7</company_recycling_ratio>
|
||||
<landfilling_ratio>0.2</landfilling_ratio>
|
||||
<cost unit="CAD">0.1</cost>
|
||||
</material>
|
||||
<material type="brick" id="3" name="refractory">
|
||||
<density unit="ton/m3">2</density>
|
||||
<embodied_carbon unit="kgCO2/ton">3080</embodied_carbon>
|
||||
<recycling_ratio>0.8</recycling_ratio>
|
||||
<onsite_recycling_ratio>0.3</onsite_recycling_ratio>
|
||||
<company_recycling_ratio>0.7</company_recycling_ratio>
|
||||
<landfilling_ratio>0.2</landfilling_ratio>
|
||||
<cost unit="CAD">0.1</cost>
|
||||
</material>
|
||||
<material type="brick" id="4" name="sand-lime brick">
|
||||
<density unit="ton/m3">1.4</density>
|
||||
<embodied_carbon unit="kgCO2/ton">300</embodied_carbon>
|
||||
<recycling_ratio>0.8</recycling_ratio>
|
||||
<onsite_recycling_ratio>0.3</onsite_recycling_ratio>
|
||||
<company_recycling_ratio>0.7</company_recycling_ratio>
|
||||
<landfilling_ratio>0.2</landfilling_ratio>
|
||||
<cost unit="CAD">0.1</cost>
|
||||
</material>
|
||||
<material type="concrete" id="5" name="light weight expanded clay">
|
||||
<density unit="ton/m3">1.6</density>
|
||||
<embodied_carbon unit="kgCO2/ton">900</embodied_carbon>
|
||||
<recycling_ratio>0.8</recycling_ratio>
|
||||
<onsite_recycling_ratio>0</onsite_recycling_ratio>
|
||||
<company_recycling_ratio>1</company_recycling_ratio>
|
||||
<landfilling_ratio>0.2</landfilling_ratio>
|
||||
<cost unit="CAD">0.1</cost>
|
||||
</material>
|
||||
<material type="concrete" id="6" name="lightweight Expanded perlite">
|
||||
<density unit="ton/m3">1.6</density>
|
||||
<embodied_carbon unit="kgCO2/ton">2340</embodied_carbon>
|
||||
<recycling_ratio>0.8</recycling_ratio>
|
||||
<onsite_recycling_ratio>0</onsite_recycling_ratio>
|
||||
<company_recycling_ratio>1</company_recycling_ratio>
|
||||
<landfilling_ratio>0.2</landfilling_ratio>
|
||||
<cost unit="CAD">0.1</cost>
|
||||
</material>
|
||||
<material type="concrete" id="7" name="lightweight expanded vermiculite">
|
||||
<density unit="ton/m3">1.6</density>
|
||||
<embodied_carbon unit="kgCO2/ton">1570</embodied_carbon>
|
||||
<recycling_ratio>0.8</recycling_ratio>
|
||||
<onsite_recycling_ratio>0</onsite_recycling_ratio>
|
||||
<company_recycling_ratio>1</company_recycling_ratio>
|
||||
<landfilling_ratio>0.2</landfilling_ratio>
|
||||
<cost unit="CAD">0.1</cost>
|
||||
</material>
|
||||
<material type="concrete" id="8" name="lightweight polystyrene">
|
||||
<density unit="ton/m3">1.4</density>
|
||||
<embodied_carbon unit="kgCO2/ton">1840</embodied_carbon>
|
||||
<recycling_ratio>0.8</recycling_ratio>
|
||||
<onsite_recycling_ratio>0</onsite_recycling_ratio>
|
||||
<company_recycling_ratio>1</company_recycling_ratio>
|
||||
<landfilling_ratio>0.2</landfilling_ratio>
|
||||
<cost unit="CAD">0.1</cost>
|
||||
</material>
|
||||
<material type="concrete" id="9" name="lightweight pumice">
|
||||
<density unit="ton/m3">1.3</density>
|
||||
<embodied_carbon unit="kgCO2/ton">410</embodied_carbon>
|
||||
<recycling_ratio>0.8</recycling_ratio>
|
||||
<onsite_recycling_ratio>0</onsite_recycling_ratio>
|
||||
<company_recycling_ratio>1</company_recycling_ratio>
|
||||
<landfilling_ratio>0.2</landfilling_ratio>
|
||||
<cost unit="CAD">0.1</cost>
|
||||
</material>
|
||||
<material type="concrete" id="10" name="concrete 20 MPa">
|
||||
<density unit="ton/m3">2.3</density>
|
||||
<embodied_carbon unit="kgCO2/ton">160</embodied_carbon>
|
||||
<recycling_ratio>0.8</recycling_ratio>
|
||||
<onsite_recycling_ratio>0</onsite_recycling_ratio>
|
||||
<company_recycling_ratio>1</company_recycling_ratio>
|
||||
<landfilling_ratio>0.2</landfilling_ratio>
|
||||
<cost unit="CAD">0.1</cost>
|
||||
</material>
|
||||
<material type="concrete" id="11" name="concrete 25 MPa">
|
||||
<density unit="ton/m3">2.3</density>
|
||||
<embodied_carbon unit="kgCO2/ton">170</embodied_carbon>
|
||||
<recycling_ratio>0.8</recycling_ratio>
|
||||
<onsite_recycling_ratio>0</onsite_recycling_ratio>
|
||||
<company_recycling_ratio>1</company_recycling_ratio>
|
||||
<landfilling_ratio>0.2</landfilling_ratio>
|
||||
<cost unit="CAD">0.1</cost>
|
||||
</material>
|
||||
<material type="concrete" id="12" name="concrete 30-32 MPa">
|
||||
<density unit="ton/m3">2.3</density>
|
||||
<embodied_carbon unit="kgCO2/ton">230</embodied_carbon>
|
||||
<recycling_ratio>0.8</recycling_ratio>
|
||||
<onsite_recycling_ratio>0</onsite_recycling_ratio>
|
||||
<company_recycling_ratio>1</company_recycling_ratio>
|
||||
<landfilling_ratio>0.2</landfilling_ratio>
|
||||
<cost unit="CAD">0.1</cost>
|
||||
</material>
|
||||
<material type="concrete" id="13" name="concrete 35 MPae">
|
||||
<density unit="ton/m3">2.4</density>
|
||||
<embodied_carbon unit="kgCO2/ton">240</embodied_carbon>
|
||||
<recycling_ratio>0.8</recycling_ratio>
|
||||
<onsite_recycling_ratio>0</onsite_recycling_ratio>
|
||||
<company_recycling_ratio>1</company_recycling_ratio>
|
||||
<landfilling_ratio>0.2</landfilling_ratio>
|
||||
<cost unit="CAD">0.1</cost>
|
||||
</material>
|
||||
<material type="concrete" id="14" name="concrete 50 MPa">
|
||||
<density unit="ton/m3">2.4</density>
|
||||
<embodied_carbon unit="kgCO2/ton">280</embodied_carbon>
|
||||
<recycling_ratio>0.8</recycling_ratio>
|
||||
<onsite_recycling_ratio>0</onsite_recycling_ratio>
|
||||
<company_recycling_ratio>1</company_recycling_ratio>
|
||||
<landfilling_ratio>0.2</landfilling_ratio>
|
||||
<cost unit="CAD">0.1</cost>
|
||||
</material>
|
||||
<material type="concrete" id="15" name="concrete block">
|
||||
<density unit="ton/m3">2.3</density>
|
||||
<embodied_carbon unit="kgCO2/ton">170</embodied_carbon>
|
||||
<recycling_ratio>0.8</recycling_ratio>
|
||||
<onsite_recycling_ratio>0</onsite_recycling_ratio>
|
||||
<company_recycling_ratio>1</company_recycling_ratio>
|
||||
<landfilling_ratio>0.2</landfilling_ratio>
|
||||
<cost unit="CAD">0.1</cost>
|
||||
</material>
|
||||
<material type="concrete" id="16" name="concrete roof tile">
|
||||
<density unit="ton/m3">1.2</density>
|
||||
<embodied_carbon unit="kgCO2/ton">440</embodied_carbon>
|
||||
<recycling_ratio>0.8</recycling_ratio>
|
||||
<onsite_recycling_ratio>0</onsite_recycling_ratio>
|
||||
<company_recycling_ratio>1</company_recycling_ratio>
|
||||
<landfilling_ratio>0.2</landfilling_ratio>
|
||||
<cost unit="CAD">0.1</cost>
|
||||
</material>
|
||||
<material type="glass" id="17" name="flat glass, coated">
|
||||
<density unit="ton/m3">2.58</density>
|
||||
<embodied_carbon unit="kgCO2/ton">2660</embodied_carbon>
|
||||
<recycling_ratio>0.95</recycling_ratio>
|
||||
<onsite_recycling_ratio>0</onsite_recycling_ratio>
|
||||
<company_recycling_ratio>1</company_recycling_ratio>
|
||||
<landfilling_ratio>0.05</landfilling_ratio>
|
||||
<cost unit="CAD">0.1</cost>
|
||||
</material>
|
||||
<material type="glass" id="18" name="glass fibre">
|
||||
<density unit="ton/m3">2.58</density>
|
||||
<embodied_carbon unit="kgCO2/ton">5260</embodied_carbon>
|
||||
<recycling_ratio>0.95</recycling_ratio>
|
||||
<onsite_recycling_ratio>0</onsite_recycling_ratio>
|
||||
<company_recycling_ratio>1</company_recycling_ratio>
|
||||
<landfilling_ratio>0.05</landfilling_ratio>
|
||||
<cost unit="CAD">0.1</cost>
|
||||
</material>
|
||||
<material type="insulation" id="19" name="cellulose fibre">
|
||||
<density unit="ton/m3">0.06</density>
|
||||
<embodied_carbon unit="kgCO2/ton">1760</embodied_carbon>
|
||||
<recycling_ratio>0.9</recycling_ratio>
|
||||
<onsite_recycling_ratio>0</onsite_recycling_ratio>
|
||||
<company_recycling_ratio>1</company_recycling_ratio>
|
||||
<landfilling_ratio>0.1</landfilling_ratio>
|
||||
<cost unit="CAD">0.1</cost>
|
||||
</material>
|
||||
<material type="insulation" id="20" name="cork slab">
|
||||
<density unit="ton/m3">0.122</density>
|
||||
<embodied_carbon unit="kgCO2/ton">3080</embodied_carbon>
|
||||
<recycling_ratio>0.9</recycling_ratio>
|
||||
<onsite_recycling_ratio>0</onsite_recycling_ratio>
|
||||
<company_recycling_ratio>1</company_recycling_ratio>
|
||||
<landfilling_ratio>0.1</landfilling_ratio>
|
||||
<cost unit="CAD">0.1</cost>
|
||||
</material>
|
||||
<material type="insulation" id="21" name="polystyren foam">
|
||||
<density unit="ton/m3">0.028</density>
|
||||
<embodied_carbon unit="kgCO2/ton">3180</embodied_carbon>
|
||||
<recycling_ratio>0.9</recycling_ratio>
|
||||
<onsite_recycling_ratio>0</onsite_recycling_ratio>
|
||||
<company_recycling_ratio>1</company_recycling_ratio>
|
||||
<landfilling_ratio>0.1</landfilling_ratio>
|
||||
<cost unit="CAD">0.1</cost>
|
||||
</material>
|
||||
<material type="insulation" id="22" name="polystyrene 10% recycled">
|
||||
<density unit="ton/m3">0.024</density>
|
||||
<embodied_carbon unit="kgCO2/ton">5140</embodied_carbon>
|
||||
<recycling_ratio>0.9</recycling_ratio>
|
||||
<onsite_recycling_ratio>0</onsite_recycling_ratio>
|
||||
<company_recycling_ratio>1</company_recycling_ratio>
|
||||
<landfilling_ratio>0.1</landfilling_ratio>
|
||||
<cost unit="CAD">0.1</cost>
|
||||
</material>
|
||||
<material type="insulation" id="23" name="stone wool">
|
||||
<density unit="ton/m3">0.1</density>
|
||||
<embodied_carbon unit="kgCO2/ton">6040</embodied_carbon>
|
||||
<recycling_ratio>0.9</recycling_ratio>
|
||||
<onsite_recycling_ratio>0</onsite_recycling_ratio>
|
||||
<company_recycling_ratio>1</company_recycling_ratio>
|
||||
<landfilling_ratio>0.1</landfilling_ratio>
|
||||
<cost unit="CAD">0.1</cost>
|
||||
</material>
|
||||
<material type="insulation" id="24" name="foam glass">
|
||||
<density unit="ton/m3">0.3</density>
|
||||
<embodied_carbon unit="kgCO2/ton">5380</embodied_carbon>
|
||||
<recycling_ratio>0.9</recycling_ratio>
|
||||
<onsite_recycling_ratio>0</onsite_recycling_ratio>
|
||||
<company_recycling_ratio>1</company_recycling_ratio>
|
||||
<landfilling_ratio>0.1</landfilling_ratio>
|
||||
<cost unit="CAD">0.1</cost>
|
||||
</material>
|
||||
<material type="insulation" id="25" name="glass wool mat">
|
||||
<density unit="ton/m3">0.032</density>
|
||||
<embodied_carbon unit="kgCO2/ton">2150</embodied_carbon>
|
||||
<recycling_ratio>0.9</recycling_ratio>
|
||||
<onsite_recycling_ratio>0</onsite_recycling_ratio>
|
||||
<company_recycling_ratio>1</company_recycling_ratio>
|
||||
<landfilling_ratio>0.1</landfilling_ratio>
|
||||
<cost unit="CAD">0.1</cost>
|
||||
</material>
|
||||
<material type="wood" id="26" name="fiberboard, hard">
|
||||
<density unit="ton/m3">0.9</density>
|
||||
<embodied_carbon unit="kgCO2/ton">3420</embodied_carbon>
|
||||
<recycling_ratio>0.6</recycling_ratio>
|
||||
<onsite_recycling_ratio>0</onsite_recycling_ratio>
|
||||
<company_recycling_ratio>1</company_recycling_ratio>
|
||||
<landfilling_ratio>0.4</landfilling_ratio>
|
||||
<cost unit="CAD">0.1</cost>
|
||||
</material>
|
||||
<material type="wood" id="27" name="three layerd laminated board">
|
||||
<density unit="ton/m3">0.7</density>
|
||||
<embodied_carbon unit="kgCO2/ton">1430</embodied_carbon>
|
||||
<recycling_ratio>0.6</recycling_ratio>
|
||||
<onsite_recycling_ratio>0</onsite_recycling_ratio>
|
||||
<company_recycling_ratio>1</company_recycling_ratio>
|
||||
<landfilling_ratio>0.4</landfilling_ratio>
|
||||
<cost unit="CAD">0.1</cost>
|
||||
</material>
|
||||
<material type="wood" id="28" name="fibreboard, soft">
|
||||
<density unit="ton/m3">0.65</density>
|
||||
<embodied_carbon unit="kgCO2/ton">2780</embodied_carbon>
|
||||
<recycling_ratio>0.6</recycling_ratio>
|
||||
<onsite_recycling_ratio>0</onsite_recycling_ratio>
|
||||
<company_recycling_ratio>1</company_recycling_ratio>
|
||||
<landfilling_ratio>0.4</landfilling_ratio>
|
||||
<cost unit="CAD">0.1</cost>
|
||||
</material>
|
||||
<material type="wood" id="29" name="plywood">
|
||||
<density unit="ton/m3">0.72</density>
|
||||
<embodied_carbon unit="kgCO2/ton">2190</embodied_carbon>
|
||||
<recycling_ratio>0.6</recycling_ratio>
|
||||
<onsite_recycling_ratio>0</onsite_recycling_ratio>
|
||||
<company_recycling_ratio>1</company_recycling_ratio>
|
||||
<landfilling_ratio>0.4</landfilling_ratio>
|
||||
<cost unit="CAD">0.1</cost>
|
||||
</material>
|
||||
<material type="covering" id="30" name="acrylic filler">
|
||||
<density unit="ton/m3">1.43</density>
|
||||
<embodied_carbon unit="kgCO2/ton">1070</embodied_carbon>
|
||||
<recycling_ratio>0</recycling_ratio>
|
||||
<onsite_recycling_ratio>0</onsite_recycling_ratio>
|
||||
<company_recycling_ratio>0</company_recycling_ratio>
|
||||
<landfilling_ratio>1</landfilling_ratio>
|
||||
<cost unit="CAD">0.1</cost>
|
||||
</material>
|
||||
<material type="covering" id="31" name="anhydrite floor">
|
||||
<density unit="ton/m3">1.43</density>
|
||||
<embodied_carbon unit="kgCO2/ton">240</embodied_carbon>
|
||||
<recycling_ratio>0</recycling_ratio>
|
||||
<onsite_recycling_ratio>0</onsite_recycling_ratio>
|
||||
<company_recycling_ratio>0</company_recycling_ratio>
|
||||
<landfilling_ratio>1</landfilling_ratio>
|
||||
<cost unit="CAD">0.1</cost>
|
||||
</material>
|
||||
<material type="covering" id="32" name="base plaster">
|
||||
<density unit="ton/m3">1.43</density>
|
||||
<embodied_carbon unit="kgCO2/ton">430</embodied_carbon>
|
||||
<recycling_ratio>0</recycling_ratio>
|
||||
<onsite_recycling_ratio>0</onsite_recycling_ratio>
|
||||
<company_recycling_ratio>0</company_recycling_ratio>
|
||||
<landfilling_ratio>1</landfilling_ratio>
|
||||
<cost unit="CAD">0.1</cost>
|
||||
</material>
|
||||
<material type="covering" id="33" name="cement cast plaster floor">
|
||||
<density unit="ton/m3">1.43</density>
|
||||
<embodied_carbon unit="kgCO2/ton">340</embodied_carbon>
|
||||
<recycling_ratio>0</recycling_ratio>
|
||||
<onsite_recycling_ratio>0</onsite_recycling_ratio>
|
||||
<company_recycling_ratio>0</company_recycling_ratio>
|
||||
<landfilling_ratio>1</landfilling_ratio>
|
||||
<cost unit="CAD">0.1</cost>
|
||||
</material>
|
||||
<material type="covering" id="34" name="cement tile">
|
||||
<density unit="ton/m3">1.2</density>
|
||||
<embodied_carbon unit="kgCO2/ton">440</embodied_carbon>
|
||||
<recycling_ratio>0.8</recycling_ratio>
|
||||
<onsite_recycling_ratio>0</onsite_recycling_ratio>
|
||||
<company_recycling_ratio>1</company_recycling_ratio>
|
||||
<landfilling_ratio>0.2</landfilling_ratio>
|
||||
<cost unit="CAD">0.1</cost>
|
||||
</material>
|
||||
<material type="covering" id="35" name="ceramic tile">
|
||||
<density unit="ton/m3">2.1</density>
|
||||
<embodied_carbon unit="kgCO2/ton">1410</embodied_carbon>
|
||||
<recycling_ratio>0.8</recycling_ratio>
|
||||
<onsite_recycling_ratio>0</onsite_recycling_ratio>
|
||||
<company_recycling_ratio>1</company_recycling_ratio>
|
||||
<landfilling_ratio>0.2</landfilling_ratio>
|
||||
<cost unit="CAD">0.1</cost>
|
||||
</material>
|
||||
<material type="covering" id="36" name="clay plaster">
|
||||
<density unit="ton/m3">1.43</density>
|
||||
<embodied_carbon unit="kgCO2/ton">250</embodied_carbon>
|
||||
<recycling_ratio>0</recycling_ratio>
|
||||
<onsite_recycling_ratio>0</onsite_recycling_ratio>
|
||||
<company_recycling_ratio>0</company_recycling_ratio>
|
||||
<landfilling_ratio>1</landfilling_ratio>
|
||||
<cost unit="CAD">0.1</cost>
|
||||
</material>
|
||||
<material type="covering" id="37" name="fiber cement corrugated slab">
|
||||
<density unit="ton/m3">1.44</density>
|
||||
<embodied_carbon unit="kgCO2/ton">1480</embodied_carbon>
|
||||
<recycling_ratio>0.8</recycling_ratio>
|
||||
<onsite_recycling_ratio>0</onsite_recycling_ratio>
|
||||
<company_recycling_ratio>1</company_recycling_ratio>
|
||||
<landfilling_ratio>0.2</landfilling_ratio>
|
||||
<cost unit="CAD">0.1</cost>
|
||||
</material>
|
||||
<material type="covering" id="38" name="fiber cement facing tile">
|
||||
<density unit="ton/m3">1.44</density>
|
||||
<embodied_carbon unit="kgCO2/ton">2220</embodied_carbon>
|
||||
<recycling_ratio>0.8</recycling_ratio>
|
||||
<onsite_recycling_ratio>0</onsite_recycling_ratio>
|
||||
<company_recycling_ratio>1</company_recycling_ratio>
|
||||
<landfilling_ratio>0.2</landfilling_ratio>
|
||||
<cost unit="CAD">0.1</cost>
|
||||
</material>
|
||||
<material type="wood" id="39" name="gypsum fibreboard">
|
||||
<density unit="ton/m3">1.27</density>
|
||||
<embodied_carbon unit="kgCO2/ton">3960</embodied_carbon>
|
||||
<recycling_ratio>0.8</recycling_ratio>
|
||||
<onsite_recycling_ratio>0</onsite_recycling_ratio>
|
||||
<company_recycling_ratio>1</company_recycling_ratio>
|
||||
<landfilling_ratio>0.2</landfilling_ratio>
|
||||
<cost unit="CAD">0.1</cost>
|
||||
</material>
|
||||
<material type="covering" id="40" name="gypsum plaster board">
|
||||
<density unit="ton/m3">1.15</density>
|
||||
<embodied_carbon unit="kgCO2/ton">760</embodied_carbon>
|
||||
<recycling_ratio>0.8</recycling_ratio>
|
||||
<onsite_recycling_ratio>0</onsite_recycling_ratio>
|
||||
<company_recycling_ratio>1</company_recycling_ratio>
|
||||
<landfilling_ratio>0.2</landfilling_ratio>
|
||||
<cost unit="CAD">0.1</cost>
|
||||
</material>
|
||||
<material type="metal" id="41" name="steel">
|
||||
<density unit="ton/m3">8</density>
|
||||
<embodied_carbon unit="kgCO2/ton">3160</embodied_carbon>
|
||||
<recycling_ratio> 0.98</recycling_ratio>
|
||||
<onsite_recycling_ratio>0</onsite_recycling_ratio>
|
||||
<company_recycling_ratio>1</company_recycling_ratio>
|
||||
<landfilling_ratio>0.02</landfilling_ratio>
|
||||
<cost unit="CAD">0.1</cost>
|
||||
</material>
|
||||
<material type="metal" id="42" name="aluminium">
|
||||
<density unit="ton/m3">2.7</density>
|
||||
<embodied_carbon unit="kgCO2/ton">5370</embodied_carbon>
|
||||
<recycling_ratio> 0.98</recycling_ratio>
|
||||
<onsite_recycling_ratio>0</onsite_recycling_ratio>
|
||||
<company_recycling_ratio>1</company_recycling_ratio>
|
||||
<landfilling_ratio>0.02</landfilling_ratio>
|
||||
<cost unit="CAD">0.1</cost>
|
||||
</material>
|
||||
<material type="metal" id="43" name="reinforcing steel">
|
||||
<density unit="ton/m3">7.85</density>
|
||||
<embodied_carbon unit="kgCO2/ton">3910</embodied_carbon>
|
||||
<recycling_ratio> 0.98</recycling_ratio>
|
||||
<onsite_recycling_ratio>0</onsite_recycling_ratio>
|
||||
<company_recycling_ratio>1</company_recycling_ratio>
|
||||
<landfilling_ratio>0.02</landfilling_ratio>
|
||||
<cost unit="CAD">0.1</cost>
|
||||
</material>
|
||||
</building_materials>
|
||||
</library>
|
Binary file not shown.
|
@ -1,83 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<archetypes reference_library_building_type="DOE">
|
||||
<archetypes ID="0" building_type="high-rise apartment" reference_standard="ASHRAE 90.1-2019" climate_zone="ASHRAE_2009:6A">
|
||||
<idf>
|
||||
<path>idf_files/ASHRAE901_OfficeSmall_STD2019_Rochester.idf</path>
|
||||
</idf>
|
||||
</archetypes>
|
||||
<archetypes ID="1" building_type="midrise apartment" reference_standard="ASHRAE 90.1-2019" climate_zone="ASHRAE_2009:6A">
|
||||
<idf>
|
||||
<path>idf_files/ASHRAE901_ApartmentMidRise_STD2019_Rochester.idf</path>
|
||||
</idf>
|
||||
</archetypes>
|
||||
<archetypes ID="2" building_type="hospital" reference_standard="ASHRAE 90.1-2019" climate_zone="ASHRAE_2009:6A">
|
||||
<idf>
|
||||
<path>idf_files/ASHRAE901_Hospital_STD2019_Rochester.idf</path>
|
||||
</idf>
|
||||
</archetypes>
|
||||
<archetypes ID="3" building_type="large hotel" reference_standard="ASHRAE 90.1-2019" climate_zone="ASHRAE_2009:6A">
|
||||
<idf>
|
||||
<path>idf_files/ASHRAE901_HotelLarge_STD2019_Rochester.idf</path>
|
||||
</idf>
|
||||
</archetypes>
|
||||
<archetypes ID="4" building_type="small hotel" reference_standard="ASHRAE 90.1-2019" climate_zone="ASHRAE_2009:6A">
|
||||
<idf>
|
||||
<path>idf_files/ASHRAE901_HotelSmall_STD2019_Rochester.idf</path>
|
||||
</idf>
|
||||
</archetypes>
|
||||
<archetypes ID="5" building_type="large office" reference_standard="ASHRAE 90.1-2019" climate_zone="ASHRAE_2009:6A">
|
||||
<idf>
|
||||
<path>idf_files/ASHRAE901_OfficeLarge_STD2019_Rochester.idf</path>
|
||||
</idf>
|
||||
</archetypes>
|
||||
<archetypes ID="6" building_type="medium office" reference_standard="ASHRAE 90.1-2019" climate_zone="ASHRAE_2009:6A">
|
||||
<idf>
|
||||
<path>idf_files/ASHRAE901_OfficeMedium_STD2019_Rochester.idf</path>
|
||||
</idf>
|
||||
</archetypes>
|
||||
<archetypes ID="7" building_type="small office" reference_standard="ASHRAE 90.1-2019" climate_zone="ASHRAE_2009:6A">
|
||||
<idf>
|
||||
<path>idf_files/ASHRAE901_OfficeSmall_STD2019_Rochester.idf</path>
|
||||
</idf>
|
||||
</archetypes>
|
||||
<archetypes ID="8" building_type="outpatient healthcare" reference_standard="ASHRAE 90.1-2019" climate_zone="ASHRAE_2009:6A">
|
||||
<idf>
|
||||
<path>idf_files/ASHRAE901_OutPatientHealthCare_STD2019_Rochester.idf</path>
|
||||
</idf>
|
||||
</archetypes>
|
||||
<archetypes ID="9" building_type="quick service restaurant" reference_standard="ASHRAE 90.1-2019" climate_zone="ASHRAE_2009:6A">
|
||||
<idf>
|
||||
<path>idf_files/ASHRAE901_RestaurantFastFood_STD2019_Rochester.idf</path>
|
||||
</idf>
|
||||
</archetypes>
|
||||
<archetypes ID="10" building_type="full service restaurant" reference_standard="ASHRAE 90.1-2019" climate_zone="ASHRAE_2009:6A">
|
||||
<idf>
|
||||
<path>idf_files/ASHRAE901_RestaurantSitDown_STD2019_Rochester.idf</path>
|
||||
</idf>
|
||||
</archetypes>
|
||||
<archetypes ID="11" building_type="stand-alone-retail" reference_standard="ASHRAE 90.1-2019" climate_zone="ASHRAE_2009:6A">
|
||||
<idf>
|
||||
<path>idf_files/ASHRAE901_RetailStandalone_STD2019_Rochester.idf</path>
|
||||
</idf>
|
||||
</archetypes>
|
||||
<archetypes ID="12" building_type="strip mall" reference_standard="ASHRAE 90.1-2019" climate_zone="ASHRAE_2009:6A">
|
||||
<idf>
|
||||
<path>idf_files/ASHRAE901_RetailStripmall_STD2019_Rochester.idf</path>
|
||||
</idf>
|
||||
</archetypes>
|
||||
<archetypes ID="13" building_type="primary school" reference_standard="ASHRAE 90.1-2019" climate_zone="ASHRAE_2009:6A">
|
||||
<idf>
|
||||
<path>idf_files/ASHRAE901_SchoolPrimary_STD2019_Rochester.idf</path>
|
||||
</idf>
|
||||
</archetypes>
|
||||
<archetypes ID="14" building_type="secondary school" reference_standard="ASHRAE 90.1-2019" climate_zone="ASHRAE_2009:6A">
|
||||
<idf>
|
||||
<path>idf_files/ASHRAE901_SchoolSecondary_STD2019_Rochester.idf</path>
|
||||
</idf>
|
||||
</archetypes>
|
||||
<archetypes ID="15" building_type="warehouse" reference_standard="ASHRAE 90.1-2019" climate_zone="ASHRAE_2009:6A">
|
||||
<idf>
|
||||
<path>idf_files/ASHRAE901_Warehouse_STD2019_Rochester.idf</path>
|
||||
</idf>
|
||||
</archetypes>
|
||||
</archetypes>
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user