ResSimpy 2.5.3__tar.gz → 2.6.0__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 (249) hide show
  1. {ressimpy-2.5.3 → ressimpy-2.6.0}/PKG-INFO +9 -5
  2. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Grid.py +13 -2
  3. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Network.py +2 -2
  4. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/FileOperations/File.py +16 -3
  5. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusActivationChange.py +3 -1
  6. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusFile.py +1 -1
  7. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/StructuredGrid/NexusGrid.py +18 -0
  8. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusNetwork.py +63 -5
  9. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusReporting.py +53 -25
  10. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/structured_grid_operations.py +2 -1
  11. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/__init__.py +10 -1
  12. {ressimpy-2.5.3 → ressimpy-2.6.0}/pyproject.toml +21 -12
  13. {ressimpy-2.5.3 → ressimpy-2.6.0}/LICENSE.MD +0 -0
  14. {ressimpy-2.5.3 → ressimpy-2.6.0}/README.md +0 -0
  15. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Aquifer.py +0 -0
  16. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Completion.py +0 -0
  17. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Constraint.py +0 -0
  18. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/DataObjectMixin.py +0 -0
  19. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Drill.py +0 -0
  20. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/DrillSite.py +0 -0
  21. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/DynamicProperty.py +0 -0
  22. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/DynamicPropertyContainer.py +0 -0
  23. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Equilibration.py +0 -0
  24. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Ftrans.py +0 -0
  25. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Gaslift.py +0 -0
  26. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/GridArrayDefinition.py +0 -0
  27. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/GridArrayFunction.py +0 -0
  28. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/GuideRate.py +0 -0
  29. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/LGR.py +0 -0
  30. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Multir.py +0 -0
  31. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/NetworkList.py +0 -0
  32. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/NetworkObject.py +0 -0
  33. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Node.py +0 -0
  34. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/NodeConnection.py +0 -0
  35. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/OperationsMixin.py +0 -0
  36. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Over.py +0 -0
  37. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/PVT.py +0 -0
  38. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/RelPerm.py +0 -0
  39. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/RelPermEndPoint.py +0 -0
  40. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Reporting.py +0 -0
  41. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Rock.py +0 -0
  42. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Separator.py +0 -0
  43. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Simulator.py +0 -0
  44. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/SolverParameter.py +0 -0
  45. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Target.py +0 -0
  46. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Valve.py +0 -0
  47. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Water.py +0 -0
  48. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Well.py +0 -0
  49. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/WellConnection.py +0 -0
  50. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Wellbore.py +0 -0
  51. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Wellhead.py +0 -0
  52. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/__init__.py +0 -0
  53. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/output_request.py +0 -0
  54. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Enums/FluidTypeEnums.py +0 -0
  55. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Enums/FrequencyEnum.py +0 -0
  56. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Enums/GridFunctionTypes.py +0 -0
  57. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Enums/HowEnum.py +0 -0
  58. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Enums/OutputType.py +0 -0
  59. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Enums/PenetrationDirectionEnum.py +0 -0
  60. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Enums/TimeSteppingMethodEnum.py +0 -0
  61. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Enums/UnitsEnum.py +0 -0
  62. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Enums/WellTypeEnum.py +0 -0
  63. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Enums/__init__.py +0 -0
  64. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/FileOperations/FileBase.py +0 -0
  65. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/FileOperations/__init__.py +0 -0
  66. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/FileOperations/file_operations.py +0 -0
  67. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/FileOperations/simulator_constants.py +0 -0
  68. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/GenericContainerClasses/Constraints.py +0 -0
  69. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/GenericContainerClasses/DrillSites.py +0 -0
  70. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/GenericContainerClasses/Drills.py +0 -0
  71. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/GenericContainerClasses/Grids.py +0 -0
  72. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/GenericContainerClasses/GuideRates.py +0 -0
  73. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/GenericContainerClasses/Hydraulics.py +0 -0
  74. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/GenericContainerClasses/LGRs.py +0 -0
  75. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/GenericContainerClasses/NetworkLists.py +0 -0
  76. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/GenericContainerClasses/NodeConnections.py +0 -0
  77. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/GenericContainerClasses/Nodes.py +0 -0
  78. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/GenericContainerClasses/SolverParameters.py +0 -0
  79. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/GenericContainerClasses/Targets.py +0 -0
  80. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/GenericContainerClasses/WellConnections.py +0 -0
  81. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/GenericContainerClasses/Wellbores.py +0 -0
  82. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/GenericContainerClasses/Wellheads.py +0 -0
  83. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/GenericContainerClasses/Wells.py +0 -0
  84. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/GenericContainerClasses/__init__.py +0 -0
  85. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/FcsConfig.py +0 -0
  86. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/FcsFile.py +0 -0
  87. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusAction.py +0 -0
  88. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusActions.py +0 -0
  89. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusActivationChanges.py +0 -0
  90. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusConList.py +0 -0
  91. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusConLists.py +0 -0
  92. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusConstraint.py +0 -0
  93. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusConstraints.py +0 -0
  94. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusDrill.py +0 -0
  95. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusDrillSite.py +0 -0
  96. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusDrillSites.py +0 -0
  97. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusDrills.py +0 -0
  98. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusGuideRate.py +0 -0
  99. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusGuideRates.py +0 -0
  100. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusNode.py +0 -0
  101. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusNodeConnection.py +0 -0
  102. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusNodeConnections.py +0 -0
  103. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusNodeList.py +0 -0
  104. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusNodeLists.py +0 -0
  105. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusNodes.py +0 -0
  106. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusProc.py +0 -0
  107. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusProcs.py +0 -0
  108. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusStation.py +0 -0
  109. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusStations.py +0 -0
  110. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusStreamTracer.py +0 -0
  111. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusStreamTracers.py +0 -0
  112. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusTarget.py +0 -0
  113. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusTargets.py +0 -0
  114. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusWellConnection.py +0 -0
  115. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusWellConnections.py +0 -0
  116. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusWellList.py +0 -0
  117. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusWellLists.py +0 -0
  118. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusWellbore.py +0 -0
  119. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusWellbores.py +0 -0
  120. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusWellhead.py +0 -0
  121. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusWellheads.py +0 -0
  122. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/__init__.py +0 -0
  123. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusAquiferMethod.py +0 -0
  124. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusCompletion.py +0 -0
  125. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusEquilMethod.py +0 -0
  126. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusGasliftMethod.py +0 -0
  127. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusHydraulicsMethod.py +0 -0
  128. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusIPRMethod.py +0 -0
  129. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusOptions.py +0 -0
  130. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusPVTMethod.py +0 -0
  131. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusRelPermEndPoint.py +0 -0
  132. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusRelPermMethod.py +0 -0
  133. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusReportingRequests.py +0 -0
  134. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusRockMethod.py +0 -0
  135. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusSeparatorMethod.py +0 -0
  136. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusSolverParameter.py +0 -0
  137. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusValveMethod.py +0 -0
  138. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusWaterMethod.py +0 -0
  139. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusWell.py +0 -0
  140. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusWellMod.py +0 -0
  141. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/StructuredGrid/NexusFtrans.py +0 -0
  142. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/StructuredGrid/NexusGridArrayFunction.py +0 -0
  143. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/StructuredGrid/NexusLGR.py +0 -0
  144. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/StructuredGrid/NexusLGRs.py +0 -0
  145. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/StructuredGrid/NexusMultir.py +0 -0
  146. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/StructuredGrid/NexusOver.py +0 -0
  147. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/StructuredGrid/NexusTOver.py +0 -0
  148. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/StructuredGrid/__init__.py +0 -0
  149. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/__init__.py +0 -0
  150. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/nexus_grid_to_proc.py +0 -0
  151. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusAquiferMethods.py +0 -0
  152. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusEnums/ActivationChangeEnum.py +0 -0
  153. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusEnums/DateFormatEnum.py +0 -0
  154. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusEnums/__init__.py +0 -0
  155. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusEquilMethods.py +0 -0
  156. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusGasliftMethods.py +0 -0
  157. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusGrids.py +0 -0
  158. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusHydraulicsMethods.py +0 -0
  159. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusIPRMethods.py +0 -0
  160. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/__init__.py +0 -0
  161. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/adsorption_keywords.py +0 -0
  162. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/alphaf_keywords.py +0 -0
  163. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/aquifer_keywords.py +0 -0
  164. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/choke_keywords.py +0 -0
  165. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/compressor_keywords.py +0 -0
  166. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/eos_defaults_keywords.py +0 -0
  167. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/equil_keywords.py +0 -0
  168. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/esp_keywords.py +0 -0
  169. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/fcs_keywords.py +0 -0
  170. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/fluxin_keywords.py +0 -0
  171. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/gaslift_keywords.py +0 -0
  172. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/hyd_keywords.py +0 -0
  173. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/icd_keywords.py +0 -0
  174. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/ipr_keywords.py +0 -0
  175. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/nexus_keywords.py +0 -0
  176. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/options_keywords.py +0 -0
  177. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/polymer_keywords.py +0 -0
  178. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/proc_keywords.py +0 -0
  179. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/pump_keywords.py +0 -0
  180. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/pvt_keywords.py +0 -0
  181. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/relpm_keywords.py +0 -0
  182. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/rock_keywords.py +0 -0
  183. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/runcontrol_keywords.py +0 -0
  184. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/separator_keywords.py +0 -0
  185. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/structured_grid_keywords.py +0 -0
  186. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/surface_keywords.py +0 -0
  187. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/tracer_init_keywords.py +0 -0
  188. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/valve_keywords.py +0 -0
  189. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/water_keywords.py +0 -0
  190. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/wells_keywords.py +0 -0
  191. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusPVTMethods.py +0 -0
  192. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusRelPermMethods.py +0 -0
  193. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusRockMethods.py +0 -0
  194. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusSeparatorMethods.py +0 -0
  195. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusSimulator.py +0 -0
  196. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusSolverParameters.py +0 -0
  197. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusValveMethods.py +0 -0
  198. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusWaterMethods.py +0 -0
  199. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusWells.py +0 -0
  200. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/__init__.py +0 -0
  201. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/array_function_operations.py +0 -0
  202. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/constants.py +0 -0
  203. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/load_wells.py +0 -0
  204. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/logfile_operations.py +0 -0
  205. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/nexus_add_new_object_to_file.py +0 -0
  206. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/nexus_collect_tables.py +0 -0
  207. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/nexus_constraint_operations.py +0 -0
  208. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/nexus_file_operations.py +0 -0
  209. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/nexus_load_faults.py +0 -0
  210. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/nexus_load_list_table.py +0 -0
  211. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/nexus_model_file_generator.py +0 -0
  212. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/nexus_modify_object_in_file.py +0 -0
  213. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/nexus_remove_object_from_file.py +0 -0
  214. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/rel_perm_operations.py +0 -0
  215. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/runcontrol_operations.py +0 -0
  216. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/OpenGoSim/DataModels/Network/__init__.py +0 -0
  217. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/OpenGoSim/DataModels/OpenGoSimCompletion.py +0 -0
  218. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/OpenGoSim/DataModels/OpenGoSimWell.py +0 -0
  219. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/OpenGoSim/DataModels/__init__.py +0 -0
  220. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/OpenGoSim/Enums/SimulationTypeEnum.py +0 -0
  221. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/OpenGoSim/Enums/__init__.py +0 -0
  222. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/OpenGoSim/Model_Parts/OpenGoSimNetwork.py +0 -0
  223. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/OpenGoSim/Model_Parts/__init__.py +0 -0
  224. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/OpenGoSim/OpenGoSimKeywords/OpenGoSimKeywords.py +0 -0
  225. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/OpenGoSim/OpenGoSimKeywords/__init__.py +0 -0
  226. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/OpenGoSim/OpenGoSimSimulator.py +0 -0
  227. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/OpenGoSim/OpenGoSimWells.py +0 -0
  228. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/OpenGoSim/__init__.py +0 -0
  229. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Time/ISODateTime.py +0 -0
  230. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Time/__init__.py +0 -0
  231. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Units/AttributeMapping.py +0 -0
  232. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Units/AttributeMappings/BaseUnitMapping.py +0 -0
  233. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Units/AttributeMappings/CompletionUnitMapping.py +0 -0
  234. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Units/AttributeMappings/ConstraintUnitMapping.py +0 -0
  235. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Units/AttributeMappings/DynamicPropertyUnitMapping.py +0 -0
  236. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Units/AttributeMappings/NetworkUnitMapping.py +0 -0
  237. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Units/AttributeMappings/__init__.py +0 -0
  238. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Units/Units.py +0 -0
  239. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Units/__init__.py +0 -0
  240. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Utils/__init__.py +0 -0
  241. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Utils/dynamic_method_manipulations.py +0 -0
  242. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Utils/factory_methods.py +0 -0
  243. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Utils/general_utilities.py +0 -0
  244. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Utils/generic_repr.py +0 -0
  245. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Utils/grid_filtering_functions.py +0 -0
  246. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Utils/invert_nexus_map.py +0 -0
  247. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Utils/obj_to_dataframe.py +0 -0
  248. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Utils/obj_to_table_string.py +0 -0
  249. {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Utils/to_dict_generic.py +0 -0
@@ -1,12 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ResSimpy
3
- Version: 2.5.3
3
+ Version: 2.6.0
4
4
  Summary: A Python library for working with Reservoir Simulator Models.
5
5
  License: Apache-2.0
6
6
  License-File: LICENSE.MD
7
7
  Keywords: ResSimpy,Reservoir Engineering
8
8
  Author: BP
9
- Requires-Python: >=3.10,<3.13
9
+ Requires-Python: >=3.10,<3.15
10
10
  Classifier: Development Status :: 5 - Production/Stable
11
11
  Classifier: License :: OSI Approved :: Apache Software License
12
12
  Classifier: Operating System :: OS Independent
@@ -14,12 +14,16 @@ Classifier: Programming Language :: Python :: 3
14
14
  Classifier: Programming Language :: Python :: 3.10
15
15
  Classifier: Programming Language :: Python :: 3.11
16
16
  Classifier: Programming Language :: Python :: 3.12
17
+ Classifier: Programming Language :: Python :: 3.13
18
+ Classifier: Programming Language :: Python :: 3.14
17
19
  Classifier: Topic :: Scientific/Engineering
18
20
  Classifier: Topic :: Scientific/Engineering :: Information Analysis
19
21
  Classifier: Topic :: System :: Filesystems
20
- Requires-Dist: numpy (>=1.23.4,<2)
21
- Requires-Dist: pandas (>=1.5.0,<2.3)
22
- Requires-Dist: typing-extensions (>=4.12,<5.0)
22
+ Requires-Dist: numpy (>=2.2,<2.3) ; python_version < "3.11"
23
+ Requires-Dist: numpy (>=2.3,<2.6) ; python_version >= "3.11"
24
+ Requires-Dist: pandas (>=2.3,<3) ; python_version < "3.11"
25
+ Requires-Dist: pandas (>=3.0,<3.0.4) ; python_version >= "3.11"
26
+ Requires-Dist: typing-extensions (>=4.15,<5.0)
23
27
  Description-Content-Type: text/markdown
24
28
 
25
29
  # ResSimpy: Python API for working with Reservoir Simulator models
@@ -37,6 +37,7 @@ class Grid(ABC):
37
37
  _grid_properties_loaded: bool = False
38
38
  _lgrs: LGRs
39
39
  _overs: Sequence[Over]
40
+ _tolpv: Optional[float]
40
41
 
41
42
  def __init__(self, assume_loaded: bool = False) -> None:
42
43
  """Initialises the Grid class."""
@@ -60,6 +61,9 @@ class Grid(ABC):
60
61
  # LGRs
61
62
  self._lgrs: LGRs = LGRs()
62
63
 
64
+ # TOLPV
65
+ self._tolpv: Optional[float] = None
66
+
63
67
  @property
64
68
  def range_x(self) -> int | None:
65
69
  """Returns an instance of grid dimensions.
@@ -169,13 +173,20 @@ class Grid(ABC):
169
173
  """Returns the LGR module object associated with the grid."""
170
174
  return self._lgrs
171
175
 
176
+ @property
177
+ def tolpv(self) -> Optional[float]:
178
+ """Returns float value for TOLPV, if grid property is not loaded."""
179
+ self.load_grid_properties_if_not_loaded()
180
+ return self._tolpv
181
+
182
+ @classmethod
172
183
  @abstractmethod
173
- def load_structured_grid_file(self, structure_grid_file: File,
184
+ def load_structured_grid_file(cls: type[Grid], structured_grid_file: File,
174
185
  model_unit_system: UnitSystem, lazy_loading: bool) -> Grid:
175
186
  """Loads in a structured grid file with all grid properties, and the array functions defined with 'FUNCTION'.
176
187
 
177
188
  Args:
178
- structure_grid_file(File, lazy_loading: bool):The NexusFile representation of a structured grid file for
189
+ structured_grid_file(File, lazy_loading: bool):The NexusFile representation of a structured grid file for
179
190
  converting into a structured grid file class.
180
191
  lazy_loading(bool): If set to True, parts of the grid will only be loaded in
181
192
  when requested via properties on the object.
@@ -75,7 +75,7 @@ class Network(ABC):
75
75
  x.node_out == connection_name and x.name != connection_name]
