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.
Files changed (200) hide show
  1. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/PKG-INFO +1 -1
  2. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/setup.py +1 -1
  3. energysystemmodels-20260416004/src/PV/ProductionElectriquePV.py +390 -0
  4. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Chiller.py +24 -4
  5. energysystemmodels-20260416004/src/ThermodynamicCycles/Combustion/NG_Heating_Value.py +130 -0
  6. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/energysystemmodels.egg-info/PKG-INFO +1 -1
  7. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/energysystemmodels.egg-info/SOURCES.txt +1 -1
  8. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/energysystemmodels.egg-info/top_level.txt +0 -1
  9. energysystemmodels-20260416002/src/EnergySystemModels/__init__.py +0 -35
  10. energysystemmodels-20260416002/src/PV/ProductionElectriquePV.py +0 -268
  11. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/LICENSE +0 -0
  12. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/README.md +0 -0
  13. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/setup.cfg +0 -0
  14. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/AHU/AirPort/AirPort.py +0 -0
  15. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/AHU/AirPort/__init__.py +0 -0
  16. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/AHU/Coil/CoolingCoil.py +0 -0
  17. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/AHU/Coil/CoolingCoil_Expert.py +0 -0
  18. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/AHU/Coil/CoolingCoil_Sensible.py +0 -0
  19. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/AHU/Coil/CoolingCoil_Tc.py +0 -0
  20. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/AHU/Coil/HeatingCoil.py +0 -0
  21. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/AHU/Coil/HeatingCoilNUT.py +0 -0
  22. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/AHU/Coil/__init__.py +0 -0
  23. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/AHU/Connect.py +0 -0
  24. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/AHU/FreshAir/AirMix.py +0 -0
  25. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/AHU/FreshAir/FreshAir.py +0 -0
  26. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/AHU/FreshAir/__init__.py +0 -0
  27. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/AHU/GenericAHU/AirRecoveryAHU.py +0 -0
  28. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/AHU/GenericAHU/AirRecyclingAHU.py +0 -0
  29. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/AHU/GenericAHU/__init__.py +0 -0
  30. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/AHU/HeatRecovery/Heat_plate_exchanger.py +0 -0
  31. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/AHU/HeatRecovery/Thermal_wheel_exchanger.py +0 -0
  32. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/AHU/HeatRecovery/__init__.py +0 -0
  33. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/AHU/Humidification/Humidifier.py +0 -0
  34. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/AHU/Humidification/__init__.py +0 -0
  35. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/AHU/__init__.py +0 -0
  36. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/AHU/air_humide/PsychrometricChart.py +0 -0
  37. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/AHU/air_humide/__init__.py +0 -0
  38. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/AHU/air_humide/air_humide.py +0 -0
  39. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/AHU/air_humide/air_humide_NB.py +0 -0
  40. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/CEE/CEE.py +0 -0
  41. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/CEE/__init__.py +0 -0
  42. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/Distillation/Deethanizer.py +0 -0
  43. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/Distillation/PengRobinson.py +0 -0
  44. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/Distillation/__init__.py +0 -0
  45. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/Distillation/diag_enthalpy_models.py +0 -0
  46. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/Distillation/reverse_engineer_enthalpies.py +0 -0
  47. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/Facture/ATR_Transport_Distribution.py +0 -0
  48. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/Facture/SONALGAZ_Elec.py +0 -0
  49. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/Facture/SONALGAZ_gaz.py +0 -0
  50. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/Facture/TURPE.py +0 -0
  51. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/Facture/__init__.py +0 -0
  52. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/Facture/coefficients_elec.json +0 -0
  53. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/Facture/coefficients_gaz_ATRD.json +0 -0
  54. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/Facture/coefficients_gaz_ATRT.json +0 -0
  55. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/Facture/coefficients_gaz_TICGN.json +0 -0
  56. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/Facture/coefficients_gaz_TVA.json +0 -0
  57. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/Facture/coefficients_sonalgaz_elec.json +0 -0
  58. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/Facture/coefficients_sonalgaz_gaz.json +0 -0
  59. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/Facture/df_utils.py +0 -0
  60. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/Facture/test.py +0 -0
  61. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/HeatTransfer/CompositeWall.py +0 -0
  62. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/HeatTransfer/ParallelepipedicBody.py +0 -0
  63. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/HeatTransfer/PipeInsulationAnalysis.py +0 -0
  64. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/HeatTransfer/PlateHeatTransfer.py +0 -0
  65. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/HeatTransfer/__init__.py +0 -0
  66. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/IPMVP/IPMVP.py +0 -0
  67. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/IPMVP/__init__.py +0 -0
  68. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/MeteoCiel/DJU_costic.py +0 -0
  69. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/MeteoCiel/MeteoCiel_Scraping.py +0 -0
  70. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/MeteoCiel/MeteoCiel_dayScraping.py +0 -0
  71. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/MeteoCiel/__init__.py +0 -0
  72. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/NodeEditor/__init__.py +0 -0
  73. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/NodeEditor/nodeeditor/__init__.py +0 -0
  74. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/NodeEditor/nodeeditor/node_content_widget.py +0 -0
  75. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/NodeEditor/nodeeditor/node_edge.py +0 -0
  76. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/NodeEditor/nodeeditor/node_edge_dragging.py +0 -0
  77. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/NodeEditor/nodeeditor/node_edge_validators.py +0 -0
  78. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/NodeEditor/nodeeditor/node_editor_widget.py +0 -0
  79. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/NodeEditor/nodeeditor/node_editor_window.py +0 -0
  80. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/NodeEditor/nodeeditor/node_graphics_cutline.py +0 -0
  81. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/NodeEditor/nodeeditor/node_graphics_edge.py +0 -0
  82. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/NodeEditor/nodeeditor/node_graphics_edge_path.py +0 -0
  83. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/NodeEditor/nodeeditor/node_graphics_node.py +0 -0
  84. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/NodeEditor/nodeeditor/node_graphics_scene.py +0 -0
  85. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/NodeEditor/nodeeditor/node_graphics_socket.py +0 -0
  86. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/NodeEditor/nodeeditor/node_graphics_view.py +0 -0
  87. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/NodeEditor/nodeeditor/node_node.py +0 -0
  88. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/NodeEditor/nodeeditor/node_scene.py +0 -0
  89. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/NodeEditor/nodeeditor/node_scene_clipboard.py +0 -0
  90. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/NodeEditor/nodeeditor/node_scene_history.py +0 -0
  91. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/NodeEditor/nodeeditor/node_serializable.py +0 -0
  92. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/NodeEditor/nodeeditor/node_socket.py +0 -0
  93. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/NodeEditor/nodeeditor/utils.py +0 -0
  94. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/NodeEditor/setup.py +0 -0
  95. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/NodeEditor/tests/__init__.py +0 -0
  96. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/NodeEditor/tests/test_000_import.py +0 -0
  97. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/NodeEditor/tox.ini +0 -0
  98. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/OpenWeatherMap/OpenWeatherMap_call.py +0 -0
  99. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/OpenWeatherMap/OpenWeatherMap_call_location.py +0 -0
  100. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/OpenWeatherMap/SQlite_OpenWeatherMap.py +0 -0
  101. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/OpenWeatherMap/__init__.py +0 -0
  102. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/OpenWeatherMap/config.ini +0 -0
  103. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/OpenWeatherMap/config_historical.ini +0 -0
  104. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/OpenWeatherMap/data.json +0 -0
  105. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/OpenWeatherMap/get_weather.py +0 -0
  106. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PV/__init__.py +0 -0
  107. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PinchAnalysis/PinchAnalysis.py +0 -0
  108. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PinchAnalysis/__init__.py +0 -0
  109. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PinchAnalysis/functions/Two_flow_pinch_analysis.py +0 -0
  110. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PinchAnalysis/functions/__init__.py +0 -0
  111. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PinchAnalysis/functions/apply_heat_exchange_above.py +0 -0
  112. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PinchAnalysis/functions/apply_heat_exchange_below.py +0 -0
  113. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PinchAnalysis/functions/calculation_HEN.py +0 -0
  114. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PinchAnalysis/functions/calculation_allowed_combinations.py +0 -0
  115. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PinchAnalysis/functions/calculation_below_above_stream.py +0 -0
  116. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PinchAnalysis/functions/calculation_composite_curve.py +0 -0
  117. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PinchAnalysis/functions/calculation_decomposition.py +0 -0
  118. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PinchAnalysis/functions/calculation_graphical_HEN.py +0 -0
  119. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PinchAnalysis/functions/calculation_surplus_deficit.py +0 -0
  120. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PinchAnalysis/functions/check_additional_heat_exchanges.py +0 -0
  121. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PinchAnalysis/functions/draw_hen_from_df.py +0 -0
  122. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PinchAnalysis/functions/plotting.py +0 -0
  123. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/__init__.py +0 -0
  124. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/calc_conf.py +0 -0
  125. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/calc_drag_listbox.py +0 -0
  126. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/calc_node_base.py +0 -0
  127. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/calc_sub_window.py +0 -0
  128. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/calc_window.py +0 -0
  129. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/config.ini +0 -0
  130. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/main.py +0 -0
  131. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/nodes/Simple_HEX.py +0 -0
  132. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/nodes/__init__.py +0 -0
  133. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/nodes/air_input.py +0 -0
  134. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/nodes/air_mixer.py +0 -0
  135. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/nodes/air_output.py +0 -0
  136. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/nodes/compressor.py +0 -0
  137. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/nodes/compressor_m.py +0 -0
  138. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/nodes/condenser.py +0 -0
  139. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/nodes/cooling_coil.py +0 -0
  140. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/nodes/cooling_coil_expert.py +0 -0
  141. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/nodes/cooling_coil_sensible.py +0 -0
  142. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/nodes/desuperheater.py +0 -0
  143. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/nodes/evaporator.py +0 -0
  144. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/nodes/expansion_valve.py +0 -0
  145. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/nodes/heating_coil.py +0 -0
  146. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/nodes/humidificateur.py +0 -0
  147. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/nodes/input.py +0 -0
  148. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/nodes/operations.py +0 -0
  149. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/nodes/output.py +0 -0
  150. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/nodes/random_meteo.py +0 -0
  151. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/nodes/source_P_h.py +0 -0
  152. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/PyqtSimulator/nodes/turbine.py +0 -0
  153. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Aeraulic/StraightPipe.py +0 -0
  154. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Aeraulic/__init__.py +0 -0
  155. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Carnot_Cycle_Analysis.py +0 -0
  156. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Combustion/Combustor_cantera.py +0 -0
  157. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Combustion/Gaz_Boiler.py +0 -0
  158. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Combustion/__init__.py +0 -0
  159. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Compressor/Compressor.py +0 -0
  160. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Compressor/Compressor_m.py +0 -0
  161. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Compressor/__init__.py +0 -0
  162. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Condenser/Condenser.py +0 -0
  163. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Condenser/__init__.py +0 -0
  164. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Connect.py +0 -0
  165. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Desuperheater/Desuperheater.py +0 -0
  166. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Desuperheater/__init__.py +0 -0
  167. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Evaporator/Evaporator.py +0 -0
  168. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Evaporator/__init__.py +0 -0
  169. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Expansion_Valve/Expansion_Valve.py +0 -0
  170. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Expansion_Valve/__init__.py +0 -0
  171. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/FluidPort/FluidPort.py +0 -0
  172. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/FluidPort/__init__.py +0 -0
  173. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/HEX/AirCooled_HEX.py +0 -0
  174. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/HEX/DTLM_HEX.py +0 -0
  175. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/HEX/NUT_HEX.py +0 -0
  176. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/HEX/Simple_HEX.py +0 -0
  177. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/HEX/__init__.py +0 -0
  178. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Hydraulic/StraightPipe.py +0 -0
  179. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Hydraulic/TA_Valve.py +0 -0
  180. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Hydraulic/__init__.py +0 -0
  181. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Pump/Pump.py +0 -0
  182. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Pump/Pump_m.py +0 -0
  183. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Pump/__init__.py +0 -0
  184. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Sink/Sink.py +0 -0
  185. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Sink/__init__.py +0 -0
  186. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Source/Source.py +0 -0
  187. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Source/__init__.py +0 -0
  188. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Tank/MixedStorage.py +0 -0
  189. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Tank/__init__.py +0 -0
  190. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Temperature_Entropy_Chart.py +0 -0
  191. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Turbine/Turbine.py +0 -0
  192. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/Turbine/__init__.py +0 -0
  193. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/ThermodynamicCycles/__init__.py +0 -0
  194. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/TkinterGUI/Chiller.py +0 -0
  195. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/TkinterGUI/__init__.py +0 -0
  196. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/energysystemmodels.egg-info/dependency_links.txt +0 -0
  197. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/src/energysystemmodels.egg-info/requires.txt +0 -0
  198. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/test/test_api_diagnostic.py +0 -0
  199. {energysystemmodels-20260416002 → energysystemmodels-20260416004}/test/test_api_key.py +0 -0
  200. {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: 20260416002
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='20260416002',
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
@@ -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
- self.df = pd.DataFrame({
80
-
81
- 'Chiller': [self.EER,self.COP,self.COMP.Q_comp/1000,self.COMP.Q_losses/1000,self.EVAP.Q_evap/1000,self.Q_condTot/1000]
82
- }, index=[ 'EER', 'COP','Q_comp (kW)','COMP.Q_losses (kW)','Q_evap (kW)', 'Q_condTot(kW)'])
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: 20260416002
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,7 +1,6 @@
1
1
  AHU
2
2
  CEE
3
3
  Distillation
4
- EnergySystemModels
5
4
  Facture
6
5
  HeatTransfer
7
6
  IPMVP
@@ -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