Exerciseschevron_rightChapter 15chevron_right15.9
fitness_center

Exercise 15.9

Gas Dehydration - Water Content & Dew-Point Spec

Level 2
Chapter 15: Gas Engineering
descriptionProblem

Gas must be dehydrated before entering a pipeline to prevent hydrate formation and corrosion. Calculate the water content of a 0.65 gravity gas at 1,000 psia and 100°F using the McKetta-Wehe chart correlation. If the pipeline spec requires a dew point of -10°F, how much water must be removed per MMscf?

---

Raw gas off an OML-58 wellhead arrives at the dehydration unit saturated with water. Before it can enter the export pipeline it must be dried down to a contractual dew-point spec; otherwise free water drops out, forming hydrates and corroding the line. Your job is to size the duty: how many pounds of water per MMscf the glycol contactor has to strip out.

The water a sweet gas can hold at saturation is read off the classic McKetta-Wehe chart. We give you a verified field-unit fit of that chart. The Bukacek-form correlation water_content(T_F, P_psia) -> lb water/MMscf, computed as W = A/P + B with T_R = T_F + 459.67, A = 10(-2984.404/T_R + 10.05791) and B = 10(-2111.516/T_R + 4.40081). Do not modify or re-derive it. It is regressed to reproduce McKetta-Wehe sweet-gas chart reads to within chart-reading accuracy. (The chart is essentially gravity-insensitive for sweet gas, so the documented GAMMA_G = 0.65 is informational only.)

The embedded field constants are: GAMMA_G = 0.65, P_PSIA = 1000.0, T_INLET_F = 100.0, and the spec T_DEWPOINT_F = -10.0.

Your task:

  1. Write dehydration(T_inlet_F, P_psia, T_dewpoint_F) returning a dict:
  • W_in = water_content(T_inlet_F, P_psia): water carried in by the inlet

gas (lb/MMscf).

  • W_out = water_content(T_dewpoint_F, P_psia): water still in the gas once

it is dried to the dew-point spec, evaluated at the same pressure (lb/MMscf).

  • W_removed = W_in - W_out: the contactor duty (lb/MMscf).
  • Return {'W_in': W_in, 'W_out': W_out, 'W_removed': W_removed}.
  1. Call dehydration(T_INLET_F, P_PSIA, T_DEWPOINT_F) and read off the pieces:

dh = dehydration(T_INLET_F, P_PSIA, T_DEWPOINT_F), then w_in = dh['W_in'], w_out = dh['W_out'], w_removed = dh['W_removed'].

> Think about it: at 100°F / 1000 psia the gas holds about 57 lb/MMscf; > dried to a −10°F dew point it carries only about 3 lb/MMscf, so you strip > roughly 54 lb/MMscf. Why is the dew-point evaluated at the pipeline > pressure rather than at the contactor inlet? And which way does the water > content move if the inlet ran hotter, or the line ran at higher pressure?

lightbulbHints (0/3)

Stuck? Reveal hints one at a time — they progress from nudge to near-solution.

codeYour solution
main.py
visibilityReveal reference solutionexpand_more

Try solving it yourself first — the hints walk you through it. The solution below is one valid approach; yours may differ and still be correct.

# ── Verified McKetta-Wehe / Bukacek field-unit correlation (do not edit) ──
def water_content(T_F, P_psia):
    """Saturated water content of a sweet gas, lb water / MMscf.

    Bukacek-form fit of the McKetta-Wehe chart in field units:
        W = A / P + B
    with T_R = T_F + 459.67 (deg Rankine),
        A = 10**(-2984.404 / T_R + 10.05791),
        B = 10**(-2111.516 / T_R +  4.40081).
    The constants were regressed to reproduce McKetta-Wehe sweet-gas chart
    reads to within chart-reading accuracy. The sweet-gas chart is essentially
    gravity-insensitive, so gas gravity does not enter the correlation.
    """
    T_R = T_F + 459.67
    A = 10 ** (-2984.404 / T_R + 10.05791)
    B = 10 ** (-2111.516 / T_R + 4.40081)
    return A / P_psia + B


# ── OML-58 dehydration constants (do not edit) ───────────────────────────
GAMMA_G = 0.65        # gas gravity (documented; sweet-gas chart is gravity-insensitive)
P_PSIA = 1000.0       # operating / pipeline pressure, psia
T_INLET_F = 100.0     # contactor inlet temperature, deg F
T_DEWPOINT_F = -10.0  # contractual pipeline dew-point spec, deg F


def dehydration(T_inlet_F, P_psia, T_dewpoint_F):
    """Dehydration duty for a sweet gas dried to a dew-point spec.

    Returns a dict (all lb water / MMscf):
      'W_in'      = water_content(T_inlet_F, P_psia)     -- inlet saturation
      'W_out'     = water_content(T_dewpoint_F, P_psia)  -- water left at the spec
      'W_removed' = W_in - W_out                         -- contactor duty
    Both W_in and W_out are evaluated at the SAME pressure P_psia.
    """
    W_in = water_content(T_inlet_F, P_psia)
    W_out = water_content(T_dewpoint_F, P_psia)
    W_removed = W_in - W_out
    return {"W_in": W_in, "W_out": W_out, "W_removed": W_removed}


dh = dehydration(T_INLET_F, P_PSIA, T_DEWPOINT_F)
w_in = dh["W_in"]
w_out = dh["W_out"]
w_removed = dh["W_removed"]

print("W_in  (lb/MMscf):", w_in)
print("W_out (lb/MMscf):", w_out)
print("W_removed (lb/MMscf):", w_removed)

lockCopying code is a Full Access feature.