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.
- {ressimpy-2.5.3 → ressimpy-2.6.0}/PKG-INFO +9 -5
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Grid.py +13 -2
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Network.py +2 -2
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/FileOperations/File.py +16 -3
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusActivationChange.py +3 -1
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusFile.py +1 -1
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/StructuredGrid/NexusGrid.py +18 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusNetwork.py +63 -5
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusReporting.py +53 -25
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/structured_grid_operations.py +2 -1
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/__init__.py +10 -1
- {ressimpy-2.5.3 → ressimpy-2.6.0}/pyproject.toml +21 -12
- {ressimpy-2.5.3 → ressimpy-2.6.0}/LICENSE.MD +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/README.md +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Aquifer.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Completion.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Constraint.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/DataObjectMixin.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Drill.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/DrillSite.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/DynamicProperty.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/DynamicPropertyContainer.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Equilibration.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Ftrans.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Gaslift.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/GridArrayDefinition.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/GridArrayFunction.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/GuideRate.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/LGR.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Multir.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/NetworkList.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/NetworkObject.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Node.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/NodeConnection.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/OperationsMixin.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Over.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/PVT.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/RelPerm.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/RelPermEndPoint.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Reporting.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Rock.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Separator.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Simulator.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/SolverParameter.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Target.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Valve.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Water.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Well.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/WellConnection.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Wellbore.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Wellhead.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/__init__.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/output_request.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Enums/FluidTypeEnums.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Enums/FrequencyEnum.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Enums/GridFunctionTypes.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Enums/HowEnum.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Enums/OutputType.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Enums/PenetrationDirectionEnum.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Enums/TimeSteppingMethodEnum.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Enums/UnitsEnum.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Enums/WellTypeEnum.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Enums/__init__.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/FileOperations/FileBase.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/FileOperations/__init__.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/FileOperations/file_operations.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/FileOperations/simulator_constants.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/GenericContainerClasses/Constraints.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/GenericContainerClasses/DrillSites.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/GenericContainerClasses/Drills.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/GenericContainerClasses/Grids.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/GenericContainerClasses/GuideRates.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/GenericContainerClasses/Hydraulics.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/GenericContainerClasses/LGRs.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/GenericContainerClasses/NetworkLists.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/GenericContainerClasses/NodeConnections.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/GenericContainerClasses/Nodes.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/GenericContainerClasses/SolverParameters.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/GenericContainerClasses/Targets.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/GenericContainerClasses/WellConnections.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/GenericContainerClasses/Wellbores.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/GenericContainerClasses/Wellheads.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/GenericContainerClasses/Wells.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/GenericContainerClasses/__init__.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/FcsConfig.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/FcsFile.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusAction.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusActions.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusActivationChanges.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusConList.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusConLists.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusConstraint.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusConstraints.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusDrill.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusDrillSite.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusDrillSites.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusDrills.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusGuideRate.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusGuideRates.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusNode.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusNodeConnection.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusNodeConnections.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusNodeList.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusNodeLists.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusNodes.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusProc.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusProcs.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusStation.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusStations.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusStreamTracer.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusStreamTracers.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusTarget.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusTargets.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusWellConnection.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusWellConnections.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusWellList.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusWellLists.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusWellbore.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusWellbores.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusWellhead.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusWellheads.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/__init__.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusAquiferMethod.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusCompletion.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusEquilMethod.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusGasliftMethod.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusHydraulicsMethod.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusIPRMethod.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusOptions.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusPVTMethod.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusRelPermEndPoint.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusRelPermMethod.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusReportingRequests.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusRockMethod.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusSeparatorMethod.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusSolverParameter.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusValveMethod.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusWaterMethod.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusWell.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusWellMod.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/StructuredGrid/NexusFtrans.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/StructuredGrid/NexusGridArrayFunction.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/StructuredGrid/NexusLGR.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/StructuredGrid/NexusLGRs.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/StructuredGrid/NexusMultir.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/StructuredGrid/NexusOver.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/StructuredGrid/NexusTOver.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/StructuredGrid/__init__.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/__init__.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/nexus_grid_to_proc.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusAquiferMethods.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusEnums/ActivationChangeEnum.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusEnums/DateFormatEnum.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusEnums/__init__.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusEquilMethods.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusGasliftMethods.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusGrids.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusHydraulicsMethods.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusIPRMethods.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/__init__.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/adsorption_keywords.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/alphaf_keywords.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/aquifer_keywords.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/choke_keywords.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/compressor_keywords.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/eos_defaults_keywords.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/equil_keywords.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/esp_keywords.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/fcs_keywords.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/fluxin_keywords.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/gaslift_keywords.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/hyd_keywords.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/icd_keywords.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/ipr_keywords.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/nexus_keywords.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/options_keywords.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/polymer_keywords.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/proc_keywords.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/pump_keywords.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/pvt_keywords.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/relpm_keywords.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/rock_keywords.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/runcontrol_keywords.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/separator_keywords.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/structured_grid_keywords.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/surface_keywords.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/tracer_init_keywords.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/valve_keywords.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/water_keywords.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/wells_keywords.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusPVTMethods.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusRelPermMethods.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusRockMethods.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusSeparatorMethods.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusSimulator.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusSolverParameters.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusValveMethods.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusWaterMethods.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusWells.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/__init__.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/array_function_operations.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/constants.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/load_wells.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/logfile_operations.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/nexus_add_new_object_to_file.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/nexus_collect_tables.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/nexus_constraint_operations.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/nexus_file_operations.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/nexus_load_faults.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/nexus_load_list_table.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/nexus_model_file_generator.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/nexus_modify_object_in_file.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/nexus_remove_object_from_file.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/rel_perm_operations.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/runcontrol_operations.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/OpenGoSim/DataModels/Network/__init__.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/OpenGoSim/DataModels/OpenGoSimCompletion.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/OpenGoSim/DataModels/OpenGoSimWell.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/OpenGoSim/DataModels/__init__.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/OpenGoSim/Enums/SimulationTypeEnum.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/OpenGoSim/Enums/__init__.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/OpenGoSim/Model_Parts/OpenGoSimNetwork.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/OpenGoSim/Model_Parts/__init__.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/OpenGoSim/OpenGoSimKeywords/OpenGoSimKeywords.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/OpenGoSim/OpenGoSimKeywords/__init__.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/OpenGoSim/OpenGoSimSimulator.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/OpenGoSim/OpenGoSimWells.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/OpenGoSim/__init__.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Time/ISODateTime.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Time/__init__.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Units/AttributeMapping.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Units/AttributeMappings/BaseUnitMapping.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Units/AttributeMappings/CompletionUnitMapping.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Units/AttributeMappings/ConstraintUnitMapping.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Units/AttributeMappings/DynamicPropertyUnitMapping.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Units/AttributeMappings/NetworkUnitMapping.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Units/AttributeMappings/__init__.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Units/Units.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Units/__init__.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Utils/__init__.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Utils/dynamic_method_manipulations.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Utils/factory_methods.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Utils/general_utilities.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Utils/generic_repr.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Utils/grid_filtering_functions.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Utils/invert_nexus_map.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Utils/obj_to_dataframe.py +0 -0
- {ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Utils/obj_to_table_string.py +0 -0
- {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.
|
|
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.
|
|
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 (>=
|
|
21
|
-
Requires-Dist:
|
|
22
|
-
Requires-Dist:
|
|
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(
|
|
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
|
-
|
|
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'
|
|
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
|
{ressimpy-2.5.3 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusActivationChange.py
RENAMED
|
@@ -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
|
-
|
|
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
|
-
|
|
305
|
-
|
|
306
|
-
self.
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
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
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
25
|
-
numpy =
|
|
26
|
-
|
|
27
|
-
|
|
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.
|
|
32
|
-
coverage = "^
|
|
33
|
-
flake8 = "^
|
|
34
|
-
mypy = "^1
|
|
35
|
-
pycodestyle = "^2.
|
|
36
|
-
pytest-cov = "^
|
|
37
|
-
ruff = "0.
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|