76
76
 
77
77
  # Add the in connection directly referenced by the connection itself if it is missing
78
- if connection_to_check.node_in != connection_name:
78
+ if connection_to_check.node_in is not None and connection_to_check.node_in != connection_name:
79
79
  node_in_connection = self.connections.get_by_name(name=connection_to_check.node_in)
80
80
  if node_in_connection is not None and node_in_connection not in connections_directly_before_connection:
81
81
  connections_directly_before_connection.append(node_in_connection)
@@ -84,7 +84,7 @@ class Network(ABC):
84
84
  x.node_in == connection_name and x.name != connection_name]
85
85
 
86
86
  # Add the out connection directly referenced by the connection itself if it is missing
87
- if connection_to_check.node_out != connection_name:
87
+ if connection_to_check.node_out is not None and connection_to_check.node_out != connection_name:
88
88
  node_out_connection = self.connections.get_by_name(name=connection_to_check.node_out)
89
89
  if node_out_connection is not None and node_out_connection not in connections_directly_after_connection:
90
90
  connections_directly_after_connection.append(node_out_connection)
@@ -274,7 +274,7 @@ class File(FileBase):
274
274
  warnings.warn(f'PermissionError when trying to access file at {full_file_path}')
275
275
  except FileNotFoundError:
276
276
  # file not found, continue without filling out that information
