ResSimpy 2.5.2__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.2 → ressimpy-2.6.0}/PKG-INFO +9 -5
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Grid.py +13 -2
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Network.py +2 -2
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/FileOperations/File.py +16 -3
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/FileOperations/file_operations.py +17 -9
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusActivationChange.py +3 -1
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusProc.py +33 -23
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusProcs.py +9 -0
- ressimpy-2.6.0/ResSimpy/Nexus/DataModels/Network/NexusStreamTracer.py +89 -0
- ressimpy-2.6.0/ResSimpy/Nexus/DataModels/Network/NexusStreamTracers.py +73 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusWellLists.py +1 -1
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusFile.py +1 -1
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/StructuredGrid/NexusGrid.py +43 -24
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusNetwork.py +100 -16
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusReporting.py +53 -25
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/nexus_collect_tables.py +1 -1
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/nexus_constraint_operations.py +1 -1
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/nexus_file_operations.py +1 -1
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/nexus_model_file_generator.py +15 -3
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/structured_grid_operations.py +2 -1
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Time/ISODateTime.py +3 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/__init__.py +10 -1
- {ressimpy-2.5.2 → ressimpy-2.6.0}/pyproject.toml +22 -13
- {ressimpy-2.5.2 → ressimpy-2.6.0}/LICENSE.MD +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/README.md +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Aquifer.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Completion.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Constraint.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/DataObjectMixin.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Drill.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/DrillSite.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/DynamicProperty.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/DynamicPropertyContainer.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Equilibration.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Ftrans.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Gaslift.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/GridArrayDefinition.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/GridArrayFunction.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/GuideRate.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/LGR.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Multir.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/NetworkList.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/NetworkObject.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Node.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/NodeConnection.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/OperationsMixin.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Over.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/PVT.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/RelPerm.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/RelPermEndPoint.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Reporting.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Rock.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Separator.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Simulator.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/SolverParameter.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Target.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Valve.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Water.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Well.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/WellConnection.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Wellbore.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/Wellhead.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/__init__.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/DataModelBaseClasses/output_request.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Enums/FluidTypeEnums.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Enums/FrequencyEnum.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Enums/GridFunctionTypes.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Enums/HowEnum.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Enums/OutputType.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Enums/PenetrationDirectionEnum.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Enums/TimeSteppingMethodEnum.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Enums/UnitsEnum.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Enums/WellTypeEnum.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Enums/__init__.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/FileOperations/FileBase.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/FileOperations/__init__.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/FileOperations/simulator_constants.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/GenericContainerClasses/Constraints.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/GenericContainerClasses/DrillSites.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/GenericContainerClasses/Drills.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/GenericContainerClasses/Grids.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/GenericContainerClasses/GuideRates.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/GenericContainerClasses/Hydraulics.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/GenericContainerClasses/LGRs.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/GenericContainerClasses/NetworkLists.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/GenericContainerClasses/NodeConnections.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/GenericContainerClasses/Nodes.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/GenericContainerClasses/SolverParameters.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/GenericContainerClasses/Targets.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/GenericContainerClasses/WellConnections.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/GenericContainerClasses/Wellbores.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/GenericContainerClasses/Wellheads.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/GenericContainerClasses/Wells.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/GenericContainerClasses/__init__.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/FcsConfig.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/FcsFile.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusAction.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusActions.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusActivationChanges.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusConList.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusConLists.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusConstraint.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusConstraints.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusDrill.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusDrillSite.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusDrillSites.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusDrills.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusGuideRate.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusGuideRates.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusNode.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusNodeConnection.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusNodeConnections.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusNodeList.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusNodeLists.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusNodes.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusStation.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusStations.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusTarget.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusTargets.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusWellConnection.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusWellConnections.py +0 -0
- {ressimpy-2.5.2/ResSimpy/Nexus/DataModels → ressimpy-2.6.0/ResSimpy/Nexus/DataModels/Network}/NexusWellList.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusWellbore.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusWellbores.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusWellhead.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/NexusWellheads.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/Network/__init__.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusAquiferMethod.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusCompletion.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusEquilMethod.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusGasliftMethod.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusHydraulicsMethod.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusIPRMethod.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusOptions.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusPVTMethod.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusRelPermEndPoint.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusRelPermMethod.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusReportingRequests.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusRockMethod.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusSeparatorMethod.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusSolverParameter.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusValveMethod.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusWaterMethod.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusWell.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/NexusWellMod.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/StructuredGrid/NexusFtrans.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/StructuredGrid/NexusGridArrayFunction.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/StructuredGrid/NexusLGR.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/StructuredGrid/NexusLGRs.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/StructuredGrid/NexusMultir.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/StructuredGrid/NexusOver.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/StructuredGrid/NexusTOver.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/StructuredGrid/__init__.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/__init__.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/DataModels/nexus_grid_to_proc.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusAquiferMethods.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusEnums/ActivationChangeEnum.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusEnums/DateFormatEnum.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusEnums/__init__.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusEquilMethods.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusGasliftMethods.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusGrids.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusHydraulicsMethods.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusIPRMethods.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/__init__.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/adsorption_keywords.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/alphaf_keywords.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/aquifer_keywords.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/choke_keywords.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/compressor_keywords.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/eos_defaults_keywords.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/equil_keywords.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/esp_keywords.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/fcs_keywords.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/fluxin_keywords.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/gaslift_keywords.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/hyd_keywords.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/icd_keywords.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/ipr_keywords.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/nexus_keywords.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/options_keywords.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/polymer_keywords.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/proc_keywords.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/pump_keywords.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/pvt_keywords.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/relpm_keywords.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/rock_keywords.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/runcontrol_keywords.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/separator_keywords.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/structured_grid_keywords.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/surface_keywords.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/tracer_init_keywords.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/valve_keywords.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/water_keywords.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusKeywords/wells_keywords.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusPVTMethods.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusRelPermMethods.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusRockMethods.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusSeparatorMethods.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusSimulator.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusSolverParameters.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusValveMethods.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusWaterMethods.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/NexusWells.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/__init__.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/array_function_operations.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/constants.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/load_wells.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/logfile_operations.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/nexus_add_new_object_to_file.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/nexus_load_faults.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/nexus_load_list_table.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/nexus_modify_object_in_file.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/nexus_remove_object_from_file.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/rel_perm_operations.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Nexus/runcontrol_operations.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/OpenGoSim/DataModels/Network/__init__.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/OpenGoSim/DataModels/OpenGoSimCompletion.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/OpenGoSim/DataModels/OpenGoSimWell.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/OpenGoSim/DataModels/__init__.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/OpenGoSim/Enums/SimulationTypeEnum.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/OpenGoSim/Enums/__init__.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/OpenGoSim/Model_Parts/OpenGoSimNetwork.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/OpenGoSim/Model_Parts/__init__.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/OpenGoSim/OpenGoSimKeywords/OpenGoSimKeywords.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/OpenGoSim/OpenGoSimKeywords/__init__.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/OpenGoSim/OpenGoSimSimulator.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/OpenGoSim/OpenGoSimWells.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/OpenGoSim/__init__.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Time/__init__.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Units/AttributeMapping.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Units/AttributeMappings/BaseUnitMapping.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Units/AttributeMappings/CompletionUnitMapping.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Units/AttributeMappings/ConstraintUnitMapping.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Units/AttributeMappings/DynamicPropertyUnitMapping.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Units/AttributeMappings/NetworkUnitMapping.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Units/AttributeMappings/__init__.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Units/Units.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Units/__init__.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Utils/__init__.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Utils/dynamic_method_manipulations.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Utils/factory_methods.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Utils/general_utilities.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Utils/generic_repr.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Utils/grid_filtering_functions.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Utils/invert_nexus_map.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Utils/obj_to_dataframe.py +0 -0
- {ressimpy-2.5.2 → ressimpy-2.6.0}/ResSimpy/Utils/obj_to_table_string.py +0 -0
- {ressimpy-2.5.2 → 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
|
|
@@ -726,17 +726,19 @@ def split_lines_for_long_string(long_string: str, max_length: int, comment_chara
|
|
|
726
726
|
return compiled_string
|
|
727
727
|
|
|
728
728
|
|
|
729
|
-
def split_list_of_strings_by_length(list_of_strings: list[str], max_length: int
|
|
729
|
+
def split_list_of_strings_by_length(list_of_strings: list[str], max_length: int,
|
|
730
|
+
comment_characters: None | list[str] = None) -> list[str]:
|
|
730
731
|
"""Splits a list of strings into a new list of strings with a maximum length.
|
|
731
732
|
|
|
732
733
|
Args:
|
|
733
734
|
list_of_strings (list[str]): The list of strings to be split.
|
|
734
735
|
max_length (int): The maximum length of each string in the new list.
|
|
736
|
+
comment_characters (Optional[list[str]]): The comment characters to filter out. Defaults to None
|
|
735
737
|
|
|
736
738
|
Returns:
|
|
737
739
|
list[str]: A new list of strings split from the original list.
|
|
738
740
|
"""
|
|
739
|
-
return [split_lines_for_long_string(string, max_length) for string in list_of_strings]
|
|
741
|
+
return [split_lines_for_long_string(string, max_length, comment_characters) for string in list_of_strings]
|
|
740
742
|
|
|
741
743
|
|
|
742
744
|
def get_full_file_path(file_path: str, origin: str, rootdir: Optional[str] = None, is_nexus: bool = True) -> str:
|
|
@@ -804,14 +806,20 @@ def split_file_as_list_by_date(file_as_list: list[str], date_token: str = 'TIME'
|
|
|
804
806
|
of that token.
|
|
805
807
|
"""
|
|
806
808
|
split_file: dict[str, list[str]] = {}
|
|
807
|
-
|
|
809
|
+
date_token_value = None
|
|
810
|
+
no_token_dict_key = f'BEFORE_FIRST_{date_token}'
|
|
811
|
+
|
|
808
812
|
for i, line in enumerate(file_as_list):
|
|
809
813
|
if check_token(date_token, line, comment_characters=comment_characters):
|
|
810
814
|
# TODO handle 3 part dates in this bit
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
split_file[
|
|
815
|
-
elif
|
|
816
|
-
split_file
|
|
815
|
+
date_token_value = get_expected_token_value(token=date_token, token_line=line,
|
|
816
|
+
file_list=file_as_list[i:],
|
|
817
|
+
comment_characters=comment_characters)
|
|
818
|
+
split_file[date_token_value] = [line]
|
|
819
|
+
elif date_token_value is None:
|
|
820
|
+
if no_token_dict_key not in split_file:
|
|
821
|
+
split_file[no_token_dict_key] = []
|
|
822
|
+
split_file[no_token_dict_key].append(line)
|
|
823
|
+
elif date_token_value is not None:
|
|
824
|
+
split_file[date_token_value].append(line)
|
|
817
825
|
return split_file
|
{ressimpy-2.5.2 → 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]]:
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
from dataclasses import dataclass
|
|
2
|
-
from typing import Optional
|
|
2
|
+
from typing import Optional
|
|
3
|
+
|
|
4
|
+
from ResSimpy.DataModelBaseClasses.NetworkObject import NetworkObject
|
|
5
|
+
from ResSimpy.Enums.UnitsEnum import UnitSystem
|
|
6
|
+
from ResSimpy.Nexus.NexusEnums.DateFormatEnum import DateFormat
|
|
3
7
|
from ResSimpy.Nexus.NexusKeywords.proc_keywords import PREDEFINED_VARS, CONDITIONAL_KEYWORDS, NEXUS_ALL_PROC_FUNCS
|
|
8
|
+
from ResSimpy.Units.AttributeMappings.BaseUnitMapping import BaseUnitMapping
|
|
4
9
|
|
|
5
10
|
|
|
6
11
|
# set custom error message
|
|
@@ -9,18 +14,15 @@ class SetError(Exception):
|
|
|
9
14
|
|
|
10
15
|
|
|
11
16
|
@dataclass(kw_only=True, repr=True)
|
|
12
|
-
class NexusProc:
|
|
17
|
+
class NexusProc(NetworkObject):
|
|
13
18
|
"""Class that represents a single nexus procedure."""
|
|
14
|
-
__date: Optional[str]
|
|
15
|
-
__name: Optional[str]
|
|
16
19
|
__priority: Optional[int]
|
|
17
20
|
__contents: Optional[list[str]]
|
|
18
21
|
__contents_breakdown: dict[str, int]
|
|
19
22
|
|
|
20
|
-
def __init__(self, date: Optional[str] = None,
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
priority: Optional[int] = None) -> None:
|
|
23
|
+
def __init__(self, date: Optional[str] = None, contents: Optional[list[str]] = None,
|
|
24
|
+
name: Optional[str] = None, priority: Optional[int] = None, unit_system: Optional[UnitSystem] = None,
|
|
25
|
+
start_date: Optional[str] = None, date_format: Optional[DateFormat] = None) -> None:
|
|
24
26
|
"""Initialize the attributes of the class.
|
|
25
27
|
|
|
26
28
|
Attributes:
|
|
@@ -33,33 +35,23 @@ class NexusProc:
|
|
|
33
35
|
Methods:
|
|
34
36
|
reset_nexus_proc_function_counts(): Returns a dictionary of zero counts for the nexus proc functions.
|
|
35
37
|
"""
|
|
36
|
-
|
|
37
|
-
self.__date = date
|
|
38
|
-
self.__name = name
|
|
39
38
|
self.__priority = priority
|
|
40
39
|
self.__contents = contents
|
|
40
|
+
|
|
41
41
|
self.__contents_breakdown = self.reset_nexus_proc_function_counts()
|
|
42
|
+
super().__init__(properties_dict={}, date=date, date_format=date_format, start_date=start_date,
|
|
43
|
+
unit_system=unit_system, name=name)
|
|
42
44
|
|
|
43
45
|
@property
|
|
44
46
|
def contents(self) -> Optional[list[str]]:
|
|
45
47
|
"""Returns the contents of the main body of the procedure."""
|
|
46
48
|
return self.__contents
|
|
47
49
|
|
|
48
|
-
@property
|
|
49
|
-
def date(self) -> Optional[str]:
|
|
50
|
-
"""Returns the date that the procedure occurred."""
|
|
51
|
-
return self.__date
|
|
52
|
-
|
|
53
50
|
@property
|
|
54
51
|
def priority(self) -> Optional[int]:
|
|
55
52
|
"""Returns the priority of the procedure."""
|
|
56
53
|
return self.__priority
|
|
57
54
|
|
|
58
|
-
@property
|
|
59
|
-
def name(self) -> Optional[str]:
|
|
60
|
-
"""Returns the name of the procedure."""
|
|
61
|
-
return self.__name
|
|
62
|
-
|
|
63
55
|
@property
|
|
64
56
|
def contents_breakdown(self) -> dict[str, int]:
|
|
65
57
|
"""Returns the dictionary counts of the proc functions."""
|
|
@@ -76,9 +68,9 @@ class NexusProc:
|
|
|
76
68
|
'Nexus Keyword Manual page 1013.')
|
|
77
69
|
|
|
78
70
|
@staticmethod
|
|
79
|
-
def get_keyword_mapping() ->
|
|
71
|
+
def get_keyword_mapping() -> dict[str, tuple[str, type]]:
|
|
80
72
|
"""Gets the mapping of nexus keywords to attribute definitions."""
|
|
81
|
-
keywords = {
|
|
73
|
+
keywords: dict[str, tuple[str, type]] = {
|
|
82
74
|
'NAME': ('name', str),
|
|
83
75
|
'PRIORITY': ('priority', str)
|
|
84
76
|
}
|
|
@@ -99,3 +91,21 @@ class NexusProc:
|
|
|
99
91
|
to_search = predef_vars | cond | all_proc_funcs
|
|
100
92
|
|
|
101
93
|
return to_search
|
|
94
|
+
|
|
95
|
+
def to_string(self) -> str:
|
|
96
|
+
"""Outputs the procedure as a string in the format it would be written in a Nexus file."""
|
|
97
|
+
output_str = "PROCS"
|
|
98
|
+
if self.name is not None:
|
|
99
|
+
output_str += f" NAME {self.name}"
|
|
100
|
+
if self.priority is not None:
|
|
101
|
+
output_str += f" PRIORITY {self.priority}"
|
|
102
|
+
output_str += '\n'
|
|
103
|
+
if self.contents is not None:
|
|
104
|
+
output_str += '\n'.join(self.contents) + '\n'
|
|
105
|
+
output_str += "ENDPROCS\n"
|
|
106
|
+
return output_str
|
|
107
|
+
|
|
108
|
+
@property
|
|
109
|
+
def units(self) -> BaseUnitMapping:
|
|
110
|
+
"""Returns the attribute to unit map for the data object."""
|
|
111
|
+
return BaseUnitMapping(None)
|
|
@@ -4,6 +4,7 @@ from dataclasses import dataclass, field
|
|
|
4
4
|
from typing import Sequence, TYPE_CHECKING
|
|
5
5
|
|
|
6
6
|
from ResSimpy.Nexus.DataModels.Network.NexusProc import NexusProc
|
|
7
|
+
from ResSimpy.Time.ISODateTime import ISODateTime
|
|
7
8
|
|
|
8
9
|
if TYPE_CHECKING:
|
|
9
10
|
from ResSimpy.Nexus.NexusNetwork import NexusNetwork
|
|
@@ -35,3 +36,11 @@ class NexusProcs:
|
|
|
35
36
|
def _add_to_memory(self, procs_to_add: list[NexusProc]) -> None:
|
|
36
37
|
"""Adds the list of Nexus procedure objects to memory."""
|
|
37
38
|
self.__procs.extend(procs_to_add)
|
|
39
|
+
|
|
40
|
+
def to_string_for_date(self, date: ISODateTime) -> str:
|
|
41
|
+
"""Outputs the procedures for a specific date."""
|
|
42
|
+
output_str = ''
|
|
43
|
+
procs_for_date = [x for x in self.__procs if x.iso_date == date]
|
|
44
|
+
for proc in procs_for_date:
|
|
45
|
+
output_str += proc.to_string()
|
|
46
|
+
return output_str
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"""Class representing a single Nexus STREAM_TRACER entry."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
from dataclasses import dataclass
|
|
5
|
+
|
|
6
|
+
from ResSimpy.DataModelBaseClasses.DataObjectMixin import DataObjectMixinDictType
|
|
7
|
+
from ResSimpy.Enums.UnitsEnum import UnitSystem
|
|
8
|
+
from ResSimpy.Nexus.NexusEnums.DateFormatEnum import DateFormat
|
|
9
|
+
from ResSimpy.DataModelBaseClasses.NetworkObject import NetworkObject
|
|
10
|
+
from ResSimpy.Units.AttributeMappings.BaseUnitMapping import BaseUnitMapping
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@dataclass(kw_only=True, repr=False)
|
|
14
|
+
class NexusStreamTracer(NetworkObject):
|
|
15
|
+
"""Represents a single row in a Nexus STREAM_TRACER table.
|
|
16
|
+
|
|
17
|
+
A STREAM_TRACER block associates named streams with a fluid component and
|
|
18
|
+
an optional tracer name and concentration, e.g.::
|
|
19
|
+
|
|
20
|
+
STREAM_TRACER
|
|
21
|
+
NAME COMPONENT TRACER CONCENTRATION
|
|
22
|
+
SEAWTR WATER SALT 1.0
|
|
23
|
+
TRTWTR WATER SALT 1.0
|
|
24
|
+
ENDSTREAM_TRACER
|
|
25
|
+
|
|
26
|
+
Attributes:
|
|
27
|
+
name (str): The stream name (NAME column). Used in WELLS tables as the STREAM value.
|
|
28
|
+
component (str): The fluid component associated with this stream (COMPONENT column),
|
|
29
|
+
e.g. ``'WATER'``, ``'GAS'``, ``'OIL'``.
|
|
30
|
+
tracer (Optional[str]): The tracer label (TRACER column). Defaults to None.
|
|
31
|
+
concentration (Optional[float]): Tracer concentration (CONCENTRATION column). Defaults to None.
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
component: str | None = None
|
|
35
|
+
tracer: str | None = None
|
|
36
|
+
concentration: float | None = None
|
|
37
|
+
|
|
38
|
+
def __init__(
|
|
39
|
+
self,
|
|
40
|
+
properties_dict: DataObjectMixinDictType | None = None,
|
|
41
|
+
date: str | None = None,
|
|
42
|
+
date_format: DateFormat | None = None,
|
|
43
|
+
start_date: str | None = None,
|
|
44
|
+
unit_system: UnitSystem | None = None,
|
|
45
|
+
name: str | None = None,
|
|
46
|
+
component: str | None = None,
|
|
47
|
+
tracer: str | None = None,
|
|
48
|
+
concentration: float | None = None,
|
|
49
|
+
) -> None:
|
|
50
|
+
"""Initialises the NexusStreamTracer class.
|
|
51
|
+
|
|
52
|
+
Args:
|
|
53
|
+
properties_dict (Optional[dict]): dict of the properties to set on the object.
|
|
54
|
+
date (Optional[str]): The date of the object.
|
|
55
|
+
date_format (Optional[DateFormat]): The date format that the object uses.
|
|
56
|
+
start_date (Optional[str]): The start date of the model.
|
|
57
|
+
unit_system (Optional[UnitSystem]): The unit system of the object e.g. ENGLISH, METRIC.
|
|
58
|
+
name (Optional[str]): The stream name (NAME column).
|
|
59
|
+
component (Optional[str]): Fluid component, e.g. ``'WATER'``, ``'GAS'``, ``'OIL'``.
|
|
60
|
+
tracer (Optional[str]): Tracer label (TRACER column).
|
|
61
|
+
concentration (Optional[float]): Tracer concentration (CONCENTRATION column).
|
|
62
|
+
"""
|
|
63
|
+
self.component = component
|
|
64
|
+
self.tracer = tracer
|
|
65
|
+
self.concentration = concentration
|
|
66
|
+
|
|
67
|
+
super().__init__(
|
|
68
|
+
properties_dict=properties_dict,
|
|
69
|
+
date=date,
|
|
70
|
+
date_format=date_format,
|
|
71
|
+
start_date=start_date,
|
|
72
|
+
unit_system=unit_system,
|
|
73
|
+
name=name,
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
@staticmethod
|
|
77
|
+
def get_keyword_mapping() -> dict[str, tuple[str, type]]:
|
|
78
|
+
"""Gets the mapping of Nexus STREAM_TRACER column headers to attribute definitions."""
|
|
79
|
+
return {
|
|
80
|
+
'NAME': ('name', str),
|
|
81
|
+
'COMPONENT': ('component', str),
|
|
82
|
+
'TRACER': ('tracer', str),
|
|
83
|
+
'CONCENTRATION': ('concentration', float),
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
@property
|
|
87
|
+
def units(self) -> BaseUnitMapping:
|
|
88
|
+
"""Returns the attribute-to-unit map for this data object."""
|
|
89
|
+
return BaseUnitMapping(unit_system=self.unit_system)
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"""Container class for Nexus STREAM_TRACER entries."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
from dataclasses import dataclass, field
|
|
5
|
+
from typing import Sequence, TYPE_CHECKING
|
|
6
|
+
|
|
7
|
+
from ResSimpy.Nexus.DataModels.Network.NexusStreamTracer import NexusStreamTracer
|
|
8
|
+
|
|
9
|
+
if TYPE_CHECKING:
|
|
10
|
+
from ResSimpy.Nexus.NexusNetwork import NexusNetwork
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@dataclass(kw_only=True)
|
|
14
|
+
class NexusStreamTracers:
|
|
15
|
+
"""Container for all :class:`NexusStreamTracer` objects parsed from STREAM_TRACER blocks.
|
|
16
|
+
|
|
17
|
+
Also exposes a :py:attr:`component_map` property that returns a ``dict[str, str]``
|
|
18
|
+
mapping each stream name (uppercased) to its declared COMPONENT, which is used by
|
|
19
|
+
:class:`~ResSimpy.Nexus.NexusNetwork.NexusNetwork` to classify well types.
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
__stream_tracers: list[NexusStreamTracer] = field(default_factory=list)
|
|
23
|
+
|
|
24
|
+
def __init__(self, parent_network: NexusNetwork) -> None:
|
|
25
|
+
"""Initialises the NexusStreamTracers class.
|
|
26
|
+
|
|
27
|
+
Args:
|
|
28
|
+
parent_network (NexusNetwork): The network that these stream tracers belong to.
|
|
29
|
+
"""
|
|
30
|
+
self.__parent_network: NexusNetwork = parent_network
|
|
31
|
+
self.__stream_tracers: list[NexusStreamTracer] = []
|
|
32
|
+
|
|
33
|
+
def get_all(self) -> Sequence[NexusStreamTracer]:
|
|
34
|
+
"""Returns all loaded :class:`NexusStreamTracer` objects."""
|
|
35
|
+
self.__parent_network.get_load_status()
|
|
36
|
+
return self.__stream_tracers
|
|
37
|
+
|
|
38
|
+
def get_by_name(self, name: str) -> NexusStreamTracer | None:
|
|
39
|
+
"""Returns the first :class:`NexusStreamTracer` whose stream name matches *name* (case-insensitive).
|
|
40
|
+
|
|
41
|
+
Args:
|
|
42
|
+
name (str): Stream name to look up.
|
|
43
|
+
|
|
44
|
+
Returns:
|
|
45
|
+
NexusStreamTracer | None: Matching object, or ``None`` if not found.
|
|
46
|
+
"""
|
|
47
|
+
self.__parent_network.get_load_status()
|
|
48
|
+
name_upper = name.upper()
|
|
49
|
+
for st in self.__stream_tracers:
|
|
50
|
+
if st.name is not None and st.name.upper() == name_upper:
|
|
51
|
+
return st
|
|
52
|
+
return None
|
|
53
|
+
|
|
54
|
+
@property
|
|
55
|
+
def component_map(self) -> dict[str, str]:
|
|
56
|
+
"""Returns a ``dict`` mapping stream name → component (both uppercased).
|
|
57
|
+
|
|
58
|
+
Example::
|
|
59
|
+
|
|
60
|
+
{'SEAWTR': 'WATER', 'TRTWTR': 'WATER', 'GASSTREAM': 'GAS'}
|
|
61
|
+
"""
|
|
62
|
+
self.__parent_network.get_load_status()
|
|
63
|
+
return {
|
|
64
|
+
st.name.upper(): st.component.upper()
|
|
65
|
+
for st in self.__stream_tracers
|
|
66
|
+
if st.name is not None and st.component is not None
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
def _add_to_memory(self, stream_tracers_to_add: list[NexusStreamTracer] | None) -> None:
|
|
70
|
+
"""Appends a list of :class:`NexusStreamTracer` objects to the internal store."""
|
|
71
|
+
if stream_tracers_to_add is None:
|
|
72
|
+
return
|
|
73
|
+
self.__stream_tracers.extend(stream_tracers_to_add)
|
|
@@ -6,7 +6,7 @@ from typing import TYPE_CHECKING, Literal, Sequence
|
|
|
6
6
|
|
|
7
7
|
from ResSimpy.DataModelBaseClasses.NetworkList import NetworkList
|
|
8
8
|
from ResSimpy.GenericContainerClasses.NetworkLists import NetworkLists
|
|
9
|
-
from ResSimpy.Nexus.DataModels.NexusWellList import NexusWellList
|
|
9
|
+
from ResSimpy.Nexus.DataModels.Network.NexusWellList import NexusWellList
|
|
10
10
|
|
|
11
11
|
if TYPE_CHECKING:
|
|
12
12
|
from ResSimpy.Nexus.NexusNetwork import NexusNetwork
|
|
@@ -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
|
|