OpenPinch 0.7.4__tar.gz → 0.7.6__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 (426) hide show
  1. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/common/shared.py +56 -5
  2. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/cycles/vapour_compression_cycle.py +102 -33
  3. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/targeting/cascade_vapour_compression.py +7 -1
  4. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/targeting/parallel_vapour_compression.py +4 -1
  5. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/targeting/vapour_compression_mvr.py +8 -4
  6. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/domain/fluids.py +18 -0
  7. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/tutorials/sample_cases/pulp_mill.json +1 -1
  8. {openpinch-0.7.4 → openpinch-0.7.6}/PKG-INFO +1 -1
  9. {openpinch-0.7.4 → openpinch-0.7.6}/pyproject.toml +1 -1
  10. {openpinch-0.7.4 → openpinch-0.7.6}/.gitignore +0 -0
  11. {openpinch-0.7.4 → openpinch-0.7.6}/LICENSE +0 -0
  12. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/__init__.py +0 -0
  13. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/__main__.py +0 -0
  14. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/adapters/__init__.py +0 -0
  15. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/adapters/io/__init__.py +0 -0
  16. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/adapters/io/csv.py +0 -0
  17. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/adapters/io/file_exports.py +0 -0
  18. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/adapters/io/json.py +0 -0
  19. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/adapters/io/problem_sources.py +0 -0
  20. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/adapters/io/records.py +0 -0
  21. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/adapters/io/tabular.py +0 -0
  22. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/adapters/io/workbook.py +0 -0
  23. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/adapters/io/workspace_bundles.py +0 -0
  24. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/adapters/optional_dependencies.py +0 -0
  25. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/__init__.py +0 -0
  26. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/economics.py +0 -0
  27. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/energy_transfer/__init__.py +0 -0
  28. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/energy_transfer/cascade.py +0 -0
  29. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/energy_transfer/diagram.py +0 -0
  30. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/energy_transfer/selection.py +0 -0
  31. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/energy_transfer/serialization.py +0 -0
  32. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/energy_transfer/service.py +0 -0
  33. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/exergy/__init__.py +0 -0
  34. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/exergy/service.py +0 -0
  35. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/graphs/__init__.py +0 -0
  36. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/graphs/composite.py +0 -0
  37. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/graphs/grand_composite.py +0 -0
  38. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/graphs/metadata.py +0 -0
  39. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/graphs/primitives.py +0 -0
  40. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/graphs/service.py +0 -0
  41. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/graphs/specifications.py +0 -0
  42. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/__init__.py +0 -0
  43. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/context.py +0 -0
  44. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/controllability.py +0 -0
  45. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/duty_optimisation.py +0 -0
  46. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/errors.py +0 -0
  47. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/execution/__init__.py +0 -0
  48. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/execution/executor.py +0 -0
  49. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/execution/fake_executor.py +0 -0
  50. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/execution/fallbacks.py +0 -0
  51. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/execution/pathways.py +0 -0
  52. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/execution/settings.py +0 -0
  53. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/execution/task_builders.py +0 -0
  54. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/extraction/__init__.py +0 -0
  55. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/extraction/metadata.py +0 -0
  56. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/extraction/period_state.py +0 -0
  57. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/extraction/recovery.py +0 -0
  58. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/extraction/segment_area.py +0 -0
  59. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/extraction/service.py +0 -0
  60. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/extraction/utility.py +0 -0
  61. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/indexing.py +0 -0
  62. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/models/__init__.py +0 -0
  63. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/models/_base/__init__.py +0 -0
  64. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/models/_base/alpha.py +0 -0
  65. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/models/_base/approach.py +0 -0
  66. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/models/_base/area.py +0 -0
  67. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/models/_base/costing.py +0 -0
  68. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/models/_base/execution.py +0 -0
  69. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/models/_base/parameters.py +0 -0
  70. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/models/_base/piecewise.py +0 -0
  71. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/models/_base/superstructure.py +0 -0
  72. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/models/_pinch_design/__init__.py +0 -0
  73. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/models/_pinch_design/amalgamation.py +0 -0
  74. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/models/_pinch_design/equations.py +0 -0
  75. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/models/_pinch_design/postprocess.py +0 -0
  76. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/models/_pinch_design/preprocessing.py +0 -0
  77. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/models/_stagewise/__init__.py +0 -0
  78. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/models/_stagewise/equations.py +0 -0
  79. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/models/_stagewise/evolution.py +0 -0
  80. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/models/_stagewise/objectives.py +0 -0
  81. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/models/_stagewise/postprocess.py +0 -0
  82. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/models/_stagewise/setup.py +0 -0
  83. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/models/_stagewise/verification.py +0 -0
  84. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/models/_stagewise/warm_start.py +0 -0
  85. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/models/base.py +0 -0
  86. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/models/fixed_structure.py +0 -0
  87. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/models/packed_pinch_design.py +0 -0
  88. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/models/packed_stagewise.py +0 -0
  89. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/models/pinch_decomposition.py +0 -0
  90. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/models/problem.py +0 -0
  91. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/models/stage_packing.py +0 -0
  92. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/models/stagewise.py +0 -0
  93. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/models/thermal_profiles.py +0 -0
  94. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/prepared_problem.py +0 -0
  95. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/reporting/__init__.py +0 -0
  96. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/reporting/exports.py +0 -0
  97. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/reporting/ranking.py +0 -0
  98. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/reporting/verification.py +0 -0
  99. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/results/__init__.py +0 -0
  100. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/results/assembly.py +0 -0
  101. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/results/seeds.py +0 -0
  102. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/results/selection.py +0 -0
  103. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/service.py +0 -0
  104. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/solver/__init__.py +0 -0
  105. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/solver/arrays.py +0 -0
  106. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/solver/backend.py +0 -0
  107. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/solver/dependencies.py +0 -0
  108. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/solver/piecewise.py +0 -0
  109. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/solver/pinch_design_decomposition.py +0 -0
  110. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/targeting/__init__.py +0 -0
  111. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/targeting/_stage.py +0 -0
  112. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/targeting/network_evolution_method.py +0 -0
  113. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/targeting/open_hens_method.py +0 -0
  114. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/targeting/pinch_design_method.py +0 -0
  115. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/targeting/thermal_derivative_method.py +0 -0
  116. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_exchanger_networks/targeting/topology.py +0 -0
  117. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/__init__.py +0 -0
  118. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/_multiperiod/__init__.py +0 -0
  119. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/_multiperiod/aggregation.py +0 -0
  120. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/_multiperiod/execution.py +0 -0
  121. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/_multiperiod/preparation.py +0 -0
  122. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/_multiperiod/setup.py +0 -0
  123. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/_multiperiod/state.py +0 -0
  124. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/_process_mvr/__init__.py +0 -0
  125. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/_process_mvr/membership.py +0 -0
  126. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/_process_mvr/replacement_streams.py +0 -0
  127. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/_process_mvr/selection.py +0 -0
  128. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/_process_mvr/state.py +0 -0
  129. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/_process_mvr/values.py +0 -0
  130. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/_process_mvr/work.py +0 -0
  131. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/common/__init__.py +0 -0
  132. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/common/_shared/__init__.py +0 -0
  133. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/common/_shared/air.py +0 -0
  134. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/common/_shared/plotting.py +0 -0
  135. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/common/_shared/streams.py +0 -0
  136. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/common/encoding.py +0 -0
  137. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/common/layout.py +0 -0
  138. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/common/load_selection.py +0 -0
  139. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/common/multi_vc_objective.py +0 -0
  140. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/common/postprocessing.py +0 -0
  141. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/common/preprocessing.py +0 -0
  142. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/common/units.py +0 -0
  143. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/components.py +0 -0
  144. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/cycles/__init__.py +0 -0
  145. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/cycles/_multi_cycle_base.py +0 -0
  146. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/cycles/brayton_heat_pump.py +0 -0
  147. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/cycles/carnot_cycles.py +0 -0
  148. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/cycles/cascade_vapour_compression_cycle.py +0 -0
  149. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/cycles/mechanical_vapour_recompression_cycle.py +0 -0
  150. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/cycles/parallel_vapour_compression_cycles.py +0 -0
  151. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/cycles/vapour_compression_mvr_cascade.py +0 -0
  152. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/direct_mvr/__init__.py +0 -0
  153. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/direct_mvr/execution.py +0 -0
  154. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/direct_mvr/models.py +0 -0
  155. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/direct_mvr/thermodynamics.py +0 -0
  156. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/direct_mvr/units.py +0 -0
  157. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/optimisation_adapter.py +0 -0
  158. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/performance_maps/__init__.py +0 -0
  159. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/performance_maps/adapters/__init__.py +0 -0
  160. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/performance_maps/adapters/coolprop.py +0 -0
  161. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/performance_maps/adapters/tespy.py +0 -0
  162. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/performance_maps/characteristics/__init__.py +0 -0
  163. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/performance_maps/characteristics/openpinch-single-stage-compressor-v1.json +0 -0
  164. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/performance_maps/context.py +0 -0
  165. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/performance_maps/coolprop_preflight.py +0 -0
  166. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/performance_maps/errors.py +0 -0
  167. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/performance_maps/factory.py +0 -0
  168. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/performance_maps/fluids.py +0 -0
  169. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/performance_maps/generation.py +0 -0
  170. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/performance_maps/models.py +0 -0
  171. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/performance_maps/points.py +0 -0
  172. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/performance_maps/protocols.py +0 -0
  173. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/performance_maps/provenance.py +0 -0
  174. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/performance_maps/resources.py +0 -0
  175. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/performance_maps/settings.py +0 -0
  176. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/performance_maps/target_basis.py +0 -0
  177. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/performance_maps/target_records.py +0 -0
  178. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/performance_maps/targeting.py +0 -0
  179. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/performance_maps/targeting_models.py +0 -0
  180. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/process_mvr.py +0 -0
  181. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/service.py +0 -0
  182. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/targeting/__init__.py +0 -0
  183. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/targeting/_carnot_common.py +0 -0
  184. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/targeting/brayton.py +0 -0
  185. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/targeting/cascade_carnot.py +0 -0
  186. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_pumps/targeting/parallel_carnot.py +0 -0
  187. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/heat_transfer.py +0 -0
  188. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/numerics.py +0 -0
  189. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/orc/__init__.py +0 -0
  190. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/orc/carnot.py +0 -0
  191. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/orc/costing.py +0 -0
  192. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/orc/cycle.py +0 -0
  193. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/orc/inputs.py +0 -0
  194. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/orc/profile.py +0 -0
  195. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/orc/search.py +0 -0
  196. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/orc/service.py +0 -0
  197. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/orc/simulated.py +0 -0
  198. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/parallelism.py +0 -0
  199. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/power/__init__.py +0 -0
  200. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/power/service.py +0 -0
  201. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/power/steam_turbine.py +0 -0
  202. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/targeting/__init__.py +0 -0
  203. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/targeting/area_cost.py +0 -0
  204. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/targeting/cascade.py +0 -0
  205. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/targeting/context.py +0 -0
  206. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/targeting/direct.py +0 -0
  207. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/targeting/grand_composite.py +0 -0
  208. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/targeting/heat_recovery_dt_min.py +0 -0
  209. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/targeting/indirect.py +0 -0
  210. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/targeting/residual.py +0 -0
  211. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/targeting/temperature_driving_force.py +0 -0
  212. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/targeting/utilities.py +0 -0
  213. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/thermodynamics/__init__.py +0 -0
  214. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/thermodynamics/water.py +0 -0
  215. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/utility_placement/__init__.py +0 -0
  216. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/utility_placement/allocation.py +0 -0
  217. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/utility_placement/bounds.py +0 -0
  218. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/utility_placement/codec.py +0 -0
  219. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/utility_placement/context.py +0 -0
  220. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/utility_placement/errors.py +0 -0
  221. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/utility_placement/evaluation.py +0 -0
  222. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/utility_placement/normalization.py +0 -0
  223. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/utility_placement/optimisation.py +0 -0
  224. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/utility_placement/penalties.py +0 -0
  225. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/utility_placement/profiles.py +0 -0
  226. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/utility_placement/replay.py +0 -0
  227. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/utility_placement/service.py +0 -0
  228. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/utility_placement/start_points.py +0 -0
  229. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/utility_placement/thermodynamics.py +0 -0
  230. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/analysis/utility_placement/units.py +0 -0
  231. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/application/__init__.py +0 -0
  232. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/application/_problem/__init__.py +0 -0
  233. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/application/_problem/accessors/__init__.py +0 -0
  234. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/application/_problem/accessors/component.py +0 -0
  235. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/application/_problem/accessors/design.py +0 -0
  236. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/application/_problem/accessors/plot.py +0 -0
  237. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/application/_problem/accessors/target.py +0 -0
  238. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/application/_problem/arguments.py +0 -0
  239. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/application/_problem/input/__init__.py +0 -0
  240. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/application/_problem/input/canonicalization.py +0 -0
  241. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/application/_problem/input/construction.py +0 -0
  242. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/application/_problem/input/loading.py +0 -0
  243. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/application/_problem/input/segments.py +0 -0
  244. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/application/_problem/input/semantics.py +0 -0
  245. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/application/_problem/input/utilities.py +0 -0
  246. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/application/_problem/input/validation.py +0 -0
  247. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/application/_problem/output/__init__.py +0 -0
  248. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/application/_problem/output/reporting.py +0 -0
  249. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/application/_problem/output/result_extraction.py +0 -0
  250. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/application/_problem/periods/__init__.py +0 -0
  251. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/application/_problem/periods/aggregation.py +0 -0
  252. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/application/_problem/targeting/__init__.py +0 -0
  253. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/application/_problem/targeting/catalog.py +0 -0
  254. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/application/_problem/targeting/dispatch.py +0 -0
  255. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/application/_problem/targeting/execution.py +0 -0
  256. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/application/_problem/targeting/provenance.py +0 -0
  257. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/application/_problem/targeting/state.py +0 -0
  258. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/application/_workspace/__init__.py +0 -0
  259. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/application/_workspace/case_inputs.py +0 -0
  260. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/application/_workspace/state.py +0 -0
  261. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/application/case_derivation.py +0 -0
  262. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/application/commands.py +0 -0
  263. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/application/heat_recovery_dt_min.py +0 -0
  264. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/application/hpr_selection.py +0 -0
  265. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/application/problem.py +0 -0
  266. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/application/residual_utility.py +0 -0
  267. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/application/targeting.py +0 -0
  268. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/application/utility_placement.py +0 -0
  269. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/application/workspace.py +0 -0
  270. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/contracts/__init__.py +0 -0
  271. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/contracts/common.py +0 -0
  272. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/contracts/controllability.py +0 -0
  273. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/contracts/graphs.py +0 -0
  274. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/contracts/heat_recovery_dt_min.py +0 -0
  275. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/contracts/hpr.py +0 -0
  276. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/contracts/hpr_performance_map.py +0 -0
  277. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/contracts/input.py +0 -0
  278. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/contracts/output.py +0 -0
  279. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/contracts/report_metrics.py +0 -0
  280. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/contracts/report_units.py +0 -0
  281. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/contracts/reporting.py +0 -0
  282. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/contracts/resources/__init__.py +0 -0
  283. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/contracts/resources/hpr_performance_map/__init__.py +0 -0
  284. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/contracts/resources/hpr_performance_map/heat-pump-1.0.json +0 -0
  285. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/contracts/resources/hpr_performance_map/refrigeration-1.0.json +0 -0
  286. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/contracts/resources/hpr_performance_map/schema-1.0.json +0 -0
  287. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/contracts/schema.py +0 -0
  288. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/contracts/synthesis/__init__.py +0 -0
  289. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/contracts/synthesis/common.py +0 -0
  290. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/contracts/synthesis/method.py +0 -0
  291. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/contracts/synthesis/result.py +0 -0
  292. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/contracts/synthesis/task.py +0 -0
  293. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/contracts/synthesis/topology.py +0 -0
  294. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/contracts/synthesis/view.py +0 -0
  295. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/contracts/turbine.py +0 -0
  296. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/contracts/units.py +0 -0
  297. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/contracts/utility_placement.py +0 -0
  298. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/contracts/workspace.py +0 -0
  299. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/domain/__init__.py +0 -0
  300. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/domain/_heat_exchanger/__init__.py +0 -0
  301. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/domain/_heat_exchanger/area.py +0 -0
  302. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/domain/_heat_exchanger/period_state.py +0 -0
  303. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/domain/_heat_exchanger/rules.py +0 -0
  304. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/domain/_heat_exchanger_network/__init__.py +0 -0
  305. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/domain/_heat_exchanger_network/types.py +0 -0
  306. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/domain/_problem_table/__init__.py +0 -0
  307. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/domain/_problem_table/constants.py +0 -0
  308. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/domain/_problem_table/equality.py +0 -0
  309. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/domain/_problem_table/intervals.py +0 -0
  310. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/domain/_problem_table/types.py +0 -0
  311. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/domain/_stream/__init__.py +0 -0
  312. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/domain/_stream/linearisation.py +0 -0
  313. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/domain/_stream/profile.py +0 -0
  314. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/domain/_stream/segment.py +0 -0
  315. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/domain/_stream/segments.py +0 -0
  316. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/domain/_stream/thermodynamics.py +0 -0
  317. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/domain/_stream/value_state.py +0 -0
  318. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/domain/_stream_collection/__init__.py +0 -0
  319. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/domain/_stream_collection/filters.py +0 -0
  320. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/domain/_stream_collection/numeric_view.py +0 -0
  321. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/domain/_stream_collection/serialization.py +0 -0
  322. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/domain/_stream_collection/sorting.py +0 -0
  323. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/domain/_validation.py +0 -0
  324. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/domain/_value/__init__.py +0 -0
  325. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/domain/_value/coercion.py +0 -0
  326. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/domain/_value/resolution.py +0 -0
  327. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/domain/_value/units.py +0 -0
  328. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/domain/analysis.py +0 -0
  329. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/domain/configuration.py +0 -0
  330. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/domain/configuration_fields.py +0 -0
  331. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/domain/enums.py +0 -0
  332. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/domain/heat_exchanger.py +0 -0
  333. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/domain/heat_exchanger_network.py +0 -0
  334. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/domain/hpr.py +0 -0
  335. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/domain/problem_table.py +0 -0
  336. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/domain/progress.py +0 -0
  337. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/domain/solver_options.py +0 -0
  338. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/domain/stream.py +0 -0
  339. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/domain/stream_collection.py +0 -0
  340. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/domain/targets.py +0 -0
  341. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/domain/value.py +0 -0
  342. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/domain/zone.py +0 -0
  343. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/optimisation/__init__.py +0 -0
  344. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/optimisation/backends/__init__.py +0 -0
  345. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/optimisation/backends/_multistart.py +0 -0
  346. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/optimisation/backends/_surrogate.py +0 -0
  347. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/optimisation/backends/bayesian.py +0 -0
  348. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/optimisation/backends/cma_es.py +0 -0
  349. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/optimisation/backends/dual_annealing.py +0 -0
  350. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/optimisation/backends/protocol.py +0 -0
  351. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/optimisation/backends/rbf.py +0 -0
  352. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/optimisation/candidates.py +0 -0
  353. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/optimisation/errors.py +0 -0
  354. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/optimisation/execution.py +0 -0
  355. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/optimisation/feasibility.py +0 -0
  356. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/optimisation/models.py +0 -0
  357. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/optimisation/service.py +0 -0
  358. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/presentation/__init__.py +0 -0
  359. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/presentation/configuration.py +0 -0
  360. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/presentation/configuration_text.py +0 -0
  361. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/presentation/dashboard/__init__.py +0 -0
  362. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/presentation/dashboard/dashboard.css +0 -0
  363. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/presentation/dashboard/dependencies.py +0 -0
  364. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/presentation/dashboard/exports.py +0 -0
  365. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/presentation/dashboard/rendering.py +0 -0
  366. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/presentation/dashboard/state.py +0 -0
  367. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/presentation/graphs/__init__.py +0 -0
  368. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/presentation/graphs/plotly.py +0 -0
  369. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/presentation/graphs/problem.py +0 -0
  370. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/presentation/graphs/simple.py +0 -0
  371. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/presentation/network_grid/__init__.py +0 -0
  372. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/presentation/network_grid/_constants.py +0 -0
  373. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/presentation/network_grid/dependencies.py +0 -0
  374. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/presentation/network_grid/geometry.py +0 -0
  375. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/presentation/network_grid/labels.py +0 -0
  376. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/presentation/network_grid/layout.py +0 -0
  377. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/presentation/network_grid/plotly.py +0 -0
  378. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/presentation/network_grid/rendering.py +0 -0
  379. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/presentation/network_grid/results.py +0 -0
  380. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/presentation/network_grid/service.py +0 -0
  381. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/presentation/network_grid/state.py +0 -0
  382. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/presentation/network_grid/temperatures.py +0 -0
  383. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/presentation/network_grid/view.py +0 -0
  384. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/presentation/reporting/__init__.py +0 -0
  385. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/presentation/reporting/adapters.py +0 -0
  386. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/presentation/reporting/excel_text.py +0 -0
  387. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/presentation/reporting/hpr.py +0 -0
  388. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/presentation/reporting/problem_table.py +0 -0
  389. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/presentation/reporting/results.py +0 -0
  390. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/presentation/reporting/specialist.py +0 -0
  391. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/presentation/reporting/stream_collection.py +0 -0
  392. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/presentation/reporting/thermal.py +0 -0
  393. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/presentation/reporting/workbook.py +0 -0
  394. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/resources.py +0 -0
  395. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/tutorials/__init__.py +0 -0
  396. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/tutorials/notebooks/01_first_solve_and_core_curves.ipynb +0 -0
  397. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/tutorials/notebooks/02_focused_direct_and_total_site.ipynb +0 -0
  398. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/tutorials/notebooks/03_multisegment_streams.ipynb +0 -0
  399. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/tutorials/notebooks/04_workspace_cases_and_scenarios.ipynb +0 -0
  400. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/tutorials/notebooks/05_workspace_persistence.ipynb +0 -0
  401. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/tutorials/notebooks/06_multiperiod_heat_integration.ipynb +0 -0
  402. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/tutorials/notebooks/07_area_cost_and_exergy.ipynb +0 -0
  403. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/tutorials/notebooks/08_carnot_heat_pump_and_refrigeration.ipynb +0 -0
  404. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/tutorials/notebooks/09_vapour_compression.ipynb +0 -0
  405. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/tutorials/notebooks/10_multiperiod_heat_pumps.ipynb +0 -0
  406. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/tutorials/notebooks/11_process_mvr_and_cascade.ipynb +0 -0
  407. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/tutorials/notebooks/12_cogeneration.ipynb +0 -0
  408. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/tutorials/notebooks/13_multiperiod_cogeneration.ipynb +0 -0
  409. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/tutorials/notebooks/14_energy_transfer.ipynb +0 -0
  410. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/tutorials/notebooks/15_hen_synthesis_and_selection.ipynb +0 -0
  411. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/tutorials/notebooks/16_advanced_hen_methods.ipynb +0 -0
  412. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/tutorials/notebooks/17_multiperiod_hen_synthesis.ipynb +0 -0
  413. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/tutorials/notebooks/18_results_plots_reports_exports.ipynb +0 -0
  414. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/tutorials/notebooks/19_utility_placement_optimisation.ipynb +0 -0
  415. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/tutorials/notebooks/__init__.py +0 -0
  416. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/tutorials/sample_cases/Four-stream-Yee-and-Grossmann-1990-1.json +0 -0
  417. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/tutorials/sample_cases/__init__.py +0 -0
  418. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/tutorials/sample_cases/basic_pinch.json +0 -0
  419. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/tutorials/sample_cases/chocolate_factory.json +0 -0
  420. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/tutorials/sample_cases/crude_preheat_train.json +0 -0
  421. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/tutorials/sample_cases/crude_preheat_train_multiperiod.json +0 -0
  422. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/tutorials/sample_cases/dairy_chilling_multiperiod.json +0 -0
  423. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/tutorials/sample_cases/process_mvr.json +0 -0
  424. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/tutorials/sample_cases/zonal_site.json +0 -0
  425. {openpinch-0.7.4 → openpinch-0.7.6}/OpenPinch/tutorials/sample_cases/zonal_site_multiperiod.json +0 -0
  426. {openpinch-0.7.4 → openpinch-0.7.6}/README.md +0 -0
