PET-440 · Lesson 6 of 12 · 18 min

Gas well testing and pseudo-pressure

The C-4 deliverability test gave a stabilized line and an AOF, but it did not say why the well performs as it does. Is the formation permeability high and the well damaged, or is the rock poorer than mapped and the completion clean? How much of the apparent skin comes from non-Darcy flow? Pressure transient analysis answers those questions. Farid asks Ethan to design and interpret a two-rate drawdown on C-4 with a downhole gauge, and to set up the same analysis for the long shut-ins planned in the Montney wells. “The equations are the oil equations,” he says, “once you put the gas in the right variables.”

Why gas needs special variables

The diffusivity equation for slightly compressible liquids is linear because the fluid's viscosity and compressibility are nearly constant. For gas, both change strongly with pressure, and density is proportional to p/z. Writing the continuity equation and Darcy's law for a real gas gives:

\[\frac{1}{r}\frac{\partial}{\partial r}(r\,\frac{p}{\mu z}\,\frac{\partial p}{\partial r}) = \frac{\phi c_t}{k}\,\frac{p}{\mu z}\,\frac{\partial p}{\partial t}\]

The equation is nonlinear because μ, z and c_t depend on p. Al-Hussainy, Ramey and Crawford (1966) removed most of the nonlinearity by defining the real-gas pseudo-pressure:

\[m(p) = 2\int_{p_0}^{p} \frac{p'}{\mu(p')\,z(p')}\,dp'\]

Written in m(p), the left side of the gas diffusivity equation becomes the same as the liquid equation. The right side still contains μc_t, which varies with pressure, but for drawdowns and buildups of moderate size, evaluating it at the initial or average pressure is accurate. Pseudo-time, defined by Agarwal (1979) with μc_t inside a time integral, handles the remaining nonlinearity when pressures change a lot, as in long tests in tight rock. With these substitutions, every solution of the liquid diffusivity equation, every type curve and every derivative plot carries over to gas.

Pseudo-pressure has awkward units, MPa²/(mPa·s) (psi²/cp), but it is easy to compute: integrate p/(μz) numerically from the gas property table of Lesson 2. At low pressure, where μz is roughly constant, m(p) is proportional to p², which is why the pressure-squared equations of Lesson 5 work there. At high pressure, where p/(μz) is roughly constant, m(p) is linear in p. In between, only m(p) is exact.

Drawdown and buildup analysis

In infinite-acting radial flow, after wellbore storage has ended and before the boundaries are felt, the flowing pseudo-pressure falls linearly with the logarithm of time. In field units, with q in Mscf/d and T in °R:

\[m(p_{wf}) = m(p_i) - \frac{1637\,q\,T}{k h}(\log t + \log\frac{k}{\phi \mu_i c_{ti} r_w^2} - 3.23 + 0.869\,s')\]

The slope of m(p_wf) against log t on a semilog plot, m', gives the permeability-thickness product: kh = 1637 qT/m'. The value on the straight line at one hour gives the apparent skin s'. Buildup analysis uses Horner time, (t_p + Δt)/Δt, in exactly the same way, with the extrapolated pseudo-pressure at Horner time 1 giving m(p*) and from it an estimate of average pressure. The apparent skin from a gas test is the sum of the mechanical skin s, from damage, partial penetration or stimulation, and the rate-dependent skin D q:

\[s' = s + D\,q\]

A single test cannot separate the two. Two tests at different rates can: plotting s' against q gives a straight line with intercept s and slope D. This is the most important practical result of gas well testing, because the remedies differ completely. Mechanical damage can be removed with an acid or a refracture; non-Darcy skin is reduced by spreading the flow over more of the formation with more perforations, a longer interval or a fracture.

Pseudo-pressure of the Halfway sandstone pool gas and analysis of a two-rate drawdown on C-4: permeability from the semilog slope, apparent skin at each rate, and the true skin and non-Darcy coefficient.
# Real-gas pseudo-pressure m(p) and a two-rate drawdown test on the C-4 well:
# permeability from the semilog slope, apparent skin at each rate, then true skin and the non-Darcy coefficient D.
import math
SI = True      # True: metric units, False: oilfield units
def sutton(gg):
    return 169.2 + 349.5 * gg - 74.0 * gg ** 2, 756.8 - 131.07 * gg - 3.6 * gg ** 2

def z_dak(Tpr, ppr):
    """Dranchuk-Abou-Kassem z-factor by fixed-point and Newton iteration."""
    A = [0.3265, -1.0700, -0.5339, 0.01569, -0.05165, 0.5475, -0.7361, 0.1844, 0.1056, 0.6134, 0.7210]
    c1 = A[0] + A[1] / Tpr + A[2] / Tpr ** 3 + A[3] / Tpr ** 4 + A[4] / Tpr ** 5
    c2 = A[5] + A[6] / Tpr + A[7] / Tpr ** 2
    c3 = A[8] * (A[6] / Tpr + A[7] / Tpr ** 2)
    def f(z):
        r = 0.27 * ppr / (z * Tpr)
        return z - (1 + c1 * r + c2 * r ** 2 - c3 * r ** 5 + A[9] * (1 + A[10] * r ** 2) * r ** 2 / Tpr ** 3 * math.exp(-A[10] * r ** 2))
    z = 1.0
    for _ in range(100):
        d = (f(z + 1e-7) - f(z)) / 1e-7
        zn = z - f(z) / d
        if abs(zn - z) < 1e-10: return zn
        z = zn
    return z

def mu_lge(T_R, rho_gcc, M):
    K = (9.4 + 0.02 * M) * T_R ** 1.5 / (209 + 19 * M + T_R)
    X = 3.5 + 986 / T_R + 0.01 * M
    return 1e-4 * K * math.exp(X * rho_gcc ** (2.4 - 0.2 * X))

gg, T_R = 0.65, 160 + 459.67; M = 28.966 * gg
Tpc, ppc = sutton(gg)
def props(p):
    z = z_dak(T_R / Tpc, p / ppc)
    rho = p * M / (z * 10.732 * T_R) / 62.428
    return z, mu_lge(T_R, rho, M)
# m(p) = 2 * integral of p / (mu z) dp, by the trapezoid rule in 10 psi steps
P = [0.0]; Mp = [0.0]; f_old = 0.0
for i in range(1, 251):
    p = 10.0 * i; z, mu = props(p); f = p / (mu * z)
    Mp.append(Mp[-1] + (f + f_old) * 10.0); P.append(p); f_old = f
mp = lambda p: Mp[int(p // 10)] + (Mp[int(p // 10) + 1] - Mp[int(p // 10)]) * (p % 10) / 10
def p_of(m):
    i = max(j for j in range(len(Mp)) if Mp[j] <= m)
    return P[i] + 10 * (m - Mp[i]) / (Mp[i + 1] - Mp[i])

conv = 6.894757 ** 2 / 1e6        # converts psi2/cp to MPa2/(mPa.s)
print(" p kPa     m(p) MPa2/(mPa.s)" if SI else " p psia    m(p) psi2/cp")
for pin in ([3500, 7000, 10500, 14000, 14341] if SI else [500, 1000, 1500, 2000, 2080]):
    p = pin * 0.145038 if SI else pin
    print(f"{pin:7,.0f}   {mp(p) * conv:10.1f}" if SI else f"{pin:7,.0f}   {mp(p):12.4e}")

# Synthetic test data from the radial solution (true k 80 mD, h 26 ft, skin 2.0, D 2.5e-4 per Mscf/d)
k, h, phi, rw, S, D, pi = 80.0, 26.0, 0.14, 0.35, 2.0, 2.5e-4, 2080.0
zi, mui = props(pi)
cg = 1 / pi - (z_dak(T_R / Tpc, pi * 1.001 / ppc) - z_dak(T_R / Tpc, pi * 0.999 / ppc)) / (0.002 * pi) / zi
ct = cg * 0.76 + 3e-6 * 0.24 + 4e-6
def pwf(q, t):
    mprime = 1637 * q * T_R / (k * h)
    return p_of(mp(pi) - mprime * (math.log10(t) + math.log10(k / (phi * mui * ct * rw ** 2)) - 3.23 + 0.869 * (S + D * q)))
results = []
for q in (5000.0, 10000.0):                   # Mscf/d
    times = [1, 2, 4, 8, 16]
    data = [(t, round(pwf(q, t), 1)) for t in times]
    # analysis: slope of m(pwf) against log t, then k and the apparent skin S' at this rate
    xs = [math.log10(t) for t, p in data]; ys = [mp(p) for t, p in data]
    n = len(xs); mx, my = sum(xs) / n, sum(ys) / n
    slope = -sum((a - mx) * (b - my) for a, b in zip(xs, ys)) / sum((a - mx) ** 2 for a in xs)
    k_est = 1637 * q * T_R / (slope * h)
    m1 = my + slope * mx                       # m(pwf) at 1 hour on the straight line
    Sp = 1.151 * ((mp(pi) - m1) / slope - math.log10(k_est / (phi * mui * ct * rw ** 2)) + 3.23)
    results.append((q, Sp))
    qq = f"{q * 0.0283168:,.0f} 10^3 m3/d" if SI else f"{q / 1000:.0f} MMscf/d"
    pw = ", ".join(f"{t} h {p / 0.145038:,.0f}" if SI else f"{t} h {p:,.0f}" for t, p in data)
    print(f"Rate {qq}: pwf {pw}")
    print(f"   k = {k_est:.2f} mD, apparent skin S' = {Sp:.2f}")
(q1, s1), (q2, s2) = results
Dfit = (s2 - s1) / (q2 - q1); Sfit = s1 - Dfit * q1
print(f"True skin {Sfit:.2f}; non-Darcy D = {Dfit / 0.0283168:.2e} per (10^3 m3/d)" if SI else
      f"True skin {Sfit:.2f}; non-Darcy D = {Dfit:.2e} per Mscf/d")
Output
 p kPa     m(p) MPa2/(mPa.s)
  3,500        975.3
  7,000       3885.6
 10,500       8592.6
 14,000      14823.0
 14,341      15498.4
Rate 142 10^3 m3/d: pwf 1 h 13,844, 2 h 13,826, 4 h 13,808, 8 h 13,790, 16 h 13,772
   k = 80.00 mD, apparent skin S' = 3.26
Rate 283 10^3 m3/d: pwf 1 h 13,202, 2 h 13,165, 4 h 13,128, 8 h 13,090, 16 h 13,053
   k = 79.84 mD, apparent skin S' = 4.48
True skin 2.04; non-Darcy D = 8.63e-03 per (10^3 m3/d)
A semilog plot of the drop in pseudo-pressure in hundreds of MPa squared per mPa second against flowing time from 0.1 to 100 hours. Two curves rise steeply at early time and then follow straight lines. The lower blue line for 142 thousand cubic metres per day passes through dots between 1 and 16 hours at about 10 to 11. The upper red line for 283 thousand cubic metres per day passes through dots at about 22 to 25. The upper line has twice the slope and starts more than twice as high.
The two C-4 drawdowns. Both semilog lines give the same permeability; the higher rate shows a larger apparent skin because of the non-Darcy term.

The analysis recovers a permeability of 80 mD for the 7.9-m net interval, an apparent skin of about 3.3 at the lower rate and 4.5 at the higher rate, a mechanical skin of 2.0 and a non-Darcy coefficient of about 8.6 × 10⁻³ per 10³ m³/d (2.4 × 10⁻⁴ per Mscf/d). At 283 × 10³ m³/d (10 MMscf/d), the non-Darcy term contributes a skin of about 2.4, more than the mechanical damage. That matches the LIT result of Lesson 5, where about a fifth of the drawdown went into non-Darcy flow. Ethan's recommendation follows: a small acid wash would remove part of the mechanical skin, but adding perforations over the full net interval, which the original completion left partly unperforated, would cut both terms.

Worked problem

Permeability and skin from a semilog drawdown

A gas well flows at 4,000 Mscf/d (113 × 10³ m³/d) with T = 640 °R and h = 40 ft. The semilog slope of m(p_wf) is 2.6 × 10⁶ psi²/cp per cycle, and m(p_i) − m(p_1h) = 1.85 × 10⁷ psi²/cp. Take log(k/(φμc_t r_w²)) = 8.4 once k is known. Find k and s'.

Show solution
  1. kh = 1637 × 4,000 × 640 / (2.6 × 10⁶) = 1,612 mD·ft, so k = 1,612 / 40 = 40 mD.
  2. Apparent skin: s' = 1.151 × (1.85 × 10⁷ / 2.6 × 10⁶ − 8.4 + 3.23) = 1.151 × (7.12 − 8.4 + 3.23) = 1.151 × 1.95 = 2.2.
  3. With a second test at 8,000 Mscf/d giving s' = 3.4, D = (3.4 − 2.2) / 4,000 = 3.0 × 10⁻⁴ per Mscf/d and s = 2.2 − 1.2 = 1.0.

Answer: k is about 40 mD, the apparent skin 2.2 at 4,000 Mscf/d, the mechanical skin 1.0 and D about 3 × 10⁻⁴ per Mscf/d. Half of the apparent skin at the higher rate is rate-dependent.

The derivative plot and flow regimes

Modern test interpretation relies on the log-log plot of the pseudo-pressure change and its derivative with respect to the logarithm of time, introduced by Bourdet in 1983. Each flow regime has a signature. Wellbore storage gives a unit slope on both curves at early time. Infinite-acting radial flow gives a flat derivative, whose level gives kh. Linear flow, into a fracture or along a channel, gives a half slope; bilinear flow, in a finite-conductivity fracture, a quarter slope. A closed boundary gives a late unit slope in drawdown and a falling derivative in buildup, and a constant-pressure boundary such as a strong aquifer a falling derivative in both. The derivative plot is a diagnostic first and a calculation second: identify the regimes, then apply the right specialized analysis to each.

Testing tight and shale gas wells

In the Montney, a conventional test would take far too long. With permeability in the microdarcy range, radial flow around a horizontal well with dozens of fractures would not develop for years. What a Caribou Ridge well shows instead is linear flow from the matrix into each hydraulic fracture, often lasting for the first one to five years of production. In linear flow the pseudo-pressure change grows with the square root of time, and the slope of Δm against √t gives the product of fracture face area and the square root of matrix permeability, A√k, not k by itself. That product is what controls the well's early performance.

Because shut-ins are costly in such wells, the industry now interprets the production data itself, a method called rate-transient analysis. The daily rates and flowing pressures from the wellhead, converted to bottomhole conditions, are normalized as rate-normalized pseudo-pressure, Δm/q, and plotted against material balance pseudo-time. The same flow regime signatures appear: a half slope for linear flow, then a unit slope when the stimulated region begins to deplete. Rate-transient analysis gives A√k, the end of linear flow and a minimum estimate of the gas in contact with the well. Lesson 8 uses these results to build the type well.

Designing a gas well test

Good tests are designed, not just run. The design sets the gauge type and placement, the flow rates and durations and the shut-in times, from a forward simulation with the best current estimate of the reservoir. Ethan's checklist for C-4 covers several points. Use a downhole gauge with memory, because wellhead pressures in gas wells are affected by liquid in the tubing and temperature changes. Flow long enough at each rate to reach at least one log cycle of radial flow after wellbore storage ends. Choose two rates that differ by at least a factor of two so that D can be resolved. Measure gas, condensate and water rates continuously. Record the separator conditions for the condensate-gas ratio. For sour wells in British Columbia, follow the BCER's requirements on flaring and on hydrogen sulphide safety during the test, and conserve the gas into the gathering system wherever possible.

Common mistakes

  • MistakeAnalysing a gas buildup in pressure rather than pseudo-pressure at high pressure.

    InsteadUse m(p), and pseudo-time when pressures change greatly.

  • MistakeReporting the apparent skin from a single rate as formation damage.

    InsteadTest at two or more rates and separate s from D q.

  • MistakeReading radial flow permeability from a half-slope period.

    InsteadA half slope is linear flow; analyse it on a square-root-of-time plot for A√k.

  • MistakeUsing wellhead pressures for transient analysis in a well producing liquids.

    InsteadUse a downhole gauge; liquid in the tubing distorts the wellhead response.

Summary and key terms

  • Real-gas pseudo-pressure, m(p) = 2∫p/(μz) dp, linearizes the gas diffusivity equation so liquid solutions apply.
  • The semilog slope of m(p) gives kh; the one-hour intercept gives the apparent skin s'.
  • Apparent skin equals mechanical skin plus rate-dependent skin, s' = s + Dq; two rates separate them.
  • The Bourdet derivative identifies wellbore storage, radial, linear, bilinear and boundary flow regimes.
  • Tight and shale gas wells show long linear flow; its square-root-of-time slope gives A√k.
  • Rate-transient analysis treats production data as a long well test.
Pseudo-pressure
The integral 2∫p/(μz) dp, used in place of pressure for gas flow.
Pseudo-time
A time variable that includes the pressure-dependent product μc_t.
Apparent skin
The total skin measured in a gas test, including rate-dependent non-Darcy skin.
Bourdet derivative
The derivative of pressure change with respect to the logarithm of time, used for diagnosis.
Linear flow
Flow along parallel streamlines, as from the matrix into a planar fracture; gives a half slope on the derivative.
Rate-transient analysis
Interpretation of production rates and flowing pressures with transient flow theory.

Practice problems

Work each problem on paper first, then reveal the answer to check.

  1. At low pressure, m(p) is proportional to what?

    Show answer

    p², because μz is roughly constant.

  2. Two tests give s' = 4.0 at 3 MMscf/d and 6.0 at 7 MMscf/d. Find s and D.

    Show answer

    D = 2.0 / 4,000 = 5 × 10⁻⁴ per Mscf/d; s = 4.0 − 1.5 = 2.5.

  3. What does a half slope on the derivative indicate?

    Show answer

    Linear flow.

  4. Why are shut-in tests rarely used to find permeability in shale gas wells?

    Show answer

    Radial flow takes years to develop; linear flow dominates, so production data are analysed instead.

Lesson quiz · 5 questions

Score 60% or more to complete this lesson.

Take the quiz