ResSimpy 2.5.1__tar.gz → 2.5.3__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.1 → ressimpy-2.5.3}/PKG-INFO +1 -1
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/FileOperations/file_operations.py +40 -2
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/GenericContainerClasses/NetworkLists.py +1 -1
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/Network/NexusProc.py +33 -23
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/Network/NexusProcs.py +9 -0
- ressimpy-2.5.3/ResSimpy/Nexus/DataModels/Network/NexusStreamTracer.py +89 -0
- ressimpy-2.5.3/ResSimpy/Nexus/DataModels/Network/NexusStreamTracers.py +73 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/Network/NexusWellLists.py +1 -1
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/Network/NexusWellhead.py +3 -2
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/StructuredGrid/NexusGrid.py +25 -24
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/NexusNetwork.py +38 -12
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/nexus_collect_tables.py +1 -1
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/nexus_constraint_operations.py +1 -1
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/nexus_file_operations.py +1 -1
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/nexus_model_file_generator.py +27 -3
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Time/ISODateTime.py +3 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/__init__.py +1 -1
- {ressimpy-2.5.1 → ressimpy-2.5.3}/pyproject.toml +3 -3
- {ressimpy-2.5.1 → ressimpy-2.5.3}/LICENSE.MD +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/README.md +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/DataModelBaseClasses/Aquifer.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/DataModelBaseClasses/Completion.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/DataModelBaseClasses/Constraint.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/DataModelBaseClasses/DataObjectMixin.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/DataModelBaseClasses/Drill.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/DataModelBaseClasses/DrillSite.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/DataModelBaseClasses/DynamicProperty.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/DataModelBaseClasses/DynamicPropertyContainer.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/DataModelBaseClasses/Equilibration.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/DataModelBaseClasses/Ftrans.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/DataModelBaseClasses/Gaslift.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/DataModelBaseClasses/Grid.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/DataModelBaseClasses/GridArrayDefinition.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/DataModelBaseClasses/GridArrayFunction.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/DataModelBaseClasses/GuideRate.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/DataModelBaseClasses/LGR.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/DataModelBaseClasses/Multir.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/DataModelBaseClasses/Network.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/DataModelBaseClasses/NetworkList.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/DataModelBaseClasses/NetworkObject.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/DataModelBaseClasses/Node.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/DataModelBaseClasses/NodeConnection.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/DataModelBaseClasses/OperationsMixin.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/DataModelBaseClasses/Over.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/DataModelBaseClasses/PVT.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/DataModelBaseClasses/RelPerm.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/DataModelBaseClasses/RelPermEndPoint.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/DataModelBaseClasses/Reporting.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/DataModelBaseClasses/Rock.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/DataModelBaseClasses/Separator.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/DataModelBaseClasses/Simulator.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/DataModelBaseClasses/SolverParameter.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/DataModelBaseClasses/Target.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/DataModelBaseClasses/Valve.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/DataModelBaseClasses/Water.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/DataModelBaseClasses/Well.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/DataModelBaseClasses/WellConnection.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/DataModelBaseClasses/Wellbore.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/DataModelBaseClasses/Wellhead.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/DataModelBaseClasses/__init__.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/DataModelBaseClasses/output_request.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Enums/FluidTypeEnums.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Enums/FrequencyEnum.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Enums/GridFunctionTypes.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Enums/HowEnum.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Enums/OutputType.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Enums/PenetrationDirectionEnum.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Enums/TimeSteppingMethodEnum.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Enums/UnitsEnum.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Enums/WellTypeEnum.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Enums/__init__.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/FileOperations/File.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/FileOperations/FileBase.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/FileOperations/__init__.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/FileOperations/simulator_constants.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/GenericContainerClasses/Constraints.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/GenericContainerClasses/DrillSites.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/GenericContainerClasses/Drills.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/GenericContainerClasses/Grids.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/GenericContainerClasses/GuideRates.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/GenericContainerClasses/Hydraulics.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/GenericContainerClasses/LGRs.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/GenericContainerClasses/NodeConnections.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/GenericContainerClasses/Nodes.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/GenericContainerClasses/SolverParameters.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/GenericContainerClasses/Targets.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/GenericContainerClasses/WellConnections.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/GenericContainerClasses/Wellbores.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/GenericContainerClasses/Wellheads.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/GenericContainerClasses/Wells.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/GenericContainerClasses/__init__.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/FcsConfig.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/FcsFile.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/Network/NexusAction.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/Network/NexusActions.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/Network/NexusActivationChange.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/Network/NexusActivationChanges.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/Network/NexusConList.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/Network/NexusConLists.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/Network/NexusConstraint.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/Network/NexusConstraints.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/Network/NexusDrill.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/Network/NexusDrillSite.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/Network/NexusDrillSites.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/Network/NexusDrills.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/Network/NexusGuideRate.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/Network/NexusGuideRates.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/Network/NexusNode.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/Network/NexusNodeConnection.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/Network/NexusNodeConnections.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/Network/NexusNodeList.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/Network/NexusNodeLists.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/Network/NexusNodes.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/Network/NexusStation.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/Network/NexusStations.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/Network/NexusTarget.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/Network/NexusTargets.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/Network/NexusWellConnection.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/Network/NexusWellConnections.py +0 -0
- {ressimpy-2.5.1/ResSimpy/Nexus/DataModels → ressimpy-2.5.3/ResSimpy/Nexus/DataModels/Network}/NexusWellList.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/Network/NexusWellbore.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/Network/NexusWellbores.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/Network/NexusWellheads.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/Network/__init__.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/NexusAquiferMethod.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/NexusCompletion.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/NexusEquilMethod.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/NexusFile.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/NexusGasliftMethod.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/NexusHydraulicsMethod.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/NexusIPRMethod.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/NexusOptions.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/NexusPVTMethod.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/NexusRelPermEndPoint.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/NexusRelPermMethod.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/NexusReportingRequests.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/NexusRockMethod.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/NexusSeparatorMethod.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/NexusSolverParameter.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/NexusValveMethod.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/NexusWaterMethod.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/NexusWell.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/NexusWellMod.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/StructuredGrid/NexusFtrans.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/StructuredGrid/NexusGridArrayFunction.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/StructuredGrid/NexusLGR.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/StructuredGrid/NexusLGRs.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/StructuredGrid/NexusMultir.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/StructuredGrid/NexusOver.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/StructuredGrid/NexusTOver.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/StructuredGrid/__init__.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/__init__.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/DataModels/nexus_grid_to_proc.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/NexusAquiferMethods.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/NexusEnums/ActivationChangeEnum.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/NexusEnums/DateFormatEnum.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/NexusEnums/__init__.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/NexusEquilMethods.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/NexusGasliftMethods.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/NexusGrids.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/NexusHydraulicsMethods.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/NexusIPRMethods.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/NexusKeywords/__init__.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/NexusKeywords/adsorption_keywords.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/NexusKeywords/alphaf_keywords.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/NexusKeywords/aquifer_keywords.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/NexusKeywords/choke_keywords.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/NexusKeywords/compressor_keywords.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/NexusKeywords/eos_defaults_keywords.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/NexusKeywords/equil_keywords.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/NexusKeywords/esp_keywords.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/NexusKeywords/fcs_keywords.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/NexusKeywords/fluxin_keywords.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/NexusKeywords/gaslift_keywords.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/NexusKeywords/hyd_keywords.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/NexusKeywords/icd_keywords.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/NexusKeywords/ipr_keywords.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/NexusKeywords/nexus_keywords.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/NexusKeywords/options_keywords.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/NexusKeywords/polymer_keywords.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/NexusKeywords/proc_keywords.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/NexusKeywords/pump_keywords.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/NexusKeywords/pvt_keywords.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/NexusKeywords/relpm_keywords.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/NexusKeywords/rock_keywords.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/NexusKeywords/runcontrol_keywords.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/NexusKeywords/separator_keywords.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/NexusKeywords/structured_grid_keywords.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/NexusKeywords/surface_keywords.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/NexusKeywords/tracer_init_keywords.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/NexusKeywords/valve_keywords.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/NexusKeywords/water_keywords.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/NexusKeywords/wells_keywords.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/NexusPVTMethods.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/NexusRelPermMethods.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/NexusReporting.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/NexusRockMethods.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/NexusSeparatorMethods.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/NexusSimulator.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/NexusSolverParameters.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/NexusValveMethods.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/NexusWaterMethods.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/NexusWells.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/__init__.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/array_function_operations.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/constants.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/load_wells.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/logfile_operations.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/nexus_add_new_object_to_file.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/nexus_load_faults.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/nexus_load_list_table.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/nexus_modify_object_in_file.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/nexus_remove_object_from_file.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/rel_perm_operations.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/runcontrol_operations.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Nexus/structured_grid_operations.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/OpenGoSim/DataModels/Network/__init__.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/OpenGoSim/DataModels/OpenGoSimCompletion.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/OpenGoSim/DataModels/OpenGoSimWell.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/OpenGoSim/DataModels/__init__.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/OpenGoSim/Enums/SimulationTypeEnum.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/OpenGoSim/Enums/__init__.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/OpenGoSim/Model_Parts/OpenGoSimNetwork.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/OpenGoSim/Model_Parts/__init__.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/OpenGoSim/OpenGoSimKeywords/OpenGoSimKeywords.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/OpenGoSim/OpenGoSimKeywords/__init__.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/OpenGoSim/OpenGoSimSimulator.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/OpenGoSim/OpenGoSimWells.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/OpenGoSim/__init__.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Time/__init__.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Units/AttributeMapping.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Units/AttributeMappings/BaseUnitMapping.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Units/AttributeMappings/CompletionUnitMapping.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Units/AttributeMappings/ConstraintUnitMapping.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Units/AttributeMappings/DynamicPropertyUnitMapping.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Units/AttributeMappings/NetworkUnitMapping.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Units/AttributeMappings/__init__.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Units/Units.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Units/__init__.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Utils/__init__.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Utils/dynamic_method_manipulations.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Utils/factory_methods.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Utils/general_utilities.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Utils/generic_repr.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Utils/grid_filtering_functions.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Utils/invert_nexus_map.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Utils/obj_to_dataframe.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Utils/obj_to_table_string.py +0 -0
- {ressimpy-2.5.1 → ressimpy-2.5.3}/ResSimpy/Utils/to_dict_generic.py +0 -0
|
@@ -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:
|
|
@@ -785,3 +787,39 @@ def split_line(line: str, upper: bool = True, comment_characters: None | list[st
|
|
|
785
787
|
value = get_next_value(0, [trimmed_line], comment_characters=comment_characters)
|
|
786
788
|
|
|
787
789
|
return stored_values
|
|
790
|
+
|
|
791
|
+
|
|
792
|
+
def split_file_as_list_by_date(file_as_list: list[str], date_token: str = 'TIME',
|
|
793
|
+
comment_characters: None | list[str] = None) -> dict[str, list[str]]:
|
|
794
|
+
"""Splits a file represented as a list of strings into a dictionary of lists of strings based on the token
|
|
795
|
+
specified.
|
|
796
|
+
|
|
797
|
+
Args:
|
|
798
|
+
file_as_list (list[str]): a list of strings containing each line of the file as a new entry
|
|
799
|
+
date_token (str): The date token to split on. Defaults to Nexus format.
|
|
800
|
+
comment_characters (Optional[list[str]], optional): a list of characters that are considered inline comments.
|
|
801
|
+
Defaults to the Nexus format (!)
|
|
802
|
+
|
|
803
|
+
Returns:
|
|
804
|
+
dict[str, list[str]]: a dictionary where the keys are the token followed by the first value after the token,
|
|
805
|
+
and the values are lists of strings containing the lines of the file between that token and the next occurrence
|
|
806
|
+
of that token.
|
|
807
|
+
"""
|
|
808
|
+
split_file: dict[str, list[str]] = {}
|
|
809
|
+
date_token_value = None
|
|
810
|
+
no_token_dict_key = f'BEFORE_FIRST_{date_token}'
|
|
811
|
+
|
|
812
|
+
for i, line in enumerate(file_as_list):
|
|
813
|
+
if check_token(date_token, line, comment_characters=comment_characters):
|
|
814
|
+
# TODO handle 3 part dates in this bit
|
|
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)
|
|
825
|
+
return split_file
|
|
@@ -76,6 +76,6 @@ class NetworkLists(ABC):
|
|
|
76
76
|
printable_string += f'{self.table_header()} {list_item.name}\n'
|
|
77
77
|
# remove all the previous wells and reinitialise the list
|
|
78
78
|
printable_string += 'CLEAR\nADD\n'
|
|
79
|
-
printable_string += '
|
|
79
|
+
printable_string += '\n'.join(list_item.elements_in_the_list) + '\n'
|
|
80
80
|
printable_string += self.table_footer() + '\n'
|
|
81
81
|
return printable_string
|
|
@@ -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
|
|
@@ -61,7 +61,7 @@ class NexusWellhead(Wellhead):
|
|
|
61
61
|
heat_transfer_coeff: Optional[float] = None
|
|
62
62
|
dt_add: Optional[float] = None
|
|
63
63
|
|
|
64
|
-
def __init__(self, properties_dict: DataObjectMixinDictType, date: Optional[str] = None,
|
|
64
|
+
def __init__(self, properties_dict: Optional[DataObjectMixinDictType] = None, date: Optional[str] = None,
|
|
65
65
|
date_format: Optional[DateFormat] = None, start_date: Optional[str] = None,
|
|
66
66
|
unit_system: Optional[UnitSystem] = None, name: Optional[str] = None, pvt_method: Optional[int] = None,
|
|
67
67
|
water_method: Optional[int] = None, bat_method: Optional[int] = None,
|
|
@@ -77,7 +77,8 @@ class NexusWellhead(Wellhead):
|
|
|
77
77
|
"""Initialises the NexusWellhead class.
|
|
78
78
|
|
|
79
79
|
Args:
|
|
80
|
-
properties_dict (dict): dict of the properties to set on the
|
|
80
|
+
properties_dict (Optional[dict]): optional way of importing via a dict of the properties to set on the
|
|
81
|
+
object.
|
|
81
82
|
date (Optional[str]): The date of the object.
|
|
82
83
|
date_format (Optional[DateFormat]): The date format that the object uses.
|
|
83
84
|
start_date (Optional[str]): The start date of the model. Required if the object uses a decimal TIME.
|
|
@@ -6,7 +6,7 @@ import copy
|
|
|
6
6
|
import numpy as np
|
|
7
7
|
import pandas as pd
|
|
8
8
|
from dataclasses import dataclass, field
|
|
9
|
-
from typing import
|
|
9
|
+
from typing import TYPE_CHECKING, Any, Final
|
|
10
10
|
import warnings
|
|
11
11
|
from sys import maxsize
|
|
12
12
|
|
|
@@ -43,14 +43,14 @@ class PropertyToLoad:
|
|
|
43
43
|
|
|
44
44
|
@dataclass(kw_only=True)
|
|
45
45
|
class NexusGrid(Grid):
|
|
46
|
-
__array_functions_list:
|
|
47
|
-
__array_functions_df:
|
|
46
|
+
__array_functions_list: list[list[str]] | None = None
|
|
47
|
+
__array_functions_df: pd.DataFrame | None = None
|
|
48
48
|
__array_functions_loaded: bool = False
|
|
49
|
-
__grid_file_contents:
|
|
50
|
-
__grid_file_nested:
|
|
51
|
-
__faults_df:
|
|
49
|
+
__grid_file_contents: list[str] | None = None
|
|
50
|
+
__grid_file_nested: list[str] | None = None
|
|
51
|
+
__faults_df: pd.DataFrame | None = None
|
|
52
52
|
__grid_faults_loaded: bool = False
|
|
53
|
-
__grid_nexus_file:
|
|
53
|
+
__grid_nexus_file: NexusFile | None = None
|
|
54
54
|
__corp: GridArrayDefinition
|
|
55
55
|
__dx: GridArrayDefinition
|
|
56
56
|
__dy: GridArrayDefinition
|
|
@@ -125,14 +125,14 @@ class NexusGrid(Grid):
|
|
|
125
125
|
__kyeff: GridArrayDefinition
|
|
126
126
|
__kzeff: GridArrayDefinition
|
|
127
127
|
__grid_multir_loaded: bool = False
|
|
128
|
-
__multir:
|
|
128
|
+
__multir: list[NexusMultir] | None = None
|
|
129
129
|
__lgrs: NexusLGRs
|
|
130
130
|
__overs: list[NexusOver] = field(default_factory=list)
|
|
131
131
|
__tovers: list[NexusTOver] = field(default_factory=list)
|
|
132
132
|
__ftrans: list[NexusFtrans] = field(default_factory=list)
|
|
133
133
|
__model_unit_system: UnitSystem
|
|
134
134
|
|
|
135
|
-
def __init__(self, model_unit_system: UnitSystem, grid_nexus_file:
|
|
135
|
+
def __init__(self, model_unit_system: UnitSystem, grid_nexus_file: NexusFile | None = None,
|
|
136
136
|
assume_loaded: bool = False,
|
|
137
137
|
) -> None:
|
|
138
138
|
"""Initialises the NexusGrid class.
|
|
@@ -146,15 +146,15 @@ class NexusGrid(Grid):
|
|
|
146
146
|
super().__init__(assume_loaded=assume_loaded)
|
|
147
147
|
self.__array_functions_loaded: bool = assume_loaded
|
|
148
148
|
self.__grid_faults_loaded: bool = assume_loaded
|
|
149
|
-
self.__array_functions_list:
|
|
150
|
-
self.__array_functions_df:
|
|
151
|
-
self.__grid_file_contents:
|
|
149
|
+
self.__array_functions_list: list[list[str]] | None = None
|
|
150
|
+
self.__array_functions_df: pd.DataFrame | None = None
|
|
151
|
+
self.__grid_file_contents: list[str] | None = None if grid_nexus_file is None else \
|
|
152
152
|
grid_nexus_file.get_flat_list_str_file_including_includes
|
|
153
|
-
self.__grid_file_nested:
|
|
153
|
+
self.__grid_file_nested: list[str] | None = None if grid_nexus_file is None else \
|
|
154
154
|
grid_nexus_file.file_content_as_list
|
|
155
|
-
self.__faults_df:
|
|
156
|
-
self.__grid_nexus_file:
|
|
157
|
-
self.__grid_array_functions:
|
|
155
|
+
self.__faults_df: pd.DataFrame | None = None
|
|
156
|
+
self.__grid_nexus_file: NexusFile | None = grid_nexus_file
|
|
157
|
+
self.__grid_array_functions: list[NexusGridArrayFunction] | None = None
|
|
158
158
|
self.__corp: GridArrayDefinition = GridArrayDefinition()
|
|
159
159
|
self.__iequil: GridArrayDefinition = GridArrayDefinition()
|
|
160
160
|
self.__ipvt: GridArrayDefinition = GridArrayDefinition()
|
|
@@ -257,14 +257,14 @@ class NexusGrid(Grid):
|
|
|
257
257
|
# Prevent reload from disk
|
|
258
258
|
self._grid_properties_loaded = True
|
|
259
259
|
|
|
260
|
-
def to_dict(self) -> dict[str,
|
|
260
|
+
def to_dict(self) -> dict[str, int | None | GridArrayDefinition]:
|
|
261
261
|
"""Returns a dictionary representation of grid array.
|
|
262
262
|
Checks if grid properties are not loaded and loads them.
|
|
263
263
|
"""
|
|
264
264
|
self.load_grid_properties_if_not_loaded()
|
|
265
265
|
|
|
266
266
|
original_dict = self.__dict__
|
|
267
|
-
new_dict: dict[str,
|
|
267
|
+
new_dict: dict[str, int | None | GridArrayDefinition] = {}
|
|
268
268
|
for key in original_dict.keys():
|
|
269
269
|
new_key = key
|
|
270
270
|
if new_key[0] == '_':
|
|
@@ -709,13 +709,13 @@ class NexusGrid(Grid):
|
|
|
709
709
|
self.__array_functions_df = afo.summarize_model_functions(self.__array_functions_list)
|
|
710
710
|
self.__array_functions_loaded = True
|
|
711
711
|
|
|
712
|
-
def get_array_functions_list(self) ->
|
|
712
|
+
def get_array_functions_list(self) -> list[list[str]] | None:
|
|
713
713
|
"""Returns the grid array functions as a list of function lines."""
|
|
714
714
|
if not self.__array_functions_loaded:
|
|
715
715
|
self.load_array_functions()
|
|
716
716
|
return self.__array_functions_list
|
|
717
717
|
|
|
718
|
-
def get_array_functions_df(self) ->
|
|
718
|
+
def get_array_functions_df(self) -> pd.DataFrame | None:
|
|
719
719
|
"""Returns the grid array functions as a dataframe."""
|
|
720
720
|
if not self.__array_functions_loaded:
|
|
721
721
|
self.load_array_functions()
|
|
@@ -753,7 +753,7 @@ class NexusGrid(Grid):
|
|
|
753
753
|
self.__faults_df = new_df.drop(['TMULT'], axis=1)
|
|
754
754
|
self.__grid_faults_loaded = True
|
|
755
755
|
|
|
756
|
-
def get_faults_df(self) ->
|
|
756
|
+
def get_faults_df(self) -> pd.DataFrame | None:
|
|
757
757
|
"""Returns the fault definition and transmissility multiplier information as a dataframe."""
|
|
758
758
|
self.load_grid_properties_if_not_loaded()
|
|
759
759
|
if not self.__grid_faults_loaded:
|
|
@@ -804,7 +804,7 @@ class NexusGrid(Grid):
|
|
|
804
804
|
def __extract_multir_tableline(line: str) -> None | NexusMultir:
|
|
805
805
|
"""Takes a single line in a file and extracts a Multir object from it."""
|
|
806
806
|
stored_values = fo.split_line(line)
|
|
807
|
-
if not stored_values:
|
|
807
|
+
if not stored_values or len(stored_values) < 3:
|
|
808
808
|
return None
|
|
809
809
|
region_1_str, region_2_str, tmult_str = stored_values[0:3]
|
|
810
810
|
region_1 = int(region_1_str)
|
|
@@ -854,7 +854,7 @@ class NexusGrid(Grid):
|
|
|
854
854
|
return None
|
|
855
855
|
|
|
856
856
|
@property
|
|
857
|
-
def array_functions(self) ->
|
|
857
|
+
def array_functions(self) -> list[NexusGridArrayFunction] | None:
|
|
858
858
|
"""Returns a list of the array functions defined in the structured grid file."""
|
|
859
859
|
self.load_grid_properties_if_not_loaded()
|
|
860
860
|
if self.__grid_array_functions is None:
|
|
@@ -1814,7 +1814,8 @@ class NexusGrid(Grid):
|
|
|
1814
1814
|
|
|
1815
1815
|
# add the faults
|
|
1816
1816
|
faults_df = self.get_faults_df()
|
|
1817
|
-
|
|
1817
|
+
if faults_df is not None and not faults_df.empty:
|
|
1818
|
+
grid_str += NexusGrid.fault_df_to_string(faults_df)
|
|
1818
1819
|
|
|
1819
1820
|
if self.array_functions:
|
|
1820
1821
|
for array_function in self.array_functions:
|