Lucia
On this page
Summary
Lucia's rock-fabric approach gives the Water saturation of a carbonate reservoir rock from its porosity, its Height above free water level and its Rock fabric number, which sets the pore-size class of the rock. It is a capillary-pressure based saturation-height relation, not a resistivity equation: resistivity enters only when the rock fabric is calibrated. Use it in carbonates where Archie's constant exponents fail and where the rock fabric can be identified.
Inputs and outputs
| Item | Units | |
|---|---|---|
| Input | Total porosity | v/v |
| Input | Height above free water level | ft |
| Input | Rock fabric number | dimensionless |
| Output | Water saturation | v/v |
Equations
For each rock-fabric class, water saturation is a power function of height above the free water level and of porosity:
The constants depend on the class, which is set by the rock fabric number \(\CpRFN\):
| Class | Rock fabric number | A | B | C | Typical rock |
|---|---|---|---|---|---|
| 1 | 0.5 to 1.5 | 0.02219 | 0.316 | 1.745 | Grain-dominated, large pores |
| 2 | 1.5 to 2.5 | 0.1404 | 0.407 | 1.440 | Grain-dominated packstone |
| 3 | 2.5 to 4.0 | 0.6110 | 0.505 | 1.210 | Mud-dominated, small pores |
The result is limited to the interval 0 to 1. Height is in feet and porosity is a fraction. The relation describes the transition zone and the irreducible saturation above it, and it has no solution at zero height. When a log-derived saturation is also available, Archie with a variable \(m\) can be used to solve for the rock fabric number (the value that makes the two agree).
| Symbol | Variable | Units | Typical range |
|---|---|---|---|
| \(h\) | Height above free water level | ft | 0 to 1000 |
| \(\phi_t\) | Total porosity | v/v | 0 to 0.40 |
| \(RFN\) | Rock fabric number | dimensionless | 0.5 to 4 |
| \(S_w\) | Water saturation | v/v | 0 to 1 |
Single-value calculator
Behavior
Water saturation falls with height and with porosity, and the rock fabric number sets the level. At 15% porosity, a class 1 rock (RFN 1) has Sw of 0.294, 0.177, 0.142 and 0.114 at heights of 10, 50, 100 and 200 ft above the free water level. A class 2 rock (RFN 2) has 0.845, 0.439, 0.331 and 0.250, and a class 3 rock (RFN 3) has 1.0 (limited), 0.841, 0.593 and 0.418. At 100 ft the three classes differ by a factor of four, from 0.14 to 0.59. Class 3 stays at 1 up to about 36 ft: a mud-dominated rock needs a longer column to hold any hydrocarbon.
Parameter guidance
Rock fabric number is the main input. It comes from core (capillary pressure or petrographic description) or from log-based calibration, and is held constant in a zone. Height above the free water level is from the depth and the free water level, which should be picked from pressure data or the oil-water contact. Porosity: Lucia's relations were developed for interparticle porosity. Where separate vugs are significant, use the interparticle porosity (total minus separate-vug porosity), which can be estimated from the difference between total porosity and sonic porosity. Total porosity from the Porosity step is the simple choice for rocks with little vuggy porosity. In a resistivity-based calculation in the same rock, Lucia also proposed a cementation exponent that rises with the separate-vug fraction (see Going Deeper). The step page (Water Saturation) explains where this method fits. See also Swirr from Lucia, which uses the same relations at the top of the column.
Worked example
Water saturation at 15% porosity for the three classes at several heights, and the effect of porosity at one height:
def sw_lucia(phi, h, rfn):
if rfn <= 1.5:
s = 0.02219 * h ** -0.316 * phi ** -1.745
elif rfn <= 2.5:
s = 0.1404 * h ** -0.407 * phi ** -1.440
else:
s = 0.6110 * h ** -0.505 * phi ** -1.210
return min(1.0, max(0.0, s))
print(f"{'h (ft)':>7} {'RFN 1':>7} {'RFN 2':>7} {'RFN 3':>7} (porosity 0.15)")
for h in (10, 50, 100, 200):
print(f"{h:7d} {sw_lucia(0.15, h, 1.0):7.3f} {sw_lucia(0.15, h, 2.0):7.3f} {sw_lucia(0.15, h, 3.0):7.3f}")
print()
print("Porosity effect at h = 100 ft, RFN 2:")
for phi in (0.08, 0.12, 0.16, 0.20, 0.25):
print(f" porosity {phi:.2f} Sw = {sw_lucia(phi, 100.0, 2.0):.3f}")
# height at which class 3, 15% porosity first drops below 1
h = 1.0
while sw_lucia(0.15, h, 3.0) >= 1.0:
h += 0.1
print(f"class 3 at 15% porosity reaches Sw < 1 at about {h:.1f} ft")
Output
h (ft) RFN 1 RFN 2 RFN 3 (porosity 0.15)
10 0.294 0.845 1.000
50 0.177 0.439 0.841
100 0.142 0.331 0.593
200 0.114 0.250 0.418
Porosity effect at h = 100 ft, RFN 2:
porosity 0.08 Sw = 0.818
porosity 0.12 Sw = 0.456
porosity 0.16 Sw = 0.302
porosity 0.20 Sw = 0.219
porosity 0.25 Sw = 0.159
class 3 at 15% porosity reaches Sw < 1 at about 35.6 ft
Assumptions and limitations
- Capillary equilibrium: the reservoir is in vertical capillary equilibrium with the free water level, so saturation depends on height only through the capillary relation.
- The rock fabric number is correct and constant in the zone. A mixed zone of different classes needs a layer-by-layer assignment.
- The relation holds for the porosity range and the fluid pair of the data it was fitted to. Different hydrocarbon densities change the pressure at a given height. Check whether the heights are for oil-water or gas-water.
- Porosity is the interparticle porosity. Separate vugs add porosity that carries no capillary-pressure signal.
- A free water level is known. Where it is not, the result is not meaningful.
QC checks
- Sw falls with height above the free water level, and is 1 or near 1 at the free water level.
- Sw from this relation agrees with resistivity-based Sw (Archie with an appropriate m) in clean parts of the reservoir. A systematic offset means the rock fabric number or the free water level is wrong.
- The rock fabric number is within 0.5 to 4, and changes in it follow geology (facies, diagenesis), not noise.
- Core capillary-pressure data, converted to reservoir conditions, plot on the same class curve.
- Class 3 intervals near the base of a column have Sw close to 1 and do not appear as pay.
Going Deeper
Lucia's rock-fabric classification links pore-size distribution to the geological description of carbonate rock. The key point is that, in carbonates, porosity alone does not predict permeability or saturation, because the same porosity can be coarse and grain-supported or fine and mud-supported. The rock fabric number places a rock on a continuous scale between classes, and from it permeability and saturation are computed with relations fitted to core. In the resistivity branch of the method, Lucia proposed that the cementation exponent rises with the proportion of separate-vug porosity, as \(m = 2.14\,\phi_{sv}/\phi_t + 1.76\), where \(\phi_{sv}\) is the separate-vug porosity (total porosity minus sonic porosity). With a rock fabric number from core, the same classes give saturation-height functions without any resistivity log, which is why the method is often used to cross-check a resistivity-based saturation in carbonates.
References
- Lucia, F.J., 1995. Rock-fabric/petrophysical classification of carbonate pore space for reservoir characterization. AAPG Bulletin, 79(9), 1275–1300.
- Lucia, F.J., 2007. Carbonate Reservoir Characterization: An Integrated Approach, 2nd edition. Springer-Verlag, Berlin Heidelberg.
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.