0% found this document useful (0 votes)
13 views3 pages

Amato Del Monte 2015 Seismic Petrophysics Part 2

This document is a tutorial on seismic petrophysics, focusing on fluid-replacement modeling using Gassmann's equation to predict changes in elastic logs due to different fluid conditions. It discusses creating new logs, analyzing statistical properties of lithofluid classes, and generating synthetic data sets to improve reservoir analysis. The tutorial emphasizes the use of Python for data manipulation and modeling, allowing for a more flexible approach to understanding reservoir behavior.

Uploaded by

ROHIT ARORA
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
13 views3 pages

Amato Del Monte 2015 Seismic Petrophysics Part 2

This document is a tutorial on seismic petrophysics, focusing on fluid-replacement modeling using Gassmann's equation to predict changes in elastic logs due to different fluid conditions. It discusses creating new logs, analyzing statistical properties of lithofluid classes, and generating synthetic data sets to improve reservoir analysis. The tutorial emphasizes the use of Python for data manipulation and modeling, allowing for a more flexible approach to understanding reservoir behavior.

Uploaded by

ROHIT ARORA
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 3

G e o p h y s i c a l T u t o r i a l — C o o r d i n at e d by M a tt H a l l

Seismic petrophysics: Part 2


Downloaded 01/02/24 to 103.240.194.208. Redistribution subject to SEG license or copyright; see Terms of Use at http://library.seg.org/page/policies/terms

Alessandro Amato del Monte 1

I n Part 1 of this tutorial in the April 2015 issue of TLE, we # Forward Gassmann
loaded some logs and used a data framework called Pandas to k _ s2 = k _ d + (1 - (k _ d/k0))**2 /\
manage them. We made a lithology-fluid-class (LFC) log and ((phi/k_f2) + ((1-phi)/k0) - (k _ d/k0**2))
used it to color a crossplot. This month, we take the workflow
further with fluid-replacement modeling based on Gassmann’s # New properties
equation. This is just an introduction; see Wang (2001) and rho2 = rho1-phi * rho_f1+phi * rho _ f2
Smith et al. (2003) for comprehensive overviews. mu2 = mu1
Fluid-replacement modeling is used to predict the response vp2 = np.sqrt(((k_s2+(4./3)*mu2))/rho2)
of elastic logs (VP , VS , and density) in different fluid conditions. vs2 = np.sqrt((mu2/rho2))
In that way, we can see how much a rock would change in
terms of velocity (or impedance) if it was filled with gas instead return vp2*1000, vs2*1000, rho2, k _s2
of brine, for example. It also brings all elastic logs to a common
fluid “denominator,” enabling us to disregard fluid effects and This function takes the following parameters:
focus only on lithologic variations.
• vp1, vs1, rho1: measured VP, VS , and density — satu-
Creating new logs rated with fluid 1
The inputs to fluid-replacement modeling are Ks and µs (satu- • rho_ f1, k _ f1: density and bulk modulus of fluid 1
rated bulk and shear moduli, which we can obtain from recorded • rho_ f2, k _ f2: density and bulk modulus of fluid 2
VP, VS , and density logs), Kd and µd (dry-rock bulk and shear • k0: mineral bulk modulus
DOI:10.1190/tle34060700.1

moduli), K 0 (mineral bulk modulus), K f (fluid bulk modulus), • phi: porosity


and porosity, φ. Reasonable estimates of mineral and fluid bulk
moduli and porosity are computed easily. The real unknowns, and returns VP , VS , density, and bulk modulus of the rock with
arguably the core issue of rock physics, are the dry-rock moduli. fluid 2. Velocities are in meters per second, and densities are in
To find the bulk modulus of a rock with the new fluid, we grams per cubic centimeter.
first use an inverse form of Gassmann’s equation to compute the This is how we can create gas sands that we discussed in
dry-rock bulk modulus and then apply the direct form: Part 1 of this tutorial. In the IPython notebook, I go into
more detail to show how to compute mineral moduli and
2
Kd mixed-fluid moduli. I also demonstrate how to put all the
Ks = Kd +
( 1− K0 ) .
results together in a Python container for later use and how to
φ 1−φ Kd update the LFC log we created last time to reflect the newly
+ − 2
Kf K 0 K0 available gas sands.

