Hydraulic Flow Units and Winland R35
On this page
Summary
Rock is grouped into Hydraulic flow unit classes so that each class has its own porosity-permeability relation and its own saturation-height curve. The Winland R35 estimates the pore throat radius at 35% mercury saturation from porosity and permeability, and the Flow zone indicator from the Reservoir quality index and Normalized porosity separates classes by pore geometry. Use them to define rock types before fitting capillary pressure models.
Inputs and outputs
| Item | Units | |
|---|---|---|
| Input | Permeability | mD |
| Input | Effective porosity | v/v |
| Output | Winland R35 | µm |
| Output | Reservoir quality index | µm |
| Output | Normalized porosity | v/v |
| Output | Flow zone indicator | µm |
Equations
Winland R35. The pore throat radius at 35% mercury saturation, in micrometres, from permeability in mD and porosity in percent:
Flow zone indicator. From the Kozeny-Carman relation, with \(k\) in mD and \(\phie\) as a fraction:
Rearranged, the permeability of a unit with a given FZI is
where \(1014 = 1/0.0314^2\). Points of the same hydraulic flow unit fall on one line of slope 1 of \(\log \CpRQI\) against \(\log \CpPhiZ\), whose intercept is FZI.
Clustering. A flow unit is a cluster of samples with similar FZI. In practice the logarithm of FZI is clustered (for example by k-means, or by probability plot partitioning) into a chosen number of units, and each log sample is assigned to the nearest cluster centre.
| Symbol | Variable | Units | Typical range |
|---|---|---|---|
| \(k\) | Permeability | mD | 0.0001 to 10000 |
| \(\phi_e\) | Effective porosity | v/v | 0 to 0.35 |
| \(R_{35}\) | Winland R35 | µm | 0.05 to 50 |
| \(RQI\) | Reservoir quality index | µm | 0.01 to 5 |
| \(\phi_z\) | Normalized porosity | v/v | 0.05 to 0.7 |
| \(FZI\) | Flow zone indicator | µm | 0.1 to 10 |
| Hydraulic flow unit |
Single-value calculator
Behavior
R35 rises with permeability and falls with porosity at a given permeability, because for the same permeability a rock with more porosity must have smaller throats. On the log-log plot each curve is a straight line, with slope 0.588. At 10 mD, R35 is 3.47, 2.01 and 1.29 µm for porosities of 0.08, 0.15 and 0.25. At the defaults of 10 mD and 0.15, RQI is 0.256 µm, the normalized porosity is 0.176 and the FZI is 1.45 µm. Across a range of rocks from 0.1 mD at 0.08 porosity to 1000 mD at 0.25, R35 goes from 0.231 to 19.4 µm and FZI from 0.404 to 5.96 µm.
Parameter guidance
Port size classes. R35 is commonly grouped into megaport (above 10 µm), macroport (2 to 10), mesoport (0.5 to 2), microport (0.2 to 0.5) and nanoport (below 0.2) classes. These break points are quoted from memory and from the usual Winland-based classification; adjust them to the rocks, as the classes are only labels.
Porosity units. Winland takes porosity in percent. The calculator takes a fraction and multiplies by 100, and a porosity in v/v used in place of percent shifts R35 by a factor of \(100^{0.864} \approx 53.4\).
Number of units. Start with the number of units that FZI plots show, on a histogram or a probability plot of log FZI, and check that the cluster centres are well separated. More units fit the data better and generalize worse. Three to six is typical.
Use in the saturation-height model. Fit the J-Sw coefficients, Swirr relation and porosity-permeability transform for each unit, as described on the Permeability, RQI and FZI page. The porosity basis (effective here) has to be the same in every step.
Worked example
Synthetic plug data from three flow units (FZI near 0.6, 1.8 and 4.5 µm) are clustered on log FZI with k-means into three units, and the permeability of each unit centre at a porosity of 0.18 is computed. The random scatter is generated with a fixed seed so the numbers are repeatable.
import math, random
random.seed(7)
data = []
for fzi0, phis in ((0.6, (0.07, 0.09, 0.11, 0.13, 0.15, 0.17)), (1.8, (0.10, 0.13, 0.16, 0.19, 0.22, 0.24)), (4.5, (0.15, 0.18, 0.21, 0.24, 0.27, 0.30))):
for phi in phis:
fzi = fzi0 * math.exp(random.gauss(0, 0.12))
k = 1014.2 * fzi ** 2 * phi ** 3 / (1 - phi) ** 2
data.append((k, phi, fzi))
def r35(k, phi):
return 10 ** (0.732 + 0.588 * math.log10(k) - 0.864 * math.log10(100 * phi))
lf = [math.log10(d[2]) for d in data]
# 1-D k-means on log10(FZI), centres started at the minimum, median and maximum
cent = [min(lf), sorted(lf)[len(lf) // 2], max(lf)]
for _ in range(50):
groups = [[] for _ in cent]
for x in lf:
groups[min(range(len(cent)), key=lambda i: abs(x - cent[i]))].append(x)
cent = [sum(g) / len(g) if g else c for g, c in zip(groups, cent)]
print(f'{len(data)} samples, permeability {min(d[0] for d in data):.2f} to {max(d[0] for d in data):.0f} mD')
print(f"{'unit':>4} {'n':>3} {'FZI centre':>11} {'k at phi 0.18 (mD)':>19} {'R35 at that point':>18}")
for i, c in enumerate(sorted(cent)):
n_i = sum(1 for x in lf if min(range(len(cent)), key=lambda j: abs(x - cent[j])) == cent.index(c))
fzi = 10 ** c
phi = 0.18
k = 1014.2 * fzi ** 2 * phi ** 3 / (1 - phi) ** 2
print(f'{i + 1:4d} {n_i:3d} {fzi:11.2f} {k:19.1f} {r35(k, phi):18.2f}')
Output
18 samples, permeability 0.14 to 745 mD
unit n FZI centre k at phi 0.18 (mD) R35 at that point
1 6 0.58 3.0 0.85
2 6 1.93 32.7 3.45
3 6 4.22 156.5 8.67
Assumptions and limitations
- Winland R35 is a regression on a set of sandstone samples. It is not valid for rock types with different pore systems, and carbonates with vugs or fractures lie far from the trend.
- Porosity and permeability are the core plug (or core-calibrated log) values on the same basis, and the permeability is the air permeability corrected to Klinkenberg.
- FZI is constant within a unit, which holds only if the unit has a single Kozeny-Carman style pore geometry. Mixed pore systems give an FZI that varies with porosity.
- The number of clusters is chosen by the user, and the result depends on it and on the starting values of the clustering.
- Flow units from FZI are statistical groups, not necessarily geological facies. A unit can combine different geological rock types and split one into two.
QC checks
- RQI against normalized porosity plotted on log-log axes forms parallel unit-slope lines, one per flow unit. Unit-slope bands that overlap mean too many clusters.
- R35 is the order of magnitude of the pore throat radius from mercury data on the same rocks. A factor of 2 to 3 disagreement is normal; ten times is not.
- Every unit has enough core samples to fit its capillary pressure and Swirr relations. Remove or merge units with fewer than about five plugs.
- The units are in sensible order along the well: abrupt changes between adjacent samples point to noise in the permeability curve.
- FZI and R35 rank the samples in much the same order. A disagreement points to a rock outside the range of the Winland data.
Going Deeper
Winland's relation was derived from a set of sandstone samples with mercury capillary pressure data, and R35 was chosen because the throat size at 35% mercury saturation was found to give the best fit to the porosity-permeability data. It has been used since to rank reservoir quality and to define the pore throat size of the pay. The flow zone indicator comes from a different line of thought: Amaefule and co-authors took the Kozeny-Carman relation and showed that on a log-log plot points of one hydraulic unit fall on a line of unit slope. The two measures answer the same question, where Winland needs only the two core curves and returns a physical length, and FZI separates units that Winland would merge. The mapping to saturation-height models is the main reason for this page: rock types control the curves. A tighter, finer-throated unit has higher entry pressure, a more gradual transition zone and a higher irreducible saturation, so a single set of coefficients over a section with several units gives an average curve that is wrong in each. The usual protocol is to assign units from logs through a permeability curve and then apply unit-specific saturation-height functions.
References
- Amaefule, J.O., Altunbay, M., Tiab, D., Kersey, D.G. and Keelan, D.K., 1993. Enhanced reservoir description: using core and log data to identify hydraulic (flow) units and predict permeability in uncored intervals/wells. SPE 26436, SPE Annual Technical Conference and Exhibition, Houston, TX.
- Pittman, E.D., 1992. Relationship of porosity and permeability to various parameters derived from mercury injection-capillary pressure curves for sandstone. AAPG Bulletin, 76(2), 191–198.
- Kolodzie, S., 1980. Analysis of pore throat size and use of the Waxman-Smits equation to determine OOIP in Spindle Field, Colorado. SPE 9382, SPE Annual Technical Conference and Exhibition.
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.