Capillary Pressure and the Leverett J-Function
On this page
Summary
Capillary pressure measured in the laboratory on a core plug has to be converted to the reservoir fluids before it can be used. The conversion scales Laboratory capillary pressure by the interfacial tension and contact angle of the two fluid pairs, gives the Reservoir capillary pressure, and turns it into a Height above free water level with the density contrast. The Leverett J-function removes the rock-specific scale from the laboratory curve so that samples can be compared.
Inputs and outputs
| Item | Units | |
|---|---|---|
| Input | Laboratory capillary pressure | psi |
| Input | Laboratory interfacial tension | dyne/cm |
| Input | Laboratory contact angle | degrees |
| Input | Reservoir interfacial tension | dyne/cm |
| Input | Reservoir contact angle | degrees |
| Input | Permeability | mD |
| Input | Effective porosity | v/v |
| Input | Fluid density contrast | g/cm³ |
| Output | Leverett J-function | dimensionless |
| Output | Reservoir capillary pressure | psi |
| Output | Height above free water level | ft |
Equations
A capillary tube of radius \(r\) holds a column of wetting fluid against the pressure difference
where \(\sigma\) is the interfacial tension and \(\theta\) the contact angle. For one pore throat size the capillary pressure is therefore proportional to \(\sigma\cos\theta\), and a laboratory measurement is converted to reservoir fluids with the ratio of the two products:
The Leverett J-function scales the laboratory capillary pressure by the interfacial properties and by a length that stands for the pore size, \(\sqrt{k/\phie}\):
with \(\PcLab\) in psi, \(\sigma\) in dyne/cm (the same as mN/m), \(k\) in mD and \(\phie\) as a fraction. The constant 0.2166 is the unit conversion for those units: 1 psi is 68 947.6 dyne/cm\(^2\), and 1 mD is \(9.869\times10^{-12}\) cm\(^2\), so \(\sqrt{k}\) is \(3.1416\times10^{-6}\) cm for \(k\) = 1 mD, and \(68\,947.6 \times 3.1416\times10^{-6} = 0.2166\). In consistent units (pressure in Pa, \(\sigma\) in N/m, \(k\) in m\(^2\)) the constant is 1. Mercury has a contact angle above 90 degrees, so \(\sigma\cos\theta\) is negative for air-mercury data; use its magnitude in both formulas.
The hydrocarbon column above the free water level exerts a buoyancy pressure on the pore throats. Its height follows from the pressure gradient of the density contrast, with 0.433 psi/ft the gradient of fresh water (specific gravity 1):
Together, a laboratory point converts to a height by \(\hFWL = \PcLab\,(\sigRes\cos\thetaRes)\,/\,\left[(\sigLab\cos\thetaLab)\,0.433\,\dRhoHC\right]\). The height also has an exact metric form: \(h = P_c/(g\,\Delta\rho)\) with \(g\) = 9.81 m/s\(^2\).
| Symbol | Variable | Units | Typical range |
|---|---|---|---|
| \(P_{c,lab}\) | Laboratory capillary pressure | psi | 0.1 to 2000 |
| \(\sigma_{lab}\) | Laboratory interfacial tension | dyne/cm | 20 to 500 |
| \(\theta_{lab}\) | Laboratory contact angle | degrees | 0 to 140 |
| \(\sigma_{res}\) | Reservoir interfacial tension | dyne/cm | 20 to 70 |
| \(\theta_{res}\) | Reservoir contact angle | degrees | 0 to 60 |
| \(k\) | Permeability | mD | 0.0001 to 10000 |
| \(\phi_e\) | Effective porosity | v/v | 0 to 0.35 |
| \(\Delta\rho\) | Fluid density contrast | g/cm³ | 0.1 to 0.9 |
| \(J\) | Leverett J-function | dimensionless | 0.05 to 10 |
| \(P_{c,res}\) | Reservoir capillary pressure | psi | 0 to 500 |
| \(h\) | Height above free water level | ft | 0 to 1000 |
Single-value calculator
Behavior
Height rises in proportion to the laboratory pressure, so on the log-log plot every curve is a straight line of slope 1, and the density contrast moves the line without changing its slope. A smaller contrast means a taller column for the same pressure. At 100 psi of air-brine laboratory pressure the reservoir pressure is 36.1 psi, and contrasts of 0.10, 0.25 and 0.50 g/cm³ give heights of 833, 333 and 167 ft. With the defaults the J-function at 100 psi is 2.24. The J-function itself does not depend on the reservoir fluids: converting the same sample to mercury, 100 psi of air-mercury pressure gives J = 0.439 and a reservoir pressure of 7.07 psi, which is the same reservoir pressure as 19.6 psi of air-brine pressure would give.
Parameter guidance
Interfacial tension and contact angle. Typical textbook values for the laboratory pairs are 72 dyne/cm and 0 degrees for air and brine, and 480 dyne/cm and 140 degrees for air and mercury. For the reservoir pair, 30 dyne/cm and 30 degrees are often used for oil and water, and 50 dyne/cm and 0 degrees for gas and water. These are generic values, not measurements: interfacial tension falls with temperature, gas density and dissolved gas, and the contact angle depends on wettability. Replace them with measured values or an equation of state result when the fluid properties are known, and remember that they rescale the whole saturation-height curve. Interfacial tension and contact angle enter only as the product, so any pair giving the same product has the same effect.
Density contrast. Use the reservoir brine and hydrocarbon densities, for example 1.05 for brine and 0.80 for oil gives 0.25 g/cm³. A gas column has a much larger contrast, often 0.7 to 0.9. The pair is not switched automatically by fluid type, so change it when the column changes.
Permeability and porosity. Use the core plug values measured with the capillary pressure, on the same porosity basis as the rest of the model. How the J-function is then turned into a saturation profile is on the Permeability, RQI and FZI page.
Worked example
A laboratory air-brine capillary pressure of 100 psi on a plug of 10 mD and 0.18 porosity, converted to oil and water in the reservoir, and the same sample expressed as air-mercury:
import math
def sc(sigma, theta):
return abs(sigma * math.cos(math.radians(theta)))
k, phi, drho = 10.0, 0.18, 0.25
pc_lab = 100.0
pc_res = pc_lab * sc(30, 30) / sc(72, 0)
j = 0.2166 * pc_lab / sc(72, 0) * math.sqrt(k / phi)
print(f'air-brine: sigma cos(theta) lab {sc(72, 0):.1f}, reservoir {sc(30, 30):.2f} dyne/cm')
print(f'Pc,res = {pc_lab:g} x {sc(30, 30):.2f} / {sc(72, 0):.1f} = {pc_res:.2f} psi')
print(f'height = {pc_res:.2f} / (0.433 x {drho:g}) = {pc_res / (0.433 * drho):.0f} ft')
print(f'J = {j:.3f}')
# the same rock saturation measured with mercury: the same J needs a different lab pressure
pc_hg = j * sc(480, 140) / (0.2166 * math.sqrt(k / phi))
print(f'the same J in air-mercury: Pc,lab = {pc_hg:.1f} psi')
print(f' converted to the reservoir: {pc_hg * sc(30, 30) / sc(480, 140):.2f} psi (same as above)')
print()
print('rocks of different quality need different pressure for the same J = 1')
for kk, pp in ((1, 0.10), (10, 0.18), (100, 0.25)):
p = 1.0 * sc(30, 30) / (0.2166 * math.sqrt(kk / pp))
print(f' k {kk:5.0f} mD, phi {pp:.2f}: Pc,res = {p:5.1f} psi, height = {p / (0.433 * drho):5.0f} ft')
Output
air-brine: sigma cos(theta) lab 72.0, reservoir 25.98 dyne/cm
Pc,res = 100 x 25.98 / 72.0 = 36.08 psi
height = 36.08 / (0.433 x 0.25) = 333 ft
J = 2.242
the same J in air-mercury: Pc,lab = 510.7 psi
converted to the reservoir: 36.08 psi (same as above)
rocks of different quality need different pressure for the same J = 1
k 1 mD, phi 0.10: Pc,res = 37.9 psi, height = 350 ft
k 10 mD, phi 0.18: Pc,res = 16.1 psi, height = 149 ft
k 100 mD, phi 0.25: Pc,res = 6.0 psi, height = 55 ft
Assumptions and limitations
- The pore system behaves like a bundle of capillary tubes, so capillary pressure scales with \(\sigma\cos\theta\). For a real rock with a different wettability from the laboratory test, the scaling is only an approximation.
- The contact angle is known. Air-brine and mercury tests are strongly wetting tests with a fixed angle, while the reservoir contact angle is uncertain and may change with height as the surface wettability changes.
- The J-function collapses the curves of one rock type. It does not collapse samples with different pore geometry, for which the \(\sqrt{k/\phi}\) scale is not the right length.
- Laboratory pressure is not affected by stress or by slip or clay effects that the reservoir sample would see. Overburden-corrected porosity and permeability are used.
- Gravity is the only force acting on the column. Dynamic effects, such as hydrodynamic tilt of the contact, are outside this conversion.
QC checks
- Reservoir pressures are smaller than laboratory pressures for air-brine data: the ratio is the ratio of \(\sigma\cos\theta\) (about 0.36 for the generic pairs). A reservoir pressure that is larger points to swapped inputs.
- Plot J against water saturation for all plugs of one rock type on log axes. The points should form a single narrow band. A broad band means more than one rock type.
- The height obtained for the pressure at the lowest water saturation of the plug is of the order of the real column height. If it is far taller, the plug was driven harder than the reservoir ever was.
- Units: pressure in psi, tension in dyne/cm, permeability in mD and porosity as a fraction. A J-function that is 1000 times too large means permeability in the wrong unit.
Going Deeper
The J-function goes back to Leverett, who proposed it from data on unconsolidated sands. Its value is that it separates what depends on the fluids (interfacial tension and wettability) from what depends on the rock (pore size, represented by the length \(\sqrt{k/\phi}\)). Within a rock type it lets laboratory curves from plugs of different permeability collapse, so one saturation-height function can be used for the whole interval, with permeability and porosity from logs. Where the data do not collapse, the cause is usually a second rock type, or a pore system in which permeability is not set by the same throats as capillary pressure (fractures, vugs or very clayey rock). Mercury injection gives a different pressure scale from the reservoir, because mercury does not wet any rock and the reservoir fluids are usually wetting to a degree; conversion by \(\sigma\cos\theta\) is accepted practice, but contact angle differences are the largest single uncertainty in it. The pore size link also lets capillary pressure be used to estimate pore throat radii from \(r = 2\sigma\cos\theta/P_c\), which is the basis of the Winland R35 classification.
References
- Leverett, M.C., 1941. Capillary behavior in porous solids. Transactions of the AIME, 142(1), 152–169.
- Tiab, D. and Donaldson, E.C., 2015. Petrophysics: Theory and Practice of Measuring Reservoir Rock and Fluid Transport Properties, 4th edition. Gulf Professional Publishing (Elsevier).
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.