Geolog
Module tp_tvd White Paper
Prepared by
TW Trowbridge
June 1999
Table of Contents
1 INTRODUCTION
*1.1 Statement of Findings:
*1.2 Recommendations
*2 MODULE INTERFACE
*2.1 Recent Changes to Program:
*2.2 Hints for Module Interface Inputs
*2.3 Framing
*3 VERTICAL AND STRATIGRAPHIC THICKNESS
*3.1 Basic Formulas
*3.2 Sample Calculation
*3.3 Bed Dip and Interpolation Method
*4 CALCULATION of VT in GEOLOG
*4.1 Recommended Framing
*4.2 Alternatives
*4.3 A Caveat
*5 INTERVAL_SUM PROGRAM
*5.1 Utility Program Source Code
*This document presents general information about calculation of ‘True Vertical Thickness’, (VT) and includes findings and recommendations for use of Geolog module tp_tvd (the program) to calculate the VT related curves. For the most part, this document is devoted to the calculation of VT. The main reason is that calculation of VT generates more questions than calculations of TVD, MT or TMT, and because other thickness related curves ST, TVT or TST are all calculated from VT in the program. In general, where VT is mentioned, these other thickness related curves are implied.
This document also includes a utility program to calculate VT for selected intervals.
Statement of Findings:
The following statements are supported by sections of this document.
Recommendations
Recent Changes to Program:
Beginning in 6.15 there are two new features including option to extend TVD calculations to the full range of the reference depth, and calculation of additional ‘alternate’ TVDSS reference. The module interface (launcher) is used to prepare input/output data for the program. In 6.16 the module launcher proposes the use of REFERENCE.DEPTH as the ‘Sampling Control Log’.
Table 1: Module interface inputs.
|
Input Set |
Default Input Set |
|
|
Output Set |
Default Output Set |
|
|
Sampling Control Log |
Primary control for framing. In 6.16 the module launcher proposes REFERENCE.DEPTH to control framing. Changes to certain input parameters will erase this entry on screen. |
|
|
1 |
Calculation Method |
The module launcher defaults to tangential method. Purists recognize this method as out-dated and usually prefer an alternate such as ‘Radius of Curvature’. |
|
2 |
Number of Chords |
The number of chords used to subdivide arcs in calculations. |
|
3 |
Directional survey tool length |
Assumed length of tool. A tool length longer than a chord length can limit the length of the chord in calculations. |
|
4 |
First along hole depth |
Items 4 to 7 are used for deviation surveys NOT beginning at depth 0, such as ‘sidetrack’ surveys. These inputs set the start of well bore path in 3D space so that tp_tvd may continue on from there; the module does not really care what is the history of the path. The result is reference curves beginning with the first survey depth. Lacking data for inputs, and with an understanding of current needs the user may elect to edit the deviation survey by entering 0 for depth in the first frame of the sidetrack survey along with appropriate log values to approximate the path just before the sidetrack. Merging deviation surveys using tp_evaluate is always a choice. |
|
5 |
TVD of first point |
|
|
6 |
X offset of first point |
|
|
7 |
Y offset of first point |
|
|
8 |
Extend tvd output to range |
Extend calculations for output curves to the full range of REFERENCE.DEPTH even if valid deviation survey does not exist. Assumes direction is tangent to the arc at the last frame. |
|
9 |
Elevation meas reference |
Taken from the well header and used to calculate alternate tvd reference. |
|
10 |
Reference xoffset at bottom |
Places the well bore path in X and Y space. |
|
11 |
Reference yoffset at bottom |
|
|
12 |
Directional survey along hole depth |
Input deviation SURVEY curves used to calculate TVD related curves in items 18 through 21. DEPTH curve has impact on framing of input table pipe. |
|
13 |
Directional survey dip log |
|
|
14 |
Directional survey azimuth log |
|
|
15 |
Bed dip log |
Input curves used to calculate TVD related curves 22 through 27. These curves may be held in an alternate set. |
|
16 |
Bed azimuth log |
|
|
17 |
Reference depth log |
This depth curve should always be REFERENCE.DEPTH. If not, then the calculation of logs is not guaranteed to the full depth of TD. This occurs despite choice for ‘tvd extend’ or Sampling Control Log. |
|
18 |
Reference tvd log |
Output curves calculated from input of deviation survey. Alternate reference tvd is calculated by tvd – elev_meas_ref; offsets are distance from kb; mt is along bore thickness of frame, ie sample rate; tmt is sum of mt.
|
|
19 |
Alternate Reference tvd log |
|
|
20 |
Reference xoffset log |
|
|
21 |
Reference yoffset log |
|
|
22 |
Reference mt log |
|
|
23 |
Reference tmt log |
|
|
24 |
Reference vt log |
Output reference curves calculated from input of deviation survey and bed dip information. Calculation of vt related curves are discussed in Section 3. |
|
25 |
Reference tvt log |
|
|
26 |
Reference st log |
|
|
27 |
Reference tst log |
One of the main functions of the module launcher is to prepare data sent to the program, and pass results to the well database. This is controlled with framing, or the act of joining input/output data together into two tables of rows based on depth ranges, sample rates and interpolation methods. The curves that may affect framing in this program are listed below.
True Vertical Thickness (VT) is the vertical height of a bed measured from the top of the interval to its base, "directly below" the top of the interval, while True Stratigraphic Thickness (ST) is the height of a bed perpendicular to the bedding plane. The following diagram illustrates these values. The program calculates VT and accumulates these values into TVT, likewise with ST. In Geolog and in this document TVT refers to the sum of VT and TST refers to the sum of ST.
Basic Formulas
VT = md * cos(dev) - md * sin(dev) * tan(dip) * cos(waz-baz)
ST = md * cos(dev) * cos(dip) - md * sin(dev) * sin(dip) * cos(waz-baz)
Where md is measured depth along well bore path.
dev is well bore deviation from vertical.
waz is well azimuth at interval top.
baz is bed azimuth at interval base.
dip is bed plane dip from horizontal at interval base;
+ angle below horizontal,
- angle above horizontal
Figure 1. 2D diagram of wellbore intersecting beds
The following table illustrates the calculation of VT and ST related curves for Figure 1. Note that the calculation of VT relies on the bed dip at the base of the interval and not the top.
Table 2: Sample calculation of VT and ST
|
Depth |
top |
Waz |
dev |
Baz |
Dip |
VT |
ST |
TVT |
TST |
|
0 |
A |
0 |
45 |
0 |
0 |
598 |
518 |
598 |
518 |
|
2000 |
B |
0 |
45 |
0 |
30 |
4461 |
3864 |
5059 |
4381 |
|
6000 |
C |
0 |
45 |
0 |
-30 |
1414 |
1414 |
6473 |
5796 |
|
8000 |
D |
0 |
45 |
0 |
0 |
- |
- |
- |
- |
|
Interval from A to B: |
|||||||||
|
Md |
2000 |
Depth from A to B |
|||||||
|
cos(dev) |
0.7071 |
Cosine of well deviation from A to B |
|||||||
|
sin(dev) |
0.7071 |
sine of well deviation from A to B |
|||||||
|
tan(dip) |
0.5774 |
Tangent of bed dip at B |
|||||||
|
Ang |
0 |
Delta azimuth well A - bed B |
|||||||
|
cos(ang) |
1.0000 |
Cosine delta azimuth |
|||||||
|
Vt |
598 |
md * cos(dev) – md * sin(dev) * tan(dip) * cos(ang) |
|||||||
|
St |
518 |
md * cos(dev) * cos(dip) - md * sin(dev) * sin(dip) * cos(ang) |
|||||||
The previous calculations imply that all beds within an interval are parallel with the interval base. For example, VT for interval A assumes that all beds dip at 30 degrees within the interval. Likewise, all beds in Interval B dip at a constant –30 degrees, and so forth. This is true for unconformities where all beds in the interval are parallel and truncate up against the previous interval base, but what about the case where bedding planes within the interval are parallel according to the dip angle of the previous interval base. For instance, what if bedding planes in interval A are all parallel at 0 degrees. The resulting calculation of VT for the interval would be valid for that situation.
Dip meter data is commonly obtained at fractional units of depth, and so examples like this of large intervals does not really apply. The main issue is that calculation of VT for an interval, be it 0.1 ft or 8000 ft thick, relies on bed dip at the base of the interval and so the answer may not be useful if details about available bed dip information within the interval is ignored. Consider a single calculation of VT in the illustration from 0 to 8000 ft where bed dip at the base is 0 degrees and so VT equals TVD equals 6473 ft. Compare this with the calculation of TVT using well deviation of 30 degrees (not 45 degrees) and the sum of VT is 7505 ft. Alongside this issue is the method of interpolation, (TOPS, or CONTINUOUS). Different choices will result in different VT’s.
If details about bed dip were known and unintentionally ignored then this calculation would invalid, but if details are unknown (or consciously ignored) then the calculation of VT would be useful.
Table 3: Calculation of VT for sample data (modified 30 degree dev).
|
Depth |
waz |
dev |
baz |
Dip |
VT |
ST |
TVT |
TST |
|
0 |
0.0 |
30.0 |
0.0 |
0.0 |
1155 |
1000 |
1155 |
1000 |
|
2000 |
0.0 |
30.0 |
0.0 |
30.0 |
4619 |
4000 |
5774 |
500 |
|
6000 |
0.0 |
30.0 |
0.0 |
-30.0 |
1732 |
1732 |
7505 |
6732 |
|
8000 |
0.0 |
30.0 |
0.0 |
0.0 |
The main purpose of the program is to calculate reference curves, such as TVD for domain translation in Geolog. TVT is no exception. If the program is misused directly to calculate the ‘true vertical thickness’ or ‘true stratigraphic thickness’ for a given set of intervals, such as formations, then the program produces less than desirable results. The reason behind this is the way in which Geolog frames data to calculate VT, and the calculation of VT. As mentioned, framing is performed by the module launcher as it prepares data sent to the program, and then afterward to the well database in ‘table pipes’. For instance, assume calculation of VT using example deviation survey and bed dip information stored in common deviation survey set, and with output going to the REFERENCE set. The input table pipe for this example is shown below.
Table 4: Excerpt from input table pipe
depth depth dev waz dip baz depth
0 0 45 0 0 0 0
2000 609.6 45 0 30 0 609.6
6000 1828.8 45 0 -30 0 1828.8
8000 2438.4 45 0 - - 2438.4
The formula for VT relies on well azimuth and deviation at the top of the current interval, and bed azimuth and dip at the top of the next interval. For this reason the program lacks all the information it needs in the current frame to calculate VT, -not so with TVD curve. In this example, the program uses information from the second input frame in Table 4 to calculate all the output frames for REFERENCE set leading up to 2000 ft. Consider what if ‘dev’ in the second frame is 90 degrees instead of 45 degrees. This feature may be useful to achieve some special effect, but if used unintentionally then the results will be undesirable. Therefore, this Table serves as a common example of improper framing for calculating VT.
Proper calculation of VT requires a 1:1 relation between the number of input and output frames.
If framing is controlled by depth reference that is TOPS interpolation method and/or APERIODIC sample rate then values in the last frame of the input table pipe will go missing as shown in Table 4. This is due to the way in which TOPS data is created in the input table pipe, and discussion is not limited to just this program. The result is that the last one or two frames in the output table pipe will not be calculated. A way around this might be to add an extra frame to survey data, BUT since the recommendation is control framing by REFERENCE.DEPTH then seeing this is evidence that framing is probably not properly controlled.
Recommended Framing
Since its possible to improperly calculate VT, and since there is no practical way of knowing that the results are correct by just looking at the output, then there should be some recommendation that is simple to follow, and that will provide consistent and reliable results. Keeping in mind the goal is to maintain a 1:1 relationship between input and output table pipes, then the simplest recommendation is to specify REFERENCE.DEPTH as the ‘Sampling Control Log’, and REFERENCE as the output set shown in Figure 2. The module launcher in 6.16 offers this as the default, but the user soon finds this is erased as entries to input and output sets are made. The recommendation is to fill the screen, and then replace value of REFERENCE.DEPTH before launching module.
Given the example there are two possible solutions depending on whether input curves are TOPS or CONTINUOUS interpolation method. If TOPS then all bed dip from 0 to 2000 ft will be based on dip at A and NOT dip at B, and so forth; all bed dip within an interval is parallel to the roof. If CONTINUOUS, then bed dip is linear interpolation from 0 degrees at depth 0 to 30 degrees at depth 2000 ft, and so forth. If a third solution is desired that assume bed dip within an interval is parallel to dip of next interval, then addition frames should be inserted into bed dip set. Eg md = 1.0ft, dip = 30 degrees; md = 2001ft, dip = -30 degrees; md = 6001ft, dip = 0 degrees.
Ordinarily, the previous example with large intervals does not come up very often. More commonly there is detailed bed dip information over selected intervals, and so framing at the coarse sample rate of REFERENCE.DEPTH results in loss of detail. The choices are to be satisfied with framing by REFERENCE.DEPTH, or create a new REFERENCE set with finer sampling rate.

