← Digital Garden
Part 1 of 3 · Black Oil PVT from Scratch

What PVT Software Actually Does at Characterisation: A Python Implementation

28 May 2026

Petroleum engineering fundamentals have been settled for decades. Peng-Robinson (1976). Kesler-Lee (1976). Peneloux (1982). Whitson & Brulé (2000). Reservoir engineers routinely use specialised PVT software to characterise fluid compositions and generate keywords for dynamic simulation.

In practice, the internal workflow of these tools is rarely examined. The standard approach is to QC and match to available laboratory data through regression then export to the simulator. Which correlations are applied, how the cubic is solved, what the reported Z-factor represents — these are not part of the routine workflow in general.

Several of these details directly affect simulation results yet are not documented in standard references. The publicly available Volve field dataset is used here to make that connection explicit, building the workflow from first principles in Python and verifying every result against commercial software output exactly.

Part 1 covers characterisation — converting MW and SG into critical properties. Everything here is deterministic. No regression, no fitting, no adjustable parameters.

The Starting Point: Fluid Composition Inputs

A typical PVT report provides a composition in this format:

Table 1 — Volve 15/9-F-4 Wellstream Composition
Component Mole % MW (g/mol) SG
N₂0.41028.013
CO₂3.79944.010
C139.91616.043
C26.07230.070
C35.44944.097
iC40.77158.124
nC42.81658.124
iC51.05072.151
nC51.69772.151
C62.34284.000
C7-C1519.774150.00.784
C16+15.903480.00.968

For N₂ through C6, the critical properties are known physical constants sourced directly from the component library. No calculation needed. For C7-C15 and C16+, only MW and SG are available from the laboratory report. Tc, Pc, ω and Tb must be estimated from correlations.

That is the characterisation challenge.

The Characterisation Correlations

Several correlation sets are available for pseudocomponent characterisation in commercial software. The default is Kesler-Lee (1976). The workflow is sequential where each step feeds the next.

MW, SG → Tb (normal boiling point) → Tc (critical temperature) → Pc (critical pressure) → ω (acentric factor)

Step 1 — Normal Boiling Point (Tb)

Tb is estimated from MW and SG via the Watson characterisation factor:

Kw = 4.5579 · MW0.15178 · SG−0.84573 Tb = (Kw · SG)3

Output is in Rankine — convert to Kelvin by multiplying by 5/9. This approach is valid across the full MW range of petroleum pseudocomponents, including C7-C15 (MW=150).

  • C7-C15 (MW=150, SG=0.784): Tb ≈ 460 K
  • C16+ (MW=480, SG=0.968): Tb ≈ 862 K

Step 2 — Critical Temperature (Tc)

Tc = 5/9 · (341.7 + 811.1·SG + (0.4244 + 0.1174·SG)·Tb + (0.4669 − 3.2623·SG)×10⁵ / Tb)

where Tb is in Rankine. Output converted to Kelvin.

Step 3 — Critical Pressure (Pc)

ln Pc = 8.3634 − 0.0566/SG − (0.24244 + 2.2898/SG + 0.11857/SG²) · Tb/10³ + (1.4685 + 3.648/SG + 0.47227/SG²) · Tb²/10⁷ − (0.42019 + 1.6977/SG²) · Tb³/10¹⁰

Output is in psia — convert to bar by multiplying by 0.068948.

Step 4 — Acentric Factor (ω) — Lee-Kesler (1975)

The acentric factor uses two forms depending on the reduced boiling temperature Tbr = Tb/Tc.

For Tbr ≤ 0.8 (lighter fractions — vapor-pressure definition):

ω = [−ln(Pc/14.7) − 5.92714 + 6.09648/Tbr + 1.28862·ln(Tbr) − 0.169347·Tbr⁶] / [15.2518 − 15.6875/Tbr − 13.4721·ln(Tbr) + 0.43577·Tbr⁶]

For Tbr > 0.8 (heavier fractions — Watson-K petroleum form):

ω = −7.904 + 0.1352·Kw − 0.007465·Kw² + 8.359·Tbr + (1.408 − 0.01063·Kw) / Tbr

For the Volve pseudocomponents, both C7-C15 and C16+ fall in the heavier fraction form (Tbr > 0.8).

The Watson K-Factor

The Watson characterisation factor encodes the paraffinicity of the fraction:

Kw = Tb1/3 / SG

where Tb is in Rankine. Higher Kw indicates more paraffinic character. For the Volve C7-C15 fraction (MW=150, SG=0.784), Kw ≈ 11.8 — consistent with a mixed paraffinic/naphthenic North Sea crude.

Results: Calculated vs Commercial Software

