Exerciseschevron_rightChapter 13chevron_right13.9
fitness_center

Exercise 13.9

ESP vs. Gas Lift Economic Comparison

Level 2
Chapter 13: Production Optimization
descriptionProblem

A well can be put on either an ESP (capital cost 350,000,operatingcost350,000, operating cost 5/STB, expected rate 2,200 STB/d) or gas lift (capital cost 150,000,operatingcost150,000, operating cost 8/STB, expected rate 1,800 STB/d). Oil price is $75/bbl. Calculate the NPV of each option over 5 years assuming 15% annual decline. Which is more profitable?

---

This is a discounted-cash-flow (DCF) decision. Each artificial-lift option is a project: spend capital up front (capex), then earn the spread between oil price and per-barrel operating cost on every barrel produced, while the well declines year over year. The option with the higher net present value (NPV) wins.

The book gives no discount rate, so we use a standard corporate hurdle rate of 10% (DISCOUNT_RATE = 0.10): money next year is worth less than money today. All other numbers are taken verbatim from the book exercise and embedded for you:

OIL_PRICE     = 75.0     # $/bbl
ANNUAL_DECLINE = 0.15    # fraction per year
YEARS          = 5
DISCOUNT_RATE  = 0.10    # hurdle rate (book omits; standard 10%)
DAYS_PER_YEAR  = 365.0
ESP      = {'capex': 350000.0, 'opcost': 5.0, 'rate0': 2200.0}
GAS_LIFT = {'capex': 150000.0, 'opcost': 8.0, 'rate0': 1800.0}

Your tasks:

  1. Write lift_npv(capex, opcost, rate0, price, decline, years, disc, days_per_year=365.0):
  • For each year y from 1 to years, the start-of-year rate is

rate = rate0 (1 - decline) * (y - 1) (STB/d).

  • annual_oil = rate * days_per_year (STB that year).
  • cash_flow = annual_oil * (price - opcost) (the net dollars that year).
  • Discount it to today by dividing by (1 + disc) ** y.
  • NPV = -capex + sum(discounted cash flows). Return a float.
  1. Write compare_lift(esp, gas_lift, price, decline, years, disc):
  • Call lift_npv for each option (each dict supplies its capex, opcost,

rate0).

  • Return the tuple (npv_esp, npv_gl, better) where better is the string

'ESP' or 'GAS_LIFT', whichever NPV is higher.

  1. Produce the module-scope answers:

``python npv_esp, npv_gl, better = compare_lift(ESP, GAS_LIFT, OIL_PRICE, ANNUAL_DECLINE, YEARS, DISCOUNT_RATE) ``

> Think about it: the ESP costs more than twice as much up front, yet it still > wins. Why? It produces at a higher rate (2,200 vs. 1,800 STB/d) and costs less > per barrel to run (5vs.5 vs. 8). Two advantages that compound across five years of > 365-day cash flows easily swamp a $200,000 capex gap. Discounting shrinks later > years. Would a much higher hurdle rate ever flip the decision?

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 OML economic constants (do not edit) ────────────────────────
# Book Exercise 13.9 values; discount rate is the standard 10% hurdle rate
# (the book omits it, so it is an explicit parameter here).
OIL_PRICE = 75.0          # oil price, $/bbl
ANNUAL_DECLINE = 0.15     # production decline, fraction per year
YEARS = 5                 # evaluation horizon
DISCOUNT_RATE = 0.10      # hurdle rate (book omits; standard 10%)
DAYS_PER_YEAR = 365.0     # producing days per year

ESP = {'capex': 350000.0, 'opcost': 5.0, 'rate0': 2200.0}      # electric submersible pump
GAS_LIFT = {'capex': 150000.0, 'opcost': 8.0, 'rate0': 1800.0}  # gas lift


def lift_npv(capex, opcost, rate0, price, decline, years, disc, days_per_year=365.0):
    """Discounted-cash-flow NPV of an artificial-lift option.

    For year y in 1..years:
      rate       = rate0 * (1 - decline) ** (y - 1)   # start-of-year rate, STB/d
      annual_oil = rate * days_per_year               # STB that year
      cash_flow  = annual_oil * (price - opcost)      # net $ that year
      discounted = cash_flow / (1 + disc) ** y
    NPV = -capex + sum(discounted). Return a float.
    """
    npv = -capex
    for y in range(1, years + 1):
        rate = rate0 * (1 - decline) ** (y - 1)
        annual_oil = rate * days_per_year
        cash_flow = annual_oil * (price - opcost)
        npv += cash_flow / (1 + disc) ** y
    return float(npv)


def compare_lift(esp, gas_lift, price, decline, years, disc):
    """Return (npv_esp, npv_gl, better) where better is 'ESP' or 'GAS_LIFT'.

    Each option dict supplies its own capex, opcost, and rate0.
    `better` is whichever option has the higher NPV.
    """
    npv_esp = lift_npv(esp['capex'], esp['opcost'], esp['rate0'],
                       price, decline, years, disc)
    npv_gl = lift_npv(gas_lift['capex'], gas_lift['opcost'], gas_lift['rate0'],
                      price, decline, years, disc)
    better = 'ESP' if npv_esp > npv_gl else 'GAS_LIFT'
    return npv_esp, npv_gl, better


npv_esp, npv_gl, better = compare_lift(ESP, GAS_LIFT, OIL_PRICE,
                                       ANNUAL_DECLINE, YEARS, DISCOUNT_RATE)

print("NPV ESP      ($):", npv_esp)
print("NPV Gas Lift ($):", npv_gl)
print("Better option   :", better)

lockCopying code is a Full Access feature.