Exercise 15.9
Gas Dehydration - Water Content & Dew-Point Spec
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:
- 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}.
- 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?
Stuck? Reveal hints one at a time — they progress from nudge to near-solution.
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.