277
- warnings.warn(f'FileNotFoundError when trying to access file at {full_file_path}')
277
+ warnings.warn(f'No file found for: {full_file_path}')
278
278
  except KeyError:
279
279
  # Group or owner doesn't exist on this system, continue without filling out that information
280
280
  warnings.warn(f'Unable to find the group for the file at {full_file_path}')
@@ -345,6 +345,19 @@ class File(FileBase):
345
345
  last_modified=None)
346
346
  warnings.warn(UserWarning(f'No file found for: {full_file_path} while loading {origin}'))
347
347
  return nexus_file_class
348
+ except PermissionError:
349
+ # handle if a file can't be accessed
350
+ nexus_file_class = simulator_type(location=file_path,
351
+ include_locations=None,
352
+ origin=origin,
353
+ rootdir=rootdir,
354
+ include_objects=None,
355
+ file_content_as_list=None,
356
+ linked_user=None,
357
+ last_modified=None)
358
+ warnings.warn(UserWarning(
359
+ f'PermissionError when trying to access file at {full_file_path} while loading {origin}'))
360
+ return nexus_file_class
348
361
 
349
362
  # check last modified and user for the file
350
363
  user = File.get_pathlib_path_details(full_file_path)
@@ -403,8 +416,8 @@ class File(FileBase):
403
416
  if skip_arrays:
404
417
  try:
405
418
  inc_file_as_list = fo.load_file_as_list(inc_full_path)
406
- except FileNotFoundError:
407
- # handle files not found - this is handled in an exception in the main loop
419
+ except (FileNotFoundError, PermissionError):
420
+ # handle files not found or not accessible - this is handled in an exception in the main loop
408
421
  pass
409
422
  else:
410
423
  all_numeric = False
@@ -2,6 +2,7 @@ from dataclasses import dataclass
2
2
  from typing import Optional
3
3
 
4
4
  from ResSimpy.DataModelBaseClasses.NetworkObject import NetworkObject
5
+ from ResSimpy.Enums.UnitsEnum import UnitSystem
5
6
  from ResSimpy.Nexus.NexusEnums.ActivationChangeEnum import ActivationChangeEnum
6
7
  from ResSimpy.Nexus.NexusEnums.DateFormatEnum import DateFormat
7
8
  from ResSimpy.Units.AttributeMappings.BaseUnitMapping import BaseUnitMapping
@@ -27,7 +28,8 @@ class NexusActivationChange(NetworkObject):
27
28
  """
28
29
  self.change = change
29
30
  self.is_constraint_change = is_constraint_change
30
- super().__init__(date_format=date_format, start_date=start_date, name=name, date=date)
31
+ super().__init__(date_format=date_format, start_date=start_date, name=name, date=date,
32
+ unit_system=UnitSystem.METRIC)
31
33
 
32
34
  @staticmethod
33
35
  def get_keyword_mapping() -> dict[str, tuple[str, type]]:
@@ -152,7 +152,7 @@ class NexusFile(File):
152
152
  include_file = obj
153
153
  break
154
154
  if obj.location is not None and \
155
- os.path.basename(obj.location) == os.path.basename(incfile_location):
155
+ obj.location_in_including_file == incfile_location:
156
156
  include_file = obj
157
157
  break
158
158
 
@@ -603,6 +603,18 @@ class NexusGrid(Grid):
603
603
  self._range_y = int(second_value)
604
604
  self._range_z = int(third_value)
605
605
 
606
+ # Load TOLPV scalar value
607
+ if nfo.check_token('TOLPV', line):
608
+ tolpv_value = fo.get_token_value('TOLPV', line, [line])
609
+ if tolpv_value is not None:
610
+ self._tolpv = float(tolpv_value)
611
+
612
+ # Load TOLPV from CORTOL keyword third value when present.
613
+ if nfo.check_token('CORTOL', line):
614
+ cortol_values = line.split()
615
+ if len(cortol_values) >= 4:
616
+ self._tolpv = float(cortol_values[3])
617
+
606
618
  # load the overs:
607
619
  if fo.value_in_file('OVER', file_as_list):
608
620
  self.__overs = NexusGrid.load_nexus_overs(file_as_list)
@@ -732,6 +744,10 @@ class NexusGrid(Grid):
732
744
  # Ensure resulting dataframe has uppercase column names
733
745
  df.columns = [col.upper() for col in df.columns]
734
746
 
747
+ # Ensure fault name case insensivity by making all fault names uppercase.
748
+ # This also ensures that when we check for MULTFL lines, we can do so in a case insensitive way.
749
+ df['NAME'] = df['NAME'].str.upper()
750
+
735
751
  # Check if any multfls have been used in grid file and update fault trans multipliers accordingly
736
752
  f_names = df['NAME'].unique()
737
753
  f_mults = [1.] * len(f_names)
@@ -741,6 +757,8 @@ class NexusGrid(Grid):
741
757
  fname = str(nfo.get_expected_token_value(
742
758
  'MULTFL', line, file_content_as_list,
743
759
  custom_message=f'{line} does not have a fault name following MULTFL'))
760
+ # Ensure fname is uppercase for case insensitivity
761
+ fname = fname.upper()
744
762
  if fname in df['NAME'].unique():
745
763
  tmult = float(str(nfo.get_expected_token_value(
746
764
  fname, line, file_content_as_list,
@@ -5,13 +5,14 @@ connections, well connections, wellheads, wellbores, constraints and targets.
5
5
  """
