Gas and Organic-Matter Corrections
On this page
Summary
Porosity logs are written for a rock of matrix and liquid. Kerogen, gas and salt break that assumption. This page removes the effect of kerogen, using Kerogen volume from TOC analysis, shows how gas is handled in neutron-density porosity, and explains why porosity is set to zero in salt. Apply it where TOC is significant or where gas or evaporites occur.
Inputs and outputs
| Item | Units | |
|---|---|---|
| Input | Bulk density | g/cm³ |
| Input | Neutron porosity | v/v |
| Input | Matrix density | g/cm³ |
| Input | Pore fluid density | g/cm³ |
| Input | Kerogen volume | v/v |
| Input | Kerogen density | g/cm³ |
| Input | Kerogen neutron response | v/v |
| Output | Kerogen as density porosity | v/v |
| Output | Density porosity | v/v |
| Output | Kerogen-corrected density porosity | v/v |
| Output | Kerogen-corrected neutron-density porosity | v/v |
Equations
Kerogen. Kerogen is a solid with a density far below the matrix, so the density log reads it as porosity. Let kerogen have volume \(\Vk\) and density \(\rhoK\). The density log reads as if the rock had an extra porosity of:
per unit of kerogen volume. The true porosity is therefore the apparent one minus the kerogen contribution:
This is exact when the bulk density is \(\rhob = \Vk\rhoK + \phit\rhoFl + (1 - \Vk - \phit)\rhoMa\). The neutron log reads kerogen as a porosity \(\phiNk\) (kerogen contains hydrogen), and the neutron-density average is corrected with the mean of the two kerogen responses:
The sonic correction has the same form, with \(\Delta t_k\) the kerogen slowness and a kerogen response \((\Delta t_k - \dtMa)/(\dtW - \dtMa)\) in place of \(\phiDk\).
Gas. Gas lowers the neutron response far below its liquid-filled value and lowers the density, but less. The root-mean-square form of the neutron-density combination reduces the loss, and the same combination is used for the kerogen response if the RMS form is used.
Salt. Halite has a density of about 2.04 g/cm³ and no porosity. A density log read against a sandstone matrix gives a large false porosity there. Porosity is set to the lowest allowed value wherever a salt flag is set.
| Symbol | Variable | Units | Typical range |
|---|---|---|---|
| \(\rho_b\) | Bulk density | g/cm³ | 1.8 to 3.0 |
| \(\phi_N\) | Neutron porosity | v/v | -0.02 to 0.60 |
| \(\rho_{ma}\) | Matrix density | g/cm³ | 2.65 to 2.87 |
| \(\rho_f\) | Pore fluid density | g/cm³ | 0.2 to 1.2 |
| \(\phi_t\) | Total porosity | v/v | 0 to 0.40 |
| \(\Delta t_{ma}\) | Matrix slowness | µs/ft | 47 to 60 |
| \(\Delta t_w\) | Fluid slowness | µs/ft | 180 to 200 |
| \(V_k\) | Kerogen volume | v/v | 0 to 0.4 |
| \(\rho_k\) | Kerogen density | g/cm³ | 1.1 to 1.4 |
| \(\phi_{N,k}\) | Kerogen neutron response | v/v | 0.4 to 0.8 |
| \(\phi_{D,k}\) | Kerogen as density porosity | v/v | 0.7 to 0.95 |
| \(\phi_D\) | Density porosity | v/v | 0 to 0.40 |
| \(\phi_D^{c}\) | Kerogen-corrected density porosity | v/v | 0 to 0.15 |
| \(\phi_{ND}^{c}\) | Kerogen-corrected neutron-density porosity | v/v | 0 to 0.15 |
Single-value calculator
Behavior
Each curve shows corrected density porosity falling in a straight line with kerogen volume, with a slope of \(-\phi_{D,k}\) = -0.84 porosity per unit kerogen volume for these densities: 10% kerogen removes 0.084 porosity. The three curves are three bulk densities. At a kerogen volume of 0.10 the corrected porosity is 0.098, 0.037 and 0 for bulk densities of 2.35, 2.45 and 2.55 g/cm³. The last is cut off at zero: the rock is dense enough that the kerogen alone accounts for the apparent porosity. Where the kerogen volume is too high (or the density too high), clipping hides an inconsistency, so check where the curve sits at zero.
Parameter guidance
Kerogen volume comes from the TOC analysis, converted as described on the Kerogen Volume and Maturity page. Use the same kerogen density in the conversion and here, or the corrected porosity is inconsistent. A kerogen volume error of 0.02 is a porosity error of 0.017.
Kerogen neutron response. Typical values quoted are 0.4 to 0.8. It is poorly known and should be checked against core. The result is far less sensitive to it than the density term, since it enters only half-weighted.
Gas. Use the RMS option, or a gas correction fitted to the formation. Do not apply both a gas correction and the RMS form to the same interval.
Salt. A salt flag from the density (about 2.04) with a very low neutron, or from the sonic (about 67 µs/ft), sets porosity to zero. Washouts in salt, caused by dissolution, make the density unreliable there.
Worked example
A shale with a true porosity of 0.06 and 10% kerogen, then a salt reading, then a gas-bearing sand:
rho_ma, rho_f, rho_k = 2.65, 1.00, 1.26
phi_true, v_ker, phin_ker = 0.06, 0.10, 0.65
# 1. Kerogen. Build the logs from a known rock, then recover the porosity.
rhob = v_ker * rho_k + phi_true * rho_f + (1 - v_ker - phi_true) * rho_ma
nphi = v_ker * phin_ker + phi_true * 1.0 # matrix neutron response taken as zero
phid_ker = (rho_ma - rho_k) / (rho_ma - rho_f)
phi_d = (rho_ma - rhob) / (rho_ma - rho_f)
phi_nd = (phi_d + nphi) / 2
print("Kerogen: true porosity 0.06, kerogen volume 0.10")
print(f" bulk density = {rhob:.3f}, neutron porosity = {nphi:.3f}")
print(f" kerogen as density porosity = {phid_ker:.4f}")
print(f" apparent density porosity = {phi_d:.4f} (high by {phi_d - phi_true:.4f})")
print(f" corrected density porosity = {phi_d - v_ker * phid_ker:.4f}")
print(f" apparent ND porosity = {phi_nd:.4f}")
print(f" corrected ND porosity = {phi_nd - v_ker * (phid_ker + phin_ker) / 2:.4f}")
print(f" error from a kerogen volume off by 0.02: {0.02 * phid_ker:.4f}")
# 2. Salt. Halite reads 2.04 g/cm3.
print()
print(f"Salt: density porosity at 2.04 g/cm3 with a 2.65 matrix = {(2.65 - 2.04) / (2.65 - 1.0):.3f}")
print(f" with the halite matrix 2.04: {(2.04 - 2.04) / (2.04 - 1.0):.3f}")
# 3. Gas. A gas-bearing sand: true porosity 0.20, flushed-zone gas saturation 0.30
phi, sxo_gas = 0.20, 0.30
rho_gas, hi_gas = 0.25, 0.30 # illustrative gas density and neutron response in the flushed zone
rho_fl = (1 - sxo_gas) * 1.0 + sxo_gas * rho_gas
rhob = (1 - phi) * rho_ma + phi * rho_fl
nphi = phi * ((1 - sxo_gas) * 1.0 + sxo_gas * hi_gas)
phi_d = (rho_ma - rhob) / (rho_ma - 1.0) # analyst assumes a water-filled pore
print()
print("Gas: true porosity 0.20, gas saturation in the flushed zone 0.30")
print(f" rhob = {rhob:.3f}, nphi = {nphi:.3f}, phi_D (water fluid) = {phi_d:.3f}")
print(f" average = {(phi_d + nphi) / 2:.3f} RMS = {((phi_d ** 2 + nphi ** 2) / 2) ** 0.5:.3f}")
print(f" density porosity with the mixed fluid density {rho_fl:.3f}: {(rho_ma - rhob) / (rho_ma - rho_fl):.3f}")
Output
Kerogen: true porosity 0.06, kerogen volume 0.10
bulk density = 2.412, neutron porosity = 0.125
kerogen as density porosity = 0.8424
apparent density porosity = 0.1442 (high by 0.0842)
corrected density porosity = 0.0600
apparent ND porosity = 0.1346
corrected ND porosity = 0.0600
error from a kerogen volume off by 0.02: 0.0168
Salt: density porosity at 2.04 g/cm3 with a 2.65 matrix = 0.370
with the halite matrix 2.04: 0.000
Gas: true porosity 0.20, gas saturation in the flushed zone 0.30
rhob = 2.275, nphi = 0.158, phi_D (water fluid) = 0.227
average = 0.193 RMS = 0.196
density porosity with the mixed fluid density 0.775: 0.200
Assumptions and limitations
- The kerogen volume is known and correct. TOC and its conversion to volume carry their own errors, covered on the TOC pages.
- Kerogen is a separate solid of constant density and neutron response. Bitumen or retained oil in the pores behaves like a fluid, not like kerogen.
- The matrix density is that of the inorganic minerals only. Using a matrix that already includes kerogen counts it twice.
- The gas correction by RMS is approximate. It removes part of the effect and does not use the gas saturation or density.
- The salt flag identifies salt reliably. Mixed salt and clastic intervals need care.
QC checks
- Corrected porosity is not negative. A zero floor over long intervals means kerogen volume is too high or matrix density too low.
- Corrected porosity compares with core porosity in the same organic-rich interval better than the apparent one does.
- The correction is large only where the kerogen volume is large. A correction that is not zero in a lean interval points to a TOC baseline problem.
- In gas zones the corrected neutron-density porosity does not fall below the corrected density porosity by an unreasonable amount.
- Porosity is zero across salt, and the density and neutron in the salt interval are close to their halite values.
Going Deeper
The kerogen correction is exact for the mixing model above and approximate only through its inputs: the kerogen density and neutron response vary with maturity and organic type. In unconventional work the correction is often as large as the porosity itself, which makes the TOC analysis the dominant uncertainty. The alternative is to treat kerogen as a component in a mineral inversion, where it is one more volume to solve and no separate correction is needed. Gas corrections in the literature use the hydrogen index and density of the gas and the flushed-zone saturation, and are more accurate than the RMS form when those are known.
References
- Passey, Q.R., Bohacs, K.M., Esch, W.L., Klimentidis, R. and Sinha, S., 2010. From oil-prone source rock to gas-producing shale reservoir: geologic and petrophysical characterization of unconventional shale gas reservoirs. SPE 131350, SPE International Oil and Gas Conference and Exhibition, Beijing.
- Gaymard, R. and Poupon, A., 1968. Response of neutron and formation density logs in hydrocarbon bearing formations. The Log Analyst, 9(5), 3–12.
- Asquith, G. and Krygowski, D., 2004. Basic Well Log Analysis, 2nd edition. AAPG Methods in Exploration Series 16, American Association of Petroleum Geologists, Tulsa, OK.
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.