Table 2 — Critical Properties: Calculated vs Commercial Software
Component Tb (K) Tc (K) Pc (bar) ω Ref Tc Ref Pc Ref ω
N₂126.2033.9440.0400126.2033.9440.0400
CO₂304.7073.8660.2250304.7073.8660.2250
C1190.6046.0420.0130190.6046.0420.0130
C2305.4348.8390.0986305.4348.8390.0986
C3369.8042.4550.1524369.8042.4550.1524
iC4408.1036.4770.1848408.1036.4770.1848
nC4425.2037.9660.2010425.2037.9660.2010
iC5460.4033.8930.2270460.4033.8930.2270
nC5469.6033.7010.2510469.6033.7010.2510
C6507.5030.1040.2990507.5030.1040.2990
C7-C15460.2640.5422.8350.4867640.5422.8350.4867
C16+861.7993.226.9391.3738993.226.9391.3738

For the pseudocomponents the Kesler-Lee correlations reproduce the commercial software values exactly. For the pure components the values come directly from the component library — same source in both cases.

The BIP Matrix

The binary interaction parameters (BIPs) are not calculated from MW and SG — they come from the Katz-Firoozabadi default set, verified to match exactly. The non-zero interactions are N₂ and CO₂ against all hydrocarbons (0.10), a small negative N₂-CO₂ pair (−0.012), and gravity-dependent C1-heavy hydrocarbon pairs. All other hydrocarbon-hydrocarbon pairs are zero.

These are deterministic defaults from the characterisation stage with no manual input required.

Table 3 — Non-zero BIPs
PairkijSource
N₂ — CO₂−0.012KF default
N₂ — all HC0.100KF default
CO₂ — all HC0.100KF default
C1 — C60.0279f(SGC6)
C1 — C7-C150.04176f(SGC715)
C1 — C16+0.06752f(SGC16)
C2/C3 — C6/C7+0.010KF default
All other HC-HC0.000KF default

Volume Shifts

The software computes Peneloux volume shifts automatically at the characterisation stage — before any experimental data is entered. They are a deterministic output of the critical properties, stored as dimensionless shift parameters (sShift) and dimensional equivalents (cShift in cm³/mol).

The concept is textbook Peneloux (1982). How they are used in the EOS is covered in Part 2 and the implementation differs from the textbook approach.

Table 4 — Peneloux Volume Shifts
ComponentsShift (—)cShift (cm³/mol)
N₂−0.131−3.158
CO₂−0.043−1.140
C1−0.144−3.863
C2−0.103−4.177
C3−0.078−4.367
iC4−0.062−4.486
nC4−0.054−3.928
iC5−0.042−3.670
nC5−0.030−2.729
C6−0.007−0.795
C7-C15+0.047+8.588
C16++0.491+454.2
What We Have After Part 1

At the end of characterisation the 12-component fluid is fully defined:

QuantitySource
ZI (mole fractions)Lab measurement
MW, SG pseudocomponentsLab measurement
Tc, Pc, ω — pure componentsComponent library
Tc, Pc, ω — pseudocomponentsKesler-Lee (1976) correlations
BIPsKatz-Firoozabadi
Volume shiftsPeneloux, computed from Tc/Pc/Vcrit

This is the complete input to the EOS engine. Everything is deterministic from raw laboratory data — no fitting, regression, or adjustable parameters.

Part 2 builds the PR3 EOS engine — cubic solver, fugacity coefficients, bubble point pressure. All results verified against commercial software output of 200.84 bar exactly.

Data and Code

The full Jupyter notebook for this post is available at: github.com/eskoantg/PVTi_cross_check

References

  1. Kesler, M.G. and Lee, B.I. (1976). Improve Prediction of Enthalpy of Fractions. Hydrocarbon Processing, 55(3), 153-158.
  2. Lee, B.I. and Kesler, M.G. (1975). A Generalized Thermodynamic Correlation Based on Three-Parameter Corresponding States. AIChE Journal, 21(3), 510-527.
  3. Whitson, C.H. and Brulé, M.R. (2000). Phase Behavior of Petroleum Reservoir Fluids. SPE Monograph Series.
  4. Peneloux, A., Rauzy, E. and Freze, R. (1982). A Consistent Correction for Redlich-Kwong-Soave Volumes. Fluid Phase Equilibria, 8, 7-23.
  5. Equinor (2018). Volve Field Data Village. equinor.com/energy/volve-data-sharing
Disclaimer

This series is an independent, educational and methodological implementation based on published correlations and equations. Verification is performed against a widely used commercial PVT simulator. No proprietary source code or licensed documentation was accessed or reproduced. Volve field data is used under Equinor's open data licence.