Skip to main content

Utility for calculating elastic properties of petroleum fields.

Project description

open_petro_elastic

Library used for Petro elastic modelling.

Installation

pip install .

Usage

open_petro_elastic -h

Run tests

pytest

Config file format

See examples/ for example config and data files. Input to open_petro_elastic consists of a yaml config file plus an optional csv data file.

The yaml config consists of three sections, minerals, fluids and dryrock. Elastic values for dry rock, having the mineral as its pore-material and saturated with the fluid is outputed.

minerals

Consists only of a list of constituents which will be mixed using Hashin-Shtrikman, like so:

minerals:
    constituents:
        - material: #sand
            bulk_modulus: 36.0E+9 #Pa
            shear_modulus: 44.0E+9 #Pa
            density: 2650.0 # kg/m3
          fraction: 0.5
        - material: # shale
            bulk_modulus: 11.0E+9 #Pa
            shear_modulus: 4.5E+9 #Pa
            density: 1.0 # kg/m3
          # fraction of shale is 1 - sum(other materials)

fluids

Same as minerals, but a choice of mixing methods is given, and temperature and pressure can be given for costituents from theoretical models:

fluids:
    mix_method: "wood" # either brie or wood
    temperature: 75.0 # celsius
    pressure: 1000.0 # Pa
    constituents:
        - material:
            type: "oil"
            gas_gravity: 0.5 # ratio to air (air gas gravity is 1)
            reference_density: 800.0 # kg/m3
            gas_oil_ratio: 153.0 # ratio of gas to oil
          #fraction set to 1 - sum(other_fluid_fractions)
        - material:
            type: "brine"
            salinity: 45000 # ppm
          fraction: 0.3 # Ratio of brine to remaining fluid
        - material:
            type: "gas"
            gas_gravity: 0.5 # ratio to air (air gas gravity is 1)
          fraction: 0.3 # Ratio of gas to remaining fluid

The list can be any number of arbitrary materials (see example in mineral section above) or given one of the types ["oil", "brine", "gas", "condensate"].

Dry Rock

This section describes the porous dry rock to the corresponding dense mineral.

dry_rock:
    model:
        type: "polyfit"
        coefficients:
           density: [[0.0, 0.0], [1.0, -1.0]]
           bulk_modulus: [[2900.0, -1300.0]]
           shear_modulus: [[1700.0, -800.0]]
    porosity: 0.36
    adjustments:
       - model: "powerfit"
         overburden_pressure: 100.0E6
         pressure: 70.0E+6 Pa
         reference_pressure: 30.0E+6 # Pa
         coefficients:
            bulk_modulus: [20.0E+9, -46.0]
            vp_over_vs: [12.0, -26.0]
            density: [1.0, 0.0]
       - depth: 1000.0
         reference_depth: 0.0
         coefficients:
           bulk_modulus: [[0.0, 1.5], [1.0, 0.0]]
           shear_modulus: [[0.0, 1.2], [1.0, 0.0]]
           density: [[0.0, 1.35], [1.0, 0.0]]

In the config above dry rock is created using a polynomial fit to porosity, however, it is also possible to use the theoretical models "friable_sand" and "patchy_cement", see example configs for useage.

The polynomial fit coefficients are such that the terms of the polynoimal, for e.g. density, are dry_rock_density = sum_ij mineral_density^i * porosity^j * coeff[i][j]. So the polynomials in the example above are

dry_rock_density = mineral_density * (1 - porosity)
dry_rock_bulk_modulus = 2900 - 1300.0 * porosity
dry_rock_shear_modulus = 1700 - 800.0 * porosity

Adjustments (pressure dependency and depth trend) are applied in the order they are given in the adjustments list. In the example above, pressure dependency using the powerfit model is applied first, then depth trend which uses a polynomial fit. See examples/example2.yaml for a detailed description of adjustments.

Inserting form datafile

Values from the csv file are inserted into the config file as columns of vectors, open_petro_elastic then maps its computation over the columns row-wise. The insertion into the yaml file of columns is done by giving the column name to the value you want to insert it into. For instance

minerals:
    constituents:
        - material: # shale
            bulk_modulus:
                column: "shale_k"
            shear_modulus:
                column: "shale_s"
            density:
                column: "shale_r"

This specifies that the minerals first constitutent shold have a material whos bulk_modulus, shear_modulus, and density can be found in the data files columns with headers shale_k, shale_s, and shale_r respectively. Lets say the contents of the data file is as follows:

shale_k,shale_s,shale_r
10E+9,4E+9,2000
8E+9,4.5E+9,3000
9E+9,5E+9,2666

Then the output from open_petro_elastic will have three rows corresponding to the three rows in the input.

If a position is given only one value, as opposed to a vector, that same value is used for all rows. So in our previous example, if the config looks like this

minerals:
    constituents:
        - material: # shale
            bulk_modulus:
                column: "shale_k"
            shear_modulus:
                column: "shale_s"
            density: 1000

A density of 1000 kg/m^3 is applied in all three output rows.

Project details


Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distribution

open_petro_elastic-0.0.6-py3-none-any.whl (48.9 kB view hashes)

Uploaded Python 3

Supported by

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