Cutoffs Analysis
On this page
Purpose
A cutoff turns a continuous curve into a decision: is this rock reservoir, and does it hold pay? The thicknesses and net-to-gross ratios that result are the numbers that go into volumetrics, maps, reserves and perforation picks, so this step is where the petrophysical interpretation becomes a quantity of hydrocarbon. It does not compute a new property. It decides which parts of the properties already computed are counted.
Cutoffs are choices, not measurements. The same logs with different cutoffs give different net pay, and the step is about making that choice, applying it consistently, and showing how much it matters.
Position in the workflow
Upstream. Cutoffs use everything the earlier steps produced: Clay volume from Clay Volume, Effective porosity from Porosity, Water saturation from Water Saturation, and Permeability from Permeability. Swirr is the reference for judging a water saturation cutoff. Core and test data decide the cutoffs themselves.
Downstream. The flags and thicknesses feed volumetrics, where pore volume, hydrocarbon pore volume, porosity-thickness and permeability-thickness are summed over net reservoir or net pay only, and then mapping, reserves and completion design.
Error propagation. Each cutoff turns a continuous error into a threshold error, and the three levels are ANDed, so an error in any one input removes or adds a sample to the net pay, whole samples at a time. Clay volume errors reach net pay twice: directly through the clay volume cutoff, and indirectly because effective porosity and, in a shaly-sand model, water saturation are computed from it. A porosity error moves samples across the porosity cutoff, and a saturation error moves samples across the saturation cutoff. The effect is largest where many samples sit near a cutoff, so a thick, uniform, clean reservoir is insensitive and a heterogeneous or marginal one is not. The simulated interval below has 120 ft of gross thickness and 48.0 ft of net pay at cutoffs of 0.40 for clay volume, 0.08 for porosity and 0.60 for water saturation. A clay volume that is too high by 0.05 loses 4.5 ft, 9% of the net pay. A porosity that is too low by 0.01 loses 4.0 ft, 8%. A water saturation that is too high by 0.05 loses 3.0 ft, 6%. The same errors in the other direction gain less, because the property distributions are not symmetric about the cutoff. These shifts are applied one at a time. In practice they are correlated, because a clay volume error also moves porosity and saturation.
import numpy as np
# a simulated 120 ft interval at 0.5 ft spacing, made of beds 0.5 to 4 ft thick
rng = np.random.default_rng(11)
dz = 0.5
vcl, phie, sw = [], [], []
while len(vcl) < 240:
nbed = int(rng.integers(1, 9))
v = rng.beta(1.5, 3.0)
p = np.clip(0.25 * (1 - v) * rng.uniform(0.35, 1.1), 0.01, 0.35)
s = np.clip(0.25 + 0.9 * v + rng.normal(0, 0.1), 0.05, 1.0)
for _ in range(nbed):
vcl.append(np.clip(v + rng.normal(0, 0.03), 0, 1))
phie.append(np.clip(p + rng.normal(0, 0.008), 0.0, 0.4))
sw.append(np.clip(s + rng.normal(0, 0.03), 0.02, 1))
vcl, phie, sw = (np.array(x[:240]) for x in (vcl, phie, sw))
def thickness(v, p, s, cut_vcl=0.40, cut_phi=0.08, cut_sw=0.60):
gross = v <= cut_vcl
net_res = gross & (p >= cut_phi)
net_pay = net_res & (s <= cut_sw)
return gross.sum() * dz, net_res.sum() * dz, net_pay.sum() * dz
base = thickness(vcl, phie, sw)
print('gross interval 120.0 ft; gross reservoir {:.1f}, net reservoir {:.1f}, net pay {:.1f} ft (net pay / gross {:.2f})'.format(*base, base[2] / 120))
print(f"{'error in the input':20s} {'net pay (ft)':>12} {'change':>8}")
for name, args in (('Vcl +0.05', (vcl + 0.05, phie, sw)), ('Vcl -0.05', (vcl - 0.05, phie, sw)),
('phie -0.01', (vcl, phie - 0.01, sw)), ('phie +0.01', (vcl, phie + 0.01, sw)),
('Sw +0.05', (vcl, phie, sw + 0.05)), ('Sw -0.05', (vcl, phie, sw - 0.05))):
pay = thickness(*args)[2]
print(f'{name:20s} {pay:12.1f} {100 * (pay - base[2]) / base[2]:7.1f}%')
Output
gross interval 120.0 ft; gross reservoir 59.5, net reservoir 55.0, net pay 48.0 ft (net pay / gross 0.40)
error in the input net pay (ft) change
Vcl +0.05 43.5 -9.4%
Vcl -0.05 50.0 4.2%
phie -0.01 44.0 -8.3%
phie +0.01 49.5 3.1%
Sw +0.05 45.0 -6.2%
Sw -0.05 50.0 4.2%
Key concepts
Nested levels. Gross reservoir is the rock that passes a lithology test, net reservoir is the part with enough storage and flow, and net pay is the part that also holds hydrocarbon. Each is a subset of the one before. The Gross Reservoir, Net Reservoir, and Net Pay page defines them and the flags.
A cutoff has a purpose. The cutoff for a volume of hydrocarbon in place is not the cutoff for a completion or for producible reserves. State the purpose, the fluid and the development plan with every cutoff.
Cutoffs and averages move together. Averages such as porosity and saturation are taken over the flagged rock. A higher porosity cutoff removes thickness and raises the average porosity of what remains, so the product of the two, porosity-thickness, changes much less than either. Always report net thickness together with the averages and the cutoffs that produced them.
Evidence for a cutoff. Core relates porosity, permeability and clay volume. Tests relate fluid and rate to saturation and quality. Flow-capacity and storage-capacity curves show what each cutoff costs. See Choosing Cutoff Curves and Values.
Thickness filter. Flags made sample by sample contain spikes and chatter. A minimum bed thickness and a bridged gap clean them up and change net-to-gross; see Minimum Thickness.
Method selection guide
| Topic | Inputs | Use when | Strengths | Weaknesses |
|---|---|---|---|---|
| Gross, net reservoir and net pay | Vcl, porosity, permeability, Sw; four cutoffs | Always: this is the flagging itself | Simple, transparent, reproducible | Step function; sensitive to log errors near a cutoff |
| Choosing cutoffs: core-based | Core porosity and permeability; a permeability criterion | Core exists in the rock type | Ties the cutoff to flow | Plug bias; needs a transform and its scatter |
| Choosing cutoffs: Sw crossplots | Test results; Sw against porosity or permeability | Tests with known fluid are available | Direct evidence of what produces | Few tests; completion effects |
| Choosing cutoffs: flow and storage capacity | Core k, porosity, thickness | A basis is needed to defend a permeability cutoff | Shows the cost of each cutoff in flow and storage | Silent on economics and fluid |
| Choosing cutoffs: sensitivity | The whole workflow | Always, as the last step | Shows how much the choice matters | Needs all the logs and a range of values |
| Minimum thickness | A net flag; thickness limits | Logs are noisy or the section is thinly bedded | Removes spikes and chatter | Order of operations matters; can delete real thin pay |
Decision guidance
- Use all three levels (gross, net reservoir and net pay) and keep them nested, so that downstream users can pick the one they need.
- Base the permeability cutoff on a producibility argument for the fluid, and derive the porosity cutoff from it through the transform. Do not choose a porosity cutoff alone.
- Use test data for the saturation cutoff wherever it exists. Without it, relate it to Swirr and report the range.
- Run a sensitivity analysis before quoting net pay, and report the range with the number.
- Add the thickness filter last, and state its parameters and the order.
Shared parameter picking
Cutoff set per zone and per purpose. Clay volume cutoff, Porosity cutoff, Permeability cutoff and Water saturation cutoff are set once for a zone and purpose, and applied the same way in every well. If the rock changes, the zone changes.
Curves. Use effective porosity and a water saturation on a matching basis; see Total vs Effective Sw. Use the same curves in the cutoff and in the average, and the same ones in every well.
Thickness filter. Minimum bed thickness and Maximum bridged gap are shared by every flag in the zone and are set from the vertical resolution of the logs.
Sample spacing. Thickness is the sample count times the spacing. Keep the spacing the same in every well, or work in depth.
Reporting. Report the cutoffs, the curves, the purpose, the thickness filter and the sensitivity range with every net pay number.
Recommended default approach
Absent other information, a careful generalist would:
- State the purpose, the fluid and the zone, and group the data by rock type.
- Fit a porosity-permeability transform to core for each rock type, with its scatter.
- Choose a permeability cutoff from a producibility argument for the fluid, and convert it to a porosity cutoff with the band.
- Choose the clay volume cutoff from core permeability against clay volume, and the water saturation cutoff from tests, or from Swirr with a margin.
- Flag gross reservoir, net reservoir and net pay in that order.
- Apply a thickness filter, with a minimum bed and a bridged gap set from the log resolution.
- Run a sensitivity on each cutoff and report net pay as a range.
- Compare with perforations, tests and production.
Combining methods
There are two things to combine. The first is the criteria within a flag: tests on different curves are ANDed, so a sample has to pass all of them. An OR is correct only where there are two alternative definitions of reservoir, for example a clean sand and a fractured tight interval, each with its own rule. The second is evidence for a single cutoff. Core, tests and capacity curves give separate values for the same cutoff, and they should be reconciled and not averaged: take the one that is best supported for the purpose, and carry the others as the low and high cases. When the values disagree, find the reason (plug bias, completion damage, wrong fluid) before choosing.
QC of results
A good result:
- has net pay inside net reservoir inside gross reservoir at every sample,
- uses cutoffs that can be traced to core, tests or a producibility argument, and are written down,
- agrees with perforated and producing intervals and with test results,
- has a net-to-gross ratio that varies smoothly between wells with the geology, and
- comes with a sensitivity range, so that the cutoff choice is visible.
Signs of a bad result: a net-to-gross that jumps between neighbouring wells because the cutoffs differ, net pay in rock that tested water, thin spikes of net in a shale, and a net pay number with no cutoffs given.
Common pitfalls
- Choosing a porosity cutoff with no permeability or flow argument behind it.
- Using different cutoffs in different wells of one zone without a geological reason.
- Regressing porosity on log permeability to convert a permeability cutoff to porosity.
- Using total porosity or total Sw in a cutoff written for effective values.
- Ignoring the scatter of the porosity-permeability transform, which makes a porosity cutoff a band.
- Applying the same cutoffs for volumes and for reserves or completions.
- Quoting net pay without the cutoffs, curves and thickness filter that gave it.
- Taking a net-to-gross from a filter whose parameters and order were not recorded.
- Treating a flag as if it were smooth: a small log error near a cutoff changes the net pay by whole samples.
- Using a clay volume cutoff in a laminated sand-shale section, where the sand is clean at a scale below the tool.
Going Deeper
Cutoffs started as rules of thumb, with fixed porosity and saturation values carried from one field to the next, and the standard complaint ever since has been that they are not tied to what the reservoir does. The modern view is that a cutoff has meaning only against a production criterion, and that net pay is a model of what a well will produce, not a property of the rock. Work in this direction ties cutoffs to dynamic data, to mobility, and to the recovery process, and replaces the single value with a distribution so that net pay is a range with a probability. Another line of work avoids cutoffs by carrying the full property distribution into the reservoir model, and leaves the dynamic model to decide what flows. Where reserves are reported, a fixed set of cutoffs and a clear record of how it was chosen is still the usual requirement.