From cb3e100fd46580a157904c295dac5406b3c04722 Mon Sep 17 00:00:00 2001 From: Saeed Ranjbar Date: Tue, 19 Sep 2023 20:35:08 -0400 Subject: [PATCH] I completed the generation_system.py Created generic_storage_system.py, thermal_storage_system.py, and electrical_storage_system.py and added them to energy_system.py and generic_energy_system.py --- .../electrical_storage_system.py | 155 ++++++++++++++++++ .../energy_systems/energy_system.py | 19 +++ .../energy_systems/generation_system.py | 97 +++++++++++ .../energy_systems/generic_energy_system.py | 24 ++- .../energy_systems/generic_storage_system.py | 65 ++++++++ .../energy_systems/thermal_storage_system.py | 136 +++++++++++++++ 6 files changed, 493 insertions(+), 3 deletions(-) create mode 100644 hub/city_model_structure/energy_systems/electrical_storage_system.py create mode 100644 hub/city_model_structure/energy_systems/generic_storage_system.py create mode 100644 hub/city_model_structure/energy_systems/thermal_storage_system.py diff --git a/hub/city_model_structure/energy_systems/electrical_storage_system.py b/hub/city_model_structure/energy_systems/electrical_storage_system.py new file mode 100644 index 00000000..54bf587c --- /dev/null +++ b/hub/city_model_structure/energy_systems/electrical_storage_system.py @@ -0,0 +1,155 @@ +""" +Energy System catalog heat generation system +SPDX - License - Identifier: LGPL - 3.0 - or -later +Copyright © 2023 Concordia CERC group +Project Coder Saeed Ranjbar saeed.ranjbar@concordia.ca +Code contributors: Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +""" + +from __future__ import annotations + +from hub.city_model_structure.energy_systems.generic_storage_system import GenericStorageSystem + + + +class ElectricalStorageSystem: + def __init__(self): + self._model_name = None + self._manufacturer = None + self._generic_storage_system = None + self._rated_output_power = None + self._nominal_efficiency = None + self._battery_voltage = None + self._depth_of_discharge = None + self._self_discharge_rate = None + + @property + def model_name(self): + """ + Get the model name + :return: string + """ + return self._model_name + + @model_name.setter + def model_name(self, value): + """ + Set the model name + :return: string + """ + self._model_name = value + + @property + def manufacturer(self): + """ + Get the manufacturer name + :return: string + """ + return self._manufacturer + + @manufacturer.setter + def manufacturer(self, value): + """ + Set the manufacturer name + :return: string + """ + self._manufacturer = value + + @property + def generic_storage_system(self) -> GenericStorageSystem: + """ + Get associated generic_storage_system + :return: GenericStorageSystem + """ + return self._generic_storage_system + + @generic_storage_system.setter + def generic_storage_system(self, value): + """ + Set associated generic_storage_system + :param value: GenericStorageSystem + """ + self._generic_storage_system = value + + @property + def rated_output_power(self): + """ + Get the rated output power in Watts + :return: float + """ + return self._rated_output_power + + @rated_output_power.setter + def rated_output_power(self, value): + """ + Set the rated output power in Watts + :return: float + """ + self._rated_output_power = value + + @property + def nominal_efficiency(self): + """ + Get the nominal efficiency + :return: float + """ + return self._nominal_efficiency + + @nominal_efficiency.setter + def nominal_efficiency(self, value): + """ + Set the nominal efficiency + :return: float + """ + self._nominal_efficiency = value + + @property + def battery_voltage(self): + """ + Get the battery voltage in Volts + :return: float + """ + return self._battery_voltage + + @battery_voltage.setter + def battery_voltage(self, value): + """ + Get the battery voltage in Volts + :return: float + """ + self._battery_voltage = value + + @property + def depth_of_discharge(self): + """ + Get the depth of discharge as a percentage + :return: float + """ + return self._depth_of_discharge + + @depth_of_discharge.setter + def depth_of_discharge(self, value): + """ + Set the depth of discharge as a percentage + :return: float + """ + self._depth_of_discharge = value + + @property + def self_discharge_rate(self): + """ + Get the self discharge rate of battery as a percentage + :return: float + """ + return self._self_discharge_rate + + @self_discharge_rate.setter + def self_discharge_rate(self, value): + """ + Get the self discharge rate of battery as a percentage + :return: float + """ + self._self_discharge_rate = value + + + diff --git a/hub/city_model_structure/energy_systems/energy_system.py b/hub/city_model_structure/energy_systems/energy_system.py index a5324047..f4a9ea96 100644 --- a/hub/city_model_structure/energy_systems/energy_system.py +++ b/hub/city_model_structure/energy_systems/energy_system.py @@ -11,6 +11,8 @@ from hub.city_model_structure.energy_systems.generation_system import Generation 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.energy_systems.thermal_storage_system import ThermalStorageSystem +from hub.city_model_structure.energy_systems.electrical_storage_system import ElectricalStorageSystem from hub.city_model_structure.city_object import CityObject @@ -26,6 +28,7 @@ class EnergySystem: self._emission_system = None self._connected_city_objects = None self._control_system = None + self._energy_storage_system = None @property def name(self): @@ -138,3 +141,19 @@ class EnergySystem: :param value: ControlSystem """ self._control_system = value + + @property + def energy_storage_system(self) -> Union[None, List[ThermalStorageSystem], List[ElectricalStorageSystem]]: + """ + Get energy storage systems + :return: [EnergyStorageSystem] + """ + return self._energy_storage_system + + @energy_storage_system.setter + def energy_storage_system(self, value): + """ + Set storage system + :param value: [EnergyStorageSystem] + """ + self._energy_storage_system = value diff --git a/hub/city_model_structure/energy_systems/generation_system.py b/hub/city_model_structure/energy_systems/generation_system.py index 10572805..5d64f303 100644 --- a/hub/city_model_structure/energy_systems/generation_system.py +++ b/hub/city_model_structure/energy_systems/generation_system.py @@ -125,3 +125,100 @@ class GenerationSystem: :param value: GenerationSystem """ self._auxiliary_equipment = value + + @property + def model_name(self): + """ + Get the model name + :return: string + """ + return self._model_name + + @model_name.setter + def model_name(self, value): + """ + Set the model name + :return: string + """ + self._model_name = value + + @property + def manufacturer(self): + """ + Get the manufacturer name + :return: string + """ + return self._manufacturer + + @manufacturer.setter + def manufacturer(self, value): + """ + Set the manufacturer name + :return: string + """ + self._manufacturer = value + + @property + def maximum_heat_output(self): + """ + Get maximum heat output in W + :return: float + """ + return self._maximum_heat_output + + @maximum_heat_output.setter + def maximum_heat_output(self, value): + """ + Set maximum heat output in W + :return: float + """ + self._maximum_heat_output = value + + @property + def minimum_heat_output(self): + """ + Get minimum heat output in W + :return: float + """ + return self._minimum_heat_output + + @minimum_heat_output.setter + def minimum_heat_output(self, value): + """ + Set minimum heat output in W + :return: float + """ + self._minimum_heat_output = value + + @property + def maximum_cooling_output(self): + """ + Get maximum cooling output in W + :return: float + """ + return self._maximum_cooling_output + + @maximum_cooling_output.setter + def maximum_cooling_output(self, value): + """ + Set maximum cooling output in W + :return: float + """ + self._maximum_cooling_output = value + + @property + def minimum_cooling_output(self): + """ + Get minimum cooling output in W + :return: float + """ + return self._minimum_cooling_output + + @minimum_cooling_output.setter + def minimum_cooling_output(self, value): + """ + Set minimum cooling output in W + :return: float + """ + self._minimum_cooling_output = value + diff --git a/hub/city_model_structure/energy_systems/generic_energy_system.py b/hub/city_model_structure/energy_systems/generic_energy_system.py index ac5d9b62..fddd4368 100644 --- a/hub/city_model_structure/energy_systems/generic_energy_system.py +++ b/hub/city_model_structure/energy_systems/generic_energy_system.py @@ -5,12 +5,12 @@ Copyright © 2023 Concordia CERC group Project Coder Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca """ -from typing import Union +from typing import Union, List 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 - +from hub.city_model_structure.energy_systems.generic_storage_system import GenericStorageSystem class GenericEnergySystem: """ @@ -23,6 +23,8 @@ class GenericEnergySystem: self._distribution_system = None self._emission_system = None self._connected_city_objects = None + self._energy_storage_system = None + @property def name(self): @@ -57,7 +59,7 @@ class GenericEnergySystem: self._demand_types = value @property - def generation_system(self) -> GenericGenerationSystem: + def generation_system(self) -> List[GenericGenerationSystem]: """ Get generation system :return: GenerationSystem @@ -103,3 +105,19 @@ class GenericEnergySystem: :param value: EmissionSystem """ self._emission_system = value + + @property + def energy_storage_system(self) -> Union[None, GenericStorageSystem]: + """ + Get storage system + :return: EnergyStorageSystem + """ + return self._energy_storage_system + + @energy_storage_system.setter + def energy_storage_system(self, value): + """ + Set storage system + :return: EnergyStorageSystem + """ + self._energy_storage_system = value diff --git a/hub/city_model_structure/energy_systems/generic_storage_system.py b/hub/city_model_structure/energy_systems/generic_storage_system.py new file mode 100644 index 00000000..2b7e0bab --- /dev/null +++ b/hub/city_model_structure/energy_systems/generic_storage_system.py @@ -0,0 +1,65 @@ +""" +Energy System catalog heat generation system +SPDX - License - Identifier: LGPL - 3.0 - or -later +Copyright © 2023 Concordia CERC group +Project Coder Saeed Ranjbar saeed.ranjbar@concordia.ca +Code contributors: Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +""" + +from __future__ import annotations + + +class GenericStorageSystem: + def __init__(self): + self._storage_type = None + self._nominal_capacity = None + self._losses_ratio = None + + @property + def storage_type(self): + """ + Get the type of storage system from [sensible, latent, lithium_ion, NiCd, lead_acid] + :return: string + """ + return self._storage_type + + @storage_type.setter + def storage_type(self, value): + """ + Set the type of storage system from [sensible, latent, lithium_ion, NiCd, lead_acid] + :return: string + """ + self._storage_type = value + + @property + def nominal_capacity(self): + """ + Get the nominal capacity of storage systems in Jules + :return: float + """ + return self._nominal_capacity + + @nominal_capacity.setter + def nominal_capacity(self, value): + """ + Set the nominal capacity of storage systems in Jules + :return: float + """ + self._nominal_capacity = value + + @property + def losses_ratio(self): + """ + Get the losses-ratio of storage system in Jules lost / Jules stored + :return: float + """ + return self._losses_ratio + + @losses_ratio.setter + def losses_ratio(self, value): + """ + Set the losses-ratio of storage system in Jules lost / Jules stored + :return: float + """ + self._losses_ratio = value + diff --git a/hub/city_model_structure/energy_systems/thermal_storage_system.py b/hub/city_model_structure/energy_systems/thermal_storage_system.py new file mode 100644 index 00000000..23ee7c54 --- /dev/null +++ b/hub/city_model_structure/energy_systems/thermal_storage_system.py @@ -0,0 +1,136 @@ +""" +Energy System catalog heat generation system +SPDX - License - Identifier: LGPL - 3.0 - or -later +Copyright © 2023 Concordia CERC group +Project Coder Saeed Ranjbar saeed.ranjbar@concordia.ca +Code contributors: Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +""" + +from __future__ import annotations + + +from hub.city_model_structure.energy_systems.generic_storage_system import GenericStorageSystem +from hub.city_model_structure.building_demand.layer import Layer + + +class ThermalStorageSystem: + def __init__(self): + self._model_name = None + self._manufacturer = None + self._volume = None + self._height = None + self._layers = None + self._maximum_operating_temperature = None + self._generic_storage_system = None + + @property + def model_name(self): + """ + Get the model name + :return: string + """ + return self._model_name + + @model_name.setter + def model_name(self, value): + """ + Set the model name + :return: string + """ + self._model_name = value + + @property + def manufacturer(self): + """ + Get the manufacturer name + :return: string + """ + return self._manufacturer + + @manufacturer.setter + def manufacturer(self, value): + """ + Set the manufacturer name + :return: string + """ + self._manufacturer = value + + @property + def volume(self): + """ + Get the volume of thermal storage in m3 + :return: float + """ + return self._volume + + @volume.setter + def volume(self, value): + """ + Set the thermal storage volume in m3 + :return: float + """ + self._volume = value + + @property + def height(self): + """ + Get the storage height in m + :return: float + """ + return self._height + + @height.setter + def height(self, value): + """ + Set the storage height in m + :return: float + """ + self._height = value + + @property + def generic_storage_system(self) -> GenericStorageSystem: + """ + Get associated generic_storage_system + :return: GenericStorageSystem + """ + return self._generic_storage_system + + @generic_storage_system.setter + def generic_storage_system(self, value): + """ + Set associated generic_storage_system + :param value: GenericStorageSystem + """ + self._generic_storage_system = value + + @property + def maximum_operating_temperature(self): + """ + Get the storage maximum operating temperature in degree Celsius + :return: float + """ + return self._maximum_operating_temperature + + @maximum_operating_temperature.setter + def maximum_operating_temperature(self, value): + """ + Set the storage maximum operating temperature in degree Celsius + :return: float + """ + self._maximum_operating_temperature = value + + @property + def layers(self) -> [Layer]: + """ + Get the storage system layers + :return: Layer + """ + return self._layers + + @layers.setter + def layers(self, value): + """ + Set the storage system layers + :return: Layer + """ + self._layers = value