Initial setup of co2_emission repository
This commit is contained in:
parent
73dec8b54e
commit
6410a9d2e5
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
.idea
|
9
cerc_co2_emission.egg-info/PKG-INFO
Normal file
9
cerc_co2_emission.egg-info/PKG-INFO
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
Metadata-Version: 2.1
|
||||||
|
Name: cerc-costs
|
||||||
|
Version: 0.1.0.0
|
||||||
|
Summary: CERC costs contains the basic cost calculation per CERC-Hub building
|
||||||
|
Classifier: License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)
|
||||||
|
Classifier: Programming Language :: Python
|
||||||
|
Classifier: Programming Language :: Python :: 3
|
||||||
|
|
||||||
|
CERC costs contains the basic cost calculation per CERC-Hub building
|
20
cerc_co2_emission.egg-info/SOURCES.txt
Normal file
20
cerc_co2_emission.egg-info/SOURCES.txt
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
pyproject.toml
|
||||||
|
requirements.txt
|
||||||
|
setup.py
|
||||||
|
cerc_costs.egg-info/PKG-INFO
|
||||||
|
cerc_costs.egg-info/SOURCES.txt
|
||||||
|
cerc_costs.egg-info/dependency_links.txt
|
||||||
|
cerc_costs.egg-info/requires.txt
|
||||||
|
cerc_costs.egg-info/top_level.txt
|
||||||
|
costs/__init__.py
|
||||||
|
costs/__main__.py
|
||||||
|
costs/capital_costs.py
|
||||||
|
costs/configuration.py
|
||||||
|
costs/constants.py
|
||||||
|
costs/cost.py
|
||||||
|
costs/cost_base.py
|
||||||
|
costs/end_of_life_costs.py
|
||||||
|
costs/total_maintenance_costs.py
|
||||||
|
costs/total_operational_costs.py
|
||||||
|
costs/total_operational_incomes.py
|
||||||
|
costs/version.py
|
1
cerc_co2_emission.egg-info/dependency_links.txt
Normal file
1
cerc_co2_emission.egg-info/dependency_links.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
|
4
cerc_co2_emission.egg-info/requires.txt
Normal file
4
cerc_co2_emission.egg-info/requires.txt
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
numpy_financial
|
||||||
|
cerc_hub
|
||||||
|
pandas
|
||||||
|
setuptools
|
1
cerc_co2_emission.egg-info/top_level.txt
Normal file
1
cerc_co2_emission.egg-info/top_level.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
costs
|
12
co2_emission/__init__.py
Normal file
12
co2_emission/__init__.py
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
"""
|
||||||
|
Cost workflow initialization
|
||||||
|
SPDX - License - Identifier: LGPL - 3.0 - or -later
|
||||||
|
Copyright © 2023 Project Coder Guille Gutierrez guillermo.gutierrezmorote@concordia.ca
|
||||||
|
Code contributor Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
|
||||||
|
Code contributor Oriol Gavalda Torrellas oriol.gavalda@concordia.ca
|
||||||
|
"""
|
||||||
|
from .capital_costs import CapitalCosts
|
||||||
|
from .end_of_life_costs import EndOfLifeCosts
|
||||||
|
from .total_maintenance_costs import TotalMaintenanceCosts
|
||||||
|
from .total_operational_costs import TotalOperationalCosts
|
||||||
|
from .total_operational_incomes import TotalOperationalIncomes
|
80
co2_emission/co2_emission.py
Normal file
80
co2_emission/co2_emission.py
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
"""
|
||||||
|
CO2 emission module
|
||||||
|
SPDX - License - Identifier: LGPL - 3.0 - or -later
|
||||||
|
Copyright © 2023 Project Coder Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
|
||||||
|
"""
|
||||||
|
|
||||||
|
from hub.city_model_structure.building import Building
|
||||||
|
import hub.helpers.constants as cte
|
||||||
|
|
||||||
|
|
||||||
|
class Co2Emission:
|
||||||
|
"""
|
||||||
|
Cost class
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, building: Building, emissions_factor=None):
|
||||||
|
if emissions_factor is None:
|
||||||
|
emissions_factor = {cte.GAS: 1,
|
||||||
|
cte.ELECTRICITY: 1,
|
||||||
|
cte.WOOD: 1,
|
||||||
|
cte.DIESEL: 1,
|
||||||
|
cte.RENEWABLE: 0}
|
||||||
|
self._emissions_factor = emissions_factor
|
||||||
|
self._building = building
|
||||||
|
|
||||||
|
@property
|
||||||
|
def building(self) -> Building:
|
||||||
|
"""
|
||||||
|
Get current building.
|
||||||
|
"""
|
||||||
|
return self._building
|
||||||
|
|
||||||
|
@property
|
||||||
|
def operational_co2(self) -> dict:
|
||||||
|
"""
|
||||||
|
Get operational_co2
|
||||||
|
:return: dict
|
||||||
|
"""
|
||||||
|
results = {}
|
||||||
|
for energy_system in self._building.energy_systems:
|
||||||
|
fuel_type = energy_system.generation_system.generic_generation_system.fuel_type
|
||||||
|
for demand_type in energy_system.demand_types:
|
||||||
|
results_by_time_period = {}
|
||||||
|
if str(demand_type).lower() == str(cte.HEATING).lower():
|
||||||
|
for time_period in self._building.heating_consumption:
|
||||||
|
values = []
|
||||||
|
for value in self._building.heating_consumption[time_period]:
|
||||||
|
values.append(value * self._emissions_factor[fuel_type])
|
||||||
|
results_by_time_period[time_period] = values
|
||||||
|
if demand_type == cte.COOLING:
|
||||||
|
for time_period in self._building.cooling_consumption:
|
||||||
|
values = []
|
||||||
|
for value in self._building.cooling_consumption[time_period]:
|
||||||
|
values.append(value * self._emissions_factor[fuel_type])
|
||||||
|
results_by_time_period[time_period] = values
|
||||||
|
if demand_type == cte.DOMESTIC_HOT_WATER:
|
||||||
|
for time_period in self._building.domestic_hot_water_consumption:
|
||||||
|
values = []
|
||||||
|
for value in self._building.domestic_hot_water_consumption[time_period]:
|
||||||
|
values.append(value * self._emissions_factor[fuel_type])
|
||||||
|
results_by_time_period[time_period] = values
|
||||||
|
results[demand_type] = results_by_time_period
|
||||||
|
|
||||||
|
results_by_time_period = {}
|
||||||
|
for time_period in self._building.lighting_electrical_demand:
|
||||||
|
values = []
|
||||||
|
for value in self._building.lighting_electrical_demand[time_period]:
|
||||||
|
values.append(value * self._emissions_factor[cte.ELECTRICITY])
|
||||||
|
results_by_time_period[time_period] = values
|
||||||
|
results[cte.LIGHTING] = results_by_time_period
|
||||||
|
|
||||||
|
results_by_time_period = {}
|
||||||
|
for time_period in self._building.appliances_electrical_demand:
|
||||||
|
values = []
|
||||||
|
for value in self._building.appliances_electrical_demand[time_period]:
|
||||||
|
values.append(value * self._emissions_factor[cte.ELECTRICITY])
|
||||||
|
results_by_time_period[time_period] = values
|
||||||
|
results[cte.APPLIANCES] = results_by_time_period
|
||||||
|
|
||||||
|
return results
|
121
input_files/selected_building_2864.geojson
Normal file
121
input_files/selected_building_2864.geojson
Normal file
@ -0,0 +1,121 @@
|
|||||||
|
{
|
||||||
|
"type": "FeatureCollection",
|
||||||
|
"features": [
|
||||||
|
{
|
||||||
|
"type": "Feature",
|
||||||
|
"id": 2864,
|
||||||
|
"geometry": {
|
||||||
|
"type": "Polygon",
|
||||||
|
"coordinates": [
|
||||||
|
[
|
||||||
|
[
|
||||||
|
-73.55628837310991,
|
||||||
|
45.60732526295055
|
||||||
|
],
|
||||||
|
[
|
||||||
|
-73.55628287285629,
|
||||||
|
45.607324262904456
|
||||||
|
],
|
||||||
|
[
|
||||||
|
-73.55609247288925,
|
||||||
|
45.607288563416546
|
||||||
|
],
|
||||||
|
[
|
||||||
|
-73.55607107262188,
|
||||||
|
45.60734486277528
|
||||||
|
],
|
||||||
|
[
|
||||||
|
-73.55612487276466,
|
||||||
|
45.60735496306114
|
||||||
|
],
|
||||||
|
[
|
||||||
|
-73.55609867281544,
|
||||||
|
45.60742366317157
|
||||||
|
],
|
||||||
|
[
|
||||||
|
-73.55624087271804,
|
||||||
|
45.60745026331904
|
||||||
|
],
|
||||||
|
[
|
||||||
|
-73.55628837310991,
|
||||||
|
45.60732526295055
|
||||||
|
]
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"properties": {
|
||||||
|
"OBJECTID_12_13": 2864,
|
||||||
|
"ID_UEV": "02033771",
|
||||||
|
"CIVIQUE_DE": " 8212",
|
||||||
|
"CIVIQUE_FI": " 8212",
|
||||||
|
"NOM_RUE": "avenue Peterborough (ANJ)",
|
||||||
|
"SUITE_DEBU": " ",
|
||||||
|
"MUNICIPALI": "50",
|
||||||
|
"ETAGE_HORS": 1,
|
||||||
|
"NOMBRE_LOG": 1,
|
||||||
|
"ANNEE_CONS": 1960,
|
||||||
|
"CODE_UTILI": "1000",
|
||||||
|
"LETTRE_DEB": " ",
|
||||||
|
"LETTRE_FIN": " ",
|
||||||
|
"LIBELLE_UT": "Logement",
|
||||||
|
"CATEGORIE_": "R\u00c3\u00a9gulier",
|
||||||
|
"MATRICULE8": "0051-49-2041-2-000-0000",
|
||||||
|
"SUPERFICIE": 450,
|
||||||
|
"SUPERFIC_1": 176,
|
||||||
|
"NO_ARROND_": "REM09",
|
||||||
|
"Shape_Leng": 0.000666191644361,
|
||||||
|
"OBJECTID": 2864,
|
||||||
|
"Join_Count": 1,
|
||||||
|
"TARGET_FID": 2864,
|
||||||
|
"feature_id": "bdd1f0fe-89de-46d2-80dc-87d3636df60a",
|
||||||
|
"md_id": " ",
|
||||||
|
"acqtech": 1360,
|
||||||
|
"acqtech_en": "Lidar",
|
||||||
|
"acqtech_fr": "Lidar",
|
||||||
|
"provider": 461,
|
||||||
|
"provideren": "Municipal",
|
||||||
|
"providerfr": "Municipal",
|
||||||
|
"datemin": "20151124",
|
||||||
|
"datemax": "20151208",
|
||||||
|
"haccmin": 2,
|
||||||
|
"haccmax": 2,
|
||||||
|
"vaccmin": 1,
|
||||||
|
"vaccmax": 1,
|
||||||
|
"heightmin": 1.17,
|
||||||
|
"heightmax": 7.5,
|
||||||
|
"elevmin": 45.48,
|
||||||
|
"elevmax": 45.96,
|
||||||
|
"bldgarea": 193.18,
|
||||||
|
"comment": " ",
|
||||||
|
"OBJECTID_1": 2864,
|
||||||
|
"Shape_Le_1": 0.000666191644361,
|
||||||
|
"Shape_Ar_1": 2.22753099997e-08,
|
||||||
|
"OBJECTID_12": 2864,
|
||||||
|
"Join_Count_1": 1,
|
||||||
|
"TARGET_FID_1": 2863,
|
||||||
|
"g_objectid": "897744",
|
||||||
|
"g_co_mrc": "66023",
|
||||||
|
"g_code_mun": "66023",
|
||||||
|
"g_arrond": "REM09",
|
||||||
|
"g_anrole": "2019",
|
||||||
|
"g_usag_pre": "R\u00c3\u00a9sidentiel",
|
||||||
|
"g_no_lot": "1113400",
|
||||||
|
"g_nb_poly_": "1",
|
||||||
|
"g_utilisat": "1000",
|
||||||
|
"g_nb_logem": "1",
|
||||||
|
"g_nb_locau": " ",
|
||||||
|
"g_descript": "Unit\u00c3\u00a9 d'\u00c3\u00a9valuation",
|
||||||
|
"g_id_provi": "66023005149204120000000",
|
||||||
|
"g_sup_tota": "450.1",
|
||||||
|
"g_geometry": "0.000958907",
|
||||||
|
"g_geomet_1": "5.20226e-008",
|
||||||
|
"g_dat_acqu": "2020-02-12 00:00:00.0000000",
|
||||||
|
"g_dat_char": "2020-02-17 00:00:00.0000000",
|
||||||
|
"Shape_Leng_1": 0.000666191644361,
|
||||||
|
"Shape_Area_1": 2.22753099997e-08,
|
||||||
|
"Shape_Length": 0.0006661919640545334,
|
||||||
|
"Shape_Area": 2.22753099997e-08
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
8
pyproject.toml
Normal file
8
pyproject.toml
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
# pyproject.toml
|
||||||
|
|
||||||
|
[build-system]
|
||||||
|
requires = ["setuptools>=61.0.0", "wheel"]
|
||||||
|
build-backend = "setuptools.build_meta"
|
||||||
|
|
||||||
|
[options.packages.find_namespace]
|
||||||
|
where = "costs"
|
3
requirements.txt
Normal file
3
requirements.txt
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
numpy_financial
|
||||||
|
cerc_hub
|
||||||
|
pandas
|
36
setup.py
Normal file
36
setup.py
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
import glob
|
||||||
|
import pathlib
|
||||||
|
from distutils.util import convert_path
|
||||||
|
from setuptools import setup
|
||||||
|
|
||||||
|
with pathlib.Path('requirements.txt').open() as r:
|
||||||
|
install_requires = [
|
||||||
|
str(requirement).replace('\n', '')
|
||||||
|
for requirement
|
||||||
|
in r.readlines()
|
||||||
|
]
|
||||||
|
install_requires.append('setuptools')
|
||||||
|
|
||||||
|
main_ns = {}
|
||||||
|
version = convert_path('costs/version.py')
|
||||||
|
with open(version) as f:
|
||||||
|
exec(f.read(), main_ns)
|
||||||
|
|
||||||
|
setup(
|
||||||
|
name='cerc-costs',
|
||||||
|
version=main_ns['__version__'],
|
||||||
|
description="CERC costs contains the basic cost calculation per CERC-Hub building",
|
||||||
|
long_description="CERC costs contains the basic cost calculation per CERC-Hub building",
|
||||||
|
classifiers=[
|
||||||
|
"License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)",
|
||||||
|
"Programming Language :: Python",
|
||||||
|
"Programming Language :: Python :: 3",
|
||||||
|
],
|
||||||
|
include_package_data=True,
|
||||||
|
packages=['costs'],
|
||||||
|
setup_requires=install_requires,
|
||||||
|
install_requires=install_requires,
|
||||||
|
data_files=[
|
||||||
|
('costs', glob.glob('requirements.txt'))
|
||||||
|
]
|
||||||
|
)
|
1
tests/data/test.geojson
Normal file
1
tests/data/test.geojson
Normal file
File diff suppressed because one or more lines are too long
2
tests/output/.gitignore
vendored
Normal file
2
tests/output/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
*
|
||||||
|
!.gitignore
|
93
tests/unit_tests.py
Normal file
93
tests/unit_tests.py
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
import datetime
|
||||||
|
import glob
|
||||||
|
import os
|
||||||
|
import subprocess
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
from hub.exports.energy_building_exports_factory import EnergyBuildingsExportsFactory
|
||||||
|
from hub.exports.exports_factory import ExportsFactory
|
||||||
|
from hub.imports.construction_factory import ConstructionFactory
|
||||||
|
from hub.imports.energy_systems_factory import EnergySystemsFactory
|
||||||
|
from hub.imports.geometry_factory import GeometryFactory
|
||||||
|
from hub.imports.results_factory import ResultFactory
|
||||||
|
from hub.imports.usage_factory import UsageFactory
|
||||||
|
from hub.helpers.dictionaries import Dictionaries
|
||||||
|
|
||||||
|
from costs.cost import Cost
|
||||||
|
from costs.constants import SKIN_RETROFIT, SKIN_RETROFIT_AND_SYSTEM_RETROFIT_AND_PV, SYSTEM_RETROFIT_AND_PV
|
||||||
|
from costs.co2_emission import Co2Emission
|
||||||
|
|
||||||
|
|
||||||
|
class Initialize:
|
||||||
|
def __init__(self):
|
||||||
|
self._city = None
|
||||||
|
|
||||||
|
@property
|
||||||
|
def city(self):
|
||||||
|
if self._city is None:
|
||||||
|
start = datetime.datetime.now()
|
||||||
|
print('init tests')
|
||||||
|
city_file = (Path(__file__).parent / 'data/test.geojson').resolve()
|
||||||
|
output_path = (Path(__file__).parent / 'output').resolve()
|
||||||
|
city = GeometryFactory('geojson',
|
||||||
|
city_file,
|
||||||
|
height_field='citygml_me',
|
||||||
|
year_of_construction_field='ANNEE_CONS',
|
||||||
|
function_field='CODE_UTILI',
|
||||||
|
function_to_hub=Dictionaries().montreal_function_to_hub_function).city
|
||||||
|
ConstructionFactory('nrcan', city).enrich()
|
||||||
|
UsageFactory('nrcan', city).enrich()
|
||||||
|
ExportsFactory('sra', city, output_path).export()
|
||||||
|
sra_file = str((output_path / f'{city.name}_sra.xml').resolve())
|
||||||
|
subprocess.run(['sra', sra_file], stdout=subprocess.DEVNULL)
|
||||||
|
ResultFactory('sra', city, output_path).enrich()
|
||||||
|
|
||||||
|
for building in city.buildings:
|
||||||
|
building.energy_systems_archetype_name = 'system 1 gas pv'
|
||||||
|
EnergySystemsFactory('montreal_custom', city).enrich()
|
||||||
|
EnergyBuildingsExportsFactory('insel_monthly_energy_balance', city, output_path).export()
|
||||||
|
_insel_files = glob.glob(f'{output_path}/*.insel')
|
||||||
|
for insel_file in _insel_files:
|
||||||
|
subprocess.run(['insel', str(insel_file)], stdout=subprocess.DEVNULL)
|
||||||
|
ResultFactory('insel_monthly_energy_balance', city, output_path).enrich()
|
||||||
|
self._city = city
|
||||||
|
print(f'init completed {datetime.datetime.now() - start}')
|
||||||
|
return self._city
|
||||||
|
|
||||||
|
|
||||||
|
class UnitTests(unittest.TestCase):
|
||||||
|
init = Initialize()
|
||||||
|
|
||||||
|
def test_current_status(self):
|
||||||
|
for building in self.init.city.buildings:
|
||||||
|
result = Cost(building).life_cycle
|
||||||
|
self.assertIsNotNone(result)
|
||||||
|
self.assertEqual(0, result.values[0])
|
||||||
|
|
||||||
|
def test_scenario_1(self):
|
||||||
|
for building in self.init.city.buildings:
|
||||||
|
result = Cost(building, retrofit_scenario=SKIN_RETROFIT).life_cycle
|
||||||
|
self.assertIsNotNone(result)
|
||||||
|
|
||||||
|
def test_scenario_2(self):
|
||||||
|
for building in self.init.city.buildings:
|
||||||
|
result = Cost(building, retrofit_scenario=SYSTEM_RETROFIT_AND_PV).life_cycle
|
||||||
|
self.assertIsNotNone(result)
|
||||||
|
self.assertEqual(0, result.values[0])
|
||||||
|
|
||||||
|
def test_scenario_3(self):
|
||||||
|
for building in self.init.city.buildings:
|
||||||
|
result = Cost(building, retrofit_scenario=SKIN_RETROFIT_AND_SYSTEM_RETROFIT_AND_PV).life_cycle
|
||||||
|
self.assertIsNotNone(result)
|
||||||
|
|
||||||
|
def test_co2_emission(self):
|
||||||
|
for building in self.init.city.buildings:
|
||||||
|
result = Co2Emission(building).operational_co2
|
||||||
|
self.assertIsNotNone(result)
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
files = glob.glob('output/[!.]*')
|
||||||
|
for file in files:
|
||||||
|
os.unlink(file)
|
Loading…
Reference in New Issue
Block a user