EnergySystemModels 20260416002__tar.gz → 20260416004__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/PKG-INFO +1 -1
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/setup.py +1 -1
- energysystemmodels-20260416004/src/PV/ProductionElectriquePV.py +390 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Chiller.py +24 -4
- energysystemmodels-20260416004/src/ThermodynamicCycles/Combustion/NG_Heating_Value.py +130 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/energysystemmodels.egg-info/PKG-INFO +1 -1
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/energysystemmodels.egg-info/SOURCES.txt +1 -1
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/energysystemmodels.egg-info/top_level.txt +0 -1
- energysystemmodels-20260416002/src/EnergySystemModels/__init__.py +0 -35
- energysystemmodels-20260416002/src/PV/ProductionElectriquePV.py +0 -268
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/LICENSE +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/README.md +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/setup.cfg +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/AHU/AirPort/AirPort.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/AHU/AirPort/__init__.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/AHU/Coil/CoolingCoil.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/AHU/Coil/CoolingCoil_Expert.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/AHU/Coil/CoolingCoil_Sensible.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/AHU/Coil/CoolingCoil_Tc.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/AHU/Coil/HeatingCoil.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/AHU/Coil/HeatingCoilNUT.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/AHU/Coil/__init__.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/AHU/Connect.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/AHU/FreshAir/AirMix.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/AHU/FreshAir/FreshAir.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/AHU/FreshAir/__init__.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/AHU/GenericAHU/AirRecoveryAHU.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/AHU/GenericAHU/AirRecyclingAHU.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/AHU/GenericAHU/__init__.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/AHU/HeatRecovery/Heat_plate_exchanger.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/AHU/HeatRecovery/Thermal_wheel_exchanger.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/AHU/HeatRecovery/__init__.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/AHU/Humidification/Humidifier.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/AHU/Humidification/__init__.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/AHU/__init__.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/AHU/air_humide/PsychrometricChart.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/AHU/air_humide/__init__.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/AHU/air_humide/air_humide.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/AHU/air_humide/air_humide_NB.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/CEE/CEE.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/CEE/__init__.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/Distillation/Deethanizer.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/Distillation/PengRobinson.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/Distillation/__init__.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/Distillation/diag_enthalpy_models.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/Distillation/reverse_engineer_enthalpies.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/Facture/ATR_Transport_Distribution.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/Facture/SONALGAZ_Elec.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/Facture/SONALGAZ_gaz.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/Facture/TURPE.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/Facture/__init__.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/Facture/coefficients_elec.json +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/Facture/coefficients_gaz_ATRD.json +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/Facture/coefficients_gaz_ATRT.json +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/Facture/coefficients_gaz_TICGN.json +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/Facture/coefficients_gaz_TVA.json +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/Facture/coefficients_sonalgaz_elec.json +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/Facture/coefficients_sonalgaz_gaz.json +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/Facture/df_utils.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/Facture/test.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/HeatTransfer/CompositeWall.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/HeatTransfer/ParallelepipedicBody.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/HeatTransfer/PipeInsulationAnalysis.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/HeatTransfer/PlateHeatTransfer.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/HeatTransfer/__init__.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/IPMVP/IPMVP.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/IPMVP/__init__.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/MeteoCiel/DJU_costic.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/MeteoCiel/MeteoCiel_Scraping.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/MeteoCiel/MeteoCiel_dayScraping.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/MeteoCiel/__init__.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/NodeEditor/__init__.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/NodeEditor/nodeeditor/__init__.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/NodeEditor/nodeeditor/node_content_widget.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/NodeEditor/nodeeditor/node_edge.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/NodeEditor/nodeeditor/node_edge_dragging.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/NodeEditor/nodeeditor/node_edge_validators.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/NodeEditor/nodeeditor/node_editor_widget.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/NodeEditor/nodeeditor/node_editor_window.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/NodeEditor/nodeeditor/node_graphics_cutline.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/NodeEditor/nodeeditor/node_graphics_edge.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/NodeEditor/nodeeditor/node_graphics_edge_path.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/NodeEditor/nodeeditor/node_graphics_node.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/NodeEditor/nodeeditor/node_graphics_scene.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/NodeEditor/nodeeditor/node_graphics_socket.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/NodeEditor/nodeeditor/node_graphics_view.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/NodeEditor/nodeeditor/node_node.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/NodeEditor/nodeeditor/node_scene.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/NodeEditor/nodeeditor/node_scene_clipboard.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/NodeEditor/nodeeditor/node_scene_history.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/NodeEditor/nodeeditor/node_serializable.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/NodeEditor/nodeeditor/node_socket.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/NodeEditor/nodeeditor/utils.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/NodeEditor/setup.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/NodeEditor/tests/__init__.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/NodeEditor/tests/test_000_import.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/NodeEditor/tox.ini +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/OpenWeatherMap/OpenWeatherMap_call.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/OpenWeatherMap/OpenWeatherMap_call_location.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/OpenWeatherMap/SQlite_OpenWeatherMap.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/OpenWeatherMap/__init__.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/OpenWeatherMap/config.ini +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/OpenWeatherMap/config_historical.ini +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/OpenWeatherMap/data.json +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/OpenWeatherMap/get_weather.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PV/__init__.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PinchAnalysis/PinchAnalysis.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PinchAnalysis/__init__.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PinchAnalysis/functions/Two_flow_pinch_analysis.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PinchAnalysis/functions/__init__.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PinchAnalysis/functions/apply_heat_exchange_above.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PinchAnalysis/functions/apply_heat_exchange_below.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PinchAnalysis/functions/calculation_HEN.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PinchAnalysis/functions/calculation_allowed_combinations.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PinchAnalysis/functions/calculation_below_above_stream.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PinchAnalysis/functions/calculation_composite_curve.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PinchAnalysis/functions/calculation_decomposition.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PinchAnalysis/functions/calculation_graphical_HEN.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PinchAnalysis/functions/calculation_surplus_deficit.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PinchAnalysis/functions/check_additional_heat_exchanges.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PinchAnalysis/functions/draw_hen_from_df.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PinchAnalysis/functions/plotting.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/__init__.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/calc_conf.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/calc_drag_listbox.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/calc_node_base.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/calc_sub_window.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/calc_window.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/config.ini +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/main.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/nodes/Simple_HEX.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/nodes/__init__.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/nodes/air_input.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/nodes/air_mixer.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/nodes/air_output.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/nodes/compressor.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/nodes/compressor_m.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/nodes/condenser.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/nodes/cooling_coil.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/nodes/cooling_coil_expert.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/nodes/cooling_coil_sensible.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/nodes/desuperheater.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/nodes/evaporator.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/nodes/expansion_valve.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/nodes/heating_coil.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/nodes/humidificateur.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/nodes/input.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/nodes/operations.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/nodes/output.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/nodes/random_meteo.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/nodes/source_P_h.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/nodes/turbine.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Aeraulic/StraightPipe.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Aeraulic/__init__.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Carnot_Cycle_Analysis.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Combustion/Combustor_cantera.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Combustion/Gaz_Boiler.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Combustion/__init__.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Compressor/Compressor.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Compressor/Compressor_m.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Compressor/__init__.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Condenser/Condenser.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Condenser/__init__.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Connect.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Desuperheater/Desuperheater.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Desuperheater/__init__.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Evaporator/Evaporator.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Evaporator/__init__.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Expansion_Valve/Expansion_Valve.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Expansion_Valve/__init__.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/FluidPort/FluidPort.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/FluidPort/__init__.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/HEX/AirCooled_HEX.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/HEX/DTLM_HEX.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/HEX/NUT_HEX.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/HEX/Simple_HEX.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/HEX/__init__.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Hydraulic/StraightPipe.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Hydraulic/TA_Valve.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Hydraulic/__init__.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Pump/Pump.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Pump/Pump_m.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Pump/__init__.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Sink/Sink.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Sink/__init__.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Source/Source.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Source/__init__.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Tank/MixedStorage.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Tank/__init__.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Temperature_Entropy_Chart.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Turbine/Turbine.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Turbine/__init__.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/__init__.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/TkinterGUI/Chiller.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/TkinterGUI/__init__.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/energysystemmodels.egg-info/dependency_links.txt +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/energysystemmodels.egg-info/requires.txt +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/test/test_api_diagnostic.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/test/test_api_key.py +0 -0
- {energysystemmodels-20260416002 → energysystemmodels-20260416004}/test/test_compare_keys.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: energysystemmodels
|
|
3
|
-
Version:
|
|
3
|
+
Version: 20260416004
|
|
4
4
|
Summary: Energy systems models are the mathematical models that are developed in order to represent as reliably as possible various energy-related problems.
|
|
5
5
|
Author: Zoheir HADID
|
|
6
6
|
Author-email: zoheir.hadid@gmail.com
|
|
@@ -11,7 +11,7 @@ setup(
|
|
|
11
11
|
name='energysystemmodels',
|
|
12
12
|
|
|
13
13
|
|
|
14
|
-
version='
|
|
14
|
+
version='20260416004',
|
|
15
15
|
|
|
16
16
|
description='Energy systems models are the mathematical models that are developed in order to represent as reliably as possible various energy-related problems.',
|
|
17
17
|
|
|
@@ -0,0 +1,390 @@
|
|
|
1
|
+
import pvlib
|
|
2
|
+
import numpy as np
|
|
3
|
+
import pandas as pd
|
|
4
|
+
import matplotlib.pyplot as plt
|
|
5
|
+
|
|
6
|
+
class SolarSystem:
|
|
7
|
+
def __init__(self, latitude, longitude, name, altitude, timezone, azimut, inclinaison):
|
|
8
|
+
self.latitude = latitude
|
|
9
|
+
self.longitude = longitude
|
|
10
|
+
self.name = name
|
|
11
|
+
self.altitude = altitude
|
|
12
|
+
self.timezone = timezone
|
|
13
|
+
self.azimut = azimut
|
|
14
|
+
self.inclinaison = inclinaison
|
|
15
|
+
self.weather = None
|
|
16
|
+
self.module = None
|
|
17
|
+
self.inverter = None
|
|
18
|
+
self.temperature_model_parameters = None
|
|
19
|
+
self.system = None
|
|
20
|
+
self.solpos = None
|
|
21
|
+
self.dni_extra = None
|
|
22
|
+
self.airmass = None
|
|
23
|
+
self.pressure = None
|
|
24
|
+
self.am_abs = None
|
|
25
|
+
self.aoi = None
|
|
26
|
+
self.total_irradiance = None
|
|
27
|
+
self.cell_temperature = None
|
|
28
|
+
self.effective_irradiance = None
|
|
29
|
+
self.dc = None
|
|
30
|
+
self.ac = None
|
|
31
|
+
self.annual_energy = None
|
|
32
|
+
self.df = None
|
|
33
|
+
|
|
34
|
+
def retrieve_module_inverter_data(self,
|
|
35
|
+
module_name='Canadian_Solar_CS5P_220M___2009_',
|
|
36
|
+
inverter_name='ABB__MICRO_0_25_I_OUTD_US_208__208V_',
|
|
37
|
+
temperature_model='open_rack_glass_glass'):
|
|
38
|
+
sandia_modules = pvlib.pvsystem.retrieve_sam('SandiaMod')
|
|
39
|
+
sapm_inverters = pvlib.pvsystem.retrieve_sam('cecinverter')
|
|
40
|
+
self.module = sandia_modules[module_name]
|
|
41
|
+
self.inverter = sapm_inverters[inverter_name]
|
|
42
|
+
self.temperature_model_parameters = pvlib.temperature.TEMPERATURE_MODEL_PARAMETERS['sapm'][temperature_model]
|
|
43
|
+
|
|
44
|
+
def retrieve_weather_data(self):
|
|
45
|
+
# Récupération des données météorologiques TMY à partir de PVGIS pour l'emplacement spécifié
|
|
46
|
+
weather = pvlib.iotools.get_pvgis_tmy(self.latitude, self.longitude, map_variables=True)[0]
|
|
47
|
+
weather.index.name = "utc_time" # Définition du nom de l'index des données météorologiques
|
|
48
|
+
self.weather = weather
|
|
49
|
+
#print("Données météorologiques typiques :", self.weather)
|
|
50
|
+
|
|
51
|
+
def calculate_solar_parameters(self):
|
|
52
|
+
if self.weather is None:
|
|
53
|
+
self.retrieve_weather_data()
|
|
54
|
+
self.system = {'module': self.module, 'inverter': self.inverter, 'surface_azimuth': self.azimut}
|
|
55
|
+
# Définition de l'inclinaison de la surface du système solaire
|
|
56
|
+
self.system['surface_tilt'] = self.inclinaison
|
|
57
|
+
# Calcul de la position solaire
|
|
58
|
+
self.solpos = pvlib.solarposition.get_solarposition(
|
|
59
|
+
time=self.weather.index,
|
|
60
|
+
latitude=self.latitude,
|
|
61
|
+
longitude=self.longitude,
|
|
62
|
+
altitude=self.altitude,
|
|
63
|
+
temperature=self.weather["temp_air"],
|
|
64
|
+
pressure=pvlib.atmosphere.alt2pres(self.altitude),
|
|
65
|
+
)
|
|
66
|
+
#print("position du soleil===", self.solpos)
|
|
67
|
+
# Calcul du rayonnement solaire supplémentaire
|
|
68
|
+
self.dni_extra = pvlib.irradiance.get_extra_radiation(self.weather.index)
|
|
69
|
+
#print("rayonnement solaire suplémentaire", self.dni_extra)
|
|
70
|
+
# Calcul de la masse d'air relative
|
|
71
|
+
self.airmass = pvlib.atmosphere.get_relative_airmass(self.solpos['apparent_zenith'])
|
|
72
|
+
#print("masse d'air relative", self.airmass)
|
|
73
|
+
# Calcul de la pression atmosphérique
|
|
74
|
+
self.pressure = pvlib.atmosphere.alt2pres(self.altitude)
|
|
75
|
+
#print("pression atm", self.pressure)
|
|
76
|
+
# Calcul de la masse d'air absolue
|
|
77
|
+
self.am_abs = pvlib.atmosphere.get_absolute_airmass(self.airmass, self.pressure)
|
|
78
|
+
#print("masse d'air absolue", self.am_abs)
|
|
79
|
+
# Calcul de l'angle d'incidence
|
|
80
|
+
self.aoi = pvlib.irradiance.aoi(
|
|
81
|
+
self.system['surface_tilt'],
|
|
82
|
+
self.system['surface_azimuth'],
|
|
83
|
+
self.solpos["apparent_zenith"],
|
|
84
|
+
self.solpos["azimuth"],
|
|
85
|
+
)
|
|
86
|
+
#print("angle d'incidence", self.aoi)
|
|
87
|
+
# Calcul du rayonnement solaire total
|
|
88
|
+
self.total_irradiance = pvlib.irradiance.get_total_irradiance(
|
|
89
|
+
self.system['surface_tilt'],
|
|
90
|
+
self.system['surface_azimuth'],
|
|
91
|
+
self.solpos['apparent_zenith'],
|
|
92
|
+
self.solpos['azimuth'],
|
|
93
|
+
self.weather['dni'],
|
|
94
|
+
self.weather['ghi'],
|
|
95
|
+
self.weather['dhi'],
|
|
96
|
+
dni_extra=self.dni_extra,
|
|
97
|
+
model='haydavies',
|
|
98
|
+
)
|
|
99
|
+
#print("rayonnement solaire total", self.total_irradiance)
|
|
100
|
+
# Calcul de la température des cellules solaires
|
|
101
|
+
self.cell_temperature = pvlib.temperature.sapm_cell(
|
|
102
|
+
self.total_irradiance['poa_global'],
|
|
103
|
+
self.weather["temp_air"],
|
|
104
|
+
self.weather["wind_speed"],
|
|
105
|
+
**self.temperature_model_parameters,
|
|
106
|
+
)
|
|
107
|
+
#print("température des cellules solaires", self.cell_temperature)
|
|
108
|
+
# Calcul du rayonnement solaire effectif
|
|
109
|
+
self.effective_irradiance = pvlib.pvsystem.sapm_effective_irradiance(
|
|
110
|
+
self.total_irradiance['poa_direct'],
|
|
111
|
+
self.total_irradiance['poa_diffuse'],
|
|
112
|
+
self.am_abs,
|
|
113
|
+
self.aoi,
|
|
114
|
+
self.module,
|
|
115
|
+
)
|
|
116
|
+
#print("rayonnement solaire effectif", self.effective_irradiance)
|
|
117
|
+
# Calcul de la puissance CC (courant continu)
|
|
118
|
+
self.dc = pvlib.pvsystem.sapm(self.effective_irradiance, self.cell_temperature, self.module)
|
|
119
|
+
#print("puissance CC", self.dc)
|
|
120
|
+
# Calcul de la puissance CA (courant alternatif)
|
|
121
|
+
self.ac = pvlib.inverter.sandia(self.dc['v_mp'], self.dc['p_mp'], self.inverter)
|
|
122
|
+
#print("puissance CA (courant alternatif)", self.ac)
|
|
123
|
+
# Calcul de l'énergie annuelle
|
|
124
|
+
self.annual_energy = self.ac.sum()
|
|
125
|
+
|
|
126
|
+
module_area = self.module['Area'] if self.module is not None else 0
|
|
127
|
+
module_wc = self.module['Impo'] * self.module['Vmpo'] if self.module is not None else 0
|
|
128
|
+
prod_kwh = self.annual_energy / 1000
|
|
129
|
+
|
|
130
|
+
self.df = pd.DataFrame({'SolarSystem': [
|
|
131
|
+
self.name,
|
|
132
|
+
f"{self.latitude:.3f}",
|
|
133
|
+
f"{self.longitude:.3f}",
|
|
134
|
+
f"{self.azimut}",
|
|
135
|
+
f"{self.inclinaison}",
|
|
136
|
+
self.module.name if self.module is not None else "N/A",
|
|
137
|
+
f"{module_area:.3f}",
|
|
138
|
+
f"{module_wc:.1f}",
|
|
139
|
+
self.inverter.name if self.inverter is not None else "N/A",
|
|
140
|
+
f"{prod_kwh:.1f}",
|
|
141
|
+
f"{prod_kwh / (module_wc / 1000):.0f}" if module_wc > 0 else "N/A",
|
|
142
|
+
]}, index=[
|
|
143
|
+
'Site', 'Latitude (deg)', 'Longitude (deg)',
|
|
144
|
+
'Azimut (deg)', 'Inclinaison (deg)',
|
|
145
|
+
'Module', 'Surface module (m2)', 'Puissance STC (Wc)',
|
|
146
|
+
'Onduleur',
|
|
147
|
+
'Production / module (kWh/an)',
|
|
148
|
+
'Productivite (kWh/kWc/an)',
|
|
149
|
+
])
|
|
150
|
+
|
|
151
|
+
def summary(self, nb_modules=1, module_wc=None,
|
|
152
|
+
capex_eur_m2=None, opex_eur_m2=None,
|
|
153
|
+
tarif_elec_eur_mwh=None, duree_vie=25):
|
|
154
|
+
"""Retourne un DataFrame de synthese technique et economique.
|
|
155
|
+
|
|
156
|
+
Parameters
|
|
157
|
+
----------
|
|
158
|
+
nb_modules : int
|
|
159
|
+
Nombre de modules dans l'installation.
|
|
160
|
+
module_wc : float or None
|
|
161
|
+
Puissance crete d'un module en Wc.
|
|
162
|
+
capex_eur_m2 : float or None
|
|
163
|
+
Cout d'investissement par m2 de panneau installe (EUR/m2).
|
|
164
|
+
Si None, pas d'analyse economique.
|
|
165
|
+
opex_eur_m2 : float or None
|
|
166
|
+
Cout d'exploitation annuel par m2 (EUR/m2/an).
|
|
167
|
+
tarif_elec_eur_mwh : float or None
|
|
168
|
+
Prix de l'electricite valorisee (EUR/MWh).
|
|
169
|
+
duree_vie : int
|
|
170
|
+
Duree de vie du projet en annees (defaut 25 ans).
|
|
171
|
+
"""
|
|
172
|
+
if module_wc is None:
|
|
173
|
+
module_wc = self.module['Impo'] * self.module['Vmpo']
|
|
174
|
+
|
|
175
|
+
prod_module_kwh = self.annual_energy / 1000
|
|
176
|
+
productivite = prod_module_kwh / (module_wc / 1000)
|
|
177
|
+
puissance_kwc = nb_modules * module_wc / 1000
|
|
178
|
+
prod_totale_mwh = prod_module_kwh * nb_modules / 1000
|
|
179
|
+
module_area = self.module['Area'] if self.module is not None else 1.65
|
|
180
|
+
surface_m2 = nb_modules * module_area
|
|
181
|
+
|
|
182
|
+
rows = [
|
|
183
|
+
("--- SIMULATION ---", ""),
|
|
184
|
+
("Site", self.name),
|
|
185
|
+
("Module", self.module.name if self.module is not None else "N/A"),
|
|
186
|
+
("Surface module", f"{module_area:.3f} m2"),
|
|
187
|
+
("Nb modules", nb_modules),
|
|
188
|
+
("Puissance crete", f"{puissance_kwc:.1f} kWc"),
|
|
189
|
+
("Surface capteurs", f"{surface_m2:.0f} m2"),
|
|
190
|
+
("Production / module", f"{prod_module_kwh:.1f} kWh/an"),
|
|
191
|
+
("Productivite specifique", f"{productivite:.0f} kWh/kWc/an"),
|
|
192
|
+
("Production totale", f"{prod_totale_mwh:.1f} MWh/an"),
|
|
193
|
+
]
|
|
194
|
+
|
|
195
|
+
if all(v is not None for v in [capex_eur_m2, opex_eur_m2,
|
|
196
|
+
tarif_elec_eur_mwh]):
|
|
197
|
+
capex = surface_m2 * capex_eur_m2
|
|
198
|
+
opex = surface_m2 * opex_eur_m2
|
|
199
|
+
valorisation = prod_totale_mwh * tarif_elec_eur_mwh
|
|
200
|
+
gain_net = valorisation - opex
|
|
201
|
+
payback = capex / gain_net if gain_net > 0 else np.inf
|
|
202
|
+
roi = ((gain_net * duree_vie - capex) / capex * 100) if capex > 0 else 0
|
|
203
|
+
|
|
204
|
+
# TRI : taux r tel que sum(gain_net/(1+r)^t, t=1..N) = capex
|
|
205
|
+
tri = 0.0
|
|
206
|
+
if gain_net > 0 and capex > 0:
|
|
207
|
+
from scipy.optimize import brentq
|
|
208
|
+
def npv(r):
|
|
209
|
+
return sum(gain_net / (1 + r) ** t
|
|
210
|
+
for t in range(1, duree_vie + 1)) - capex
|
|
211
|
+
try:
|
|
212
|
+
tri = brentq(npv, -0.5, 5.0) * 100
|
|
213
|
+
except Exception:
|
|
214
|
+
tri = 0.0
|
|
215
|
+
|
|
216
|
+
rows += [
|
|
217
|
+
("--- HYPOTHESES ECO ---", ""),
|
|
218
|
+
("CAPEX", f"{capex_eur_m2} EUR/m2"),
|
|
219
|
+
("OPEX", f"{opex_eur_m2} EUR/m2/an"),
|
|
220
|
+
("Tarif electricite", f"{tarif_elec_eur_mwh} EUR/MWh"),
|
|
221
|
+
("Duree de vie", f"{duree_vie} ans"),
|
|
222
|
+
("--- RESULTATS ECO ---", ""),
|
|
223
|
+
("Investissement", f"{capex/1000:.0f} kEUR"),
|
|
224
|
+
("Valorisation annuelle", f"{valorisation/1000:.1f} kEUR/an"),
|
|
225
|
+
("OPEX annuel", f"{opex/1000:.1f} kEUR/an"),
|
|
226
|
+
("Gain net annuel", f"{gain_net/1000:.1f} kEUR/an"),
|
|
227
|
+
("Payback", f"{payback:.1f} ans"),
|
|
228
|
+
("ROI ({0} ans)".format(duree_vie), f"{roi:.0f} %"),
|
|
229
|
+
("TRI", f"{tri:.1f} %"),
|
|
230
|
+
]
|
|
231
|
+
|
|
232
|
+
return pd.DataFrame(rows, columns=["Indicateur", "Valeur"])
|
|
233
|
+
|
|
234
|
+
def plot(self, figsize=(14, 5), nb_modules=1):
|
|
235
|
+
"""Trace la production horaire AC et le profil mensuel."""
|
|
236
|
+
ac_kw = self.ac * nb_modules / 1000
|
|
237
|
+
|
|
238
|
+
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=figsize)
|
|
239
|
+
|
|
240
|
+
ax1.plot(ac_kw.values, linewidth=0.3)
|
|
241
|
+
ax1.set_xlabel('Heure de l\'annee')
|
|
242
|
+
ax1.set_ylabel('Production AC (kW)')
|
|
243
|
+
ax1.set_title(f'{self.name} - Production horaire ({nb_modules} modules)')
|
|
244
|
+
ax1.grid(True, alpha=0.3)
|
|
245
|
+
|
|
246
|
+
monthly = ac_kw.resample('ME').sum()
|
|
247
|
+
total_mwh = abs(ac_kw.sum()) / 1000
|
|
248
|
+
ax2.bar(range(len(monthly)), monthly.values, color='orange')
|
|
249
|
+
ax2.set_xticks(range(len(monthly)))
|
|
250
|
+
ax2.set_xticklabels(['J','F','M','A','M','J','J','A','S','O','N','D'][:len(monthly)])
|
|
251
|
+
ax2.set_ylabel('Production mensuelle (kWh)')
|
|
252
|
+
ax2.set_title(f'{self.name} - Profil mensuel | Total : {total_mwh:.1f} MWh/an')
|
|
253
|
+
ax2.grid(axis='y', alpha=0.3)
|
|
254
|
+
|
|
255
|
+
plt.tight_layout()
|
|
256
|
+
plt.show()
|
|
257
|
+
return fig
|
|
258
|
+
|
|
259
|
+
def to_excel(self, filename=None, nb_modules=1):
|
|
260
|
+
"""Exporte la production horaire en fichier Excel.
|
|
261
|
+
|
|
262
|
+
Parameters
|
|
263
|
+
----------
|
|
264
|
+
filename : str or None
|
|
265
|
+
Chemin du fichier. Si None, genere '{name}_production.xlsx'.
|
|
266
|
+
nb_modules : int
|
|
267
|
+
Nombre de modules (defaut 1).
|
|
268
|
+
|
|
269
|
+
Returns
|
|
270
|
+
-------
|
|
271
|
+
str
|
|
272
|
+
Chemin du fichier cree.
|
|
273
|
+
"""
|
|
274
|
+
if filename is None:
|
|
275
|
+
filename = f"{self.name.replace(' ', '_')}_production.xlsx"
|
|
276
|
+
|
|
277
|
+
df_export = pd.DataFrame({
|
|
278
|
+
'Production_AC_kW': self.ac * nb_modules / 1000,
|
|
279
|
+
'Irradiance_POA_W_m2': self.total_irradiance['poa_global'],
|
|
280
|
+
'T_cellule_C': self.cell_temperature,
|
|
281
|
+
'T_air_C': self.weather['temp_air'],
|
|
282
|
+
})
|
|
283
|
+
df_export.index.name = 'datetime_utc'
|
|
284
|
+
|
|
285
|
+
with pd.ExcelWriter(filename, engine='openpyxl') as writer:
|
|
286
|
+
df_export.to_excel(writer, sheet_name='Horaire')
|
|
287
|
+
df_export.resample('ME').sum().to_excel(writer, sheet_name='Mensuel')
|
|
288
|
+
self.df.to_excel(writer, sheet_name='Synthese')
|
|
289
|
+
|
|
290
|
+
print(f"Export : {filename}")
|
|
291
|
+
return filename
|
|
292
|
+
|
|
293
|
+
def plot_annual_energy(self):
|
|
294
|
+
energies = pd.Series({self.name: self.annual_energy})
|
|
295
|
+
energies.plot(kind='bar', rot=0)
|
|
296
|
+
plt.ylabel('Rendement energetique annuel (Wh)')
|
|
297
|
+
|
|
298
|
+
@staticmethod
|
|
299
|
+
def orientation_study(latitude, longitude, name, altitude, timezone,
|
|
300
|
+
scenarios):
|
|
301
|
+
"""Etude parametrique d'orientation et d'inclinaison.
|
|
302
|
+
|
|
303
|
+
Parameters
|
|
304
|
+
----------
|
|
305
|
+
latitude, longitude, name, altitude, timezone :
|
|
306
|
+
Parametres du site (identiques a __init__).
|
|
307
|
+
scenarios : list[dict]
|
|
308
|
+
Liste de dicts avec cles 'nom', 'azimut', 'inclinaison'.
|
|
309
|
+
|
|
310
|
+
Returns
|
|
311
|
+
-------
|
|
312
|
+
df : pd.DataFrame
|
|
313
|
+
Tableau comparatif trie par production decroissante.
|
|
314
|
+
df_monthly : pd.DataFrame
|
|
315
|
+
Production mensuelle (kWh/kWc) par scenario (colonnes)
|
|
316
|
+
et par mois (index).
|
|
317
|
+
"""
|
|
318
|
+
resultats = []
|
|
319
|
+
monthly_data = {}
|
|
320
|
+
for sc in scenarios:
|
|
321
|
+
pv = SolarSystem(
|
|
322
|
+
latitude=latitude, longitude=longitude,
|
|
323
|
+
name=sc['nom'], altitude=altitude,
|
|
324
|
+
timezone=timezone,
|
|
325
|
+
azimut=sc['azimut'], inclinaison=sc['inclinaison']
|
|
326
|
+
)
|
|
327
|
+
pv.retrieve_module_inverter_data()
|
|
328
|
+
pv.calculate_solar_parameters()
|
|
329
|
+
|
|
330
|
+
module_wc = pv.module['Impo'] * pv.module['Vmpo']
|
|
331
|
+
ac_kwh_kwc = pv.ac / module_wc
|
|
332
|
+
monthly = ac_kwh_kwc.resample('ME').sum()
|
|
333
|
+
monthly.index = range(1, len(monthly) + 1)
|
|
334
|
+
monthly_data[sc['nom']] = monthly
|
|
335
|
+
|
|
336
|
+
prod_kwh_kwc = pv.annual_energy / 1000 / (module_wc / 1000)
|
|
337
|
+
resultats.append({
|
|
338
|
+
'Configuration': sc['nom'],
|
|
339
|
+
'Azimut (deg)': sc['azimut'],
|
|
340
|
+
'Inclinaison (deg)': sc['inclinaison'],
|
|
341
|
+
'Production (kWh/kWc/an)': round(prod_kwh_kwc, 1),
|
|
342
|
+
})
|
|
343
|
+
|
|
344
|
+
df = pd.DataFrame(resultats)
|
|
345
|
+
prod_max = df['Production (kWh/kWc/an)'].max()
|
|
346
|
+
df['Ecart vs Optimal (%)'] = (
|
|
347
|
+
(df['Production (kWh/kWc/an)'] - prod_max) / prod_max * 100
|
|
348
|
+
).round(1)
|
|
349
|
+
df = df.sort_values('Production (kWh/kWc/an)', ascending=False)
|
|
350
|
+
df = df.reset_index(drop=True)
|
|
351
|
+
|
|
352
|
+
df_monthly = pd.DataFrame(monthly_data)
|
|
353
|
+
return df, df_monthly
|
|
354
|
+
|
|
355
|
+
@staticmethod
|
|
356
|
+
def plot_orientation_study(df, df_monthly, name='', save_fig=None):
|
|
357
|
+
"""Trace les profils mensuels par orientation.
|
|
358
|
+
|
|
359
|
+
Parameters
|
|
360
|
+
----------
|
|
361
|
+
df : pd.DataFrame
|
|
362
|
+
Resultat de orientation_study() (tableau annuel).
|
|
363
|
+
df_monthly : pd.DataFrame
|
|
364
|
+
Profils mensuels par scenario.
|
|
365
|
+
name : str
|
|
366
|
+
Nom du site (pour le titre).
|
|
367
|
+
save_fig : str or None
|
|
368
|
+
Chemin fichier image. Si None, pas de sauvegarde.
|
|
369
|
+
"""
|
|
370
|
+
fig, ax = plt.subplots(figsize=(12, 6))
|
|
371
|
+
mois_labels = ['Jan','Fev','Mar','Avr','Mai','Jun',
|
|
372
|
+
'Jul','Aou','Sep','Oct','Nov','Dec']
|
|
373
|
+
totaux = df.set_index('Configuration')['Production (kWh/kWc/an)']
|
|
374
|
+
for col in df_monthly.columns:
|
|
375
|
+
total = totaux.get(col, df_monthly[col].sum())
|
|
376
|
+
ax.plot(df_monthly.index, df_monthly[col], 'o-',
|
|
377
|
+
linewidth=1.5, markersize=4,
|
|
378
|
+
label=f'{col} ({total:.0f} kWh/kWc/an)')
|
|
379
|
+
ax.set_xticks(range(1, len(df_monthly) + 1))
|
|
380
|
+
ax.set_xticklabels(mois_labels[:len(df_monthly)])
|
|
381
|
+
ax.set_xlabel('Mois')
|
|
382
|
+
ax.set_ylabel('Production mensuelle (kWh/kWc)')
|
|
383
|
+
ax.set_title(f'Profil mensuel par orientation - {name}')
|
|
384
|
+
ax.legend(fontsize=11)
|
|
385
|
+
ax.grid(True, alpha=0.3)
|
|
386
|
+
fig.tight_layout()
|
|
387
|
+
if save_fig:
|
|
388
|
+
fig.savefig(save_fig, dpi=150)
|
|
389
|
+
plt.show()
|
|
390
|
+
return fig
|
{energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Chiller.py
RENAMED
|
@@ -76,10 +76,30 @@ class Object:
|
|
|
76
76
|
self.Q_condTot = self.COND.Q_cond + self.DESURCH.Qdesurch
|
|
77
77
|
self.COP = self.Q_condTot / self.COMP.Q_comp
|
|
78
78
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
79
|
+
T_evap = self.EVAP.Ti_degC
|
|
80
|
+
T_cond = self.COMP.Tcond_degC
|
|
81
|
+
lift = T_cond - T_evap
|
|
82
|
+
COP_Carnot = (T_cond + 273.15) / lift if lift > 0 else float('inf')
|
|
83
|
+
|
|
84
|
+
self.df = pd.DataFrame({'Chiller': [
|
|
85
|
+
self.fluid,
|
|
86
|
+
round(T_evap, 1), round(T_cond, 1), round(lift, 1),
|
|
87
|
+
round(self.EER, 3), round(self.COP, 3),
|
|
88
|
+
round(COP_Carnot, 2),
|
|
89
|
+
round(self.COP / COP_Carnot * 100, 1) if COP_Carnot < float('inf') else 0,
|
|
90
|
+
round(self.COMP.Q_comp / 1000, 2),
|
|
91
|
+
round(self.COMP.Q_losses / 1000, 2),
|
|
92
|
+
round(self.EVAP.Q_evap / 1000, 2),
|
|
93
|
+
round(self.Q_condTot / 1000, 2),
|
|
94
|
+
round(self.COMP.Outlet.T - 273.15, 1),
|
|
95
|
+
round(self.EVAP.Pi / 1e5, 2),
|
|
96
|
+
round(self.COND.Psat / 1e5, 2),
|
|
97
|
+
]}, index=[
|
|
98
|
+
'Fluid', 'T_evap (C)', 'T_cond (C)', 'Lift (K)',
|
|
99
|
+
'EER', 'COP', 'COP_Carnot', 'Eta_Carnot (%)',
|
|
100
|
+
'Q_comp (kW)', 'Q_losses (kW)', 'Q_evap (kW)', 'Q_condTot (kW)',
|
|
101
|
+
'T_refoulement (C)', 'P_evap (bar)', 'P_cond (bar)',
|
|
102
|
+
])
|
|
83
103
|
|
|
84
104
|
|
|
85
105
|
self.points = [
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import pandas as pd
|
|
2
|
+
import re
|
|
3
|
+
from typing import List
|
|
4
|
+
|
|
5
|
+
class NG_Heating_Value:
|
|
6
|
+
|
|
7
|
+
# Masse atomique en g/mol
|
|
8
|
+
atomic_weights = {"C":12.011, "H":1.00794, "O":15.9994, "N":14.00674}
|
|
9
|
+
|
|
10
|
+
@staticmethod
|
|
11
|
+
def molar_mass(formula):
|
|
12
|
+
"""Calcule la masse molaire d'une formule chimique simple (C,H,O,N)"""
|
|
13
|
+
formula_clean = formula.replace("n-","").replace("i-","").replace("neo-","")
|
|
14
|
+
matches = re.findall(r'([CHON])(\d*)', formula_clean)
|
|
15
|
+
mass = 0
|
|
16
|
+
for elem, num in matches:
|
|
17
|
+
n = int(num) if num else 1
|
|
18
|
+
mass += NG_Heating_Value.atomic_weights[elem] * n
|
|
19
|
+
return mass
|
|
20
|
+
|
|
21
|
+
# Données des composants
|
|
22
|
+
data = [
|
|
23
|
+
["Methane", "CH4", 891.56, 802.69, 0.0447, 2.232],
|
|
24
|
+
["Ethane", "C2H6", 1562.14, 1428.84, 0.0922, 1.756],
|
|
25
|
+
["Propane", "C3H8", 2221.10, 2043.37, 0.1338, 1.685],
|
|
26
|
+
["n-Butane", "n-C4H10", 2879.76, 2657.60, 0.1871, 1.731],
|
|
27
|
+
["i-Butane", "i-C4H10", 2870.58, 2648.42, 0.1789, 1.693],
|
|
28
|
+
["n-Pentane", "n-C5H12", 3538.60, 3272.00, 0.251, 2.313],
|
|
29
|
+
["i-Pentane", "i-C5H12", 3531.68, 3265.08, 0.228, 2.313],
|
|
30
|
+
["neo-Pentane", "neo-C5H12", 3517.43, 3250.83, 0.2121, 2.313],
|
|
31
|
+
["n-Hexane", "n-C6H14", 4198.24, 3887.21, 0.295, 2.259],
|
|
32
|
+
["Nitrogen", "N2", 0.0, 0.0, 0.0173, 1.025],
|
|
33
|
+
["Carbon dioxide", "CO2", 0.0, 0.0, 0.0748, 0.650],
|
|
34
|
+
["Hydrogen", "H2", 286.15, 241.72, -0.0048, 10.140]
|
|
35
|
+
]
|
|
36
|
+
columns = ["Component","Formula","HHV","LHV","b_factor","Cp"]
|
|
37
|
+
df = pd.DataFrame(data, columns=columns)
|
|
38
|
+
|
|
39
|
+
class GasComponent:
|
|
40
|
+
"""Classe interne pour représenter un composant gazeux"""
|
|
41
|
+
def __init__(self, formula: str, x: float):
|
|
42
|
+
self.formula = formula
|
|
43
|
+
self.x = x
|
|
44
|
+
# Masse molaire
|
|
45
|
+
self.M = NG_Heating_Value.molar_mass(formula)
|
|
46
|
+
# Chercher les propriétés dans le DataFrame
|
|
47
|
+
row = NG_Heating_Value.df.loc[NG_Heating_Value.df['Formula'] == formula]
|
|
48
|
+
if not row.empty:
|
|
49
|
+
self.HHV = row['HHV'].values[0]
|
|
50
|
+
self.LHV = row['LHV'].values[0]
|
|
51
|
+
self.b = row['b_factor'].values[0]
|
|
52
|
+
self.Cp = row['Cp'].values[0]
|
|
53
|
+
else:
|
|
54
|
+
self.HHV = 0
|
|
55
|
+
self.LHV = 0
|
|
56
|
+
self.b = 0
|
|
57
|
+
self.Cp = 0
|
|
58
|
+
|
|
59
|
+
def __init__(self, comps: List['NG_Heating_Value.GasComponent']):
|
|
60
|
+
self.c = comps
|
|
61
|
+
|
|
62
|
+
def M_mix(self):
|
|
63
|
+
return sum(ci.x * ci.M for ci in self.c)
|
|
64
|
+
|
|
65
|
+
def Cp_mix(self):
|
|
66
|
+
return sum(ci.x * ci.Cp for ci in self.c)
|
|
67
|
+
|
|
68
|
+
def HHV_mol(self):
|
|
69
|
+
return sum(ci.x * ci.HHV for ci in self.c)
|
|
70
|
+
|
|
71
|
+
def LHV_mol(self):
|
|
72
|
+
return sum(ci.x * ci.LHV for ci in self.c)
|
|
73
|
+
|
|
74
|
+
def sum_b(self):
|
|
75
|
+
return sum(ci.x * ci.b for ci in self.c)
|
|
76
|
+
|
|
77
|
+
def Z(self):
|
|
78
|
+
return 1 - self.sum_b()**2
|
|
79
|
+
|
|
80
|
+
def to_dataframe(self):
|
|
81
|
+
M = self.M_mix()
|
|
82
|
+
Cp = self.Cp_mix()
|
|
83
|
+
Hs = self.HHV_mol()
|
|
84
|
+
Hi = self.LHV_mol()
|
|
85
|
+
Z = self.Z()
|
|
86
|
+
R = 8.314510
|
|
87
|
+
P = 101.325
|
|
88
|
+
T = 273.15
|
|
89
|
+
M_AIR = 28.9626
|
|
90
|
+
Z_AIR = 0.99958
|
|
91
|
+
|
|
92
|
+
HHV_vol_MJ_Nm3 = Hs * P / (R * T)
|
|
93
|
+
LHV_vol_MJ_Nm3 = Hi * P / (R * T)
|
|
94
|
+
HHV_vol_real_MJ_Nm3 = HHV_vol_MJ_Nm3 / Z
|
|
95
|
+
LHV_vol_real_MJ_Nm3 = LHV_vol_MJ_Nm3 / Z
|
|
96
|
+
HHV_vol_kWh_Nm3 = HHV_vol_real_MJ_Nm3 / 3.6
|
|
97
|
+
LHV_vol_kWh_Nm3 = LHV_vol_real_MJ_Nm3 / 3.6
|
|
98
|
+
|
|
99
|
+
density = (P / (R * T)) * M
|
|
100
|
+
density_real = density / Z
|
|
101
|
+
d_rel = M / M_AIR
|
|
102
|
+
relative_d_rel = d_rel * Z_AIR / Z
|
|
103
|
+
|
|
104
|
+
HHV_mass_MJ_kg = Hs / M
|
|
105
|
+
LHV_mass_MJ_kg = Hi / M
|
|
106
|
+
|
|
107
|
+
Wobbe_index = HHV_vol_MJ_Nm3 / (d_rel ** 0.5)
|
|
108
|
+
Wobbe_real = (HHV_vol_MJ_Nm3 / Z) / (relative_d_rel ** 0.5)
|
|
109
|
+
|
|
110
|
+
data = [
|
|
111
|
+
["Cp", Cp, "J/kg/K"],
|
|
112
|
+
["Z mix", Z, "-"],
|
|
113
|
+
["HHV mass (PCS)", HHV_mass_MJ_kg, "MJ/kg"],
|
|
114
|
+
["LHV mass (PCI)", LHV_mass_MJ_kg, "MJ/kg"],
|
|
115
|
+
["HHV vol", HHV_vol_MJ_Nm3, "MJ/Nm3"],
|
|
116
|
+
["LHV vol", LHV_vol_MJ_Nm3, "MJ/Nm3"],
|
|
117
|
+
["HHV real", HHV_vol_real_MJ_Nm3, "MJ/Nm3"],
|
|
118
|
+
["LHV real", LHV_vol_real_MJ_Nm3, "MJ/Nm3"],
|
|
119
|
+
["HHV vol", HHV_vol_kWh_Nm3, "kWh/Nm3"],
|
|
120
|
+
["LHV vol", LHV_vol_kWh_Nm3, "kWh/Nm3"],
|
|
121
|
+
["Density", density, "kg/Nm3"],
|
|
122
|
+
["Density real", density_real, "kg/Nm3"],
|
|
123
|
+
["Relative density", d_rel, "-"],
|
|
124
|
+
["Relative density real", relative_d_rel, "-"],
|
|
125
|
+
["Wobbe index", Wobbe_index, "MJ/Nm3"],
|
|
126
|
+
["Wobbe real", Wobbe_real, "MJ/Nm3"],
|
|
127
|
+
]
|
|
128
|
+
return pd.DataFrame(data, columns=["Property", "Value", "Unit"])
|
|
129
|
+
|
|
130
|
+
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: energysystemmodels
|
|
3
|
-
Version:
|
|
3
|
+
Version: 20260416004
|
|
4
4
|
Summary: Energy systems models are the mathematical models that are developed in order to represent as reliably as possible various energy-related problems.
|
|
5
5
|
Author: Zoheir HADID
|
|
6
6
|
Author-email: zoheir.hadid@gmail.com
|
|
@@ -34,7 +34,6 @@ src/Distillation/PengRobinson.py
|
|
|
34
34
|
src/Distillation/__init__.py
|
|
35
35
|
src/Distillation/diag_enthalpy_models.py
|
|
36
36
|
src/Distillation/reverse_engineer_enthalpies.py
|
|
37
|
-
src/EnergySystemModels/__init__.py
|
|
38
37
|
src/Facture/ATR_Transport_Distribution.py
|
|
39
38
|
src/Facture/SONALGAZ_Elec.py
|
|
40
39
|
src/Facture/SONALGAZ_gaz.py
|
|
@@ -151,6 +150,7 @@ src/ThermodynamicCycles/Aeraulic/StraightPipe.py
|
|
|
151
150
|
src/ThermodynamicCycles/Aeraulic/__init__.py
|
|
152
151
|
src/ThermodynamicCycles/Combustion/Combustor_cantera.py
|
|
153
152
|
src/ThermodynamicCycles/Combustion/Gaz_Boiler.py
|
|
153
|
+
src/ThermodynamicCycles/Combustion/NG_Heating_Value.py
|
|
154
154
|
src/ThermodynamicCycles/Combustion/__init__.py
|
|
155
155
|
src/ThermodynamicCycles/Compressor/Compressor.py
|
|
156
156
|
src/ThermodynamicCycles/Compressor/Compressor_m.py
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
"""EnergySystemModels - Namespace package for energy system modeling.
|
|
2
|
-
|
|
3
|
-
This package re-exports all sub-packages so that both import styles work:
|
|
4
|
-
from EnergySystemModels.PV.ProductionElectriquePV import SolarSystem
|
|
5
|
-
from PV.ProductionElectriquePV import SolarSystem # legacy
|
|
6
|
-
"""
|
|
7
|
-
|
|
8
|
-
import importlib
|
|
9
|
-
import sys
|
|
10
|
-
import os
|
|
11
|
-
|
|
12
|
-
# Add src/ to path so sub-packages resolve
|
|
13
|
-
_src_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
|
14
|
-
if _src_dir not in sys.path:
|
|
15
|
-
sys.path.insert(0, _src_dir)
|
|
16
|
-
|
|
17
|
-
# Lazy re-export of all sub-packages
|
|
18
|
-
_subpackages = [
|
|
19
|
-
'AHU', 'CEE', 'Distillation', 'Facture', 'HeatTransfer',
|
|
20
|
-
'IPMVP', 'MeteoCiel', 'NodeEditor', 'OpenWeatherMap', 'PV',
|
|
21
|
-
'PinchAnalysis', 'PyqtSimulator', 'ThermodynamicCycles', 'TkinterGUI',
|
|
22
|
-
]
|
|
23
|
-
|
|
24
|
-
for _pkg in _subpackages:
|
|
25
|
-
try:
|
|
26
|
-
_mod = importlib.import_module(_pkg)
|
|
27
|
-
sys.modules[f'EnergySystemModels.{_pkg}'] = _mod
|
|
28
|
-
# Also register sub-modules already loaded
|
|
29
|
-
_prefix = f'{_pkg}.'
|
|
30
|
-
for _key in list(sys.modules.keys()):
|
|
31
|
-
if _key.startswith(_prefix):
|
|
32
|
-
_subname = _key[len(_prefix):]
|
|
33
|
-
sys.modules[f'EnergySystemModels.{_pkg}.{_subname}'] = sys.modules[_key]
|
|
34
|
-
except ImportError:
|
|
35
|
-
pass
|