Commit 49cddae6 authored by brugerma's avatar brugerma
Browse files

Refresh commit

parent ce89abeb
......@@ -2,22 +2,37 @@ OMEGAlpes publications
======================
OMEGAlpes was presented in details in the following publications:
- In the 2021 *energies* article `OMEGAlpes, an Open-Source Optimisation Model Generation Tool to Support Energy Stakeholders at District Scale`_, where the tool and its associated use cases are presented in detail.
- In 2019 in the *Building Simulation* conference article `An Optimization Modeler as an Efficient Tool for Design and Operation for City Energy Stakeholders and Decision Makers`_
- In French in 2019 in Camille Pajot PhD thesis `OMEGAlpes Outil d'aide à la décision pour une planification énergétique multi-fluides optimale à l'échelle des quartiers`_
The tool was also used in various scientific works:
- Pajot, C.; Delinchant, B.; Marechal, Y.; Wurtz, F.; Morriet, L.; Vincent, B.; Debray, F. Industrial Optimal Operation Plan-ning with Financial and Ecological Objectives. In Proceedings of the 7th International Conference on Smart Cities and Green ICT Systems; Funchal, Portugal, 16–18 March 2018; SciTePress—Science and and Technology Publications, Setúbal, Portugal, 2018; pp. 214–222.
- Pajot, C.; Nguyen, Q.; Delinchant, B.; Maréchal, Y.; Wurtz, F.; Robin, S.; Vincent, B.; Debray, F. Data-driven Modeling of Building Consumption Profile for Optimal Flexibility: Application to Energy Intensive Industry. In Proceedings of the Building Simulation Conference, Rome, Italy, 2–4 September 2019. Available online: https://hal.archives-ouvertes.fr/hal-02364669 (accessed on 17 December 2019).
- Hodencq, S.; Debray, F.; Trophime, C.; Vincent, B.; Stutz, B.; Delinchant, B. Thermohydraulics of High Field Magnets: From microns to urban community scale. In Proceedings of the 24ème Congrès Français de Mécanique, Brest, France, 26–30 August 2019.
- Pajot, C.; Artiges, N.; Delinchant, B.; Rouchier, S.; Wurtz, F.; Maréchal, Y. An Approach to Study District Thermal Flexibility Using Generative Modeling from Existing Data. Energies 2019, 12, 3632, doi:10.3390/en12193632.
- Morriet, L.; Debizet, G.; Wurtz, F. Multi-Actor Modelling for MILP Energy Systems Optimisation: Application to Collective Self-Consumption. In Proceedings of the Building Simulation 2019: 16th Conference of IBPSA, Rome, Italy, 2–4 September 2019. https://hal.archives-ouvertes.fr/hal-02285965
- Fitó, J.; Ramousse, J.; Hodencq, S.; Wurtz, F. Energy, exergy, economic and exergoeconomic (4E) multicriteria analysis of an industrial waste heat valorization system through district heating. Sustain. Energy Technol. Assess. 2020, 42, 100894, doi:10.1016/j.seta.2020.100894
- Fitó, J.; Hodencq, S.; Ramousse, J.; Wurtz, F.; Stutz, B.; Debray, F.; Vincent, B. Energy- and exergy-based optimal designs of a low-temperature industrial waste heat recovery system in district heating. Energy Convers. Manag. 2020, 211, 112753, doi:10.1016/j.enconman.2020.112753.
- Fitó, J.; Ramousse, J.; Hodencq, S.; Morriet, L.; Wurtz, F.; Debizet, G. Analyse technico-économique multi-acteurs de la conception d’un système de valorisation de chaleur fatale sur réseau de chaleur. In Proceedings of the Communautés Énergétiques, Autoproduction, Autoconsommation: Cadrages, Pratiques et Outils, Paris, France, 16 June 2020; p. 13.
- Hodencq, S.; Morriet, L.; Wurtz, F.; Delinchant, B.; Vincent, B.; Debray, F. Science ouverte pour l’optimisation de systèmes énergétiques: Des données et modèles ouverts à une infrastructure de recherche ouverte. In Proceedings of the Conférence IBPSA, Reims, France, 13–14 May 2020. Available online: https://hal.archives-ouvertes.fr/hal-03290009 (ac-cessed on 23 July 2021).
- Hodencq, S.; Fitó, J.; Debray, F.; Vincent, B.; Ramousse, J.; Delinchant, B.; Wurtz, F. Flexible waste heat management and recovery for an electro-intensive industrial process through energy/exergy criteria. In Proceedings of the Ecos 2021-The 34rth International Conference on Efficiency, Cost, Optimization, Simulation and Environmental Impact of Energy Systems, Taormina, Italy, 28 Jun–2 July 2021. Available online: https://hal.archives-ouvertes.fr/hal-03290126 (accessed on 23 July 2021).
- Hodencq, S.; Delinchant, B.; Frederic, W.; Artiges, N.; Ferrari, J.; Laranjeira, T.; Morriet, L.; Benjamin, V.; Francois, D. Towards an energy open science approach at district level: Application to Grenoble Presqu’île’. In Proceedings of the 1st International Workshop on Open Design & Open Source Hardware Product Development, Grenoble, France, 5–6 March 2020. Available online: https://hal.archives-ouvertes.fr/hal-03052326 (accessed on 1 March 2021).
- Hodencq, S.; Delinchant, B.; Wurtz, F., « Open and Reproducible Use Cases for Energy (ORUCE) methodology in systems design and operation: a dwelling photovoltaic self-consumption example », In Proceedings of the Building Simulation 2021: 17th Conference of IBPSA, Bruges, Belgium, 1 - 3 sept. 2021. https://hal.archives-ouvertes.fr/hal-03341883
......
What's new in the latest versions
=================================
The new version of OMEGAlpes v0.4.1 is available!
The release is from 5th of January 2021.
The new version of OMEGAlpes v0.4.2 is available!
The release is from 6th of December 2021.
.. toctree::
:maxdepth: 2
new_functionalities/v0.4.1
new_functionalities/v0.4.2
Information about the latest versions
-------------------------------------
.. toctree::
:maxdepth: 1
new_functionalities/v0.4.1
.. toctree::
:maxdepth: 1
......
......@@ -63,4 +63,8 @@ Contributors
------------
Sacha Hodencq,
Mathieu Brugeron
\ No newline at end of file
<<<<<<< HEAD
Mathieu Brugeron
=======
Mathieu Brugeron
>>>>>>> origin/master
......@@ -41,12 +41,11 @@ from omegalpes.general.utils.plots import plt, plot_quantity, \
from omegalpes.general.utils.output_data import save_energy_flows
from omegalpes.general.time import TimeUnit
from lpfics.lpfics import find_infeasible_constraint_set
__docformat__ = "restructuredtext en"
def main(work_path, load_profile, storage_pcharge_max, storage_pdischarge_max, production_pmax):
def main(work_path, load_profile, production_pmax, storage_pcharge_max,
storage_pdischarge_max):
"""
:param work_path: Path to the working directory
:param production_pmax: Maximal power delivered by the production unit [kW]
......@@ -73,10 +72,10 @@ def main(work_path, load_profile, storage_pcharge_max, storage_pdischarge_max, p
p_max=production_pmax)
# Create the storage
storage = StorageUnit(time, name='storage', soc_min=0.1,
pc_max= storage_pcharge_max, pd_max= storage_pdischarge_max,
storage = StorageUnit(time, name='storage', pc_max=storage_pcharge_max,
pd_max=storage_pdischarge_max, soc_min=0.1,
soc_max=0.9, self_disch=0.01, ef_is_e0=True)
storage.minimize_capacity(pc_max_ratio= 1.0, pd_max_ratio= 1.0) # Minimize the storage capacity
storage.minimize_capacity() # Minimize the storage capacity
# Create the energy node and connect units
node = EnergyNode(time, 'energy_node')
......@@ -124,7 +123,6 @@ def print_results():
elif LpStatus[MODEL.status] == 'Infeasible':
print("Sorry, the optimisation problem has no feasible solution !")
find_infeasible_constraint_set(MODEL)
elif LpStatus[MODEL.status] == 'Unbounded':
print("The cost function of the optimisation problem is unbounded !")
......@@ -155,8 +153,10 @@ if __name__ == '__main__':
# Run main
MODEL, TIME, LOAD, PRODUCTION, STORAGE, NODE = \
main(work_path=WORK_PATH, load_profile=LOAD_PROFILE, storage_pcharge_max = STORAGE_PC_MAX, storage_pdischarge_max = STORAGE_PD_MAX,
production_pmax=PRODUCTION_P_MAX)
main(work_path=WORK_PATH, load_profile=LOAD_PROFILE,
production_pmax=PRODUCTION_P_MAX,
storage_pcharge_max=STORAGE_PC_MAX,
storage_pdischarge_max=STORAGE_PD_MAX)
# Save energy flows into a CSV file
save_energy_flows(NODE, file_name=WORK_PATH + r'\results\storage_design')
......
......@@ -44,7 +44,7 @@ from omegalpes.energy.energy_nodes import EnergyNode
from omegalpes.energy.units.consumption_units import FixedConsumptionUnit, \
VariableConsumptionUnit
from omegalpes.energy.units.conversion_units import \
ElectricalToThermalConversionUnit, HeatPump
SingleConversionUnit, HeatPump
from omegalpes.energy.units.production_units import ProductionUnit
from omegalpes.energy.units.storage_units import StorageUnit
from omegalpes.general.optimisation.model import OptimisationModel
......@@ -54,10 +54,10 @@ from omegalpes.general.utils.plots import plt, plot_node_energetic_flows
__docformat__ = "restructuredtext en"
def main(work_path, elec2therm_ratio=0.9, pc_max=5000, pd_max=5000, pc_min=1000,
def main(work_path, elec2therm_ratio=0.9, pc_max=5000, pd_max=5000,
pc_min=1000,
pd_min=1000, capa=20000, cop_hp=3, pmax_elec_hp=1000,
storage_soc_0=0.2):
# OPTIMIZATION MODEL
# Creating the unit dedicated to time management
time = TimeUnit(periods=24 * 7, dt=1)
......@@ -73,9 +73,10 @@ def main(work_path, elec2therm_ratio=0.9, pc_max=5000, pd_max=5000, pc_min=1000,
# Creating the electro-intensive industry unit
indus_cons = [c for c in map(float, indus_cons_file)]
indus = ElectricalToThermalConversionUnit(time, 'indus',
elec_to_therm_ratio=elec2therm_ratio,
p_in_elec=indus_cons)
indus = SingleConversionUnit(time, 'indus', energy_type_in='Electrical',
energy_type_out='Thermal',
efficiency_ratio=elec2therm_ratio,
p_in=indus_cons)
# Creating unit for heat dissipation from the industrial process
dissipation = VariableConsumptionUnit(time, 'dissipation',
......@@ -109,7 +110,7 @@ def main(work_path, elec2therm_ratio=0.9, pc_max=5000, pd_max=5000, pc_min=1000,
energy_type='Thermal')
# Connecting units to the nodes
heat_node_bef_valve.connect_units(indus.thermal_production_unit,
heat_node_bef_valve.connect_units(indus.production_unit,
dissipation)
heat_node_bef_valve.export_to_node(
heat_node_aft_valve) # Export after the valve
......@@ -160,7 +161,7 @@ def print_results():
print('District consumption = {0} kWh.'.format(
DISTRICT_HEAT_LOAD.e_tot.get_value()))
print('Industry consumption = {0} kWh.'.format(
INDUS.elec_consumption_unit.e_tot.get_value()))
INDUS.consumption_unit.e_tot.get_value()))
print('District heat network production = {0} kWh.'.format(
HEAT_PRODUCTION.e_tot.get_value()))
print('Industry heat exported = {0} kWh.'.format(
......@@ -238,4 +239,4 @@ if __name__ == "__main__":
pmax_elec_hp=P_MAX_HP, storage_soc_0=SOC_0_STORAGE)
# *** SHOW THE RESULTS ***
print_results()
\ No newline at end of file
print_results()
......@@ -8,7 +8,10 @@ The conversion_units module defines various classes of conversion units,
from generic to specific ones.
It includes :
- ConversionUnit : simple conversion unit. It inherits from AssemblyUnit.
- ConversionUnit: simple conversion unit. It inherits from AssemblyUnit.
- SingleConversionUnit: Conversion unit made of a single consumption unit
and a single production unit. It can be used for any energy vector, and an
efficiency ratio between the input (consumption) and the output (production)
- ElectricalToThermalConversionUnit : Electrical to thermal Conversion unit
with an electricity consumption and a thermal production linked by and
electrical to thermal ratio. It inherits from ConversionUnit
......@@ -200,8 +203,10 @@ class ElectricalToThermalConversionUnit(ConversionUnit):
the thermal output through the electrical to thermal ratio
"""
print("DEPRECATED: please now use SingleConversionUnit with relevant energy"
"types")
print(
"DEPRECATED: please now use SingleConversionUnit with relevant energy"
"types")
def __init__(self, time, name, pmin_in_elec=1e-5, pmax_in_elec=1e+5,
p_in_elec=None, pmin_out_therm=1e-5, pmax_out_therm=1e+5,
p_out_therm=None, elec_to_therm_ratio=1,
......@@ -626,7 +631,7 @@ class HeatPump(ConversionUnit):
def __init__(self, time, name, pmin_in_elec=1e-5, pmax_in_elec=1e+5,
p_in_elec=None, pmin_in_therm=1e-5, pmax_in_therm=1e+5,
p_in_therm=None, pmin_out_therm=1e-5, pmax_out_therm=1e+5,
p_out_therm=None, cop=3, losses=0, min_time_on = None):
p_out_therm=None, cop=3, losses=0, min_time_on=None):
"""
:param time: TimeUnit describing the studied time period
:param name: name of the heat pump
......@@ -640,13 +645,15 @@ class HeatPump(ConversionUnit):
:param pmax_out_therm: maximal power output (thermal)
:param p_out_therm: power output (thermal)
:param cop: Coefficient Of Performance of the Heat Pump (cop>1)
:param losses: losses as a percentage of thermal energy produced (p_out)
:param losses: losses as a percentage of thermal energy produced (
p_out)
"""
if p_out_therm is None:
self.thermal_production_unit = VariableProductionUnit(
time, name + '_therm_prod', energy_type='Thermal',
p_min=pmin_out_therm, p_max=pmax_out_therm, min_time_on = min_time_on)
p_min=pmin_out_therm, p_max=pmax_out_therm,
min_time_on=min_time_on)
else:
self.thermal_production_unit = FixedProductionUnit(
time, name + '_therm_prod', energy_type='Thermal',
......
......@@ -612,7 +612,7 @@ class EnergyUnit(OptObject):
The final time should be greater than the initial time within a time
range, except when the final time is '00:00'.
example: set_operating_time_range([['10:00', '12:00'], ['14:00',
example: add_operating_time_range([['10:00', '12:00'], ['14:00',
'17:00']])
:param operating_time_range: list of lists of strings in the format
......
......@@ -427,8 +427,8 @@ class StorageUnit(AssemblyUnit):
'hours between cycling (e[t] = e[t+cycles/dt]')
# OBJECTIVES
def minimize_capacity(self, pc_max_ratio: float == None,
pd_max_ratio: float == None,
def minimize_capacity(self, pc_max_ratio: float = None,
pd_max_ratio: float = None,
weight=1):
"""
......@@ -478,7 +478,7 @@ class StorageUnit(AssemblyUnit):
def_pc_max = TechnicalDynamicConstraint(
exp_t='{1}_p[t] <= '
'{0}_pc_max'
.format(self.name, self.charge.name),
.format(self.name, self.charge.name),
t_range='for t in time.I',
name='def_pc_max',
parent=self)
......@@ -514,7 +514,7 @@ class StorageUnit(AssemblyUnit):
def_pd_max = TechnicalDynamicConstraint(
exp_t='{1}_p[t] <= '
'{0}_pd_max'
.format(self.name, self.discharge.name),
.format(self.name, self.discharge.name),
t_range='for t in time.I',
name='def_pd_max',
parent=self)
......
......@@ -7,7 +7,7 @@ OMEGAlpes installation script
:authors: B. DELINCHANT, S. HODENCQ, Y. MARECHAL, L. MORRIET,
C. PAJOT, F. WURTZ
:license: Apache Software License 2.0
:version: 0.4.1
:version: 0.4.2
"""
from setuptools import setup, find_packages
......@@ -15,7 +15,7 @@ from setuptools import setup, find_packages
# ------------------------------------------------------------------------------
# Module version
__version_info__ = (0, 4, 1)
__version_info__ = (0, 4, 2)
__version__ = ".".join(str(x) for x in __version_info__)
# Documentation strings format
......
......@@ -27,7 +27,7 @@ from omegalpes.energy.energy_nodes import EnergyNode
from omegalpes.energy.units.consumption_units import FixedConsumptionUnit, \
VariableConsumptionUnit
from omegalpes.energy.units.conversion_units import \
ElectricalToThermalConversionUnit, HeatPump
SingleConversionUnit, HeatPump
from omegalpes.energy.units.production_units import ProductionUnit
from omegalpes.energy.units.storage_units import StorageUnit
from omegalpes.general.optimisation.model import OptimisationModel
......@@ -67,7 +67,7 @@ class TestWasteHeatRecoverySystem(unittest.TestCase):
pmax_elec_hp=self.p_max_hp,
storage_soc_0=self.soc_0)
self.assertEqual(indus.elec_consumption_unit.p.value, indus_cons)
self.assertEqual(indus.consumption_unit.p.value, indus_cons)
def test_file_cons(self):
"""Checking the text file for the district heat load consumption is
......@@ -204,7 +204,7 @@ class TestWasteHeatRecoverySystem(unittest.TestCase):
cop_hp=self.cop,
pmax_elec_hp=self.p_max_hp,
storage_soc_0=self.soc_0)
self.assertIsInstance(indus, ElectricalToThermalConversionUnit)
self.assertIsInstance(indus, SingleConversionUnit)
def test_fourth_cons(self):
"""Checking the 4th return is a consumption unit"""
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment