Introduction to pyscal

_images/pyscal-logo.png

pyscal is a Python tool and module for creating relative permeability input curves for Eclipse, Flow (OPM) and Nexus. Curves are parametrized using Corey or LET.

SCAL recommendations are curve sets consisting of “low”, “base” and “high” curves, each parametrized individually. Pyscal has support for interpolating between such enveloping curves.

Pyscal can be used both for sensitivity tests on relative permeability parameters, and for sensitivity tests of a SCAL recommendation. For history matching, matching interpolation parameters in a SCAL recommendation is the recommended practice.

Relative permeability data can also be parsed from tabulated data and then used for interpolation.

Capillary pressure is supported through a selected number of parametrizations.

Command line tool

The command line tool is installed as pyscal and takes a table in a CSV file or in an XLSX file as the main input. Each SATNUM is represented by one row of data in the table.

Example use with CSV input for one SATNUM:

$ cat relperminput.csv  # Show example input file
SATNUM, swl, sorw, Nw, Now
1,      0.1, 0.05, 2, 3
$ # Run pyscal on example input:
$ pyscal relperminput.csv --delta_s 0.2 -o relperm.inc
Written to relperm.inc

Exactly the same table in an XLSX file would give identical results. The output from the pyscal command above will look like:

$ cat relperm.inc
SWOF
-- SATNUM 1
-- pyscal: v0.7.X
-- swirr=0 swl=0.1 swcr=0.1 sorw=0.05
-- Corey krw, nw=2, krwend=1, krwmax=1
-- Corey krow, now=3, kroend=1
-- krw = krow @ sw=0.46856
-- Zero capillary pressure
-- SW     KRW       KROW      PC
0.1000000 0.0000000 1.0000000 0
0.3000000 0.0553633 0.4471809 0
0.5000000 0.2214533 0.1483818 0
0.7000000 0.4982699 0.0254427 0
0.9000000 0.8858131 0.0002035 0
0.9500000 1.0000000 0.0000000 0
1.0000000 1.0000000 0.0000000 0
/

The saturation step-length --delta_s was set artificially high for the sake of the example. Leave it defaulted (0.01) for practical use.

Python API

The corresponding API can be used directly for more control and for custom-made solutions. An example recreating the the same table as above is given by:

from pyscal import WaterOil

wo = WaterOil(h=0.2, sorw=0.05, swl=0.1)
wo.add_corey_water(nw=2)
wo.add_corey_oil(now=3)
print(wo.SWOF())

which will give the same output as the example above.

See the full API for in-depth information.

Classes

WaterOil

Represents the data for water-oil relative permeability and capillary pressure. Essentially the data for SWOF plus metadata. All tabular data is built up in the interal object member table (a pandas DataFrame) which can be viewed for debugging. The object contains export functions for Eclipse keywords, SWOF, SWFN etc.

GasOil

Ditto for gas-oil relative permeability

GasWater

Ditto for gas-water relative permeability

WaterOilGas

Container object for one WaterOil and one GasOil. Useful for making SOF3 output, and for ensuring endpoint consistency in three-phase simulations. The objects members wateroil and gasoil refer to the contained objects. It is allowed to use this container for two-phase only, if used for oil-water, the gasoil reference would be None.

SCALrecommendation

Container object for three WaterOilGas objects which are tagged as low, base and high. Useful for interpolating between low and high, going from -1 (low) through 0 (base) to 1 (high).

PyscalFactory

Contains convenience functions for initializing the above objects from Python dictionaries. If provided a table input (Pandas DataFrame, CSV- or XLSX-file), PyscalList objects are constructed.

PyscalList

Container for a sequence of WaterOil, GasOil, GasWater, WaterOilGas or SCALrecommendation objects. Objects of this class can make up the entire relative permeability input to Eclipse through f.ex. the function dump_family_1().