Skip to main content

A Python library for working with Reservoir Simulator Models.

Project description

ResSimpy: Python API for working with Reservoir Simulator models

License Documentation Status Python CI Python version PyPI Status codecov

Introduction

ResSimpy is a Python API for automating reservoir simulation workflows, allowing the user to read, manipulate and write reservoir simulation input decks. Whilst it was created by staff at BP, we welcome contributions from anybody interested, whether it is by raising pull requests, or simply suggesting features / raising bugs in the GitHub issues.

Documentation

See the complete package documentation on readthedocs.

Installation

ResSimpy can be installed with pip:

pip install ressimpy

Contributing

Please see Contributing Guide for instructions on how to set up a dev environment and contribute code to the project.

Getting Started

The following Python code examples demonstrate how to perform some simple operations on a model using ResSimpy:

Step 1: Import the library

from ResSimpy import NexusSimulator as Simulator

Step 2: Initialise the model

nexus_fcs_file = '/path/to/fcsfile.fcs'
model = Simulator(origin=nexus_fcs_file) # Create the 'Simulator' model object

Once these steps are completed, you are able to perform any supported operations on the model. The following code snippets are examples of a few such operations:

Writing Out Files

# Update the files in the model that have been modified.
# IMPORTANT: no changes made to the model, such as adding completions or removing constraints will be applied to the model files until this function is called.
model.update_simulator_files()

# Create a copy of the entire model
model.write_out_new_simulator(new_file_path='/new/path/to/fcsfile.fcs', new_include_file_location='/new/path/to/includes_directory/')

Wells - Get wells overview

wells_info = model.wells.get_wells_overview() # Returns a list of wells with their information. Can be print()ed
print(wells_info)

Wells - Get information about an individual Well

well = model.wells.get(well_name='well_1') # Retrieves the named well as a NexusWell object

# You can then access the various properties for that well (such as perforations, shutins, completion events etc) using (for example)
perforations = well.perforations

# You can pretty print the information about a well using
print(well.printable_well_info)

# Get the wells information in dataframe format
wells_df = model.wells.get_df()
print(wells_df)

Completions

# Adding a completion
new_completion = {'date': '01/02/2025', 'i': 4, 'j': 5, 'k': 6, 'well_radius': 7.50} # Create a dictionary containing the properties of the completion you wish to add
model.wells.add_completion(well_name='well_1', completion_properties=new_completion) # Add the new completion

# Removing a completion
completion_to_modify = {'date': '01/02/2025', 'i': 4, 'j': 5, 'k': 6, 'well_radius': 7.5} # Create a dictionary containing the properties of the existing completion
model.wells.remove_completion(well_name='well_1', completion_properties=completion_to_modify) # Remove the completion

# Modifying a completion
modified_properties = {'date': '10/03/2025'} # Create a dict with the properties you want to change and their new values
model.wells.modify_completion(well_name='well_1', properties_to_modify=modified_properties, completion_to_change=completion_to_modify) # Modify the completion

Structured Grid - Get a list of the array functions applied to the grid

func_list = model.grid.get_array_functions_list()
func_summary_df = model.grid.get_array_functions_df() # get a dataframe instead

[print(x) for x in func_list[0:9]] # Example showing how to print out the first 10 functions

Networks - Get constraints

constraints = model.network.constraints.get_all()
constraints_for_well = constraints['well_1'] # Get the constraints for the well well_1

# You can then access various properties related to the constraints, such as oil, water and gas rates using
oil_rate = constraints_for_well[0].max_surface_oil_rate
print(f"\nmax surface oil rate: {oil_rate}")

# Get a dataframe with all constraints in it.
constraint_df = model.network.constraints.get_df()
print(constraint_df)

Networks - Get dataframes of well connections, wellbores, network connections and nodes

df_well_cons = model.network.connections.get_df()
df_well_bores = model.network.wellbores.get_df()
df_connections = model.network.connections.get_df()
df_nodes = model.network.nodes.get_df()

Support

For most bugs or feature requests, we recommend using GitHub issues. If, however, you have a query related to something else, or if your query relates to something confidential, please feel free to email the team at ResSimpy@bp.com.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ressimpy-2.6.0.tar.gz (272.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ressimpy-2.6.0-py3-none-any.whl (406.0 kB view details)

Uploaded Python 3

File details

Details for the file ressimpy-2.6.0.tar.gz.

File metadata

  • Download URL: ressimpy-2.6.0.tar.gz
  • Upload date:
  • Size: 272.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for ressimpy-2.6.0.tar.gz
Algorithm Hash digest
SHA256 e11c79e50246dbd8a2c562e1ccdd85608a132a047539436ee9cd6d7c0c112069
MD5 b40fd1a53cbe17a79c540136b07f0c22
BLAKE2b-256 0041b93081e2d7cbc4a8d2d864c02a86cbcbc1278ca1f5a3dc8cf6fdb701bbe5

See more details on using hashes here.

Provenance

The following attestation bundles were made for ressimpy-2.6.0.tar.gz:

Publisher: ci-publish.yml on bp/ResSimpy

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ressimpy-2.6.0-py3-none-any.whl.

File metadata

  • Download URL: ressimpy-2.6.0-py3-none-any.whl
  • Upload date:
  • Size: 406.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for ressimpy-2.6.0-py3-none-any.whl
Algorithm Hash digest
SHA256 f854c2f3c354c9b7f534597b59e2c0e1d18da43120dd03c05c8bbc7544dd0b18
MD5 1038b2ad0dedd89d1b3f260335de9166
BLAKE2b-256 25c25098d9f30e96396fa4d2f3c59a319bea5ecacd785fadd1231208b56bf1bb

See more details on using hashes here.

Provenance

The following attestation bundles were made for ressimpy-2.6.0-py3-none-any.whl:

Publisher: ci-publish.yml on bp/ResSimpy

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page