By Saad Iqbal

A gas reservoir material balance estimate comes in 20% above the volumetric OGIP, and the reserves committee wants an explanation before the booking goes through. Differences can arise from pressure sampling, reservoir connectivity, volumetric inputs or the gas compressibility factor. Pull Z off a Standing Katz chart by eye at four different pressures and you’ll get four slightly different reading errors; compute it properly from gas gravity through Standing’s pseudo critical correlations and the Dranchuk Abou Kassem (DAK) equation of state, and the calculation becomes reproducible for the same data, assumptions and implementation.
Table of Contents
What You Need Before You Start
Gas reservoir material balance assumes a volumetric, dry gas reservoir with no significant water drive. You need:
- An initial reservoir pressure Pi and at least three later pressure surveys, each with its corresponding cumulative gas production Gp
- Gas specific gravity γg (air = 1) from a separator or wellhead gas sample
- Reservoir temperature, assumed constant over the depletion history
- Python 3 with numpy and scipy installed (
pip install numpy scipy) - Confirmation the gas is sweet (low CO₂/H₂S), sour gas needs a Wichert Aziz correction on top of the correlations below
Gas Reservoir Material Balance: How the P/Z Method Works
For gas reservoir material balance in a volumetric dry gas reservoir, the real gas law applied at initial and current conditions reduces to a straight line in p/Z space:
p/Z = (Pi/Zi) × (1 − Gp/G)
where G is original gas in place (OGIP), the number you’re solving for. Plot p/Z on the y axis against cumulative production Gp on the x axis, fit a straight line through the survey points, and the x intercept (where p/Z = 0) is G. The entire exercise lives or dies on getting an accurate Z at every single pressure point, which is why the next three steps matter more than the final plot.
This gas reservoir material balance is the simplest formulation, and it’s also the one reserves auditors see most often, because it needs nothing beyond pressure, production, and gas gravity, no PVT lab report, no relative permeability curves. The more general Havlena Odeh formulation handles water influx and abnormal pore volume compaction by adding extra terms, but every version still reduces to solving for Z accurately at each pressure step; get that part wrong and no amount of curve fitting sophistication on top of it fixes the result.
Step 1: Gather the Pressure and Production History

For gas reservoir material balance, pull every reliable shut in or extrapolated static reservoir pressure survey you have, paired with the cumulative gas production at the time of each survey. More points, spread over more depletion, give a far more reliable extrapolation than two or three early life points crammed close together.
Step 2: Get Pseudo Critical Properties from Standing’s Correlation

The gas reservoir material balance workflow uses Standing’s correlation to estimate pseudo critical pressure and temperature directly from gas gravity, for a sweet, dry gas with no nitrogen or inerts correction needed:
Tpc = 168 + 325γg − 12.5γg² (°R) Ppc = 677 + 15.0γg − 37.5γg² (psia)
For γg = 0.75: Tpc ≈ 404.72 °R and Ppc ≈ 667.16 psia. Divide each survey pressure and the reservoir temperature by these to get the pseudo reduced properties Ppr and Tpr that the Z factor correlation actually runs on.
Step 3: Solve for Z with the Dranchuk Abou Kassem Equation

DAK fits the Standing Katz chart to an 11 constant equation of state in terms of pseudo reduced density ρr = 0.27·Ppr/(Z·Tpr):
Z = 1 + (A1 + A2/Tpr + A3/Tpr³ + A4/Tpr⁴ + A5/Tpr⁵)ρr + (A6 + A7/Tpr + A8/Tpr²)ρr² − A9(A7/Tpr + A8/Tpr²)ρr⁵ + A10(1 + A11ρr²)(ρr²/Tpr³)e−A11ρr²
with constants A1…A11 = 0.3265, −1.0700, −0.5339, 0.01569, −0.05165, 0.5475, −0.7361, 0.1844, 0.1056, 0.6134, 0.7210. Because ρr itself depends on Z, this has to be solved iteratively (Newton’s method or a root finder like scipy.optimize.brentq) rather than algebraically, which is the other reason to run it in code instead of by hand.
Automate the Correlation and the Extrapolation in Python
Here’s the full chain, pseudo criticals, iterative Z, and the final P/Z regression, for a reservoir at γg = 0.75 and a constant reservoir temperature of 650°R (190°F), with an initial pressure of 4,200 psia and four later surveys:
import numpy as npfrom scipy.optimize import brentqgamma_g = 0.75Tpc = 168 + 325*gamma_g - 12.5*gamma_g**2 # Standing, deg RPpc = 677 + 15.0*gamma_g - 37.5*gamma_g**2 # Standing, psiaT_res = 650.0 # deg R, constant over depletionTpr = T_res / TpcA = [0.3265, -1.0700, -0.5339, 0.01569, -0.05165, 0.5475, -0.7361, 0.1844, 0.1056, 0.6134, 0.7210]def dak_residual(Z, Ppr, Tpr): rho_r = 0.27 * Ppr / (Z * Tpr) 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) z_calc = (1 + c1*rho_r + c2*rho_r**2 - c3*rho_r**5 + A[9]*(1 + A[10]*rho_r**2)*(rho_r**2/Tpr**3) * np.exp(-A[10]*rho_r**2)) return z_calc - Zdef solve_z(p): ppr = p / Ppc return brentq(lambda Z: dak_residual(Z, ppr, Tpr), 0.3, 2.0, xtol=1e-10)pressures = np.array([4200, 3800, 3400, 3000, 2600]) # psia, survey historygp = np.array([0.0, 1.223, 2.609, 4.174, 5.928]) * 1e9 # scf, cumulative productionz = np.array([solve_z(p) for p in pressures])p_over_z = pressures / z# Linear fit of p/Z vs Gp; OGIP is the x-intercept (where p/Z = 0)slope, intercept = np.polyfit(gp, p_over_z, 1)ogip = -intercept / slopefor p, zi, pz in zip(pressures, z, p_over_z): print(f"p={p:5.0f} psia Z={zi:.4f} p/Z={pz:8.2f} psia")print(f"\nOGIP = {ogip/1e9:.2f} Bscf")
Step 4: Plot P/Z vs. Cumulative Production and Extrapolate

