CamPetro

Minimum Thickness

On this page

Summary

A cutoff flag taken sample by sample contains spikes and chatter: single samples that pass, and gaps of one or two samples inside a good bed. The thickness filter removes net beds thinner than Minimum bed thickness and bridges gaps thinner than Maximum bridged gap, so that the net thickness is made of beds that a tool can resolve and a completion can use. It changes Net-to-gross ratio, and the order in which the two steps are applied matters.

Inputs and outputs

Item Units
Input Net flag, a series of 0 and 1 per sample (Net reservoir flag or Net pay flag) 0 or 1
Input Minimum bed thickness (Minimum bed thickness) ft
Input Maximum bridged gap (Maximum bridged gap) ft
Input Sample spacing ft
Output Filtered net flag 0 or 1
Output Net-to-gross ratio (Net-to-gross ratio) v/v

Equations

Let the flag have samples of spacing \(\Delta z\). A run is a sequence of consecutive samples with the same flag value. With a run of \(n\) samples, its thickness is \(n\,\Delta z\). The two steps are:

  • Remove thin beds. A run of ones is set to zero if \(n\,\Delta z < \CpHMin\).
  • Bridge thin gaps. An interior run of zeros, with ones on both sides, is set to one if \(n\,\Delta z \le \CpHGap\). Gaps at the top and base of the interval are not bridged.

After the filter the net thickness and ratio are

\[ \text{net} = \sum_i \CpFlagP\,\Delta z \qquad \CpNTG = \frac{\text{net}}{\text{gross thickness}} \]

with \(\CpFlagP\) the filtered flag. Where the gap is bridged, the thickness of the gap is counted as net, so bridging adds net thickness; some workflows keep the gap out of the net thickness and only merge the beds.

Symbol Variable Units Typical range
\(F_{p}\) Net pay flag 0 or 1
\(h_{min}\) Minimum bed thickness ft 0.5 to 5
\(h_{gap}\) Maximum bridged gap ft 0 to 2
\(NTG\) Net-to-gross ratio v/v 0 to 1

Single-value calculator

No calculator: the filter acts on a whole flag array, not on a single value. The worked example below runs it on a small synthetic flag.

Behavior

The synthetic flag has 35.5 ft of gross interval and 17.0 ft of raw net (N/G 0.479). Removing beds under 1.5 ft only takes the net down to 13.5 ft (0.380). Bridging gaps of 1.0 ft or less only takes it up to 20.0 ft (0.563). Applying both gives a result that depends on the order: removing and then bridging gives 14.0 ft (0.394), and bridging and then removing gives 20.0 ft (0.563). In the second order, a thin bed next to a thin gap and a thicker bed is first joined to the thicker bed and so survives; in the first order it has been deleted before the gap could be bridged. The order alone therefore moves the net-to-gross ratio by 0.17, from 0.394 to 0.563, which is as large as the effect of the filter itself.

Parameter guidance

Minimum bed thickness. Set it from the vertical resolution of the logs that make the flag, which is typically about 2 ft for the density and neutron tools and more for resistivity, and from the thinnest interval that can be perforated or that matters to the geological model. Values from 0.5 to 5 ft are common, and 1 to 2 ft is a usual starting range, which I would check against the tools in use. Bridged gap. A gap is bridged when it is thin enough to be a noise break or a thin non-reservoir parting that does not block flow: use the same resolution argument, and note that tight streaks that act as barriers should not be bridged. Zero switches it off. Order. Choose one and state it. Removing first is the conservative choice, because spikes cannot join beds, and bridging first gives a higher net-to-gross. Which flag. The filter can be applied to net reservoir, to net pay, or to both. Filtering net reservoir and then testing saturation can give a different answer from filtering the net pay flag. Sample spacing. The thickness of a run is its sample count times the spacing, so the same filter on a resampled curve gives a different result: apply it at a fixed spacing.

Worked example

A synthetic net flag over 35.5 ft at 0.5 ft spacing, filtered with a minimum bed of 1.5 ft and a bridged gap of 1.0 ft, in four ways. Each line is the flag top to base, with # for net:

import numpy as np
from itertools import groupby

def runs(flag):
    return [(int(v), len(list(g))) for v, g in groupby(flag)]

def rebuild(rs):
    return np.concatenate([np.full(n, v, dtype=int) for v, n in rs])