6
6
  from __future__ import annotations
7
7
 
8
+ import copy
8
9
  import re
9
10
  import warnings
10
11
  from dataclasses import dataclass
11
- from typing import TYPE_CHECKING, Any, Literal
12
+ from typing import TYPE_CHECKING, Any, Literal, TypeVar
12
13
 
13
14
  import ResSimpy.FileOperations.file_operations as fo
14
- from ResSimpy.DataModelBaseClasses.DataObjectMixin import DataObjectMixinDictType
15
+ from ResSimpy.DataModelBaseClasses.DataObjectMixin import DataObjectMixinDictType, DataObjectMixin
15
16
  from ResSimpy.DataModelBaseClasses.Network import Network
16
17
  from ResSimpy.Enums.WellTypeEnum import WellType
17
18
  from ResSimpy.Nexus.DataModels.Network.NexusAction import NexusAction
@@ -56,6 +57,7 @@ from ResSimpy.Nexus.nexus_collect_tables import collect_all_tables_to_objects
56
57
 
57
58
  if TYPE_CHECKING:
58
59
  from ResSimpy.Nexus.NexusSimulator import NexusSimulator
60
+ T = TypeVar('T', bound=DataObjectMixin)
59
61
 
60
62
 
61
63
  @dataclass(kw_only=True)
@@ -234,6 +236,56 @@ class NexusNetwork(Network):
234
236
 
235
237
  return loaded_procs
236
238
 