We can put all the steps together into a Python function Results
(see the IPython notebook for details, available online at github. The final result is shown in Figure 1, highlighting a detail
com/seg), calculating the elastic parameters for fluid 2, given the of the reservoir section between 2150 m and 2200 m with
parameters for fluid 1, along with some other data about the fluids: acoustic impedance (I P ) and VP /VS ratio for the in situ case
(gray curve), brine case (blue), and gas case (red). The LFC
def frm(vp1, vs1, rho1, rho _ f1, k _ f1, log on the right is still the original one computed on the in
rho _ f2, k _ f2, k0, phi): situ case (gray curve). The same data are shown in the I P versus
VP /VS domain in Figure 2.
# Original properties We can make a few qualitative observations from these
vp1 = vp1 / 1000. crossplots:
vs1 = vs1 / 1000.
mu1 = rho1 * vs1**2. • Shales are overall quite different from sands thus are poten-
k_s1 = rho1 * vp1**2 - (4./3.)*mu1 tially easy to identify.
• Brine sands have higher I P and VP /VS than hydrocarbon-
# Inverse Gassmann bearing sands have.
k_d = (k _s1 * ((phi*k0)/k_f1+1-phi)-k0) /\ • Oil and gas cases are not very different from each other.
((phi*k0)/k_f1+(k _s1/k0)-1-phi) • Further investigation could be done on the shale intervals
that overlap with brine sands.

1
Milan, Italy. http://dx.doi.org/10.1190/tle34060700.1.

700 THE LEADING EDGE June 2015


Moving away from well logs With three variables instead, we would have
Fluid-replacement modeling has allowed us to create an
augmented data set. Now we will move away from the intricacies [ var _X cov _ XY cov _ XZ ]
Downloaded 01/02/24 to 103.240.194.208. Redistribution subject to SEG license or copyright; see Terms of Use at http://library.seg.org/page/policies/terms

and local irregularities of the real data to create a fully synthetic [ cov _ XY var _ Y cov _YZ ]
data set that represents an idealized version of the reservoir. We [ cov _ XZ cov _ YZ var_Z ],
do this by analyzing the data through simple statistical tech-
niques in terms of tendency, dispersion, and correlation among where var_X is the variance of property X, i.e., a measure of
certain elastic properties for each lithofluid class. dispersion about the mean, whereas the covariance cov _XY is a
Central tendency is described by calculating the mean val- measure of similarity between two properties X and Y.
ues of some desired elastic property for all the existing classes. We will study the data set using only two properties (I P and
Dispersion and correlation are summarized with the covari- VP /VS ) and store everything in the DataFrame stat:
ance matrix, which can be written like this (for two generic
variables X and Y ): LFC I P _mean VP /VS _mean IP _var
1 6790 2.11 199721
[ var _ X cov _ XY ]
2 6185 2.01 337593
[ cov _ XY var _ Y ]
3 5816 1.94 360001
4 6088 2.32 492525

LFC IP _VPVS _cov VPVS _var Samples


1 –27.95 0.0205 1546
2 –16.72 0.0234 974
DOI:10.1190/tle34060700.1

3 8.67 0.0204 840


4 –98.02 0.0563 4512

There are four rows, one for each lithofluid class: shale,
brine, oil, and gas sands. For each class, we store the mean
values, the variances, and the covariance. The number of sam-
ples that is a metric on the robustness of the analysis, i.e., too
few samples, points to a potential unreliability of the statisti-
cal information.
Once again, it is easy to get information out of stat; e.g., the
Figure 1. Results of fluid-replacement modeling.
average I P of brine sands (a value of 2 in the LFC log) is

>>> print stat.ix[stat.LFC==2,'Ip _ mean']


6184.985

To display the same information graphically, this command


produces Figure 3:

>>> pd.scatter _ matrix(ww[ww.LFC==2].drop('LFC',1),


diagonal='kde')

We can now use this information to create a brand-new


