ResSimpy 2.2.2__tar.gz → 2.2.4__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.2.2 → ressimpy-2.2.4}/PKG-INFO +1 -1
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/DataObjectMixin.py +6 -0
- ressimpy-2.2.4/ResSimpy/FileOperations/__init__.py +1 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/FileOperations/file_operations.py +3 -1
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Grid.py +86 -5
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/DataModels/FcsFile.py +9 -4
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/DataModels/Network/NexusConstraint.py +4 -1
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/DataModels/Network/NexusConstraints.py +19 -11
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/DataModels/Network/NexusNodeConnections.py +11 -5
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/DataModels/Network/NexusNodes.py +8 -3
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/DataModels/Network/NexusProc.py +2 -2
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/DataModels/Network/NexusProcs.py +3 -2
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/DataModels/Network/NexusTargets.py +14 -7
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/DataModels/Network/NexusWellConnections.py +12 -7
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/DataModels/Network/NexusWellbores.py +11 -6
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/DataModels/Network/NexusWellheads.py +6 -4
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/DataModels/NexusFile.py +11 -8
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/DataModels/NexusPVTMethod.py +1 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/DataModels/NexusSolverParameter.py +9 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/DataModels/NexusWell.py +6 -3
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/DataModels/StructuredGrid/NexusGrid.py +17 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/NexusNetwork.py +10 -7
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/NexusReporting.py +3 -2
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/NexusSimulator.py +21 -9
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/NexusSolverParameters.py +1 -1
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/NexusWells.py +11 -7
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/array_function_operations.py +1 -1
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/load_wells.py +33 -3
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/logfile_operations.py +1 -2
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/nexus_collect_tables.py +3 -1
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/nexus_constraint_operations.py +1 -1
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/nexus_file_operations.py +15 -11
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/nexus_load_well_list.py +1 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/nexus_modify_object_in_file.py +3 -2
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/nexus_remove_object_from_file.py +1 -1
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/runcontrol_operations.py +6 -3
- ressimpy-2.2.4/ResSimpy/OpenGoSim/DataModels/Network/__init__.py +1 -0
- ressimpy-2.2.4/ResSimpy/OpenGoSim/DataModels/__init__.py +1 -0
- ressimpy-2.2.4/ResSimpy/OpenGoSim/Enums/__init__.py +1 -0
- ressimpy-2.2.4/ResSimpy/OpenGoSim/Model_Parts/__init__.py +1 -0
- ressimpy-2.2.4/ResSimpy/OpenGoSim/OpenGoSimKeywords/__init__.py +1 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/OpenGoSim/OpenGoSimWells.py +4 -2
- ressimpy-2.2.4/ResSimpy/OpenGoSim/__init__.py +1 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/SolverParameter.py +1 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Utils/generic_repr.py +1 -2
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Utils/obj_to_dataframe.py +2 -1
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Utils/obj_to_table_string.py +1 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Utils/to_dict_generic.py +1 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/WellConnections.py +1 -1
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/WellLists.py +11 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/__init__.py +1 -1
- {ressimpy-2.2.2 → ressimpy-2.2.4}/pyproject.toml +6 -4
- ressimpy-2.2.2/ResSimpy/FileOperations/__init__.py +0 -0
- ressimpy-2.2.2/ResSimpy/OpenGoSim/DataModels/Network/__init__.py +0 -0
- ressimpy-2.2.2/ResSimpy/OpenGoSim/DataModels/__init__.py +0 -0
- ressimpy-2.2.2/ResSimpy/OpenGoSim/Enums/__init__.py +0 -0
- ressimpy-2.2.2/ResSimpy/OpenGoSim/Model_Parts/__init__.py +0 -0
- ressimpy-2.2.2/ResSimpy/OpenGoSim/OpenGoSimKeywords/__init__.py +0 -0
- ressimpy-2.2.2/ResSimpy/OpenGoSim/__init__.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/LICENSE.MD +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/README.md +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Aquifer.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Completion.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Constraint.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Constraints.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/DynamicProperty.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Enums/FluidTypeEnums.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Enums/FrequencyEnum.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Enums/GridFunctionTypes.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Enums/HowEnum.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Enums/OutputType.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Enums/PenetrationDirectionEnum.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Enums/TimeSteppingMethodEnum.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Enums/UnitsEnum.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Enums/WellTypeEnum.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Enums/__init__.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Equilibration.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/File.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/FileBase.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Gaslift.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/GridArrayFunction.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Grids.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Hydraulics.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/ISODateTime.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Network.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/DataModels/FcsConfig.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/DataModels/Network/NexusNode.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/DataModels/Network/NexusNodeConnection.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/DataModels/Network/NexusTarget.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/DataModels/Network/NexusWellConnection.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/DataModels/Network/NexusWellLists.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/DataModels/Network/NexusWellbore.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/DataModels/Network/NexusWellhead.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/DataModels/Network/__init__.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/DataModels/NexusAquiferMethod.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/DataModels/NexusCompletion.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/DataModels/NexusEquilMethod.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/DataModels/NexusGasliftMethod.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/DataModels/NexusHydraulicsMethod.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/DataModels/NexusRelPermEndPoint.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/DataModels/NexusRelPermMethod.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/DataModels/NexusReportingRequests.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/DataModels/NexusRockMethod.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/DataModels/NexusSeparatorMethod.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/DataModels/NexusValveMethod.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/DataModels/NexusWaterMethod.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/DataModels/NexusWellList.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/DataModels/NexusWellMod.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/DataModels/StructuredGrid/NexusGridArrayFunction.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/DataModels/StructuredGrid/__init__.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/DataModels/__init__.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/NexusAquiferMethods.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/NexusEnums/DateFormatEnum.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/NexusEnums/__init__.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/NexusEquilMethods.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/NexusGasliftMethods.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/NexusGrids.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/NexusHydraulicsMethods.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/NexusKeywords/__init__.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/NexusKeywords/adsorption_keywords.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/NexusKeywords/alphaf_keywords.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/NexusKeywords/aquifer_keywords.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/NexusKeywords/choke_keywords.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/NexusKeywords/compressor_keywords.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/NexusKeywords/eos_defaults_keywords.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/NexusKeywords/equil_keywords.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/NexusKeywords/esp_keywords.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/NexusKeywords/fcs_keywords.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/NexusKeywords/fluxin_keywords.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/NexusKeywords/gaslift_keywords.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/NexusKeywords/hyd_keywords.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/NexusKeywords/icd_keywords.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/NexusKeywords/ipr_keywords.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/NexusKeywords/nexus_keywords.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/NexusKeywords/options_keywords.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/NexusKeywords/polymer_keywords.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/NexusKeywords/proc_keywords.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/NexusKeywords/pump_keywords.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/NexusKeywords/pvt_keywords.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/NexusKeywords/relpm_keywords.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/NexusKeywords/rock_keywords.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/NexusKeywords/runcontrol_keywords.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/NexusKeywords/separator_keywords.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/NexusKeywords/structured_grid_keywords.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/NexusKeywords/surface_keywords.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/NexusKeywords/tracer_init_keywords.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/NexusKeywords/valve_keywords.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/NexusKeywords/water_keywords.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/NexusKeywords/wells_keywords.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/NexusPVTMethods.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/NexusRelPermMethods.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/NexusRockMethods.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/NexusSeparatorMethods.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/NexusValveMethods.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/NexusWaterMethods.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/__init__.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/constants.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/nexus_add_new_object_to_file.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/rel_perm_operations.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nexus/structured_grid_operations.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Node.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/NodeConnection.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/NodeConnections.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Nodes.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/OpenGoSim/DataModels/OpenGoSimCompletion.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/OpenGoSim/DataModels/OpenGoSimWell.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/OpenGoSim/Enums/SimulationTypeEnum.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/OpenGoSim/Model_Parts/OpenGoSimNetwork.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/OpenGoSim/OpenGoSimKeywords/OpenGoSimKeywords.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/OpenGoSim/OpenGoSimSimulator.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/OperationsMixin.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/PVT.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/RelPerm.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/RelPermEndPoint.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Reporting.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Rock.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Separator.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Simulator.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/SolverParameters.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Target.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Targets.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Units/AttributeMapping.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Units/AttributeMappings/BaseUnitMapping.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Units/AttributeMappings/CompletionUnitMapping.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Units/AttributeMappings/ConstraintUnitMapping.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Units/AttributeMappings/DynamicPropertyUnitMapping.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Units/AttributeMappings/NetworkUnitMapping.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Units/AttributeMappings/__init__.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Units/Units.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Units/__init__.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Utils/__init__.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Utils/factory_methods.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Utils/general_utilities.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Utils/invert_nexus_map.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Valve.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Water.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Well.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/WellConnection.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Wellbore.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Wellbores.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Wellhead.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Wellheads.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/Wells.py +0 -0
- {ressimpy-2.2.2 → ressimpy-2.2.4}/ResSimpy/output_request.py +0 -0
|
@@ -49,12 +49,14 @@ class DataObjectMixin(ABC):
|
|
|
49
49
|
|
|
50
50
|
@property
|
|
51
51
|
def iso_date(self) -> ISODateTime:
|
|
52
|
+
"""The date of the object in ISO format."""
|
|
52
53
|
if self.__iso_date is None:
|
|
53
54
|
self.set_iso_date()
|
|
54
55
|
return self.__iso_date
|
|
55
56
|
|
|
56
57
|
@property
|
|
57
58
|
def date(self) -> Optional[str]:
|
|
59
|
+
"""The date of the object as written in the source file."""
|
|
58
60
|
return self.__date
|
|
59
61
|
|
|
60
62
|
@date.setter
|
|
@@ -64,14 +66,17 @@ class DataObjectMixin(ABC):
|
|
|
64
66
|
|
|
65
67
|
@property
|
|
66
68
|
def start_date(self) -> Optional[str]:
|
|
69
|
+
"""The start date of the model (required for Nexus objects using a decimal date format)."""
|
|
67
70
|
return self._start_date
|
|
68
71
|
|
|
69
72
|
@property
|
|
70
73
|
def date_format(self) -> Optional[DateFormat]:
|
|
74
|
+
"""The date format of the date on the object."""
|
|
71
75
|
return self._date_format
|
|
72
76
|
|
|
73
77
|
@property
|
|
74
78
|
def unit_system(self) -> Optional[UnitSystem]:
|
|
79
|
+
"""The unit system being used in the object."""
|
|
75
80
|
return self._unit_system
|
|
76
81
|
|
|
77
82
|
def set_iso_date(self) -> None:
|
|
@@ -102,6 +107,7 @@ class DataObjectMixin(ABC):
|
|
|
102
107
|
|
|
103
108
|
def to_table_line(self, headers: list[str]) -> str:
|
|
104
109
|
"""Takes a generic Nexus object and returns the attribute values as a string in the order of headers provided.
|
|
110
|
+
|
|
105
111
|
Requires an implemented to_dict method and get_keyword_mapping() method.
|
|
106
112
|
|
|
107
113
|
Args:
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Module for file operations."""
|
|
@@ -9,6 +9,7 @@ def strip_file_of_comments(file_as_list: list[str], strip_str: bool = False,
|
|
|
9
9
|
comment_characters: Optional[list[str]] = None,
|
|
10
10
|
square_bracket_comments: bool = False) -> list[str]:
|
|
11
11
|
"""Strips all of the inline, single and multi line comments out of a file.
|
|
12
|
+
|
|
12
13
|
Comment characters assumed are: ! and square brackets. Escaped characters are ones wrapped in quotation marks.
|
|
13
14
|
|
|
14
15
|
Args:
|
|
@@ -270,7 +271,8 @@ def __replace_with_variable_entry(new_line: str, original_line: str, replace_wit
|
|
|
270
271
|
|
|
271
272
|
|
|
272
273
|
def check_token(token: str, line: str) -> bool:
|
|
273
|
-
"""Checks if the text line contains the supplied token and is not commented out
|
|
274
|
+
"""Checks if the text line contains the supplied token and is not commented out.
|
|
275
|
+
|
|
274
276
|
Args:
|
|
275
277
|
token (str): keyword value to search the line for
|
|
276
278
|
line (str): string to search the token in
|
|
@@ -1,17 +1,22 @@
|
|
|
1
|
+
"""Grid base class."""
|
|
2
|
+
|
|
1
3
|
from __future__ import annotations
|
|
2
4
|
from abc import ABC, abstractmethod
|
|
3
5
|
from dataclasses import dataclass
|
|
6
|
+
import os
|
|
4
7
|
import pandas as pd
|
|
5
|
-
|
|
6
|
-
from ResSimpy.GridArrayFunction import GridArrayFunction
|
|
8
|
+
import numpy as np
|
|
7
9
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
+
from typing import Optional, Sequence
|
|
11
|
+
from ResSimpy.GridArrayFunction import GridArrayFunction
|
|
12
|
+
from ResSimpy.FileOperations import file_operations as fo
|
|
13
|
+
from ResSimpy.Utils.general_utilities import check_if_string_is_float
|
|
14
|
+
from ResSimpy.File import File
|
|
10
15
|
|
|
11
16
|
|
|
12
17
|
@dataclass
|
|
13
18
|
class GridArrayDefinition:
|
|
14
|
-
"""
|
|
19
|
+
"""A class to define a grid array property.
|
|
15
20
|
|
|
16
21
|
Args:
|
|
17
22
|
modifier (Optional[str]): the modifier for the grid array property (e.g. CON, MULT, etc.)
|
|
@@ -26,9 +31,24 @@ class GridArrayDefinition:
|
|
|
26
31
|
keyword_in_include_file: bool = False
|
|
27
32
|
absolute_path: Optional[str] = None
|
|
28
33
|
|
|
34
|
+
def load_grid_array_definition_to_file_as_list(self) -> list[str]:
|
|
35
|
+
"""Loads the grid array definition to a file as a list of strings."""
|
|
36
|
+
path = self.absolute_path
|
|
37
|
+
if path is None and self.value is not None:
|
|
38
|
+
path = self.value
|
|
39
|
+
elif path is None:
|
|
40
|
+
raise FileNotFoundError('No file path found in the grid array definition')
|
|
41
|
+
return fo.load_file_as_list(path)
|
|
42
|
+
|
|
43
|
+
def get_array(self) -> np.ndarray:
|
|
44
|
+
"""Returns a 1D numpy array from the grid array definition."""
|
|
45
|
+
file_as_list = self.load_grid_array_definition_to_file_as_list()
|
|
46
|
+
return Grid.grid_file_as_list_to_numpy_array(file_as_list, None, None, None)
|
|
47
|
+
|
|
29
48
|
|
|
30
49
|
@dataclass(kw_only=True)
|
|
31
50
|
class Grid(ABC):
|
|
51
|
+
"""A base class to represent a collection of grids in a reservoir simulation model."""
|
|
32
52
|
# Grid dimensions
|
|
33
53
|
_range_x: Optional[int]
|
|
34
54
|
_range_y: Optional[int]
|
|
@@ -143,3 +163,64 @@ class Grid(ABC):
|
|
|
143
163
|
def array_functions(self) -> Optional[Sequence[GridArrayFunction]]:
|
|
144
164
|
"""Returns a list of the array functions defined in the structured grid file."""
|
|
145
165
|
raise NotImplementedError("Implement this in the derived class")
|
|
166
|
+
|
|
167
|
+
@staticmethod
|
|
168
|
+
def filter_grid_array_definition(grid_array_definition: GridArrayDefinition) -> File:
|
|
169
|
+
"""Checks array files for only float values and returns a new file with only float values."""
|
|
170
|
+
file_path = grid_array_definition.absolute_path
|
|
171
|
+
if file_path is None and grid_array_definition.value is not None:
|
|
172
|
+
file_path = grid_array_definition.value
|
|
173
|
+
elif file_path is None:
|
|
174
|
+
raise FileNotFoundError('No file path found in the grid array definition')
|
|
175
|
+
file_as_list = fo.load_file_as_list(file_path)
|
|
176
|
+
|
|
177
|
+
new_file_as_list = Grid.grid_filter_file_as_list(file_as_list)
|
|
178
|
+
|
|
179
|
+
# create a new file with the filtered list
|
|
180
|
+
new_file_path = (os.path.splitext(file_path)[0] + '_filtered' +
|
|
181
|
+
os.path.splitext(file_path)[1])
|
|
182
|
+
new_grid_file = File(location=new_file_path,
|
|
183
|
+
file_content_as_list=new_file_as_list,
|
|
184
|
+
create_as_modified=True,
|
|
185
|
+
)
|
|
186
|
+
|
|
187
|
+
return new_grid_file
|
|
188
|
+
|
|
189
|
+
@staticmethod
|
|
190
|
+
def grid_filter_file_as_list(file_as_list: list[str], comment_characters: list[str] | None = None) -> list[str]:
|
|
191
|
+
"""Checks array files for only float values and returns a new file with only float values.
|
|
192
|
+
|
|
193
|
+
This works for grid arrays only. It does not work well with extremely large files.
|
|
194
|
+
|
|
195
|
+
Args:
|
|
196
|
+
file_as_list (list[str]): The file as a list of strings.
|
|
197
|
+
comment_characters (Optional[list[str]]): The comment characters to filter out. Defaults to None.
|
|
198
|
+
"""
|
|
199
|
+
if comment_characters is None:
|
|
200
|
+
comment_characters = ['--', '!', 'C']
|
|
201
|
+
if fo.value_in_file('INCLUDE', file_as_list):
|
|
202
|
+
raise NotImplementedError('Nested includes for grid files currently not implemented')
|
|
203
|
+
file_as_list = fo.strip_file_of_comments(file_as_list, comment_characters=comment_characters)
|
|
204
|
+
# remove non float values
|
|
205
|
+
file_as_list = [' '.join([x for x in line.split() if check_if_string_is_float(x)]) for line in file_as_list]
|
|
206
|
+
return file_as_list
|
|
207
|
+
|
|
208
|
+
@staticmethod
|
|
209
|
+
def grid_file_as_list_to_numpy_array(file_as_list: list[str], x_range: None | int, y_range: None | int,
|
|
210
|
+
z_range: None | int) -> np.ndarray:
|
|
211
|
+
"""Converts a list of strings to a numpy array."""
|
|
212
|
+
# ensure the list of strings is filtered of comments and non-float values
|
|
213
|
+
new_file_as_list = Grid.grid_filter_file_as_list(file_as_list)
|
|
214
|
+
|
|
215
|
+
array_size = -1
|
|
216
|
+
if x_range is not None and y_range is not None and z_range is not None:
|
|
217
|
+
array_size = x_range * y_range * z_range
|
|
218
|
+
|
|
219
|
+
grid_array = np.fromstring(' '.join(new_file_as_list), sep=' ', count=array_size)
|
|
220
|
+
|
|
221
|
+
return grid_array
|
|
222
|
+
|
|
223
|
+
def grid_array_definition_to_numpy_array(self, grid_array_definition: GridArrayDefinition) -> np.ndarray:
|
|
224
|
+
"""Converts a grid array to a numpy array."""
|
|
225
|
+
file_as_list = grid_array_definition.load_grid_array_definition_to_file_as_list()
|
|
226
|
+
return self.grid_file_as_list_to_numpy_array(file_as_list, self.range_x, self.range_y, self.range_z)
|
|
@@ -332,13 +332,15 @@ class FcsNexusFile(NexusFile):
|
|
|
332
332
|
return_dict = dict(single_keywords, **multi_keywords)
|
|
333
333
|
return return_dict
|
|
334
334
|
|
|
335
|
-
def move_model_files(self, new_file_path: str, new_include_file_location: str) ->
|
|
335
|
+
def move_model_files(self, new_file_path: str, new_include_file_location: str, overwrite_files: bool = False) -> \
|
|
336
|
+
None:
|
|
336
337
|
"""Moves all the model files to a new location.
|
|
337
338
|
|
|
338
339
|
Args:
|
|
339
340
|
new_file_path (str): new file path for the fcs file e.g. /new_path/new_fcs_file.fcs
|
|
340
341
|
new_include_file_location (str): new location for the included files either absolute or relative
|
|
341
342
|
to the new fcs file path
|
|
343
|
+
overwrite_files (bool): whether to overwrite the files if they already exist in the new location
|
|
342
344
|
"""
|
|
343
345
|
# Take the original file, find which files have changed and write out those locations
|
|
344
346
|
# figure out where to store the include files:
|
|
@@ -358,7 +360,8 @@ class FcsNexusFile(NexusFile):
|
|
|
358
360
|
# skip if there is no file
|
|
359
361
|
continue
|
|
360
362
|
include_name = os.path.join(include_dir, os.path.basename(file.location))
|
|
361
|
-
file.write_to_file(include_name, write_includes=True, write_out_all_files=True
|
|
363
|
+
file.write_to_file(include_name, write_includes=True, write_out_all_files=True,
|
|
364
|
+
overwrite_file=overwrite_files)
|
|
362
365
|
self.change_file_path(include_name, keyword)
|
|
363
366
|
|
|
364
367
|
for keyword, attr_name in self.fcs_keyword_map_multi().items():
|
|
@@ -367,11 +370,12 @@ class FcsNexusFile(NexusFile):
|
|
|
367
370
|
continue
|
|
368
371
|
for method_number, file in file_dict.items():
|
|
369
372
|
include_name = os.path.join(include_dir, os.path.basename(file.location))
|
|
370
|
-
file.write_to_file(include_name, write_includes=True, write_out_all_files=True
|
|
373
|
+
file.write_to_file(include_name, write_includes=True, write_out_all_files=True,
|
|
374
|
+
overwrite_file=overwrite_files)
|
|
371
375
|
self.change_file_path(include_name, keyword, method_number)
|
|
372
376
|
|
|
373
377
|
# write out the final fcs file
|
|
374
|
-
self.write_to_file(new_file_path, write_includes=False)
|
|
378
|
+
self.write_to_file(new_file_path, write_includes=False, overwrite_file=overwrite_files)
|
|
375
379
|
|
|
376
380
|
def write_out_case(self, new_file_path: str, new_include_file_location: str, case_suffix: str) -> None:
|
|
377
381
|
"""Writes out a new simulator with only modified files. For use with creating multiple cases from a base case.
|
|
@@ -425,6 +429,7 @@ class FcsNexusFile(NexusFile):
|
|
|
425
429
|
|
|
426
430
|
def update_model_files(self) -> None:
|
|
427
431
|
"""Updates all the modified files in the model. Keeps file names and paths the same.
|
|
432
|
+
|
|
428
433
|
Warning: this method overwrites the existing files!
|
|
429
434
|
"""
|
|
430
435
|
# Loop through all files in the model, writing out the contents if they have been modified.
|
|
@@ -12,7 +12,9 @@ from ResSimpy.Nexus.NexusEnums.DateFormatEnum import DateFormat
|
|
|
12
12
|
|
|
13
13
|
@dataclass(repr=False)
|
|
14
14
|
class NexusConstraint(Constraint):
|
|
15
|
-
"""
|
|
15
|
+
"""Class representing a single constraint object within the NexusNetwork for a single datetime.
|
|
16
|
+
|
|
17
|
+
Attributes:
|
|
16
18
|
name (str): name of the well (NAME)
|
|
17
19
|
max_surface_oil_rate (float): max surface oil rate (QOSMAX)
|
|
18
20
|
max_surface_gas_rate (float): max surface gas rate (QGSMAX)
|
|
@@ -420,6 +422,7 @@ class NexusConstraint(Constraint):
|
|
|
420
422
|
|
|
421
423
|
def write_qmult_table(self) -> list[str]:
|
|
422
424
|
"""Writes out a QMULT table from a constraint that uses the following attributes.
|
|
425
|
+
|
|
423
426
|
'QOIL': ('qmult_oil_rate', float).
|
|
424
427
|
'QWATER': ('qmult_water_rate', float).
|
|
425
428
|
'QGAS': ('qmult_gas_rate', float).
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
"""Class that holds all the constraints for a NexusNetwork object.
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
"""Class that holds all the constraints for a NexusNetwork object.
|
|
2
|
+
|
|
3
|
+
This class is responsible for loading, modifying and removing constraints from the NexusNetwork object. This class is
|
|
4
|
+
also responsible for writing the constraints to the Nexus deck. An instance of this is held within the Network class
|
|
5
|
+
as "constraints".
|
|
4
6
|
"""
|
|
5
7
|
from __future__ import annotations
|
|
6
8
|
|
|
@@ -26,9 +28,10 @@ if TYPE_CHECKING:
|
|
|
26
28
|
|
|
27
29
|
@dataclass
|
|
28
30
|
class NexusConstraints(Constraints):
|
|
29
|
-
"""Class that holds all the constraints for a NexusNetwork object.
|
|
30
|
-
|
|
31
|
-
|
|
31
|
+
"""Class that holds all the constraints for a NexusNetwork object.
|
|
32
|
+
|
|
33
|
+
This class is responsible for loading, modifying and removing constraints from the NexusNetwork object. This
|
|
34
|
+
class is also responsible for writing the constraints to the Nexus deck.
|
|
32
35
|
|
|
33
36
|
Attributes:
|
|
34
37
|
constraints: dict[str, list[NexusConstraint]]: dictionary of all constraints defined within a model,
|
|
@@ -49,7 +52,8 @@ class NexusConstraints(Constraints):
|
|
|
49
52
|
|
|
50
53
|
def get_all(self, object_name: Optional[str] = None, date: Optional[str] = None) -> \
|
|
51
54
|
dict[str, list[NexusConstraint]]:
|
|
52
|
-
"""Get the constraints of the existing model with optional parameters to filter for name and date
|
|
55
|
+
"""Get the constraints of the existing model with optional parameters to filter for name and date.
|
|
56
|
+
|
|
53
57
|
Args:
|
|
54
58
|
object_name (Optional[str]): name of the connection, node or wellname to return. Defaults to None.
|
|
55
59
|
date (Optional[str]): date in model format to filter the dates to in the constraints
|
|
@@ -74,7 +78,8 @@ class NexusConstraints(Constraints):
|
|
|
74
78
|
return date_filtered_constraints
|
|
75
79
|
|
|
76
80
|
def get_df(self) -> pd.DataFrame:
|
|
77
|
-
"""Creates a dataframe representing all processed constraint data in a surface file
|
|
81
|
+
"""Creates a dataframe representing all processed constraint data in a surface file.
|
|
82
|
+
|
|
78
83
|
Returns:
|
|
79
84
|
DataFrame: of the properties of the constraint through time with each row representing \
|
|
80
85
|
a change in constraint.
|
|
@@ -106,6 +111,7 @@ class NexusConstraints(Constraints):
|
|
|
106
111
|
|
|
107
112
|
def _add_to_memory(self, additional_constraints: Optional[dict[str, list[NexusConstraint]]]) -> None:
|
|
108
113
|
"""Adds additional constraints to memory within the NexusConstraints object.
|
|
114
|
+
|
|
109
115
|
If user adds constraints list this will not be reflected in the Nexus deck at this time.
|
|
110
116
|
|
|
111
117
|
Args:
|
|
@@ -145,7 +151,8 @@ class NexusConstraints(Constraints):
|
|
|
145
151
|
|
|
146
152
|
def remove(self, constraint_dict: Optional[dict[str, None | float | str | int]] = None,
|
|
147
153
|
constraint_id: Optional[UUID] = None) -> None:
|
|
148
|
-
"""Remove a constraint based on closest matching constraint, requires node name and date
|
|
154
|
+
"""Remove a constraint based on closest matching constraint, requires node name and date.
|
|
155
|
+
|
|
149
156
|
Needs one of at least constraint dict or constraint id.
|
|
150
157
|
|
|
151
158
|
Args:
|
|
@@ -382,8 +389,9 @@ class NexusConstraints(Constraints):
|
|
|
382
389
|
new_constraint_props: dict[str, None | float | int | str | UnitSystem] | Constraint,
|
|
383
390
|
comments: Optional[str] = None) \
|
|
384
391
|
-> None:
|
|
385
|
-
"""Modify an existing constraint.
|
|
386
|
-
|
|
392
|
+
"""Modify an existing constraint.
|
|
393
|
+
|
|
394
|
+
Retains existing constraint values that are not overridden by the new constraint properties.
|
|
387
395
|
|
|
388
396
|
Args:
|
|
389
397
|
name (str): The well name
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
"""Holds all the node connections in a network.
|
|
1
|
+
"""Holds all the node connections in a network.
|
|
2
|
+
|
|
3
|
+
This class is responsible for loading, modifying and removing
|
|
2
4
|
connections from a network. It also holds the list of connections in memory.
|
|
3
5
|
An instance is held within the NexusNetwork class as "connections".
|
|
4
6
|
"""
|
|
@@ -27,8 +29,10 @@ if TYPE_CHECKING:
|
|
|
27
29
|
|
|
28
30
|
@dataclass(kw_only=True)
|
|
29
31
|
class NexusNodeConnections(NodeConnections):
|
|
30
|
-
"""Holds all the node connections in a network.
|
|
31
|
-
|
|
32
|
+
"""Holds all the node connections in a network.
|
|
33
|
+
|
|
34
|
+
This class is responsible for loading, modifying and removing connections from a network. It also holds the list
|
|
35
|
+
of connections in memory.
|
|
32
36
|
"""
|
|
33
37
|
__connections: list[NexusNodeConnection] = field(default_factory=list)
|
|
34
38
|
|
|
@@ -67,7 +71,8 @@ class NexusNodeConnections(NodeConnections):
|
|
|
67
71
|
return next(connections_to_return, None)
|
|
68
72
|
|
|
69
73
|
def get_df(self) -> pd.DataFrame:
|
|
70
|
-
"""Creates a dataframe representing all processed node connection data in a surface file
|
|
74
|
+
"""Creates a dataframe representing all processed node connection data in a surface file.
|
|
75
|
+
|
|
71
76
|
Returns:
|
|
72
77
|
DataFrame: of the properties of the connections through time with each row representing a node.
|
|
73
78
|
"""
|
|
@@ -123,7 +128,8 @@ class NexusNodeConnections(NodeConnections):
|
|
|
123
128
|
def modify(self, obj_to_modify: dict[str, None | str | float | int],
|
|
124
129
|
new_properties: dict[str, None | str | float | int]) -> None:
|
|
125
130
|
"""Modifies an existing connection based on a matching dictionary of properties.
|
|
126
|
-
|
|
131
|
+
|
|
132
|
+
Partial matches allowed if precisely 1 matching node is found.
|
|
127
133
|
Updates the properties with properties in the new_properties dictionary.
|
|
128
134
|
|
|
129
135
|
Args:
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
"""Holds the NexusNodes class which is used to store and manipulate the nodes in a NexusNetwork.
|
|
2
|
+
|
|
2
3
|
It is stored as an instance in the NexusNetwork class as "nodes".
|
|
3
4
|
"""
|
|
4
5
|
|
|
@@ -26,6 +27,7 @@ if TYPE_CHECKING:
|
|
|
26
27
|
@dataclass(kw_only=True)
|
|
27
28
|
class NexusNodes(Nodes):
|
|
28
29
|
"""Class to store and manipulate the nodes in a NexusNetwork.
|
|
30
|
+
|
|
29
31
|
It is stored as an instance in the NexusNetwork class as "nodes". A list of nodes in the network are stored in
|
|
30
32
|
memory these can be accessed through the get_all method.
|
|
31
33
|
"""
|
|
@@ -77,7 +79,8 @@ class NexusNodes(Nodes):
|
|
|
77
79
|
return next(nodes_to_return, None)
|
|
78
80
|
|
|
79
81
|
def get_df(self) -> pd.DataFrame:
|
|
80
|
-
"""Creates a dataframe representing all processed node data in a surface file
|
|
82
|
+
"""Creates a dataframe representing all processed node data in a surface file.
|
|
83
|
+
|
|
81
84
|
Returns:
|
|
82
85
|
DataFrame: of the properties of the nodes through time with each row representing a node.
|
|
83
86
|
"""
|
|
@@ -144,8 +147,10 @@ class NexusNodes(Nodes):
|
|
|
144
147
|
|
|
145
148
|
def modify(self, node_to_modify: dict[str, None | str | float | int],
|
|
146
149
|
new_properties: dict[str, None | str | float | int]) -> None:
|
|
147
|
-
"""Modifies an existing node based on a matching dictionary of properties
|
|
148
|
-
|
|
150
|
+
"""Modifies an existing node based on a matching dictionary of properties.
|
|
151
|
+
|
|
152
|
+
Partial matches allowed if precisely 1 matching node is found. Updates the properties with properties in the
|
|
153
|
+
new_properties dictionary.
|
|
149
154
|
|
|
150
155
|
Args:
|
|
151
156
|
node_to_modify (dict[str, None | str | float | int]): dictionary containing attributes to match in the
|
|
@@ -86,9 +86,9 @@ class NexusProc:
|
|
|
86
86
|
|
|
87
87
|
@staticmethod
|
|
88
88
|
def reset_nexus_proc_function_counts() -> dict[str, int]:
|
|
89
|
-
"""This function initializes and returns a dict of built-in Nexus proc functions.
|
|
90
|
-
1013 of the 2022 Nexus Keyword manual for a description of the functions.
|
|
89
|
+
"""This function initializes and returns a dict of built-in Nexus proc functions.
|
|
91
90
|
|
|
91
|
+
Please refer to page 1013 of the 2022 Nexus Keyword manual for a description of the functions.
|
|
92
92
|
Returns: A dictionary of Nexus proc functions where the key is the specific function and the value is
|
|
93
93
|
the count, initialized to zero.
|
|
94
94
|
"""
|
|
@@ -11,8 +11,9 @@ if TYPE_CHECKING:
|
|
|
11
11
|
|
|
12
12
|
@dataclass(kw_only=True)
|
|
13
13
|
class NexusProcs:
|
|
14
|
-
"""Class for handling procedures in the Nexus Network.
|
|
15
|
-
|
|
14
|
+
"""Class for handling procedures in the Nexus Network.
|
|
15
|
+
|
|
16
|
+
This class is used to store and collect information about certain procedures written in the Nexus surface file.
|
|
16
17
|
"""
|
|
17
18
|
# need field function to make a new unique empty list
|
|
18
19
|
__procs: list[NexusProc] = field(default_factory=list)
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
"""Class for handling targets in the Nexus Network.
|
|
2
|
-
|
|
1
|
+
"""Class for handling targets in the Nexus Network.
|
|
2
|
+
|
|
3
|
+
This class is used to store and manipulate the targets in a NexusNetwork. It is stored as an instance in the
|
|
4
|
+
NexusNetwork class as "targets".
|
|
3
5
|
"""
|
|
4
6
|
from __future__ import annotations
|
|
5
7
|
from dataclasses import dataclass, field
|
|
@@ -24,8 +26,10 @@ if TYPE_CHECKING:
|
|
|
24
26
|
|
|
25
27
|
@dataclass(kw_only=True)
|
|
26
28
|
class NexusTargets(Targets):
|
|
27
|
-
"""Class for handling targets in the Nexus Network.
|
|
28
|
-
|
|
29
|
+
"""Class for handling targets in the Nexus Network.
|
|
30
|
+
|
|
31
|
+
This class is used to store and manipulate the targets in a NexusNetwork. It is stored as an instance in the
|
|
32
|
+
NexusNetwork class as "targets".
|
|
29
33
|
"""
|
|
30
34
|
__targets: list[NexusTarget] = field(default_factory=list)
|
|
31
35
|
|
|
@@ -75,7 +79,8 @@ class NexusTargets(Targets):
|
|
|
75
79
|
return next(targets_to_return, None)
|
|
76
80
|
|
|
77
81
|
def get_df(self) -> pd.DataFrame:
|
|
78
|
-
"""Creates a dataframe representing all processed target data in a surface file
|
|
82
|
+
"""Creates a dataframe representing all processed target data in a surface file.
|
|
83
|
+
|
|
79
84
|
Returns:
|
|
80
85
|
DataFrame: of the properties of the targets through time with each row representing a target.
|
|
81
86
|
"""
|
|
@@ -142,8 +147,10 @@ class NexusTargets(Targets):
|
|
|
142
147
|
|
|
143
148
|
def modify(self, target_to_modify: dict[str, None | str | float | int],
|
|
144
149
|
new_properties: dict[str, None | str | float | int]) -> None:
|
|
145
|
-
"""Modifies an existing node based on a matching dictionary of properties
|
|
146
|
-
|
|
150
|
+
"""Modifies an existing node based on a matching dictionary of properties.
|
|
151
|
+
|
|
152
|
+
Partial matches allowed if precisely 1 matching node is found. Updates the properties with properties in the
|
|
153
|
+
new_properties dictionary.
|
|
147
154
|
|
|
148
155
|
Args:
|
|
149
156
|
target_to_modify (dict[str, None | str | float | int]): dictionary containing attributes to match in the
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
"""Class for handling well connections in the Nexus Network.
|
|
1
|
+
"""Class for handling well connections in the Nexus Network.
|
|
2
|
+
|
|
3
|
+
This class is used to store and manipulate the well
|
|
2
4
|
connections in a NexusNetwork. It is stored as an instance in the NexusNetwork class as "well_connections".
|
|
3
5
|
In Nexus this is the WELLS table.
|
|
4
6
|
"""
|
|
@@ -25,10 +27,11 @@ if TYPE_CHECKING:
|
|
|
25
27
|
|
|
26
28
|
@dataclass
|
|
27
29
|
class NexusWellConnections(WellConnections):
|
|
28
|
-
"""Class for handling well connections in the Nexus Network.
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
"""Class for handling well connections in the Nexus Network.
|
|
31
|
+
|
|
32
|
+
This class is used to store and manipulate the well connections in a NexusNetwork. It is stored as an instance in
|
|
33
|
+
the NexusNetwork class as "well_connections". In Nexus this is the WELLS table. The list of well connections can
|
|
34
|
+
be accessed in the NexusNetwork class through the get_all method.
|
|
32
35
|
"""
|
|
33
36
|
_well_connections: list[NexusWellConnection] = field(default_factory=list)
|
|
34
37
|
|
|
@@ -67,7 +70,8 @@ class NexusWellConnections(WellConnections):
|
|
|
67
70
|
return next(to_return, None)
|
|
68
71
|
|
|
69
72
|
def get_df(self) -> pd.DataFrame:
|
|
70
|
-
"""Creates a dataframe representing all processed well connections data in a surface file
|
|
73
|
+
"""Creates a dataframe representing all processed well connections data in a surface file.
|
|
74
|
+
|
|
71
75
|
Returns:
|
|
72
76
|
DataFrame: of the properties of the well connections through time with each row representing a single well \
|
|
73
77
|
connection.
|
|
@@ -115,7 +119,8 @@ class NexusWellConnections(WellConnections):
|
|
|
115
119
|
def modify(self, obj_to_modify: dict[str, None | str | float | int],
|
|
116
120
|
new_properties: dict[str, None | str | float | int]) -> None:
|
|
117
121
|
"""Modifies an existing well connection based on a matching dictionary of properties.
|
|
118
|
-
|
|
122
|
+
|
|
123
|
+
Partial matches allowed if precisely 1 matching node is found.
|
|
119
124
|
Updates the properties with properties in the new_properties dictionary.
|
|
120
125
|
|
|
121
126
|
Args:
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
"""Class for handling wellbores in the Nexus Network.
|
|
2
|
-
|
|
1
|
+
"""Class for handling wellbores in the Nexus Network.
|
|
2
|
+
|
|
3
|
+
This class is used to store and manipulate the wellbores in a NexusNetwork. It is stored as an instance in the
|
|
4
|
+
NexusNetwork class as "wellbores".
|
|
3
5
|
"""
|
|
4
6
|
from __future__ import annotations
|
|
5
7
|
|
|
@@ -25,9 +27,11 @@ if TYPE_CHECKING:
|
|
|
25
27
|
|
|
26
28
|
@dataclass
|
|
27
29
|
class NexusWellbores(Wellbores):
|
|
28
|
-
"""Class for handling wellbores in the Nexus Network.
|
|
29
|
-
|
|
30
|
-
|
|
30
|
+
"""Class for handling wellbores in the Nexus Network.
|
|
31
|
+
|
|
32
|
+
This class is used to store and manipulate the wellbores in a NexusNetwork. It is stored as an instance in the
|
|
33
|
+
NexusNetwork class as "wellbores". The list of wellbores can be accessed in the NexusNetwork class through the
|
|
34
|
+
get_all method.
|
|
31
35
|
"""
|
|
32
36
|
__wellbores: list[NexusWellbore] = field(default_factory=list)
|
|
33
37
|
|
|
@@ -113,7 +117,8 @@ class NexusWellbores(Wellbores):
|
|
|
113
117
|
def modify(self, obj_to_modify: dict[str, None | str | float | int],
|
|
114
118
|
new_properties: dict[str, None | str | float | int]) -> None:
|
|
115
119
|
"""Modifies an existing wellbore based on a matching dictionary of properties.
|
|
116
|
-
|
|
120
|
+
|
|
121
|
+
Partial matches allowed if precisely 1 matching node is found.
|
|
117
122
|
Updates the properties with properties in the new_properties dictionary.
|
|
118
123
|
|
|
119
124
|
Args:
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
"""Class for handling wellheads in the Nexus Network.
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
"""Class for handling wellheads in the Nexus Network.
|
|
2
|
+
|
|
3
|
+
This class is used to store and manipulate the wellheads in a NexusNetwork. It is stored as an instance in the
|
|
4
|
+
NexusNetwork class as "wellheads". In Nexus this is the WELLHEAD table.
|
|
4
5
|
"""
|
|
5
6
|
from __future__ import annotations
|
|
6
7
|
from dataclasses import dataclass, field
|
|
@@ -107,7 +108,8 @@ class NexusWellheads(Wellheads):
|
|
|
107
108
|
def modify(self, obj_to_modify: dict[str, None | str | float | int],
|
|
108
109
|
new_properties: dict[str, None | str | float | int]) -> None:
|
|
109
110
|
"""Modifies an existing wellhead based on a matching dictionary of properties.
|
|
110
|
-
|
|
111
|
+
|
|
112
|
+
Partial matches allowed if precisely 1 matching node is found.
|
|
111
113
|
Updates the properties with properties in the new_properties dictionary.
|
|
112
114
|
|
|
113
115
|
Args:
|
|
@@ -402,8 +402,9 @@ class NexusFile(File):
|
|
|
402
402
|
return from_list, to_list
|
|
403
403
|
|
|
404
404
|
def add_object_locations(self, obj_uuid: UUID, line_indices: list[int]) -> None:
|
|
405
|
-
"""Adds a uuid to the object_locations dictionary.
|
|
406
|
-
|
|
405
|
+
"""Adds a uuid to the object_locations dictionary.
|
|
406
|
+
|
|
407
|
+
Used for storing the line numbers where objects are stored within the flattened file_as_list.
|
|
407
408
|
|
|
408
409
|
Args:
|
|
409
410
|
obj_uuid (UUID): unique identifier of the object being created/stored.
|
|
@@ -420,9 +421,10 @@ class NexusFile(File):
|
|
|
420
421
|
self.object_locations[obj_uuid] = line_indices
|
|
421
422
|
|
|
422
423
|
def __update_object_locations(self, line_number: int, number_additional_lines: int) -> None:
|
|
423
|
-
"""Updates the object locations in a nexusfile by the additional lines.
|
|
424
|
-
|
|
425
|
-
|
|
424
|
+
"""Updates the object locations in a nexusfile by the additional lines.
|
|
425
|
+
|
|
426
|
+
Used when files have been modified and an addition/removal of lines has occurred. Ensures that the object
|
|
427
|
+
locations are correct to the actual lines in the file_as_list.
|
|
426
428
|
|
|
427
429
|
Args:
|
|
428
430
|
line_number (int): Line number at which the new lines have been added
|
|
@@ -449,7 +451,7 @@ class NexusFile(File):
|
|
|
449
451
|
self.object_locations.pop(obj_uuid, None)
|
|
450
452
|
|
|
451
453
|
def find_which_include_file(self, flattened_index: int) -> tuple[File, int]:
|
|
452
|
-
"""Given a line index that relates to a position within the flattened file_as_list from the method
|
|
454
|
+
"""Given a line index that relates to a position within the flattened file_as_list from the method \
|
|
453
455
|
get_flat_file_as_list.
|
|
454
456
|
|
|
455
457
|
Args:
|
|
@@ -577,8 +579,9 @@ class NexusFile(File):
|
|
|
577
579
|
|
|
578
580
|
def remove_from_file_as_list(self, index: int, objects_to_remove: Optional[list[UUID]] = None,
|
|
579
581
|
string_to_remove: Optional[str] = None) -> None:
|
|
580
|
-
"""Remove an entry from the file as list.
|
|
581
|
-
|
|
582
|
+
"""Remove an entry from the file as list.
|
|
583
|
+
|
|
584
|
+
Also updates existing object locations and removes any specified objects from the object locations dictionary.
|
|
582
585
|
|
|
583
586
|
Args:
|
|
584
587
|
index (int): index n the calling flat_file_as_list to remove the entry from
|
|
@@ -222,6 +222,7 @@ class NexusPVTMethod(DynamicProperty):
|
|
|
222
222
|
def __populate_eos_opts_to_tertiary_keys(self, primary_key: str, primary_key_default_val: str, single_line: str,
|
|
223
223
|
line_list: list[str], list_of_secondary_keys: list[str]) -> None:
|
|
224
224
|
"""Utility function to populate complex EOS options structures, from primary to tertiary keyword level.
|
|
225
|
+
|
|
225
226
|
Applies to TRANSITION, TRANS_TEST and PHASEID Nexus EOS options.
|
|
226
227
|
|
|
227
228
|
Args:
|