239
+ @staticmethod
240
+ def __combine_lists_into_one_timeline(list_1: list[T],
241
+ list_2: list[T]) -> list[T]:
242
+ """Combines two lists into one, ensuring that the objects are correctly ordered by iso_date.
243
+
244
+ Args:
245
+ list_1(list[DataObjectMixin]): The first list of objects to be combined
246
+ list_2(list[DataObjectMixin]): The second list of objects to be combined
247
+
248
+ Returns:
249
+ list[DataObjectMixin]: The combined list of both lists of objects in the correct order.
250
+ """
251
+ combined_list = []
252
+ list_1_copy = copy.deepcopy(list_1)
253
+ list_2_copy = copy.deepcopy(list_2)
254
+
255
+ # If either list is empty, simply return the other one.
256
+ if len(list_1_copy) == 0:
257
+ return list_2_copy
258
+ if len(list_2_copy) == 0:
259
+ return list_1_copy
260
+
261
+ # Loop through both lists, popping each entry as we add them to the combined list.
262
+ current_first_object = list_1_copy[0]
263
+ current_second_object = list_2_copy[0]
264
+
265
+ while len(list_1_copy) > 0 or len(list_2_copy) > 0:
266
+ if current_first_object.iso_date == current_second_object.iso_date:
267
+ warnings.warn('Multiple activation changes for the same timestamp of different types. Cannot guarantee '
268
+ 'the combined order matches the order in the original files')
269
+
270
+ if current_first_object.iso_date < current_second_object.iso_date:
271
+ combined_list.append(current_first_object)
272
+ list_1_copy.pop(0)
273
+ if len(list_1_copy) == 0:
274
+ combined_list.extend(list_2_copy)
275
+ break
276
+ else:
277
+ current_first_object = list_1_copy[0]
278
+ else:
279
+ combined_list.append(current_second_object)
280
+ list_2_copy.pop(0)
281
+ if len(list_2_copy) == 0:
282
+ combined_list.extend(list_1_copy)
283
+ break
284
+ else:
285
+ current_second_object = list_2_copy[0]
286
+
287
+ return combined_list
288
+
237
289
  def load(self) -> None:
238
290
  """Loads all the objects from the surface files in the Simulator class.
239
291
 
@@ -301,9 +353,15 @@ class NexusNetwork(Network):
301
353
  self.welllists._add_to_memory(type_check_lists(nexus_obj_dict.get('WELLLIST')))
302
354
  self.conlists._add_to_memory(type_check_lists(nexus_obj_dict.get('CONLIST')))
303
355
  self.nodelists._add_to_memory(type_check_lists(nexus_obj_dict.get('NODELIST')))
304
- self.activation_changes._add_to_memory(type_check_lists(nexus_obj_dict.get('ACTIVATE_DEACTIVATE')))
305
- constraint_activation_changes = self.__get_constraint_activation_changes(constraints=constraints)
306
- self.activation_changes._add_to_memory(type_check_lists(constraint_activation_changes))
356
+
357
+ first_activation_changes = type_check_lists(nexus_obj_dict.get('ACTIVATE_DEACTIVATE'))
358
+ second_activation_changes = self.__get_constraint_activation_changes(constraints=constraints)
359
+ if (isinstance(first_activation_changes, list) and
360
+ isinstance(second_activation_changes, list)):
361
+ combined_activation_changes = self.__combine_lists_into_one_timeline(list_1=first_activation_changes,
362
+ list_2=second_activation_changes)
363
+ self.activation_changes._add_to_memory(type_check_lists(combined_activation_changes))
364
+
307
365
  self.stations._add_to_memory(type_check_lists(nexus_obj_dict.get('STATION')))
308
366
  self.drills._add_to_memory(type_check_lists(nexus_obj_dict.get('DRILL')))
309
367
  self.drill_sites._add_to_memory(type_check_lists(nexus_obj_dict.get('DRILLSITE')))
@@ -3,7 +3,7 @@ from __future__ import annotations
3
3
 
4
4
  import warnings
5
5
  from dataclasses import dataclass, field
6
- from typing import TYPE_CHECKING
6
+ from typing import TYPE_CHECKING, Optional
7
7
 
8
8
  import ResSimpy.Nexus.nexus_file_operations as nfo
9
9
  import ResSimpy.FileOperations.file_operations as fo
@@ -12,6 +12,7 @@ from ResSimpy.Enums.OutputType import OutputType
12
12
  from ResSimpy.Nexus.DataModels.NexusReportingRequests import NexusOutputRequest, NexusOutputContents
13
13
  from ResSimpy.Nexus.nexus_add_new_object_to_file import AddObjectOperations
14
14
  from ResSimpy.DataModelBaseClasses.Reporting import Reporting
15
+ from ResSimpy.Nexus.NexusEnums.DateFormatEnum import DateFormat
15
16
  from ResSimpy.Time.ISODateTime import ISODateTime
16
17
 
17
18
  if TYPE_CHECKING:
@@ -145,7 +146,9 @@ class NexusReporting(Reporting):
145
146
  ss_end_index = index
146
147
  list_of_output_requests = self._get_output_request(file_as_list[ss_start_index:ss_end_index],
147
148
  date=current_date,
148
- output_type=OutputType.SPREADSHEET)
149
+ output_type=OutputType.SPREADSHEET,
150
+ date_format=self.__model.date_format,
151
+ start_date=self.__model.start_date)
149
152
  ss_output_requests.extend(list_of_output_requests)
150
153
 
151
154
  if nfo.check_token('OUTPUT', line):
@@ -154,7 +157,9 @@ class NexusReporting(Reporting):
154
157
  array_end_index = index
155
158
  list_of_output_requests = self._get_output_request(file_as_list[array_start_index:array_end_index],
156
159
  date=current_date,
157
- output_type=OutputType.ARRAY)
160
+ output_type=OutputType.ARRAY,
161
+ date_format=self.__model.date_format,
162
+ start_date=self.__model.start_date)
158
163
  array_output_requests.extend(list_of_output_requests)
159
164
 
160
165
  if nfo.check_token('SSOUT', line):
@@ -163,7 +168,9 @@ class NexusReporting(Reporting):
163
168
  ss_end_index = index
164
169
  list_of_output_contents = self._get_output_contents(file_as_list[ss_start_index:ss_end_index],
165
170
  date=current_date,
166
- output_type=OutputType.SPREADSHEET)
171
+ output_type=OutputType.SPREADSHEET,
172
+ date_format=self.__model.date_format,
173
+ start_date=self.__model.start_date)
167
174
  ss_output_contents.extend(list_of_output_contents)
168
175
 
169
176
  if nfo.check_token('MAPOUT', line) or nfo.check_token('ARRAYOUT', line):
@@ -172,7 +179,9 @@ class NexusReporting(Reporting):
172
179
  ss_end_index = index
173
180
  list_of_output_contents = self._get_output_contents(file_as_list[ss_start_index:ss_end_index],
174
181
  date=current_date,
175
- output_type=OutputType.ARRAY)
182
+ output_type=OutputType.ARRAY,
183
+ date_format=self.__model.date_format,
184
+ start_date=self.__model.start_date)
176
185
  array_output_contents.extend(list_of_output_contents)
177
186
 
178
187
  self.__ss_output_requests = ss_output_requests
@@ -182,50 +191,69 @@ class NexusReporting(Reporting):
182
191
  self.__load_status = True
183
192
 
184
193
  @staticmethod
185
- def _get_output_request(table_file_as_list: list[str], date: str, output_type: OutputType) \
186
- -> list[NexusOutputRequest]:
194
+ def _get_output_request(table_file_as_list: list[str], date: str, output_type: OutputType,
195
+ date_format: Optional[DateFormat] = None,
196
+ start_date: Optional[str] = None) -> list[NexusOutputRequest]:
187
197
  """Gets the output objects from the runcontrol file.