@@ -25,6 +25,7 @@ from ....contracts.hpr import (
25
25
  )
26
26
  from ....domain.configuration import tol as _tol
27
27
  from ....domain.enums import ProblemTableLabel
28
+ from ....domain.fluids import critical_point
28
29
  from ....domain.stream_collection import StreamCollection
29
30
  from ....domain.value import Value
30
31
  from ..optimisation_adapter import (
@@ -61,6 +62,7 @@ __all__ = [
61
62
  "cap_stage_condensing_temperatures",
62
63
  "is_negligible_useful_duty",
63
64
  "condensing_temperature_search_range",
65
+ "floor_stage_evaporating_temperatures",
64
66
  "calc_simulated_hpr_annualized_costs",
65
67
  "hpr_penalty_cost_scale",
66
68
  "refrigeration_allowance",
@@ -209,6 +211,12 @@ def calc_hpr_machine_capital_costs(
209
211
  return tuple(costs)
210
212
 
211
213
 
214
+ # A cascade stage doing no more than this fraction of its machine's work has
215
+ # no compressor, so it adds no stage capital (the same fraction as
216
+ # NEGLIGIBLE_USEFUL_DUTY_FRACTION uses for duty).
217
+ NEGLIGIBLE_STAGE_WORK_FRACTION = 1e-3
218
+
219
+
212
220
  def _single_cost_unit(
213
221
  state: HPRParsedState,
214
222
  hpr_streams: StreamCollection,
@@ -220,7 +228,9 @@ def _single_cost_unit(
220
228
  Each closed stage has its own compressor, so the stage count comes from
221
229
  the solved stage works: a cascade with ``n_cond`` condenser and
222
230
  ``n_evap`` evaporator levels has ``n_cond + n_evap - 1`` stages, more
223
- than its ``n_cond`` condensing temperatures.
231
+ than its ``n_cond`` condensing temperatures. A stage whose work is at
232
+ most ``NEGLIGIBLE_STAGE_WORK_FRACTION`` of the machine's work (merged
233
+ levels, or no duty) has no compressor and is not charged.
224
234
  """
225
235
  hot = hpr_streams.get_hot_utility_streams()
226
236
  Q_cap = (
@@ -229,9 +239,12 @@ def _single_cost_unit(
229
239
  else 0.0
230
240
  )
231
241
  T_cond = np.asarray(state.T_cond, dtype=float).ravel()
242
+ works = np.abs(np.asarray(work_arr if work_arr is not None else [], dtype=float))
232
243
  n_stages = (
233
- np.asarray(work_arr, dtype=float).size if work_arr is not None else 0
234
- ) or T_cond.size
244
+ int(np.count_nonzero(works > NEGLIGIBLE_STAGE_WORK_FRACTION * works.sum()))
245
+ if works.size
246
+ else T_cond.size
247
+ )
235
248
  return [
236
249
  HPRCostUnit(
237
250
  Q_cap=Q_cap,
@@ -770,7 +783,7 @@ def condensing_temperature_search_range(
770
783
  return t_hot, t_cold
771
784
  try:
772
785
  refrigerants = list(getattr(args, "refrigerant_ls", None) or ["water"])
773
- t_crit = max(float(_coolprop.PropsSI("Tcrit", ref)) for ref in refrigerants)
786
+ t_crit = max(float(critical_point(ref)[0]) for ref in refrigerants)
774
787
  except (ValueError, TypeError):
775
788
  return t_hot, t_cold
776
789
  ceiling = t_crit - 273.15 - SUBCRITICAL_CONDENSING_MARGIN_K
@@ -814,7 +827,7 @@ def cap_stage_condensing_temperatures(
814
827
  for index in range(T_cond.size):
815
828
  refrigerant = refrigerants[min(index, len(refrigerants) - 1)]
816
829
  try:
817
- t_crit = float(_coolprop.PropsSI("Tcrit", refrigerant)) - 273.15
830
+ t_crit = float(critical_point(refrigerant)[0]) - 273.15
818
831
  except (ValueError, TypeError):
819
832
  continue
820
833
  ceilings[index] = t_crit - SUBCRITICAL_CONDENSING_MARGIN_K
@@ -827,6 +840,44 @@ def cap_stage_condensing_temperatures(
827
840
  return capped
828
841
 
829
842
 
843
+ # Keeps a floored temperature above Tmin through the degC to K round trip.
844
+ EVAPORATING_FLOOR_MARGIN_K = 1e-6
845
+
846
+
847
+ def floor_stage_evaporating_temperatures(
848
+ T_evap: np.ndarray,
849
+ args: HeatPumpTargetInputs,
850
+ *,
851
+ first_stage: int = 0,
852
+ ) -> np.ndarray:
853
+ """Raise each evaporator to its own refrigerant's minimum temperature.
854
+
855
+ CoolProp extrapolates saturation below ``Tmin`` without error, so the search
856
+ range must stop there. Flooring at decode keeps candidates evaluable, where
857
+ rejecting them would spend a small search budget on failures. Evaporator
858
+ ``i`` uses ``args.refrigerant_ls[first_stage + i]``; the result is
859
+ non-increasing (a floored stage lifts the warmer stages with it).
860
+ """
861
+ T_evap = np.asarray(T_evap, dtype=float)
862
+ if getattr(args, "simulation_backend", "coolprop") == "tespy":
863
+ return T_evap
864
+ refrigerants = list(getattr(args, "refrigerant_ls", None) or [])
865
+ if not refrigerants:
866
+ return T_evap
867
+ floors = np.full(T_evap.shape, -np.inf)
868
+ for index in range(T_evap.size):
869
+ refrigerant = refrigerants[min(first_stage + index, len(refrigerants) - 1)]
870
+ try:
871
+ t_min = float(_coolprop.PropsSI("Tmin", refrigerant)) - 273.15
872
+ except (ValueError, TypeError):
873
+ continue
874
+ floors[index] = t_min + EVAPORATING_FLOOR_MARGIN_K
875
+ floored = np.maximum(T_evap, floors)
876
+ for index in range(floored.size - 2, -1, -1):
877
+ floored[index] = max(floored[index], floored[index + 1])
878
+ return floored
879
+
880
+
830
881
  def validate_vapour_hp_refrigerant_ls(
831
882
  num_stages: int,
832
883
  args: HeatPumpTargetInputs,
@@ -13,7 +13,7 @@ from ....domain._stream.linearisation import (
13
13
  get_piecewise_data_points,
14
14
  )
15
15
  from ....domain.configuration import tol
16
- from ....domain.fluids import build_coolprop_abstract_state
16
+ from ....domain.fluids import build_coolprop_abstract_state, critical_point
17
17
  from ....domain.stream_collection import StreamCollection
18
18
 
19
19
  # Qualities this close to 0 or 1 are saturated liquid or vapour; differences
@@ -93,9 +93,12 @@ class VapourCompressionCycle:
93
93
  """Set the working-fluid state object and refresh critical properties."""
94
94
  self._state = self._get_fluid_state(value)
95
95
  self._solved = False
96
- self._p_crit = self._state.keyed_output(CoolProp.iP_critical)
97
- self._t_crit = self._state.keyed_output(CoolProp.iT_critical)
98
- self._d_crit = self._state.keyed_output(CoolProp.irhomass_critical)
96
+ if isinstance(value, str):
97
+ self._t_crit, self._p_crit, self._d_crit = critical_point(value)
98
+ else:
99
+ self._p_crit = self._state.keyed_output(CoolProp.iP_critical)
100
+ self._t_crit = self._state.keyed_output(CoolProp.iT_critical)
101
+ self._d_crit = self._state.keyed_output(CoolProp.irhomass_critical)
99
102
 
100
103
  @property
101
104
  def cycle_states(self) -> list[dict[str, float]]:
@@ -324,7 +327,7 @@ class VapourCompressionCycle:
324
327
  refrigerant: str = None,
325
328
  ) -> bool:
326
329
  if refrigerant is not None:
327
- self.state = self._get_fluid_state(refrigerant)
330
+ self.state = refrigerant
328
331
  if self._state is None:
329
332
  raise ValueError("A fluid must be specified before solving the cycle.")
330
333
  return True
@@ -413,6 +416,69 @@ class VapourCompressionCycle:
413
416
  s.update(CoolProp.PQ_INPUTS, P, Q)
414
417
  return s
415
418
 
419
+ def _isobar_points(
420
+ self,
421
+ P: float,
422
+ h_start: float,
423
+ h_end: float,
424
+ num: int,
425
+ ) -> list[list[float]]:
426
+ """Return ``num`` [h, T] points from ``h_start`` to ``h_end`` on isobar ``P``.
427
+
428
+ Pure fluids step in enthalpy. A HEOS mixture's pressure-enthalpy flash
429
+ costs tens of milliseconds, so a mixture steps in quality inside the
430
+ two-phase region and in temperature outside it; both give exact points
431
+ on the same isobar. Segment ends keep their exact enthalpies so that
432
+ adjacent profile blocks still share their boundary point.
433
+ """
434
+ if len(self._get_fluid_state(self._refrigerant).fluid_names()) == 1:
435
+ return [
436
+ [h, float(self._compute_state_from_pressure_enthalpy(P=P, h=h).T())]
437
+ for h in np.linspace(h_start, h_end, num)
438
+ ]
439
+
440
+ h_liquid = self._compute_state_from_pressure_quality(P, 0.0).hmass()
441
+ h_vapour = self._compute_state_from_pressure_quality(P, 1.0).hmass()
442
+ start, end = (
443
+ self._isobar_end_state(P, h, h_liquid, h_vapour) for h in (h_start, h_end)
444
+ )
445
+ if all(h_liquid <= h <= h_vapour for h in (h_start, h_end)):
446
+ states = [
447
+ self._compute_state_from_pressure_quality(P, Q)
448
+ for Q in np.linspace(start[2], end[2], num)[1:-1]
449
+ ]
450
+ else:
451
+ states = [
452
+ self._compute_state_from_pressure_temperature(P, T)
453
+ for T in np.linspace(start[1], end[1], num)[1:-1]
454
+ ]
455
+ interior = [[float(s.hmass()), float(s.T())] for s in states]
456
+ return [[start[0], start[1]], *interior, [end[0], end[1]]]
457
+
458
+ def _isobar_end_state(
459
+ self,
460
+ P: float,
461
+ h: float,
462
+ h_liquid: float,
463
+ h_vapour: float,
464
+ ) -> tuple[float, float, float | None]:
465
+ """Return (h, T, quality) of a profile segment end on a mixture isobar.
466
+
467
+ Saturation ends and solved cycle states are already known; only an end
468
+ strictly inside the two-phase region needs a flash, for its quality.
469
+ """
470
+ if h == h_vapour:
471
+ return h, float(self._compute_state_from_pressure_quality(P, 1.0).T()), 1.0
472
+ if h == h_liquid:
473
+ return h, float(self._compute_state_from_pressure_quality(P, 0.0).T()), 0.0
474
+ if not h_liquid < h < h_vapour:
475
+ for point in self._cycle_states:
476
+ if point and point["P"] == P and point["H"] == h:
477
+ return h, point["T"], None
478
+ state = self._compute_state_from_pressure_enthalpy(P=P, h=h)
479
+ quality = float(state.Q()) if h_liquid < h < h_vapour else None
480
+ return h, float(state.T()), quality
481
+
416
482
  def _compute_compressor_outlet_state(
417
483
  self, h_in: float, s_in: float, P_out: float
418
484
  ) -> CoolProp.AbstractState:
@@ -601,6 +667,13 @@ class VapourCompressionCycle:
601
667
  0.0,
602
668
  )
603
669
 
670
+ # CoolProp extrapolates saturation below Tmin without error.
671
+ if self._T_evap < self._state.Tmin():
672
+ raise ValueError(
673
+ "Evaporating temperature is below the refrigerant's minimum "
674
+ "temperature."
675
+ )
676
+
604
677
  P_lo = self._get_P_sat_from_T(self._T_evap, Q=1.0)
605
678
  P_hi = self._get_P_sat_from_T(self._T_cond, Q=0.0)
606
679
 
@@ -846,27 +919,23 @@ class VapourCompressionCycle:
846
919
  ).hmass()
847
920
 
848
921
  if H[4] > h_sat_vapor:
849
- for h in np.linspace(H[4], max(h_sat_vapor, H[2]), 21):
850
- state = self._compute_state_from_pressure_enthalpy(P=p_high, h=h)
851
- t_h_curve_points.append([h, float(state.T())])
922
+ t_h_curve_points.extend(
923
+ self._isobar_points(p_high, H[4], max(h_sat_vapor, H[2]), 21)
924
+ )
852
925
 
853
926
  if H[4] > h_sat_liquid and not (H[2] > h_sat_vapor):
854
- for h in np.linspace(
855
- min(h_sat_vapor, H[4]), max(h_sat_liquid, H[2]), 21
927
+ for point in self._isobar_points(
928
+ p_high, min(h_sat_vapor, H[4]), max(h_sat_liquid, H[2]), 21
856
929
  ):
857
- if not _repeats_last_point(t_h_curve_points, h):
858
- state = self._compute_state_from_pressure_enthalpy(
859
- P=p_high, h=h
860
- )
861
- t_h_curve_points.append([h, float(state.T())])
930
+ if not _repeats_last_point(t_h_curve_points, point[0]):
931
+ t_h_curve_points.append(point)
862
932
 
863
933
  if H[2] < h_sat_liquid:
864
- for h in np.linspace(min(h_sat_liquid, H[4]), H[2], 21):
865
- if not _repeats_last_point(t_h_curve_points, h):
866
- state = self._compute_state_from_pressure_enthalpy(
867
- P=p_high, h=h
868
- )
869
- t_h_curve_points.append([h, float(state.T())])
934
+ for point in self._isobar_points(
935
+ p_high, min(h_sat_liquid, H[4]), H[2], 21
936
+ ):
937
+ if not _repeats_last_point(t_h_curve_points, point[0]):
938
+ t_h_curve_points.append(point)
870
939
 
871
940
  else:
872
941
  # Determine supercritical gas cooler profile
@@ -918,23 +987,23 @@ class VapourCompressionCycle:
918
987
  h_sat_liquid = self._compute_state_from_pressure_quality(p_low, 0.0).hmass()
919
988
 
920
989
  if H[3] < h_sat_liquid:
921
- for h in np.linspace(H[3], min(h_sat_liquid, H[5]), 21):
922
- state = self._compute_state_from_pressure_enthalpy(P=p_low, h=h)
923
- t_h_curve_points.append([h, float(state.T())])
990
+ t_h_curve_points.extend(
991
+ self._isobar_points(p_low, H[3], min(h_sat_liquid, H[5]), 21)
992
+ )
924
993
 
925
994
  if H[3] < h_sat_vapor and not (H[5] < h_sat_liquid):
926
- for h in np.linspace(
927
- max(h_sat_liquid, H[3]), min(h_sat_vapor, H[5]), 21
995
+ for point in self._isobar_points(
996
+ p_low, max(h_sat_liquid, H[3]), min(h_sat_vapor, H[5]), 21
928
997
  ):
929
- if not _repeats_last_point(t_h_curve_points, h):
930
- state = self._compute_state_from_pressure_enthalpy(P=p_low, h=h)
931
- t_h_curve_points.append([h, float(state.T())])
998
+ if not _repeats_last_point(t_h_curve_points, point[0]):
999
+ t_h_curve_points.append(point)
932
1000
 
933
1001
  if H[5] > h_sat_vapor:
934
- for h in np.linspace(max(h_sat_vapor, H[3]), H[5], 21):
935
- if not _repeats_last_point(t_h_curve_points, h):
936
- state = self._compute_state_from_pressure_enthalpy(P=p_low, h=h)
937
- t_h_curve_points.append([h, float(state.T())])
1002
+ for point in self._isobar_points(
1003
+ p_low, max(h_sat_vapor, H[3]), H[5], 21
1004
+ ):
1005
+ if not _repeats_last_point(t_h_curve_points, point[0]):
1006
+ t_h_curve_points.append(point)
938
1007
 
939
1008
  else:
940
1009
  # Determine supercritical gas heater profile
@@ -34,6 +34,7 @@ from ..common.shared import (
34
34
  cap_stage_condensing_temperatures,
35
35
  condensing_temperature_search_range,
36
36
  evaluate_vapour_hpr_result,
37
+ floor_stage_evaporating_temperatures,
37
38
  validate_vapour_hp_refrigerant_ls,
38
39
  )
39
40
  from ..cycles.cascade_vapour_compression_cycle import CascadeVapourCompressionCycle
@@ -246,7 +247,12 @@ def _parse_cascade_hp_state_variables(
246
247
  T_cond = cap_stage_condensing_temperatures(
247
248
  map_x_arr_to_T_arr(x_cond, *condensing_temperature_search_range(args)), args
248
249
  )
249
- T_evap = map_x_arr_to_T_arr(x_evap, args.T_hot[-1], args.T_hot[0])
250
+ T_evap = floor_stage_evaporating_temperatures(
251
+ map_x_arr_to_T_arr(x_evap, args.T_hot[-1], args.T_hot[0]),
252
+ args,
253
+ # Process evaporators sit on the coldest stages.
254
+ first_stage=n_cond - 1,
255
+ )
250
256
  dT_subcool = map_x_arr_to_DT_arr(x_subcool, T_cond, args.T_cold[0])
251
257
  Q_heat_available = (
252
258
  limit_available_duty(
@@ -28,6 +28,7 @@ from ..common.shared import (
28
28
  cap_stage_condensing_temperatures,
29
29
  condensing_temperature_search_range,
30
30
  evaluate_vapour_hpr_result,
31
+ floor_stage_evaporating_temperatures,
31
32
  validate_vapour_hp_refrigerant_ls,
32
33
  )
33
34
  from ..cycles.parallel_vapour_compression_cycles import (
@@ -161,7 +162,9 @@ def _parse_parallel_hp_state_temperatures(
161
162
  T_cond = cap_stage_condensing_temperatures(
162
163
  map_x_arr_to_T_arr(x_cond, *condensing_temperature_search_range(args)), args
163
164
  )
164
- T_evap = map_x_arr_to_T_arr(x_evap, args.T_hot[-1], args.T_hot[0])
165
+ T_evap = floor_stage_evaporating_temperatures(
166
+ map_x_arr_to_T_arr(x_evap, args.T_hot[-1], args.T_hot[0]), args
167
+ )
165
168
  dT_subcool = map_x_arr_to_DT_arr(x_subcool, T_cond, T_evap)
166
169
  Q_heat_available = (
167
170
  limit_available_duty(
@@ -30,6 +30,7 @@ from ..common.shared import (
30
30
  cap_stage_condensing_temperatures,
31
31
  condensing_temperature_search_range,
32
32
  evaluate_vapour_hpr_result,
33
+ floor_stage_evaporating_temperatures,
33
34
  is_negligible_useful_duty,
34
35
  post_solve_error,
35
36
  validate_vapour_hp_refrigerant_ls,
@@ -176,10 +177,13 @@ def _parse_vc_mvr_state_variables(
176
177
  map_x_arr_to_T_arr(parts["x_cond"], *condensing_temperature_search_range(args)),
177
178
  args,
178
179
  )
179
- T_evap_vc = map_x_arr_to_T_arr(
180
- parts["x_evap"],
181
- args.T_hot[-1],
182
- args.T_hot[0],
180
+ T_evap_vc = floor_stage_evaporating_temperatures(
181
+ map_x_arr_to_T_arr(
182
+ parts["x_evap"],
183
+ args.T_hot[-1],
184
+ args.T_hot[0],
185
+ ),
186
+ args,
183
187
  )
184
188
  Q_heat_available = limit_available_duty(
185
189
  get_Q_vals_at_T_hpr_from_bckgrd_profile(
@@ -2,6 +2,7 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ import functools
5
6
  import math
6
7
  import re
7
8
  from typing import Any
@@ -52,6 +53,23 @@ def build_coolprop_abstract_state(value: str | Any):
52
53
  return state
53
54
 
54
55
 
56
+ @functools.cache
57
+ def critical_point(value: str) -> tuple[float, float, float]:
58
+ """Return a fluid spec's critical temperature (K), pressure (Pa) and density.
59
+
60
+ A mixture's critical point is a costly CoolProp solve, so each spec is
61
+ solved once per process.
62
+ """
63
+ import CoolProp
64
+
65
+ state = build_coolprop_abstract_state(value)
66
+ return (
67
+ state.keyed_output(CoolProp.iT_critical),
68
+ state.keyed_output(CoolProp.iP_critical),
69
+ state.keyed_output(CoolProp.irhomass_critical),
70
+ )
71
+
72
+
55
73
  def validate_coolprop_fluid_name(value: str) -> None:
56
74
  """Validate a CoolProp fluid or mixture name by constructing its state object."""
57
75
  try:
@@ -1656,7 +1656,7 @@
1656
1656
  },
1657
1657
  {
1658
1658
  "zone": "Digestion",
1659
- "name": "Cooling od Acc.0",
1659
+ "name": "Cooling od Acc-0",
1660
1660
  "t_supply": {
1661
1661
  "value": 80,
1662
1662
  "unit": "degC"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: OpenPinch
3
- Version: 0.7.4
3
+ Version: 0.7.6
4
4
  Summary: An advanced pinch analysis and total site integration toolkit
5
5
  Project-URL: Homepage, https://github.com/waikato-ahuora-smart-energy-systems/OpenPinch
6
6
  Project-URL: Issues, https://github.com/waikato-ahuora-smart-energy-systems/OpenPinch/issues
@@ -36,7 +36,7 @@ dependencies=[
36
36
  "pydantic>=2.12,<3",
37
37
  "scipy>=1.16.1,<2",
38
38
  ]
39
- version = "0.7.4"
39
+ version = "0.7.6"
40
40
  authors = [
41
41
  { name="Tim Walmsley", email="tim.walmsley@waikato.ac.nz" },
42
42
  ]
File without changes
File without changes