Running the script above gives Zi = 0.9071 at the initial 4,200 psia (Pi/Zi ≈ 4,630 psia), dropping to Z = 0.8263 by the time pressure has fallen to 2,600 psia. The five (Gp, p/Z) points land on a straight line with essentially zero scatter, and the regression extrapolates to OGIP ≈ 18.5 Bscf, the x intercept where the fitted line crosses p/Z = 0.
Step 5: Gas Reservoir Material Balance Checks

- Check the points actually fall on a line. Curvature in a p/Z plot usually means water influx (the line bends upward, understating true depletion) or gas desorption effects in a coal bed or shale setting, the simple straight line method doesn’t apply as is.
- Compare the material balance OGIP against the volumetric estimate. A gap bigger than 15–20% is worth investigating before either number goes to reserves, it can point to compartmentalization, an aquifer, or a bad net pay or porosity input on the volumetric side.
- Re check gas gravity if it varies with depletion. Retrograde condensate reservoirs and wells with changing produced gas composition over time break the constant γg assumption behind a single Standing correlation run.
- Use absolute pressures, always. The same gauge vs absolute mix up that corrupts a deliverability test will shift every Z value and distort the whole P/Z line.
- Don’t trust an extrapolation built on two early life points. The further the survey history extends into depletion, the shorter, and more reliable, the extrapolation to G has to be.
- Re run the DAK solver rather than reusing an old Z table. A Z value looked up from a different gas gravity or a different temperature than the one on this reservoir will not be caught by the straight line check, it just shifts the whole line slightly and biases OGIP high or low.
One more check worth running before the number leaves your desk: recompute Zi and the first survey point by hand (or in a second, independent script) and confirm they match the automated output to three decimal places. The DAK correlation is well behaved and converges quickly with a bracketed root finder like brentq, so a mismatch almost always means a units error upstream, gravity entered as a percentage, temperature left in Fahrenheit instead of converted to Rankine, or a pressure column that’s still in gauge units.
The same Z factor machinery underpins more than OGIP: if you’re also sizing nitrogen displacement or kill fluid jobs on this reservoir, see our nitrogen volume and Z factor guide for the same real gas correction applied to job planning. And once you’ve nailed down deliverability on individual wells, pairing it with this field level OGIP is how reserves and allowable calculations stay consistent, see our gas well deliverability test walkthrough for that companion calculation.
Gas reservoir material balance is only as good as the Z factor feeding it. Compute the pseudo criticals and the DAK correlation properly once, in code, and the same P/Z line, and the same OGIP, comes out no matter who on the team runs the numbers next quarter.
Gas Reservoir Material Balance: Practical Questions
When does gas reservoir material balance apply? Use the simple P/Z method when depletion dominates a connected dry gas reservoir. Water influx, significant compaction and changing composition require a more complete model. A straight trend is useful evidence, but does not prove every assumption.
What data quality checks matter? Pair representative static pressures with cumulative production at matching dates. Use absolute pressure, consistent standard volume conditions and reservoir temperature in Rankine. Review gauge calibration and stabilisation before fitting a trend.
Can gas reservoir material balance establish reserves? It estimates gas initially in place under the stated assumptions. Recoverable reserves also depend on abandonment pressure, operating constraints, economics and a qualified evaluation. Keep that distinction explicit when presenting the result.
How should uncertainty be reported? Repeat gas reservoir material balance with plausible pressure, gas gravity and temperature ranges. Compare the sensitivity range with volumetrics and well performance, and retain the data and code version with the forecast.
For gas reservoir material balance, archive the pressure survey date, production cutoff, temperature, gas composition and Z factor method with each estimate. Recalculate older points when a meter allocation or fluid property changes. Compare the revised intercept with the original result before attributing a change in OGIP to reservoir behavior. This makes the gas reservoir material balance estimate reproducible and keeps a data correction separate from a change in interpretation.