synthetic data set that will replicate the average behavior of
the reservoir complex and at the same time overcome typi-
cal problems when using real data such as undersampling of
a certain class, presence of outliers, or spurious occurrence of
anomalies. The technique is a Monte Carlo simulation that
relies on multivariate normal distribution to draw samples
that are random but correlated in the elastic domain of choice
(I P and VP /VS ).
First we define how many samples per class to create (e.g., 100)
and then create an empty Pandas DataFrame (called mc) with as
Figure 2. Crossplots of IP and VP /VS of fluid-replaced data. many columns as the chosen elastic logs (in this case, three: LFC,

702 THE LEADING EDGE June 2015


>>> sigma = np.reshape(stat.loc[i-1,
covs[0]:covs[-1]].values,
Downloaded 01/02/24 to 103.240.194.208. Redistribution subject to SEG license or copyright; see Terms of Use at http://library.seg.org/page/policies/terms

(nlogs, nlogs))
>>> m = multivariate_normal(mean, sigma, NN)
>>> mc.ix[mc.LFC==i,1:] = m

The synthetic data set is therefore a copy of my original


data set in which we have added all the modifications obtained
through fluid-replacement modeling and have subtracted the
local discrepancies and outliers that often plague our under-
standing of the situation, leading us to see separation between
lithologies where they are absent or similarity between fluids
that are different. See Figure 4, in which the synthetic data set
is compared with the augmented data set.
This procedure also can be used as the basis for more
advanced work, for example, modeling the progressive argil-
Figure 3. Scatter matrix of (a) IP and (b) VP /VS for lithofluid class 2. lization of a reservoir or the reduction in porosity resulting
from burial depth or modeling lithologic rather than fluid
changes. See the discussion on training data in Avseth et al.
(2005), p. 126.

Conclusions
With this tutorial, I have shown two ways to create new data
DOI:10.1190/tle34060700.1

for a reservoir system, progressively increasing the distance from


the real situation encountered to allow us to make conjectures
and play with more data than we normally have. We have used
Python to also demonstrate how easy it is to move away from a
“black-box” approach, making it possible to adjust every part of
the workflow.

Corresponding author: [email protected]


Figure 4. Crossplots of IP and VP /VS of (a) augmented and (b) syn­-
thetic data.
References
I P , and VP /VS ) and rows equal to the number of samples multiplied Avseth, P., T. Mukerji, and G. Mavko, 2005, Quantitative seismic
by the number of classes (100 × 4 = 400): interpretation: Applying rock physics rules to reduce interpreta-
tion risk: Cambridge University Press.
Smith, T. M., C. H. Sondergeld, and C. S. Rai, 2003, Gassmann
>>> mc = pd.DataFrame(data=None,
fluid substitutions: A tutorial: Geophysics, 68, no. 2, 430–440,
columns=lognames0,
http://dx.doi.org/10.1190/1.1567211.
index=np.arange(100*nlfc), Wang, Z., 2001, Fundamentals of seismic rock physics: Geophys-
dtype='float') ics, 66, no. 2, 398–412, http://dx.doi.org/10.1190/1.1444931.

Then we fill in the LFC column with the numbers assigned


to each class:

>>> for i in range(1, nlfc+1):


>>> mc.loc[NN*i-NN:NN*i-1, 'LFC'] = i

Finally, for each class, we extract the average value mean and
the covariance matrix sigma from the stat DataFrame and then put © The Author(s). Published by the Society of Exploration
them into Python’s np.random.multivariate_normal func- Geophysicists. All article content, except where otherwise noted
tion to draw randomly selected samples from the continuous and (including republished material), is licensed under a Creative
correlated distributions of the properties I P and VP /VS: Commons Attribution 3.0 Unported License (CC BY-SA). See
http://creativecommons.org/licenses/by/3.0/. Distribution or
reproduction of this work in whole or in part commercially or
>>> for i in range(1, nlfc+1): noncommercially requires full attribution of the original publica-
>>> mean = stat.loc[i-1, tion, including its digital object identifier (DOI). Derivatives of
means[0]:means[-1]].values this work must carry the same license.

704 THE LEADING EDGE June 2015

You might also like