One alternate is to copy (edit/copy edit/paste) the well deviation/azimuth and bed dip/azimuth curves directly into the REFERENCE set, and to then specify REFERENCE as both input and output sets. This approach has the added benefit of ‘seeing’ exactly what information is being passed to the program. This becomes more important as TOPS or CONTINUOUS methods of interpolation for well and bed dip information is considered.
Another alternative is to specify REFERENCE.DEPTH as survey depth curve to force proper framing by virtue of being the first depth reference encountered by the module launcher.
Rightfully, VT should be reported beginning in the first frame. The program properly calculates VT, but reports a value of 0.0 in the first frame, and then begins storing calculated values in the second frame; VT for depth 0.0 to 1.0 is stored in the second frame. The program continues reporting VT throughout well depth including the last frame resulting in accurate reference TVT over the entire well depth, and indeed over any interval that does not include the first or last frame. Even so, the opinion is that TVT over any interval is reliable for most applications given realities of precision.
Performing a join in text view for the basic example shows values of TVD, TVT and TST at depths in the SURVEY set. Note that cumulative values in Figure 4 are valid for the depths reported, and that TVT and TST should not be misinterpreted as being interval thickness.
Figure 3: Joining Reference Curves in Text View.
There is a strong temptation to input well deviation and bed dip information into the tvd module, and output interval TVT’s directly into a TOPS set such as formations. The results are generally disappointing. Instead, a general-purpose utility program (interval_sum) should be used to sum curve values over intervals in a TOPS set. A proposed program is included.
Figure 4: Module interface for interval_sum program.

PROGRAM: INTERVAL_SUM Sum log values for given intervals
/*----------------------------------------------------------------------------
/*start_doc
/*
/* Trowbridge 30-May-99
/*
/*
/*
/*end_doc
/*----------------------------------------------------------------------------
INPUT
/*
/* INTERVALS ----------------------
/*
INTERVAL ALPHA /* Interval log
/*
/* LOGS ---------------------------
/*
DEPTH /* Depth Reference
LOG_VALUE /* Log values to sum over interval
LOCAL
tmp_tot /*
tmp_cum /*
OUTPUT
/*
/* LOGS ---------------------------
/*
TOT_VALUE /* Sum log values over interval
CUM_VALUE /* Cum log values over interval
START:
dowhile GET_FRAME ()
if INTERVAL_START () then
tmp_tot = 0
endif
tmp_tot = tmp_tot + nonmiss(LOG_VALUE, 0)
tmp_cum = tmp_cum + nonmiss(LOG_VALUE, 0)
if INTERVAL_FINISH () then
TOT_VALUE = tmp_tot
CUM_VALUE = tmp_cum
call PUT_FRAME ()
endif
enddo
end