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:
Guille Gutierrez 2023-05-31 13:55:49 -04:00
commit 909b453036
268 changed files with 57414 additions and 329783 deletions

View File

@ -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. 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. * 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. * Maximize your code coverage by ensuring that you are testing as much of your code as possible.

View File

@ -58,7 +58,7 @@ section in persistence/README.md file.
as shown below: as shown below:
```python ```python
from hub.exports.db_factory import DBFactory from hub.persistence.db_control import DBFactory
from pathlib import Path from pathlib import Path
dotenv_path = (Path(__file__).parent / '.env').resolve() dotenv_path = (Path(__file__).parent / '.env').resolve()

View File

@ -48,11 +48,11 @@ Use properties whenever it is possible. Encapsulate the access to all the calcul
```python ```python
@property @property
def object_attribute(self): def object_attribute(cls):
if self._object_attribute is None: if cls._object_attribute is None:
self._object_attribute = ... 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 ```python
@property @property
def object_changeable_attribute(self): def object_changeable_attribute(cls):
return self._object_changeable_attribute return cls._object_changeable_attribute
@object_changeable_attribute.setter @object_changeable_attribute.setter
def object_changeable_attribute(self, value): def object_changeable_attribute(cls, value):
self._object_changeable_attribute = 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 ```python
@property @property
def complex_object(self) -> ComplexObject: def complex_object(cls) -> ComplexObject:
return self._object_changeable_attribute return cls._object_changeable_attribute
def new_complex_object(self, first_param, second_param) -> ComplexObject: def new_complex_object(cls, first_param, second_param) -> ComplexObject:
other_needed_property = self.other_needed_property other_needed_property = cls.other_needed_property
return ComplexObject(first_param, second_param, 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 ```python
@property @property
def object_attribute(self): def object_attribute(cls):
return self._object_attribute return cls._object_attribute
def operation(self, first_param, second_param): def operation(cls, first_param, second_param):
return self.object_attribute * 2 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 MyClass class perform models class operations
""" """
def __init__(self): def __init__(cls):
@property @property
def object_attribute(self): def object_attribute(cls):
""" """
Get my class object attribute Get my class object attribute
:return: int :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 Multiplies object_attribute by two
:return: int :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 ```python
@property @property
def object_attribute(self): def object_attribute(cls):
""" """
Get object attribute Get object attribute
:return: int :return: int
""" """
return self._object_attribute return cls._object_attribute
@object_attribute.setter @object_attribute.setter
def object_attribute(self, value): def object_attribute(cls, value):
""" """
Set object attribute Set object attribute
:param value: int :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 ```python
@property @property
def distance(self): def distance(cls):
""" """
My class distance in meters My class distance in meters
:return: float :return: float
""" """
return self._distance return cls._distance
``` ```
#### To do's. #### To do's.

View File

View File

@ -112,16 +112,19 @@ class NrelCatalog(Catalog):
function = archetype['@building_type'] function = archetype['@building_type']
name = f"{function} {archetype['@climate_zone']} {archetype['@reference_standard']}" name = f"{function} {archetype['@climate_zone']} {archetype['@reference_standard']}"
climate_zone = archetype['@climate_zone'] climate_zone = archetype['@climate_zone']
construction_period = \ construction_period = ConstructionHelper().reference_standard_to_construction_period[
ConstructionHelper().reference_standard_to_construction_period[archetype['@reference_standard']] archetype['@reference_standard']
]
average_storey_height = float(archetype['average_storey_height']['#text']) average_storey_height = float(archetype['average_storey_height']['#text'])
thermal_capacity = float(archetype['thermal_capacity']['#text']) * 1000 thermal_capacity = float(archetype['thermal_capacity']['#text']) * 1000
extra_loses_due_to_thermal_bridges = float(archetype['extra_loses_due_to_thermal_bridges']['#text']) extra_loses_due_to_thermal_bridges = float(archetype['extra_loses_due_to_thermal_bridges']['#text'])
indirect_heated_ratio = float(archetype['indirect_heated_ratio']['#text']) indirect_heated_ratio = float(archetype['indirect_heated_ratio']['#text'])
infiltration_rate_for_ventilation_system_off = \ infiltration_rate_for_ventilation_system_off = float(
float(archetype['infiltration_rate_for_ventilation_system_off']['#text']) 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_on = float(
archetype['infiltration_rate_for_ventilation_system_on']['#text']
)
archetype_constructions = [] archetype_constructions = []
for archetype_construction in archetype['constructions']['construction']: for archetype_construction in archetype['constructions']['construction']:

View File

@ -4,26 +4,22 @@ SPDX - License - Identifier: LGPL - 3.0 - or -later
Copyright © 2022 Concordia CERC group Copyright © 2022 Concordia CERC group
Project Coder Guille Gutierrez guillermo.gutierrezmorote@concordia.ca Project Coder Guille Gutierrez guillermo.gutierrezmorote@concordia.ca
""" """
import logging
from pathlib import Path from pathlib import Path
from typing import TypeVar from typing import TypeVar
from hub.catalog_factories.construction.nrel_catalog import NrelCatalog 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.helpers.utils import validate_import_export_type
from hub.catalog_factories.construction.nrcan_catalog import NrcanCatalog from hub.catalog_factories.construction.nrcan_catalog import NrcanCatalog
Catalog = TypeVar('Catalog') Catalog = TypeVar('Catalog')
class ConstructionCatalogFactory: class ConstructionCatalogFactory:
def __init__(self, file_type, base_path=None): def __init__(self, handler, base_path=None):
if base_path is None: if base_path is None:
base_path = Path(Path(__file__).parent.parent / 'data/construction') base_path = Path(Path(__file__).parent.parent / 'data/construction')
self._catalog_type = '_' + file_type.lower() self._handler = '_' + handler.lower()
class_funcs = validate_import_export_type(ConstructionCatalogFactory) validate_import_export_type(ConstructionCatalogFactory, handler)
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._path = base_path self._path = base_path
@property @property
@ -46,4 +42,4 @@ class ConstructionCatalogFactory:
Enrich the city given to the class using the class given handler Enrich the city given to the class using the class given handler
:return: Catalog :return: Catalog
""" """
return getattr(self, self._catalog_type, lambda: None) return getattr(self, self._handler, lambda: None)

View File

View 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.operational_cost import OperationalCost
from hub.catalog_factories.data_models.cost.fuel import Fuel 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.income import Income
from hub.catalog_factories.data_models.cost.cost_helper import CostHelper
class MontrealCustomCatalog(Catalog): class MontrealCustomCatalog(Catalog):
@ -53,7 +52,6 @@ class MontrealCustomCatalog(Catalog):
def _get_capital_costs(self, entry): def _get_capital_costs(self, entry):
general_chapters = [] general_chapters = []
chapters_titles = CostHelper().chapters_in_lod1
shell = entry['B_shell'] shell = entry['B_shell']
items_list = [] items_list = []
item_type = 'B10_superstructure' item_type = 'B10_superstructure'
@ -125,9 +123,9 @@ class MontrealCustomCatalog(Catalog):
for archetype in archetypes: for archetype in archetypes:
function = archetype['@function'] function = archetype['@function']
municipality = archetype['@municipality'] municipality = archetype['@municipality']
country = 'CA'#archetype['@country'] country = archetype['@country']
lod = 0 #float(archetype['@lod']) lod = float(archetype['@lod'])
currency = 'CAD'#archetype['currency'] currency = archetype['currency']
capital_cost = self._get_capital_costs(archetype['capital_cost']) capital_cost = self._get_capital_costs(archetype['capital_cost'])
operational_cost = self._get_operational_costs(archetype['operational_cost']) operational_cost = self._get_operational_costs(archetype['operational_cost'])
end_of_life_cost = float(archetype['end_of_life_cost']['#text']) end_of_life_cost = float(archetype['end_of_life_cost']['#text'])

View File

@ -64,4 +64,3 @@ class Construction:
:return: Window :return: Window
""" """
return self._window return self._window

View 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

View File

@ -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

View 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

View File

@ -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

View File

@ -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

View File

@ -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

View 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

View File

@ -32,4 +32,3 @@ class Content:
All soils in the catalog All soils in the catalog
""" """
return self._soils return self._soils

View File

@ -5,10 +5,10 @@ Copyright © 2022 Concordia CERC group
Project Coder Guille Gutierrez guillermo.gutierrezmorote@concordia.ca 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): def __init__(self, percentage, plant_category, plant):
super().__init__(plant_category, plant) super().__init__(plant_category, plant)

View File

@ -2,7 +2,7 @@
Usage catalog domestic hot water Usage catalog domestic hot water
SPDX - License - Identifier: LGPL - 3.0 - or -later SPDX - License - Identifier: LGPL - 3.0 - or -later
Copyright © 2023 Concordia CERC group 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 from typing import Union, List

View File

@ -2,7 +2,7 @@
Usage catalog occupancy Usage catalog occupancy
SPDX - License - Identifier: LGPL - 3.0 - or -later SPDX - License - Identifier: LGPL - 3.0 - or -later
Copyright © 2022 Concordia CERC group 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 from typing import Union, List

View File

@ -73,4 +73,3 @@ class Schedule:
:return: None or [str] :return: None or [str]
""" """
return self._day_types return self._day_types

View File

@ -18,8 +18,7 @@ class ThermalControl:
hvac_availability_schedules, hvac_availability_schedules,
heating_set_point_schedules, heating_set_point_schedules,
cooling_set_point_schedules): cooling_set_point_schedules):
#todo: eliminate negative value
deltaTsetpoint=0
self._mean_heating_set_point = mean_heating_set_point self._mean_heating_set_point = mean_heating_set_point
self._heating_set_back = heating_set_back self._heating_set_back = heating_set_back
self._mean_cooling_set_point = mean_cooling_set_point self._mean_cooling_set_point = mean_cooling_set_point

View File

@ -29,7 +29,6 @@ class Usage:
self._days_year = days_year self._days_year = days_year
self._mechanical_air_change = mechanical_air_change self._mechanical_air_change = mechanical_air_change
self._ventilation_rate = ventilation_rate self._ventilation_rate = ventilation_rate
# classes
self._occupancy = occupancy self._occupancy = occupancy
self._lighting = lighting self._lighting = lighting
self._appliances = appliances self._appliances = appliances

View 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")

View File

@ -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")

View File

@ -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 SPDX - License - Identifier: LGPL - 3.0 - or -later
Copyright © 2022 Concordia CERC group Copyright © 2022 Concordia CERC group
Project Coder Pilar Monsalvete Álvarez de Uribarri pilar.monsalvete@concordia.ca Project Coder Pilar Monsalvete Álvarez de Uribarri pilar.monsalvete@concordia.ca
""" """
import logging
from pathlib import Path from pathlib import Path
from typing import TypeVar from typing import TypeVar
from hub.catalog_factories.energy_systems.nrcan_catalog import NrcanCatalog from hub.catalog_factories.energy_systems.montreal_custom_catalog import MontrealCustomCatalog
from hub.hub_logger import logger
from hub.helpers.utils import validate_import_export_type from hub.helpers.utils import validate_import_export_type
Catalog = TypeVar('Catalog') Catalog = TypeVar('Catalog')
class UsageCatalogFactory: class EnergySystemsCatalogFactory:
def __init__(self, file_type, base_path=None): def __init__(self, handler, base_path=None):
if base_path is None: if base_path is None:
base_path = Path(Path(__file__).parent.parent / 'data/energy_systems') base_path = Path(Path(__file__).parent.parent / 'data/energy_systems')
self._catalog_type = '_' + file_type.lower() self._handler = '_' + handler.lower()
class_funcs = validate_import_export_type(UsageCatalogFactory) validate_import_export_type(EnergySystemsCatalogFactory, handler)
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._path = base_path self._path = base_path
@property @property
def _nrcan(self): def _montreal_custom(self):
""" """
Retrieve NRCAN catalog Retrieve NRCAN catalog
""" """
# nrcan retrieves the data directly from github return MontrealCustomCatalog(self._path)
return NrcanCatalog(self._path)
@property @property
def catalog(self) -> Catalog: def catalog(self) -> Catalog:
@ -39,4 +34,4 @@ class UsageCatalogFactory:
Enrich the city given to the class using the class given handler Enrich the city given to the class using the class given handler
:return: Catalog :return: Catalog
""" """
return getattr(self, self._catalog_type, lambda: None) return getattr(self, self._handler, lambda: None)

View File

@ -45,7 +45,7 @@ class GreeneryCatalog(Catalog):
if plant.name == plant_percentage.plant.name: if plant.name == plant_percentage.plant.name:
plant_category = plant.category plant_category = plant.category
break 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)) vegetations.append(libs_vegetation(name, vegetation, plant_percentages))
plants = [] plants = []
for plant_category in catalog_data.plantCategories: for plant_category in catalog_data.plantCategories:

View File

@ -7,9 +7,9 @@ Project Coder Guille Gutierrez guillermo.gutierrezmorote@concordia.ca
from pathlib import Path from pathlib import Path
from typing import TypeVar from typing import TypeVar
from hub.catalog_factories.greenery.greenery_catalog import GreeneryCatalog 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') Catalog = TypeVar('Catalog')
@ -17,15 +17,10 @@ class GreeneryCatalogFactory:
""" """
GreeneryCatalogFactory class GreeneryCatalogFactory class
""" """
def __init__(self, file_type, base_path=None): def __init__(self, handler, base_path=None):
if base_path is None: if base_path is None:
base_path = Path(Path(__file__).parent.parent / 'data/greenery') base_path = (Path(__file__).parent.parent / 'data/greenery').resolve()
self._catalog_type = '_' + file_type.lower() self._handler = '_' + handler.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)
self._path = base_path self._path = base_path
@property @property
@ -42,4 +37,4 @@ class GreeneryCatalogFactory:
Enrich the city given to the class using the class given handler Enrich the city given to the class using the class given handler
:return: Catalog :return: Catalog
""" """
return getattr(self, self._catalog_type, lambda: None) return getattr(self, self._handler, lambda: None)

View File

View File

@ -4,6 +4,7 @@ SPDX - License - Identifier: LGPL - 3.0 - or -later
Copyright © 2022 Concordia CERC group Copyright © 2022 Concordia CERC group
Project Coder Guille Gutierrez guillermo.gutierrezmorote@concordia.ca Project Coder Guille Gutierrez guillermo.gutierrezmorote@concordia.ca
""" """
import io
from typing import Dict from typing import Dict
import pandas as pd import pandas as pd
@ -129,8 +130,12 @@ class ComnetCatalog(Catalog):
for usage_name in comnet_usages: for usage_name in comnet_usages:
if usage_name == 'C-13 Data Center': if usage_name == 'C-13 Data Center':
continue continue
_extracted_data = pd.read_excel(self._comnet_schedules_path, sheet_name=comnet_usages[usage_name], with open(self._comnet_schedules_path, 'rb') as xls:
skiprows=[0, 1, 2, 3], nrows=39, usecols="A:AA") _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 = {} _schedules = {}
for row in range(0, 39, 3): for row in range(0, 39, 3):
_schedule_values = {} _schedule_values = {}
@ -143,13 +148,13 @@ class ComnetCatalog(Catalog):
if day == cte.SATURDAY: if day == cte.SATURDAY:
start = start + 1 start = start + 1
end = end + 1 end = end + 1
elif day == cte.SUNDAY or day == cte.HOLIDAY: elif day in (cte.SUNDAY, cte.HOLIDAY):
start = start + 2 start = start + 2
end = end + 2 end = end + 2
_schedule_values[day] = _extracted_data.iloc[start:end, 3:27].to_numpy().tolist()[0] _schedule_values[day] = _extracted_data.iloc[start:end, 3:27].to_numpy().tolist()[0]
_schedule = [] _schedule = []
for day in _schedule_values: 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 # to celsius
if 'n.a.' in _schedule_values[day]: if 'n.a.' in _schedule_values[day]:
_schedule_values[day] = None _schedule_values[day] = None
@ -166,9 +171,13 @@ class ComnetCatalog(Catalog):
:return : Dict :return : Dict
""" """
number_usage_types = 33 number_usage_types = 33
xl_file = pd.ExcelFile(self._comnet_archetypes_path) with open(self._comnet_archetypes_path, 'rb') as xls:
file_data = pd.read_excel(xl_file, sheet_name="Modeling Data", skiprows=[0, 1, 2, 24], _extracted_data = pd.read_excel(
nrows=number_usage_types, usecols="A:AB") io.BytesIO(xls.read()),
sheet_name="Modeling Data",
skiprows=[0, 1, 2, 24],
nrows=number_usage_types, usecols="A:AB"
)
lighting_data = {} lighting_data = {}
plug_loads_data = {} plug_loads_data = {}
@ -178,7 +187,7 @@ class ComnetCatalog(Catalog):
process_data = {} process_data = {}
schedules_key = {} schedules_key = {}
for j in range(0, number_usage_types-1): 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] usage_type = usage_parameters[0]
lighting_data[usage_type] = usage_parameters[1:6].values.tolist() lighting_data[usage_type] = usage_parameters[1:6].values.tolist()
plug_loads_data[usage_type] = usage_parameters[8:13].values.tolist() plug_loads_data[usage_type] = usage_parameters[8:13].values.tolist()

View File

@ -94,8 +94,7 @@ class NrcanCatalog(Catalog):
# W/m2 # W/m2
appliances_density = space_type['electric_equipment_per_area_w_per_m2'] appliances_density = space_type['electric_equipment_per_area_w_per_m2']
# peak flow in gallons/h/m2 # peak flow in gallons/h/m2
domestic_hot_water_peak_flow = space_type['service_water_heating_peak_flow_per_area'] \ domestic_hot_water_peak_flow = space_type['service_water_heating_peak_flow_per_area'] * cte.GALLONS_TO_QUBIC_METERS / cte.HOUR_TO_SECONDS
* cte.GALLONS_TO_QUBIC_METERS / cte.HOUR_TO_SECONDS
space_types_dictionary[usage_type] = {'occupancy_per_area': occupancy_density, space_types_dictionary[usage_type] = {'occupancy_per_area': occupancy_density,
'lighting_per_area': lighting_density, 'lighting_per_area': lighting_density,
'electric_equipment_per_area': appliances_density, 'electric_equipment_per_area': appliances_density,
@ -132,8 +131,9 @@ class NrcanCatalog(Catalog):
# cfm/ft2 to m3/m2.s # cfm/ft2 to m3/m2.s
ventilation_rate = space_type['ventilation_per_area'] / (cte.METERS_TO_FEET * cte.MINUTES_TO_SECONDS) ventilation_rate = space_type['ventilation_per_area'] / (cte.METERS_TO_FEET * cte.MINUTES_TO_SECONDS)
# cfm/person to m3/m2.s # cfm/person to m3/m2.s
ventilation_rate += space_type['ventilation_per_person'] / (pow(cte.METERS_TO_FEET, 3) * cte.MINUTES_TO_SECONDS)\ ventilation_rate += space_type['ventilation_per_person'] / (
* occupancy_density pow(cte.METERS_TO_FEET, 3) * cte.MINUTES_TO_SECONDS
) * occupancy_density
lighting_radiative_fraction = space_type['lighting_fraction_radiant'] lighting_radiative_fraction = space_type['lighting_fraction_radiant']
lighting_convective_fraction = 0 lighting_convective_fraction = 0

View File

@ -4,10 +4,10 @@ SPDX - License - Identifier: LGPL - 3.0 - or -later
Copyright © 2022 Concordia CERC group Copyright © 2022 Concordia CERC group
Project Coder Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca Project Coder Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
""" """
import sys
import hub.helpers.constants as cte
from typing import Dict from typing import Dict
import hub.helpers.constants as cte
class UsageHelper: class UsageHelper:
""" """
@ -17,8 +17,8 @@ class UsageHelper:
'Lighting': cte.LIGHTING, 'Lighting': cte.LIGHTING,
'Occupancy': cte.OCCUPANCY, 'Occupancy': cte.OCCUPANCY,
'Equipment': cte.APPLIANCES, 'Equipment': cte.APPLIANCES,
'Thermostat Setpoint Cooling': cte.COOLING_SET_POINT, # Compose 'Thermostat Setpoint' + 'Cooling' 'Thermostat Setpoint Cooling': cte.COOLING_SET_POINT,
'Thermostat Setpoint Heating': cte.HEATING_SET_POINT, # Compose 'Thermostat Setpoint' + 'Heating' 'Thermostat Setpoint Heating': cte.HEATING_SET_POINT,
'Fan': cte.HVAC_AVAILABILITY, 'Fan': cte.HVAC_AVAILABILITY,
'Service Water Heating': cte.DOMESTIC_HOT_WATER 'Service Water Heating': cte.DOMESTIC_HOT_WATER
} }
@ -92,41 +92,49 @@ class UsageHelper:
@property @property
def nrcan_day_type_to_hub_days(self): 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 return self._nrcan_day_type_to_hub_days
@property @property
def nrcan_schedule_type_to_hub_schedule_type(self): 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 return self._nrcan_schedule_type_to_hub_schedule_type
@property @property
def nrcan_data_type_to_hub_data_type(self): 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 return self._nrcan_data_type_to_hub_data_type
@property @property
def nrcan_time_to_hub_time(self): def nrcan_time_to_hub_time(self):
"""
Get a dictionary to convert nrcan time to hub time
"""
return self._nrcan_time_to_hub_time return self._nrcan_time_to_hub_time
@property @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 return self._comnet_data_type_to_hub_data_type
@property @property
def comnet_schedules_key_to_comnet_schedules(self) -> Dict: 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 return self._comnet_schedules_key_to_comnet_schedules
@property @property
def comnet_days(self): def comnet_days(self) -> [str]:
"""
Get the list of days used in comnet
"""
return self._comnet_days 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')

View File

@ -4,26 +4,22 @@ SPDX - License - Identifier: LGPL - 3.0 - or -later
Copyright © 2022 Concordia CERC group Copyright © 2022 Concordia CERC group
Project Coder Guille Gutierrez guillermo.gutierrezmorote@concordia.ca Project Coder Guille Gutierrez guillermo.gutierrezmorote@concordia.ca
""" """
import logging
from pathlib import Path from pathlib import Path
from typing import TypeVar from typing import TypeVar
from hub.catalog_factories.usage.comnet_catalog import ComnetCatalog from hub.catalog_factories.usage.comnet_catalog import ComnetCatalog
from hub.catalog_factories.usage.nrcan_catalog import NrcanCatalog from hub.catalog_factories.usage.nrcan_catalog import NrcanCatalog
from hub.hub_logger import logger
from hub.helpers.utils import validate_import_export_type from hub.helpers.utils import validate_import_export_type
Catalog = TypeVar('Catalog') Catalog = TypeVar('Catalog')
class UsageCatalogFactory: class UsageCatalogFactory:
def __init__(self, file_type, base_path=None): def __init__(self, handler, base_path=None):
if base_path is None: if base_path is None:
base_path = Path(Path(__file__).parent.parent / 'data/usage') base_path = Path(Path(__file__).parent.parent / 'data/usage')
self._catalog_type = '_' + file_type.lower() self._catalog_type = '_' + handler.lower()
class_funcs = validate_import_export_type(UsageCatalogFactory) validate_import_export_type(UsageCatalogFactory, handler)
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._path = base_path self._path = base_path
@property @property

View File

View File

@ -45,14 +45,13 @@ class Plane:
:return: (A, B, C, D) :return: (A, B, C, D)
""" """
if self._equation is None: if self._equation is None:
a = self.normal[0] a = self.normal[0]
b = self.normal[1] b = self.normal[1]
c = self.normal[2] c = self.normal[2]
d = ((-1 * self.origin.coordinates[0]) * self.normal[0]) d = -1 * self.origin.coordinates[0] * self.normal[0]
d += ((-1 * self.origin.coordinates[1]) * self.normal[1]) d += -1 * self.origin.coordinates[1] * self.normal[1]
d += ((-1 * self.origin.coordinates[2]) * self.normal[2]) d += -1 * self.origin.coordinates[2] * self.normal[2]
self._equation = (a, b, c, d) self._equation = a, b, c, d
return self._equation return self._equation
def distance_to_point(self, point): def distance_to_point(self, point):

View File

@ -31,7 +31,7 @@ class Point:
:return: float :return: float
""" """
power = 0 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) power += math.pow(other_point.coordinates[dimension]-self.coordinates[dimension], 2)
distance = math.sqrt(power) distance = math.sqrt(power)
return distance return distance

View File

@ -6,20 +6,21 @@ Project Coder Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
""" """
from __future__ import annotations from __future__ import annotations
import logging
import math import math
import sys import sys
from typing import List from typing import List
from hub.hub_logger import logger
import numpy as np import numpy as np
from trimesh import Trimesh
import trimesh.intersections
import trimesh.creation import trimesh.creation
import trimesh.geometry import trimesh.geometry
import trimesh.intersections
from shapely.geometry.polygon import Polygon as shapley_polygon 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.plane import Plane
from hub.city_model_structure.attributes.point import Point from hub.city_model_structure.attributes.point import Point
import hub.helpers.constants as cte
class Polygon: class Polygon:
@ -69,44 +70,6 @@ class Polygon:
""" """
return self._coordinates 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 @property
def points_list(self) -> np.ndarray: def points_list(self) -> np.ndarray:
""" """
@ -142,12 +105,12 @@ class Polygon:
if self._area is None: if self._area is None:
self._area = 0 self._area = 0
for triangle in self.triangles: for triangle in self.triangles:
ab = np.zeros(3) a_b = np.zeros(3)
ac = np.zeros(3) a_c = np.zeros(3)
for i in range(0, 3): for i in range(0, 3):
ab[i] = triangle.coordinates[1][i] - triangle.coordinates[0][i] a_b[i] = triangle.coordinates[1][i] - triangle.coordinates[0][i]
ac[i] = triangle.coordinates[2][i] - triangle.coordinates[0][i] a_c[i] = triangle.coordinates[2][i] - triangle.coordinates[0][i]
self._area += np.linalg.norm(np.cross(ab, ac)) / 2 self._area += np.linalg.norm(np.cross(a_b, a_c)) / 2
return self._area return self._area
@area.setter @area.setter
@ -217,7 +180,11 @@ class Polygon:
return -alpha return -alpha
@staticmethod @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_x = 1e16
min_y = 1e16 min_y = 1e16
min_z = 1e16 min_z = 1e16
@ -246,7 +213,8 @@ class Polygon:
polygon = shapley_polygon(coordinates) polygon = shapley_polygon(coordinates)
try: 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) mesh = Trimesh(vertices=vertices, faces=faces)
# check orientation # check orientation
@ -262,18 +230,20 @@ class Polygon:
new_face.append(face[len(face)-i-1]) new_face.append(face[len(face)-i-1])
new_faces.append(new_face) new_faces.append(new_face)
mesh = Trimesh(vertices=vertices, faces=new_faces) mesh = Trimesh(vertices=vertices, faces=new_faces)
return mesh return mesh
except ValueError: except ValueError:
logger.error(f'Not able to triangulate polygon\n') logging.error('Not able to triangulate polygon\n')
sys.stderr.write(f'Not able to triangulate polygon\n')
_vertices = [[0, 0, 0], [0, 0, 1], [0, 1, 0]] _vertices = [[0, 0, 0], [0, 0, 1], [0, 1, 0]]
_faces = [[0, 1, 2]] _faces = [[0, 1, 2]]
return Trimesh(vertices=_vertices, faces=_faces) return Trimesh(vertices=_vertices, faces=_faces)
@property @property
def triangles(self) -> List[Polygon]: def triangles(self) -> List[Polygon]:
"""
Triangulate the polygon and return a list of triangular polygons
:return: [Polygon]
"""
if self._triangles is None: if self._triangles is None:
self._triangles = [] self._triangles = []
_mesh = self.triangle_mesh(self.coordinates, self.normal) _mesh = self.triangle_mesh(self.coordinates, self.normal)
@ -336,7 +306,7 @@ class Polygon:
def _reshape(self, triangles) -> Polygon: def _reshape(self, triangles) -> Polygon:
edges_list = [] edges_list = []
for i in range(0, len(triangles)): for i in enumerate(triangles):
for edge in triangles[i].edges: for edge in triangles[i].edges:
if not self._edge_in_edges_list(edge, edges_list): if not self._edge_in_edges_list(edge, edges_list):
edges_list.append(edge) edges_list.append(edge)
@ -421,7 +391,8 @@ class Polygon:
if len(points) != 3: if len(points) != 3:
sub_polygons = polygon.triangles sub_polygons = polygon.triangles
# todo: I modified this! To be checked @Guille # 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: for sub_polygon in sub_polygons:
face = [] face = []
points = sub_polygon.coordinates points = sub_polygon.coordinates
@ -440,7 +411,7 @@ class Polygon:
:return: int :return: int
""" """
vertices = self.vertices vertices = self.vertices
for i in range(len(vertices)): for i in enumerate(vertices):
# ensure not duplicated vertex # ensure not duplicated vertex
power = 0 power = 0
vertex2 = vertices[i] vertex2 = vertices[i]

View File

@ -41,10 +41,10 @@ class Polyhedron:
:return: int :return: int
""" """
vertices = self.vertices vertices = self.vertices
for i in range(len(vertices)): for i, vertex in enumerate(vertices):
# ensure not duplicated vertex # ensure not duplicated vertex
power = 0 power = 0
vertex2 = vertices[i] vertex2 = vertex
for dimension in range(0, 3): for dimension in range(0, 3):
power += math.pow(vertex2[dimension] - point[dimension], 2) power += math.pow(vertex2[dimension] - point[dimension], 2)
distance = math.sqrt(power) distance = math.sqrt(power)
@ -92,8 +92,8 @@ class Polyhedron:
points = polygon.coordinates points = polygon.coordinates
if len(points) != 3: if len(points) != 3:
sub_polygons = polygon.triangles 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: for sub_polygon in sub_polygons:
face = [] face = []
points = sub_polygon.coordinates points = sub_polygon.coordinates

View File

@ -6,27 +6,31 @@ Project Coder Guille Gutierrez guillermo.gutierrezmorote@concordia.ca
Code contributors: Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca Code contributors: Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
""" """
import sys import logging
from typing import List, Union from typing import List, Union, TypeVar
import numpy as np import numpy as np
import pandas as pd import pandas as pd
from hub.hub_logger import logger
import hub.helpers.constants as cte import hub.helpers.constants as cte
import hub.helpers.peak_loads as pl 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.building_demand.household import Household 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.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): class Building(CityObject):
""" """
Building(CityObject) class 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) super().__init__(name, surfaces)
self._city = city
self._households = None self._households = None
self._basement_heated = None self._basement_heated = None
self._attic_heated = None self._attic_heated = None
@ -39,15 +43,22 @@ class Building(CityObject):
self._roof_type = None self._roof_type = None
self._internal_zones = None self._internal_zones = None
self._shell = None self._shell = None
self._alias = None self._aliases = None
self._type = 'building' self._type = 'building'
self._cold_water_temperature = dict() self._cold_water_temperature = {}
self._heating = dict() self._heating = {}
self._cooling = dict() self._cooling = {}
self._lighting_electrical_demand = dict() self._lighting_electrical_demand = {}
self._appliances_electrical_demand = dict() self._appliances_electrical_demand = {}
self._domestic_hot_water_heat_demand = dict() 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._eave_height = None
self._energy_systems = None
self._systems_archetype_name = None
self._grounds = [] self._grounds = []
self._roofs = [] self._roofs = []
self._walls = [] self._walls = []
@ -75,8 +86,8 @@ class Building(CityObject):
elif surface.type == cte.INTERIOR_SLAB: elif surface.type == cte.INTERIOR_SLAB:
self._interior_slabs.append(surface) self._interior_slabs.append(surface)
else: else:
logger.error(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'
sys.stderr.write(f'Building {self.name} [alias {self.alias}] has an unexpected surface type {surface.type}.\n') logging.error(error)
@property @property
def shell(self) -> Polyhedron: def shell(self) -> Polyhedron:
@ -193,14 +204,6 @@ class Building(CityObject):
if value is not None: if value is not None:
self._basement_heated = int(value) 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 @property
def year_of_construction(self): def year_of_construction(self):
""" """
@ -258,6 +261,9 @@ class Building(CityObject):
Get building storeys number above ground Get building storeys number above ground
:return: None or int :return: None or int
""" """
if self._storeys_above_ground is None:
if self.eave_height is not None and self.average_storey_height is not None:
self._storeys_above_ground = int(self.eave_height / self.average_storey_height)
return self._storeys_above_ground return self._storeys_above_ground
@storeys_above_ground.setter @storeys_above_ground.setter
@ -366,33 +372,38 @@ class Building(CityObject):
self._domestic_hot_water_heat_demand = value self._domestic_hot_water_heat_demand = value
@property @property
def heating_peak_load(self) -> dict: def heating_peak_load(self) -> Union[None, dict]:
""" """
Get heating peak load in W Get heating peak load in W
:return: dict{DataFrame(float)} :return: dict{DataFrame(float)}
""" """
results = {} results = {}
if cte.HOUR in self.heating: 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: else:
monthly_values = pl.heating_peak_loads_from_methodology(self) monthly_values = PeakLoads(self).heating_peak_loads_from_methodology
results[cte.MONTH] = pd.DataFrame(monthly_values, columns=['heating peak loads']) if monthly_values is None:
results[cte.YEAR] = pd.DataFrame([max(monthly_values)], columns=['heating peak loads']) 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 return results
@property @property
def cooling_peak_load(self) -> dict: def cooling_peak_load(self) -> Union[None, dict]:
""" """
Get cooling peak load in W Get cooling peak load in W
:return: dict{DataFrame(float)} :return: dict{DataFrame(float)}
""" """
results = {} results = {}
if cte.HOUR in self.cooling: 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: else:
monthly_values = pl.cooling_peak_loads_from_methodology(self) monthly_values = PeakLoads(self).cooling_peak_loads_from_methodology
results[cte.MONTH] = pd.DataFrame(monthly_values, columns=['cooling peak loads']) if monthly_values is None:
results[cte.YEAR] = pd.DataFrame([max(monthly_values)], columns=['cooling peak loads']) 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 return results
@property @property
@ -467,19 +478,38 @@ class Building(CityObject):
return False return False
@property @property
def alias(self): def aliases(self):
""" """
Get the alias name for the building Get the alias name for the building
:return: str :return: str
""" """
return self._alias return self._aliases
@alias.setter def add_alias(self, value):
def 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 @property
def usages_percentage(self): def usages_percentage(self):
@ -488,6 +518,207 @@ class Building(CityObject):
""" """
_usage = '' _usage = ''
for internal_zone in self.internal_zones: for internal_zone in self.internal_zones:
if internal_zone.usages is None:
continue
for usage in internal_zone.usages: for usage in internal_zone.usages:
_usage = f'{_usage}{usage.name}_{usage.percentage} ' _usage = f'{_usage}{usage.name}_{usage.percentage} '
return _usage.rstrip() 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

View File

@ -7,9 +7,11 @@ Code contributors: Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concord
""" """
from __future__ import annotations from __future__ import annotations
import math
import uuid import uuid
import numpy as np
from typing import List, Union from typing import List, Union
import numpy as np
from hub.city_model_structure.attributes.polygon import Polygon from hub.city_model_structure.attributes.polygon import Polygon
from hub.city_model_structure.attributes.plane import Plane from hub.city_model_structure.attributes.plane import Plane
from hub.city_model_structure.attributes.point import Point from hub.city_model_structure.attributes.point import Point
@ -32,7 +34,7 @@ class Surface:
self._area = None self._area = None
self._lower_corner = None self._lower_corner = None
self._upper_corner = None self._upper_corner = None
self._global_irradiance = dict() self._global_irradiance = {}
self._perimeter_polygon = perimeter_polygon self._perimeter_polygon = perimeter_polygon
self._holes_polygons = holes_polygons self._holes_polygons = holes_polygons
self._solid_polygon = solid_polygon self._solid_polygon = solid_polygon
@ -42,6 +44,7 @@ class Surface:
self._associated_thermal_boundaries = [] self._associated_thermal_boundaries = []
self._vegetation = None self._vegetation = None
self._percentage_shared = None self._percentage_shared = None
self._solar_collectors_area_reduction_factor = None
@property @property
def name(self): def name(self):
@ -134,7 +137,7 @@ class Surface:
@property @property
def azimuth(self): def azimuth(self):
""" """
Get surface azimuth in radians Get surface azimuth in radians (north = 0)
:return: float :return: float
""" """
if self._azimuth is None: if self._azimuth is None:
@ -145,7 +148,7 @@ class Surface:
@property @property
def inclination(self): def inclination(self):
""" """
Get surface inclination in radians Get surface inclination in radians (zenith = 0, horizon = pi/2)
:return: float :return: float
""" """
if self._inclination is None: if self._inclination is None:
@ -161,10 +164,12 @@ class Surface:
:return: str :return: str
""" """
if self._type is None: if self._type is None:
grad = np.rad2deg(self.inclination) inclination_cos = math.cos(self.inclination)
if grad >= 170: # 170 degrees
if inclination_cos <= -0.98:
self._type = 'Ground' self._type = 'Ground'
elif 80 <= grad <= 100: # between 80 and 100 degrees
elif abs(inclination_cos) <= 0.17:
self._type = 'Wall' self._type = 'Wall'
else: else:
self._type = 'Roof' self._type = 'Roof'
@ -346,3 +351,36 @@ class Surface:
:param value: float :param value: float
""" """
self._percentage_shared = value 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

View File

@ -226,7 +226,7 @@ class ThermalBoundary:
r_value += float(layer.thickness) / float(layer.material.conductivity) r_value += float(layer.thickness) / float(layer.material.conductivity)
self._u_value = 1.0/r_value self._u_value = 1.0/r_value
except TypeError: except TypeError:
raise Exception('Constructions layers are not initialized') from TypeError raise TypeError('Constructions layers are not initialized') from TypeError
return self._u_value return self._u_value
@u_value.setter @u_value.setter

View File

@ -8,8 +8,9 @@ Code contributors: Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concord
import uuid import uuid
import copy import copy
import numpy
from typing import List, Union, TypeVar 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.occupancy import Occupancy
from hub.city_model_structure.building_demand.appliances import Appliances from hub.city_model_structure.building_demand.appliances import Appliances
from hub.city_model_structure.building_demand.lighting import Lighting from hub.city_model_structure.building_demand.lighting import Lighting
@ -59,7 +60,11 @@ class ThermalZone:
@property @property
def usages(self): 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: if self._usage_from_parent:
self._usages = copy.deepcopy(self._parent_internal_zone.usages) self._usages = copy.deepcopy(self._parent_internal_zone.usages)
else: else:
@ -324,19 +329,19 @@ class ThermalZone:
_occupancy_reference = self.usages[0].occupancy _occupancy_reference = self.usages[0].occupancy
if _occupancy_reference.occupancy_schedules is not None: if _occupancy_reference.occupancy_schedules is not None:
_schedules = [] _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 = Schedule()
schedule.type = _occupancy_reference.occupancy_schedules[i_schedule].type schedule.type = schedule_value.type
schedule.day_types = _occupancy_reference.occupancy_schedules[i_schedule].day_types schedule.day_types = schedule_value.day_types
schedule.data_type = _occupancy_reference.occupancy_schedules[i_schedule].data_type schedule.data_type = schedule_value.data_type
schedule.time_step = _occupancy_reference.occupancy_schedules[i_schedule].time_step schedule.time_step = schedule_value.time_step
schedule.time_range = _occupancy_reference.occupancy_schedules[i_schedule].time_range schedule.time_range = schedule_value.time_range
new_values = [] 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 _new_value = 0
for usage in self.usages: 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) new_values.append(_new_value)
schedule.values = new_values schedule.values = new_values
_schedules.append(schedule) _schedules.append(schedule)
@ -363,12 +368,15 @@ class ThermalZone:
return None return None
_lighting_density += usage.percentage * usage.lighting.density _lighting_density += usage.percentage * usage.lighting.density
if usage.lighting.convective_fraction is not None: if usage.lighting.convective_fraction is not None:
_convective_part += usage.percentage * usage.lighting.density \ _convective_part += (
* usage.lighting.convective_fraction usage.percentage * usage.lighting.density * usage.lighting.convective_fraction
_radiative_part += usage.percentage * usage.lighting.density \ )
* usage.lighting.radiative_fraction _radiative_part += (
_latent_part += usage.percentage * usage.lighting.density \ usage.percentage * usage.lighting.density * usage.lighting.radiative_fraction
* usage.lighting.latent_fraction )
_latent_part += (
usage.percentage * usage.lighting.density * usage.lighting.latent_fraction
)
self._lighting.density = _lighting_density self._lighting.density = _lighting_density
if _lighting_density > 0: if _lighting_density > 0:
self._lighting.convective_fraction = _convective_part / _lighting_density self._lighting.convective_fraction = _convective_part / _lighting_density
@ -382,19 +390,19 @@ class ThermalZone:
_lighting_reference = self.usages[0].lighting _lighting_reference = self.usages[0].lighting
if _lighting_reference.schedules is not None: if _lighting_reference.schedules is not None:
_schedules = [] _schedules = []
for i_schedule in range(0, len(_lighting_reference.schedules)): for schedule_index, schedule_value in enumerate(_lighting_reference.schedules):
schedule = Schedule() schedule = Schedule()
schedule.type = _lighting_reference.schedules[i_schedule].type schedule.type = schedule_value.type
schedule.day_types = _lighting_reference.schedules[i_schedule].day_types schedule.day_types = schedule_value.day_types
schedule.data_type = _lighting_reference.schedules[i_schedule].data_type schedule.data_type = schedule_value.data_type
schedule.time_step = _lighting_reference.schedules[i_schedule].time_step schedule.time_step = schedule_value.time_step
schedule.time_range = _lighting_reference.schedules[i_schedule].time_range schedule.time_range = schedule_value.time_range
new_values = [] 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 _new_value = 0
for usage in self.usages: 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) new_values.append(_new_value)
schedule.values = new_values schedule.values = new_values
_schedules.append(schedule) _schedules.append(schedule)
@ -421,12 +429,15 @@ class ThermalZone:
return None return None
_appliances_density += usage.percentage * usage.appliances.density _appliances_density += usage.percentage * usage.appliances.density
if usage.appliances.convective_fraction is not None: if usage.appliances.convective_fraction is not None:
_convective_part += usage.percentage * usage.appliances.density \ _convective_part += (
* usage.appliances.convective_fraction usage.percentage * usage.appliances.density * usage.appliances.convective_fraction
_radiative_part += usage.percentage * usage.appliances.density \ )
* usage.appliances.radiative_fraction _radiative_part += (
_latent_part += usage.percentage * usage.appliances.density \ usage.percentage * usage.appliances.density * usage.appliances.radiative_fraction
* usage.appliances.latent_fraction )
_latent_part += (
usage.percentage * usage.appliances.density * usage.appliances.latent_fraction
)
self._appliances.density = _appliances_density self._appliances.density = _appliances_density
if _appliances_density > 0: if _appliances_density > 0:
self._appliances.convective_fraction = _convective_part / _appliances_density self._appliances.convective_fraction = _convective_part / _appliances_density
@ -440,19 +451,19 @@ class ThermalZone:
_appliances_reference = self.usages[0].appliances _appliances_reference = self.usages[0].appliances
if _appliances_reference.schedules is not None: if _appliances_reference.schedules is not None:
_schedules = [] _schedules = []
for i_schedule in range(0, len(_appliances_reference.schedules)): for schedule_index, schedule_value in enumerate(_appliances_reference.schedules):
schedule = Schedule() schedule = Schedule()
schedule.type = _appliances_reference.schedules[i_schedule].type schedule.type = schedule_value.type
schedule.day_types = _appliances_reference.schedules[i_schedule].day_types schedule.day_types = schedule_value.day_types
schedule.data_type = _appliances_reference.schedules[i_schedule].data_type schedule.data_type = schedule_value.data_type
schedule.time_step = _appliances_reference.schedules[i_schedule].time_step schedule.time_step = schedule_value.time_step
schedule.time_range = _appliances_reference.schedules[i_schedule].time_range schedule.time_range = schedule_value.time_range
new_values = [] 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 _new_value = 0
for usage in self.usages: 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) new_values.append(_new_value)
schedule.values = new_values schedule.values = new_values
_schedules.append(schedule) _schedules.append(schedule)
@ -486,12 +497,15 @@ class ThermalZone:
for usage in self.usages: for usage in self.usages:
for internal_gain in usage.internal_gains: for internal_gain in usage.internal_gains:
_average_internal_gain += internal_gain.average_internal_gain * usage.percentage _average_internal_gain += internal_gain.average_internal_gain * usage.percentage
_convective_fraction += internal_gain.average_internal_gain * usage.percentage \ _convective_fraction += (
* internal_gain.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 _radiative_fraction += (
_latent_fraction += internal_gain.average_internal_gain * usage.percentage \ internal_gain.average_internal_gain * usage.percentage * internal_gain.radiative_fraction
* internal_gain.latent_fraction )
_latent_fraction += (
internal_gain.average_internal_gain * usage.percentage * internal_gain.latent_fraction
)
for usage in self.usages: for usage in self.usages:
for internal_gain in usage.internal_gains: for internal_gain in usage.internal_gains:
if internal_gain.schedules is None: if internal_gain.schedules is None:
@ -501,12 +515,12 @@ class ThermalZone:
_schedules_defined = False _schedules_defined = False
break break
for day, _schedule in enumerate(internal_gain.schedules): for day, _schedule in enumerate(internal_gain.schedules):
for v, value in enumerate(_schedule.values): for v_index, value in enumerate(_schedule.values):
values[v, day] += value * usage.percentage values[v_index, day] += value * usage.percentage
if _schedules_defined: if _schedules_defined:
_schedules = [] _schedules = []
for day in range(0, len(_days)): for day, _ in enumerate(_days):
_schedule = copy.deepcopy(_base_schedule) _schedule = copy.deepcopy(_base_schedule)
_schedule.day_types = [_days[day]] _schedule.day_types = [_days[day]]
_schedule.values = values[:day] _schedule.values = values[:day]
@ -534,7 +548,8 @@ class ThermalZone:
if self.usages is None: if self.usages is None:
return None return None
if self._thermal_control is None: if self._thermal_control is not None:
return self._thermal_control
self._thermal_control = ThermalControl() self._thermal_control = ThermalControl()
_mean_heating_set_point = 0 _mean_heating_set_point = 0
_heating_set_back = 0 _heating_set_back = 0
@ -556,19 +571,19 @@ class ThermalZone:
if _thermal_control_reference.cooling_set_point_schedules is not None: 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]) _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 = [] _schedules = []
_schedule_type = _types_reference[i_type][1] _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 = Schedule()
schedule.type = _schedule_type[i_schedule].type schedule.type = schedule_value.type
schedule.day_types = _schedule_type[i_schedule].day_types schedule.day_types = schedule_value.day_types
schedule.data_type = _schedule_type[i_schedule].data_type schedule.data_type = schedule_value.data_type
schedule.time_step = _schedule_type[i_schedule].time_step schedule.time_step = schedule_value.time_step
schedule.time_range = _schedule_type[i_schedule].time_range schedule.time_range = schedule_value.time_range
new_values = [] 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 _new_value = 0
for usage in self.usages: for usage in self.usages:
if _types_reference[i_type][0] == cte.HVAC_AVAILABILITY: if _types_reference[i_type][0] == cte.HVAC_AVAILABILITY:
@ -589,7 +604,6 @@ class ThermalZone:
self._thermal_control.heating_set_point_schedules = _schedules self._thermal_control.heating_set_point_schedules = _schedules
elif i_type == 2: elif i_type == 2:
self._thermal_control.cooling_set_point_schedules = _schedules self._thermal_control.cooling_set_point_schedules = _schedules
return self._thermal_control return self._thermal_control
@property @property
@ -613,19 +627,19 @@ class ThermalZone:
_domestic_hot_water_reference = self.usages[0].domestic_hot_water _domestic_hot_water_reference = self.usages[0].domestic_hot_water
if _domestic_hot_water_reference.schedules is not None: if _domestic_hot_water_reference.schedules is not None:
_schedules = [] _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 = Schedule()
schedule.type = _domestic_hot_water_reference.schedules[i_schedule].type schedule.type = schedule_value.type
schedule.day_types = _domestic_hot_water_reference.schedules[i_schedule].day_types schedule.day_types = schedule_value.day_types
schedule.data_type = _domestic_hot_water_reference.schedules[i_schedule].data_type schedule.data_type = schedule_value.data_type
schedule.time_step = _domestic_hot_water_reference.schedules[i_schedule].time_step schedule.time_step = schedule_value.time_step
schedule.time_range = _domestic_hot_water_reference.schedules[i_schedule].time_range schedule.time_range = schedule_value.time_range
new_values = [] 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 _new_value = 0
for usage in self.usages: 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) new_values.append(_new_value)
schedule.values = new_values schedule.values = new_values
_schedules.append(schedule) _schedules.append(schedule)

View File

@ -8,28 +8,27 @@ Code contributors: Peter Yefi peteryefi@gmail.com
from __future__ import annotations from __future__ import annotations
import bz2 import bz2
import sys
import pickle
import math
import copy import copy
import pyproj import logging
from typing import List, Union import math
from pyproj import Transformer import pickle
from pathlib import Path 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.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_object import CityObject
from hub.city_model_structure.city_objects_cluster import CityObjectsCluster from hub.city_model_structure.city_objects_cluster import CityObjectsCluster
from hub.city_model_structure.buildings_cluster import BuildingsCluster from hub.city_model_structure.energy_system import EnergySystem
from hub.city_model_structure.fuel import Fuel
from hub.city_model_structure.iot.station import Station from hub.city_model_structure.iot.station import Station
from hub.city_model_structure.level_of_detail import LevelOfDetail 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.city_model_structure.parts_consisting_building import PartsConsistingBuilding
from hub.helpers.geometry_helper import GeometryHelper from hub.helpers.geometry_helper import GeometryHelper
from hub.helpers.location import Location 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: class City:
@ -61,34 +60,20 @@ class City:
self._lca_materials = None self._lca_materials = None
self._level_of_detail = LevelOfDetail() self._level_of_detail = LevelOfDetail()
self._city_objects_dictionary = {} self._city_objects_dictionary = {}
self._city_objects_alias_dictionary = {}
@property self._energy_systems_connection_table = None
def fuels(self) -> [Fuel]: self._generic_energy_systems = None
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
def _get_location(self) -> Location: def _get_location(self) -> Location:
if self._location is None: if self._location is None:
gps = pyproj.CRS('EPSG:4326') # LatLon with WGS84 datum used by GPS units and Google Earth gps = pyproj.CRS('EPSG:4326') # LatLon with WGS84 datum used by GPS units and Google Earth
try: 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] self._srs_name = GeometryHelper.srs_transformations[self._srs_name]
input_reference = pyproj.CRS(self.srs_name) # Projected coordinate system from input data input_reference = pyproj.CRS(self.srs_name) # Projected coordinate system from input data
except pyproj.exceptions.CRSError: except pyproj.exceptions.CRSError as err:
sys.stderr.write('Invalid projection reference system, please check the input data. ' logging.error('Invalid projection reference system, please check the input data.')
'(e.g. in CityGML files: srs_name)\n') raise pyproj.exceptions.CRSError from err
sys.exit()
transformer = Transformer.from_crs(input_reference, gps) transformer = Transformer.from_crs(input_reference, gps)
coordinates = transformer.transform(self.lower_corner[0], self.lower_corner[1]) coordinates = transformer.transform(self.lower_corner[0], self.lower_corner[1])
self._location = GeometryHelper.get_location(coordinates[0], coordinates[1]) self._location = GeometryHelper.get_location(coordinates[0], coordinates[1])
@ -103,7 +88,11 @@ class City:
return self._get_location().country return self._get_location().country
@property @property
def location(self): def location(self) -> Location:
"""
Get city location
:return: Location
"""
return self._get_location().city return self._get_location().city
@property @property
@ -204,6 +193,27 @@ class City:
return self.buildings[self._city_objects_dictionary[name]] return self.buildings[self._city_objects_dictionary[name]]
return None 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): def add_city_object(self, new_city_object):
""" """
Add a CityObject to the city Add a CityObject to the city
@ -215,6 +225,12 @@ class City:
self._buildings = [] self._buildings = []
self._buildings.append(new_city_object) self._buildings.append(new_city_object)
self._city_objects_dictionary[new_city_object.name] = len(self._buildings) - 1 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': elif new_city_object.type == 'energy_system':
if self._energy_systems is None: if self._energy_systems is None:
self._energy_systems = [] self._energy_systems = []
@ -230,15 +246,21 @@ class City:
""" """
if city_object.type != 'building': if city_object.type != 'building':
raise NotImplementedError(city_object.type) raise NotImplementedError(city_object.type)
if self._buildings is None or self._buildings == []: if not self._buildings:
sys.stderr.write('Warning: impossible to remove city_object, the city is empty\n') logging.warning('impossible to remove city_object, the city is empty\n')
else: else:
if city_object in self._buildings: if city_object in self._buildings:
self._buildings.remove(city_object) self._buildings.remove(city_object)
# regenerate hash map # regenerate hash map
self._city_objects_dictionary.clear() self._city_objects_dictionary.clear()
for i, city_object in enumerate(self._buildings): self._city_objects_alias_dictionary.clear()
self._city_objects_dictionary[city_object.name] = i 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 @property
def srs_name(self) -> Union[None, str]: def srs_name(self) -> Union[None, str]:
@ -282,8 +304,8 @@ class City:
:param city_filename: destination city filename :param city_filename: destination city filename
:return: None :return: None
""" """
with bz2.BZ2File(city_filename, 'wb') as f: with bz2.BZ2File(city_filename, 'wb') as file:
pickle.dump(self, f) pickle.dump(self, file)
def region(self, center, radius) -> City: def region(self, center, radius) -> City:
""" """
@ -420,31 +442,6 @@ class City:
else: else:
raise NotImplementedError 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 @property
def copy(self) -> City: def copy(self) -> City:
""" """
@ -453,34 +450,11 @@ class City:
return copy.deepcopy(self) return copy.deepcopy(self)
def merge(self, city) -> City: def merge(self, city) -> City:
_merge_city = self.copy """
selected_city_object = None Return a merged city combining the current city and the given one
building = None :return: City
# set initial minimum radiation to a higher number """
min_radiation = 1999999 raise NotImplementedError('This method needs to be reimplemented')
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
@property @property
def level_of_detail(self) -> LevelOfDetail: def level_of_detail(self) -> LevelOfDetail:
@ -490,4 +464,36 @@ class City:
""" """
return self._level_of_detail 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

View File

@ -8,6 +8,7 @@ Project Coder Guille Gutierrez guillermo.gutierrezmorote@concordia.ca
from __future__ import annotations from __future__ import annotations
from typing import List, Union 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.iot.sensor import Sensor
from hub.city_model_structure.building_demand.surface import Surface from hub.city_model_structure.building_demand.surface import Surface
from hub.city_model_structure.attributes.polyhedron import Polyhedron from hub.city_model_structure.attributes.polyhedron import Polyhedron
@ -21,6 +22,7 @@ class CityObject:
""" """
def __init__(self, name, surfaces): def __init__(self, name, surfaces):
self._name = name self._name = name
self._level_of_detail = LevelOfDetail()
self._surfaces = surfaces self._surfaces = surfaces
self._type = None self._type = None
self._city_object_lower_corner = None self._city_object_lower_corner = None
@ -35,14 +37,22 @@ class CityObject:
self._max_z = ConfigurationHelper().min_coordinate self._max_z = ConfigurationHelper().min_coordinate
self._centroid = None self._centroid = None
self._volume = None self._volume = None
self._external_temperature = dict() self._external_temperature = {}
self._ground_temperature = dict() self._ground_temperature = {}
self._global_horizontal = dict() self._global_horizontal = {}
self._diffuse = dict() self._diffuse = {}
self._beam = dict() self._beam = {}
self._sensors = [] self._sensors = []
self._neighbours = None 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 @property
def name(self): def name(self):
""" """

View 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

View File

@ -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

View 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

View 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

View 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

View File

@ -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

View File

@ -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

View 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

View File

@ -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

View File

@ -46,7 +46,7 @@ class HeatPump:
@hp_monthly_fossil_consumption.setter @hp_monthly_fossil_consumption.setter
def hp_monthly_fossil_consumption(self, value): def hp_monthly_fossil_consumption(self, value):
if type(value) is Series: if isinstance(value, Series):
self._hp_monthly_fossil_consumption = value self._hp_monthly_fossil_consumption = value
@property @property
@ -60,5 +60,5 @@ class HeatPump:
@hp_monthly_electricity_demand.setter @hp_monthly_electricity_demand.setter
def hp_monthly_electricity_demand(self, value): def hp_monthly_electricity_demand(self, value):
if type(value) == Series: if isinstance(value, Series):
self._hp_monthly_electricity_demand = value self._hp_monthly_electricity_demand = value

View File

@ -30,4 +30,3 @@ class HvacTerminalUnit:
""" """
if value is not None: if value is not None:
self._type = str(value) self._type = str(value)

View File

@ -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

View File

@ -1,5 +1,5 @@
""" """
Plant class Plant module
SPDX - License - Identifier: LGPL - 3.0 - or -later SPDX - License - Identifier: LGPL - 3.0 - or -later
Copyright © 2022 Concordia CERC group Copyright © 2022 Concordia CERC group
Project Coder Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca 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: class Plant:
"""
Plant class
"""
def __init__(self, name, height, leaf_area_index, leaf_reflectivity, leaf_emissivity, minimal_stomatal_resistance, def __init__(self, name, height, leaf_area_index, leaf_reflectivity, leaf_emissivity, minimal_stomatal_resistance,
co2_sequestration, grows_on_soils): co2_sequestration, grows_on_soils):
self._name = name self._name = name

View File

@ -1,5 +1,5 @@
""" """
Soil class Soil module
SPDX - License - Identifier: LGPL - 3.0 - or -later SPDX - License - Identifier: LGPL - 3.0 - or -later
Copyright © 2022 Concordia CERC group Copyright © 2022 Concordia CERC group
Project Coder Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca 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: class Soil:
"""
Soil class
"""
def __init__(self, name, roughness, dry_conductivity, dry_density, dry_specific_heat, thermal_absorptance, def __init__(self, name, roughness, dry_conductivity, dry_density, dry_specific_heat, thermal_absorptance,
solar_absorptance, visible_absorptance, saturation_volumetric_moisture_content, solar_absorptance, visible_absorptance, saturation_volumetric_moisture_content,
residual_volumetric_moisture_content): residual_volumetric_moisture_content):

View File

@ -1,5 +1,5 @@
""" """
Vegetation class Vegetation module
SPDX - License - Identifier: LGPL - 3.0 - or -later SPDX - License - Identifier: LGPL - 3.0 - or -later
Copyright © 2022 Concordia CERC group Copyright © 2022 Concordia CERC group
Project Coder Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca 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: class Vegetation:
"""
Vegetation class
"""
def __init__(self, name, soil, soil_thickness, plants): def __init__(self, name, soil, soil_thickness, plants):
self._name = name self._name = name
self._management = None self._management = None

View File

View File

@ -7,6 +7,9 @@ Project Coder Guille Gutierrez guillermo.gutierrezmorote@concordia.ca
class SensorMeasure: class SensorMeasure:
"""
Sensor measure class
"""
def __init__(self, latitude, longitude, utc_timestamp, value): def __init__(self, latitude, longitude, utc_timestamp, value):
self._latitude = latitude self._latitude = latitude
self._longitude = longitude self._longitude = longitude

View File

@ -9,6 +9,9 @@ from enum import Enum
class SensorType(Enum): class SensorType(Enum):
"""
Sensor type enumeration
"""
HUMIDITY = 0 HUMIDITY = 0
TEMPERATURE = 1 TEMPERATURE = 1
CO2 = 2 CO2 = 2

View File

@ -1,5 +1,5 @@
""" """
Station Station module
SPDX - License - Identifier: LGPL - 3.0 - or -later SPDX - License - Identifier: LGPL - 3.0 - or -later
Copyright © 2022 Concordia CERC group Copyright © 2022 Concordia CERC group
Project Coder Guille Gutierrez guillermo.gutierrezmorote@concordia.ca Project Coder Guille Gutierrez guillermo.gutierrezmorote@concordia.ca
@ -10,6 +10,9 @@ from hub.city_model_structure.iot.sensor import Sensor
class Station: class Station:
"""
Station class
"""
def __init__(self, station_id=None, _mobile=False): def __init__(self, station_id=None, _mobile=False):
self._id = station_id self._id = station_id
self._mobile = _mobile self._mobile = _mobile
@ -19,7 +22,7 @@ class Station:
def id(self): def id(self):
""" """
Get the station id a random uuid will be assigned if no ID was provided to the constructor 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: if self._id is None:
self._id = uuid.uuid4() self._id = uuid.uuid4()

View File

@ -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)

View File

@ -16,6 +16,7 @@ class LevelOfDetail:
self._usage = None self._usage = None
self._weather = None self._weather = None
self._surface_radiation = None self._surface_radiation = None
self._energy_systems = None
@property @property
def geometry(self): def geometry(self):
@ -75,7 +76,7 @@ class LevelOfDetail:
""" """
Set the city minimal weather level of detail, 0 (yearly), 1 (monthly), 2 (hourly) Set the city minimal weather level of detail, 0 (yearly), 1 (monthly), 2 (hourly)
""" """
self._usage = value self._weather = value
@property @property
def surface_radiation(self): 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) Set the city minimal surface radiation level of detail, 0 (yearly), 1 (monthly), 2 (hourly)
""" """
self._surface_radiation = value 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

View File

@ -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

View 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

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -97,7 +97,7 @@ P 40
B 41 CONST B 41 CONST
P 41 P 41
$HPDisactivationTemperature % Constant value $HPDeactivationTemperature % Constant value
B 42 CONST B 42 CONST
P 42 P 42

View File

@ -97,7 +97,7 @@ P 30
B 31 CONST B 31 CONST
P 31 P 31
$HPDisactivationTemperature % Constant value $HPDeactivationTemperature % Constant value
B 32 CONST B 32 CONST
P 32 P 32

View File

@ -339,7 +339,7 @@ P 142
B 143 CONST B 143 CONST
P 143 P 143
$HPDisactivationTemperature % Constant value $HPDeactivationTemperature % Constant value
B 144 CONST B 144 CONST
P 144 P 144

View File

@ -303,7 +303,7 @@ P 106
B 107 CONST B 107 CONST
P 107 P 107
$HPDisactivationTemperature % Constant value $HPDeactivationTemperature % Constant value
B 108 CONST B 108 CONST
P 108 P 108

View 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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

Some files were not shown because too many files have changed in this diff Show More