188
198
 
189
199
  Args:
190
200
  table_file_as_list (list[str]): The table file as a list of strings
191
201
  date (str): The date of the output
192
202
  output_type (OutputType): The output type as an Enum
203
+ date_format (Optional[DateFormat]): The date format of the model.
204
+ start_date (Optional[str]): The start date of the model (required if dates are numeric).
193
205
  """
194
206
  output_request_with_number = ['DT', 'DTTOL', 'FREQ', 'TIMESTEP']
195
207
 
196
- resulting_output_requests: list[NexusOutputRequest] = []
208
+ # Flatten all tokens across every line so that keyword/frequency pairs
209
+ # split across lines (e.g. "MAPS\nTNEXT") are handled correctly.
210
+ all_tokens: list[str] = []
197
211
  for line in table_file_as_list:
212
+ all_tokens.extend(fo.split_line(line))
213
+
214
+ resulting_output_requests: list[NexusOutputRequest] = []
215
+ i = 0
216
+ while i < len(all_tokens):
198
217
  number_defined_float: None | float = None
199
- element = nfo.get_next_value(start_line_index=0, file_as_list=[line])
200
- if element is None or element == '':
201
- continue
202
- frequency = nfo.get_expected_token_value(element, token_line=line,
203
- file_list=[line])
218
+ element = all_tokens[i]
219
+ i += 1
220
+ if i >= len(all_tokens):
221
+ warnings.warn(f'No frequency found for output request: {element}')
222
+ break
223
+ frequency = all_tokens[i]
224
+ i += 1
204
225
  if frequency in output_request_with_number:
205
- number_defined = nfo.get_expected_token_value(frequency, token_line=line,
206
- file_list=[line])
207
- try:
208
- number_defined_float = float(number_defined)
209
- except ValueError:
210
- warnings.warn(f'Unable to convert output request number to float: {number_defined}')
211
- number_defined_float = None
226
+ if i >= len(all_tokens):
227
+ warnings.warn(f'No number found after {frequency} for output request: {element}')
228
+ else:
229
+ number_defined = all_tokens[i]
230
+ i += 1
231
+ try:
232
+ number_defined_float = float(number_defined)
233
+ except ValueError:
234
+ warnings.warn(f'Unable to convert output request number to float: {number_defined}')
235
+ number_defined_float = None
212
236
 
213
237
  frequency_enum = FrequencyEnum[frequency]
214
238
  output_request = NexusOutputRequest(date=date, output=element, output_frequency=frequency_enum,
215
- output_frequency_number=number_defined_float, output_type=output_type)
239
+ output_frequency_number=number_defined_float, output_type=output_type,
240
+ date_format=date_format, start_date=start_date)
216
241
  resulting_output_requests.append(output_request)
217
242
 
218
243
  return resulting_output_requests
219
244
 
220
245
  @staticmethod
221
- def _get_output_contents(table_file_as_list: list[str], date: str, output_type: OutputType) \
222
- -> list[NexusOutputContents]:
246
+ def _get_output_contents(table_file_as_list: list[str], date: str, output_type: OutputType,
247
+ date_format: Optional[DateFormat] = None,
248
+ start_date: Optional[str] = None) -> list[NexusOutputContents]:
223
249
  """Gets the output contents from a table.
224
250
 