def remove_thin_beds(flag, dz, h_min):
    return rebuild([(0 if (v == 1 and n * dz < h_min) else v, n) for v, n in runs(flag)])

def bridge_gaps(flag, dz, h_gap):
    rs = runs(flag)
    return rebuild([(1 if (v == 0 and 0 < i < len(rs) - 1 and n * dz <= h_gap) else v, n) for i, (v, n) in enumerate(rs)])

# a net flag at 0.5 ft sampling, given as (value, number of samples) runs: 35.5 ft in all
spec = [(0, 6), (1, 2), (0, 1), (1, 8), (0, 3), (1, 1), (0, 2), (1, 4), (0, 1), (1, 3), (0, 10),
        (1, 2), (0, 2), (1, 2), (0, 8), (1, 12), (0, 4)]
flag = np.concatenate([np.full(n, v) for v, n in spec])
dz, h_min, h_gap = 0.5, 1.5, 1.0
gross = len(flag) * dz
show = lambda f: ''.join('#' if x else '.' for x in f)
cases = {
    'raw net flag': flag,
    'remove thin beds only': remove_thin_beds(flag, dz, h_min),
    'bridge gaps only': bridge_gaps(flag, dz, h_gap),
    'remove, then bridge': bridge_gaps(remove_thin_beds(flag, dz, h_min), dz, h_gap),
    'bridge, then remove': remove_thin_beds(bridge_gaps(flag, dz, h_gap), dz, h_min),
}
print(f'gross interval {gross} ft; minimum bed {h_min} ft, bridged gap up to {h_gap} ft; # = net')
for name, f in cases.items():
    print(f'{name:22s} {show(f)}  net {f.sum() * dz:5.1f} ft  N/G {f.sum() * dz / gross:.3f}')
beds = [n * dz for v, n in runs(cases['remove, then bridge']) if v == 1]
print('beds after remove, then bridge (ft):', beds)

Output

gross interval 35.5 ft; minimum bed 1.5 ft, bridged gap up to 1.0 ft; # = net
raw net flag           ......##.########...#..####.###..........##..##........############....  net  17.0 ft  N/G 0.479
remove thin beds only  .........########......####.###........................############....  net  13.5 ft  N/G 0.380
bridge gaps only       ......###########...###########..........######........############....  net  20.0 ft  N/G 0.563
remove, then bridge    .........########......########........................############....  net  14.0 ft  N/G 0.394
bridge, then remove    ......###########...###########..........######........############....  net  20.0 ft  N/G 0.563
beds after remove, then bridge (ft): [4.0, 4.0, 6.0]

Assumptions and limitations

  • A single minimum thickness and a single gap limit suit the whole interval. A thin bed in a low-resolution log is not a better-resolved bed.
  • The flag is at constant sample spacing, so that thickness is proportional to the sample count.
  • Bridged gaps are permeable. A thin shale or a tight streak in the gap may be a barrier to vertical flow, and bridging hides it.
  • The minimum thickness is a property of the tools and the completion, not of the rock. It does not remove the effect of a thin bed on a log reading that is too thin to be read correctly.

QC checks

  • Plot the raw and the filtered flag next to the logs. Removed beds should be spikes, and bridged gaps should be thin breaks.
  • Report net-to-gross before and after the filter; a large change means that the interval has many thin beds and that the parameters matter.
  • Check that the filter is applied after the cutoff flags and before the thicknesses are summed or the averages calculated.
  • Check the first and last runs of the interval: they are cut at the zone boundary and should not be treated as thin beds because of that.
  • The same minimum thickness is used in every well of the study, or the differences are explained.

Going Deeper

The vertical resolution of a log is the length over which it averages, typically a foot or two for density and neutron and larger for deep resistivity. Beds thinner than that are not measured, only smeared, so a thin bed is under-read, and a thickness filter is a way of declaring those beds below the level of confidence. In thinly bedded sand and shale the filter does not solve the problem: the thin sands carry net pay that the logs cannot see, and the approach for that is the laminated sand analysis, which treats the interval as a mixture of sand and shale. A minimum thickness that removes the thin sands also removes real net pay, so it should be a deliberate choice.

References

References will be added once verified.

Python reference implementation

Python reference implementation

The Python reference implementation is available to registered users with a verified email address. Register or sign in to view it.