Initial setup of co2_emission repository

This commit is contained in:
Koa Wells 2023-07-28 13:00:10 -04:00
parent 73dec8b54e
commit 6410a9d2e5
15 changed files with 392 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
.idea

View 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

View 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

View File

@ -0,0 +1 @@

View File

@ -0,0 +1,4 @@
numpy_financial
cerc_hub
pandas
setuptools

View File

@ -0,0 +1 @@
costs

12
co2_emission/__init__.py Normal file
View 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

View 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

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

@ -0,0 +1,3 @@
numpy_financial
cerc_hub
pandas

36
setup.py Normal file
View 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

File diff suppressed because one or more lines are too long

2
tests/output/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
*
!.gitignore

93
tests/unit_tests.py Normal file
View 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)