225
251
  Args:
226
252
  table_file_as_list (list[str]): The table file as a list of strings
227
253
  date (str): The date of the output
228
254
  output_type (OutputType): The output type as an Enum
255
+ date_format (Optional[DateFormat]): The date format of the model.
256
+ start_date (Optional[str]): The start date of the model (required if dates are numeric).
229
257
  """
230
258
  resulting_output_contents: list[NexusOutputContents] = []
231
259
  for line in table_file_as_list:
@@ -242,8 +270,8 @@ class NexusReporting(Reporting):
242
270
  output_contents.append(value)
243
271
 
244
272
  output_contents_obj = NexusOutputContents(date=date, output_contents=output_contents,
245
- output_type=output_type,
246
- output=element)
273
+ output_type=output_type, output=element,
274
+ _date_format=date_format, _start_date=start_date)
247
275
  resulting_output_contents.append(output_contents_obj)
248
276
 
249
277
  return resulting_output_contents
@@ -481,10 +481,11 @@ class StructuredGridOperations:
481
481
  if len(mod_table.columns) == 7:
482
482
  mod_table.columns = ['i1', 'i2', 'j1', 'j2', 'k1', 'k2', '#v']
483
483
  elif len(mod_table.columns) == 8:
484
- # clean nan's when there is a mix of 7 length and 8 length columns
484
+ # clean nans when there is a mix of 7 length and 8 length columns
485
485
  mod_table[7] = mod_table[7].convert_dtypes().astype(str)
486
486
  mod_table[7] = mod_table[7].replace('nan', '')
487
487
  mod_table[7] = mod_table[7].replace('<NA>', '')
488
+ mod_table[7] = mod_table[7].fillna('')
488
489
  # Put the last two columns together and drop them to make the #v column
489
490
  mod_table[8] = mod_table[6].astype(str) + mod_table[7].astype(str)
490
491
  mod_table = mod_table.drop([6, 7], axis=1)
@@ -11,12 +11,21 @@
11
11
  Enums
12
12
  """
13
13
 
14
- __version__ = "2.5.3" # Set at build time
14
+ __version__ = "2.6.0" # Set at build time
15
15
 
16
16
  from ResSimpy.Nexus.NexusSimulator import NexusSimulator
17
17
  from ResSimpy.OpenGoSim.OpenGoSimSimulator import OpenGoSimSimulator
18
18
 
19
+ # Useful regularly used objects
20
+ from ResSimpy.Time.ISODateTime import ISODateTime
21
+ from ResSimpy.Enums.UnitsEnum import UnitSystem
22
+ from ResSimpy.Nexus.NexusEnums.DateFormatEnum import DateFormat
23
+
24
+
19
25
  __all__ = [
20
26
  "NexusSimulator",
21
27
  "OpenGoSimSimulator",
28
+ "ISODateTime",
29
+ "UnitSystem",
30
+ "DateFormat",
22
31
  ]
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "ResSimpy"
3
- version = "2.5.3" # Set at build time
3
+ version = "2.6.0" # Set at build time
4
4
  description = "A Python library for working with Reservoir Simulator Models."
5
5
  authors = ["BP"]
6
6
  readme = "README.md"
@@ -11,6 +11,8 @@ classifiers = [
11
11
  "Programming Language :: Python :: 3.10",
12
12
  "Programming Language :: Python :: 3.11",
13
13
  "Programming Language :: Python :: 3.12",
14
+ "Programming Language :: Python :: 3.13",
15
+ "Programming Language :: Python :: 3.14",
14
16
  "Development Status :: 5 - Production/Stable",
15
17
  "Topic :: Scientific/Engineering",
16
18
  "Topic :: System :: Filesystems",
@@ -21,20 +23,27 @@ packages = [
21
23
  ]
22
24
 
23
25
  [tool.poetry.dependencies]
24
- python = ">=3.10, <3.13"
25
- numpy = ">=1.23.4, <2"
26
- pandas = ">=1.5.0, <2.3"
27
- typing-extensions = "^4.12"
26
+ python = ">=3.10, <3.15"
27
+ numpy = [
28
+ { version = ">=2.2, <2.3", python = "<3.11" },
29
+ { version = ">=2.3, <2.6", python = ">=3.11" },
30
+ ]
31
+ pandas = [
32
+ { version = ">=2.3,<3", python = "<3.11" },
33
+ { version = ">=3.0,<3.0.4", python = ">=3.11" },
34
+ ]
35
+
36
+ typing-extensions = "^4.15"
28
37
 
29
38
  [tool.poetry.group.dev.dependencies]
30
39
  pytest-mock = "^3.15"
31
- pytest = "^9.0"
32
- coverage = "^6.5"
33
- flake8 = "^6"
34
- mypy = "^1.2"
35
- pycodestyle = "^2.9.1"
36
- pytest-cov = "^4.0.0"
37
- ruff = "0.6.5"
40
+ pytest = "^9.1"
41
+ coverage = "^7.14"
42
+ flake8 = "^7.3"
43
+ mypy = "^2.1"
44
+ pycodestyle = "^2.14"
45
+ pytest-cov = "^7.1"
46
+ ruff = "0.15.18"
38
47
 
39
48
  [tool.poetry-dynamic-versioning]
40
49
  enable = false
File without changes
File without changes