pillars

pillars is a module to compute data on “pillars” in the grid from a simulation, including both static and dynamic data from the grid.

Static data

Typical usage is to obtain property statistics, and compute contacts pr. pillar (and optionally pr some region parameter).

Example pillar table

PILLAR

X

Y

Z

VOLUME

PERMX

PERMY

PERMZ

PORV

PORO

1-1

456620.8

5935659.6

1753.6

1053244.0

1095.9

1140.2

108.6

182502.8

0.2

1-10

457336.4

5934421.1

1742.2

1078104.1

776.9

758.3

82.8

171530.9

0.2

1-11

457416.0

5934283.4

1743.0

1035282.9

1332.2

1332.6

301.4

200754.5

0.2

1-12

457495.9

5934145.8

1745.8

1084271.9

1713.9

1639.4

336.1

218128.4

0.2

1-13

457575.9

5934008.2

1746.1

1097513.3

1531.9

1451.0

296.1

203463.0

0.2

where the first PILLAR column is the I and J identification of the pillar. and the other values are arithmetic averages of the values in the cells belonging to a particular pillar.

If you provide a region parameter (like EQLNUM), the value for the region will be added in an extra column called EQLNUM. Each pillar will then be repeated for each region value where it exists.

Dynamic data, volumes and fluid contacts

The API res2df.pillars.df() and command line client allows specifying dates if dynamic data should be included through the rstdates option to the API or the --rstdates option on the command line. Providing dates as an option will trigger computation of phase volumes WATVOL, OILVOL, and GASVOL for each date.

If, in addition to dates, the parameters soilcutoff etc. are provided, these are used to determine oil-water and/or gas-oil contacts pr pillar (and pr. region).

An oil-water contact pr. pillar is determined as the deepest cell centre with SOIL above the given contact, among those pillars with at least one cell above swatcutoff.

A gas-oil contact is the deepest cell centre with SGAS above the cutoff sgascutoff, among those pillars with at least one cell with non-zero oil saturation.

Gas-water contact is only computed when SOIL is not present in the simulation (two-phase runs), it will be the deepest cell centre with gas saturation above sgascutoff, among those pillars with at least one cell above swatcutoff. See the API documentation, res2df.pillars.compute_pillar_contacts().

The functionality is also available through the command line tool res2csv pillars as in the example:

res2csv pillars --help  # This will display some help text
res2csv pillars MYDATAFILE.DATA --rstdates all --stackdates

It is strongly recommended to play with the cutoffs to get the desired result. Also calibrate the computed contacts with the initial contacts, you may see that you should add a constant distance to all computed contacts. Beware that shale cells with little oil, but in the oil zone necessarily will affect the computation (sometimes that explains the need for calibration to initial contacts).

Grouping data

It is possible to aggregate data over all pillars after computation. Activate using --group to the command line client, and add optionally a --region parameter to group over a particular region, typically EQLNUM.

The Python API will group over any data that is supplied via the region option, check res2df.pillars.df()

Stacked version

By default, dynamic data are added as a set of columns for every date, like in this example:

Example pillar table with dynamical data, unstacked

PILLAR

X

Y

Z

VOLUME

PERMX

PERMY

PERMZ

PORV

WATVOL@2000-01-01

GASVOL@2000-01-01

OILVOL@2000-01-01

WATVOL@2000-07-01

GASVOL@2000-07-01

OILVOL@2000-07-01

WATVOL@2001-02-01

GASVOL@2001-02-01

OILVOL@2001-02-01

WATVOL@2001-08-01

GASVOL@2001-08-01

OILVOL@2001-08-01

PORO

OWC@2000-01-01

OWC@2000-07-01

OWC@2001-02-01

OWC@2001-08-01

14-26

460480.6

5933271.1

1716.3

843873.2

397.2

405.1

142.9

99680.2

89917.5

0.0

9762.7

89833.8

0.0

9846.4

89787.8

0.0

9892.4

89805.4

0.0

9874.8

0.1

1698.4

1698.4

1698.4

1698.4

14-31

460840.8

5932584.7

1712.6

735191.0

1737.7

1740.5

385.7

128119.9

126201.6

0.0

1918.3

126189.3

0.0

1930.5

126178.3

0.0

1941.5

126185.0

-0.0

1934.9

0.2

1699.9

1699.9

1699.9

1699.9

15-17

459835.6

5934595.5

1636.7

706576.0

605.0

535.4

97.5

126698.8

72548.6

0.0

54150.2

77354.4

0.0

49344.4

83059.3

0.0

43639.5

87168.7

0.0

39530.1

0.2

1640.4

1640.4

1640.4

1640.4

15-18

459906.7

5934460.6

1626.6

696766.3

838.3

700.9

163.6

122683.6

74366.3

0.0

48317.3

84393.5

0.0

38290.0

90880.6

0.0

31803.0

93511.7

0.0

29171.8

0.2

1635.6

1635.6

1634.3

1634.3

15-19

459976.6

5934325.5

1619.3

769240.6

1091.3

1187.3

190.1

134679.2

87650.3

0.0

47028.9

93253.8

0.0

41425.4

95279.4

0.0

39399.7

96842.8

0.0

37836.4

0.2

1630.7

1630.1

1630.1

1630.1

This may be what you want, however it is also possible to have DATE as a column, obtained by triggering the stacking option in res2df.pillars.df() or --stackdates on the command line and get data like this:

Example pillar table with dynamical data, stacked

DATE

GASVOL

OILVOL

OWC

PERMX

PERMY

PERMZ

PILLAR

PORO

PORV

VOLUME

WATVOL

X

Y

Z

2000-01-01

0.0

9762.7

1698.4

397.2

405.1

142.9

14-26

0.1

99680.2

843873.2

89917.5

460480.6

5933271.1

1716.3

2000-07-01

0.0

9846.4

1698.4

397.2

405.1

142.9

14-26

0.1

99680.2

843873.2

89833.8

460480.6

5933271.1

1716.3

2001-02-01

0.0

9892.4

1698.4

397.2

405.1

142.9

14-26

0.1

99680.2

843873.2

89787.8

460480.6

5933271.1

1716.3

2001-08-01

0.0

9874.8

1698.4

397.2

405.1

142.9

14-26

0.1

99680.2

843873.2

89805.4

460480.6

5933271.1

1716.3

2000-01-01

0.0

1918.3

1699.9

1737.7

1740.5

385.7

14-31

0.2

128119.9

735191.0

126201.6

460840.8

5932584.7

1712.6