Emulate tNavigator reservoir simulation workflows for PNGE students. Use this skill when asked to build .DATA files, run material balance, calculate PVT properties, do decline curve analysis, history matching, nodal analysis, VFP tables, IPR curves, kriging, petrophysics, or anything involving reservoir simulation, black oil models, compositional models, Arps decline, Vogel IPR, Beggs-Brill, Peng-Robinson EOS, Z-factor, bubble point, formation volume factor, water saturation, Archie equation, or sensitivity studies on reservoir parameters. Trigger phrases: "reservoir simulation", "build a DATA file", "PVT calc", "decline curve", "material balance", "history match", "nodal analysis", "IPR curve", "VFP table", "Z-factor", "bubble point", "Bo calc", "kriging", "Archie", "skin factor sensitivity", "recovery factor". Educational tool — not a replacement for full tNavigator or Eclipse runs.
Educational skill for prototyping reservoir simulation workflows, PVT calculations, decline analysis, history matching, well design, and petrophysical modeling. Produces calculation results, .DATA file snippets, and sensitivity plots — all without requiring the full tNav GUI.
Important: This is an educational emulation tool. Results are approximate and use standard petroleum engineering correlations. For production-grade simulation, use tNavigator, Eclipse, or CMG with validated models.
Generate Eclipse/tNav-format .DATA file sections. The user provides reservoir parameters and the skill produces formatted keyword blocks.
Build a .DATA file for a 3D black oil model:
- Grid: 20x20x5, dx=dy=200ft, dz varies 10-30ft
- Porosity: 0.15 avg, Perm: 50 md
- Oil API: 35, GOR: 600 scf/STB
- Initial pressure: 4000 psia at 8000ft datum
- One producer, BHP limit 1500 psia
Example .DATA output (partial):
RUNSPEC
TITLE
Black Oil Model — Educational Example
DIMENS
20 20 5 /
OIL
WATER
GAS
DISGAS
FIELD
START
1 JAN 2025 /
TABDIMS
1 1 40 20 /
WELLDIMS
2 5 1 2 /
-- ============================================
GRID
DX
2000*200.0 /
DY
2000*200.0 /
DZ
400*10.0 400*15.0 400*20.0 400*25.0 400*30.0 /
TOPS
400*8000.0 /
PORO
2000*0.15 /
PERMX
2000*50.0 /
PERMY
2000*50.0 /
PERMZ
2000*5.0 /
Generalized form for oil reservoirs with gas cap and water influx:
F = N * [Eo + m*Eg + Efw] + We
Where:
See references/equations.md for full definitions.
Workflow:
Three decline models:
| Type | b value | Equation |
|---|---|---|
| Exponential | b = 0 | q(t) = qi * exp(-Di * t) |
| Hyperbolic | 0 < b < 1 | q(t) = qi / (1 + bDit)^(1/b) |
| Harmonic | b = 1 | q(t) = qi / (1 + Di*t) |
Workflow:
Vary bottom-hole flowing pressure and compute recovery factor using material balance or decline analysis:
The Dranchuk-Abou-Kassem correlation solves iteratively:
Input: Tpr (pseudo-reduced temperature), Ppr (pseudo-reduced pressure)
Output: Z-factor
Pseudo-critical properties from gas gravity (Standing correlations):
Tpc = 168 + 325*gamma_g - 12.5*gamma_g^2 (R)
Ppc = 677 + 15*gamma_g - 37.5*gamma_g^2 (psia)
Tpr = T / Tpc
Ppr = P / Ppc
DAK uses 11 coefficients (A1-A11) — see references/equations.md.
Workflow:
Pb = 18.2 * ((Rs/gamma_g)^0.83 * 10^(0.00091*T - 0.0125*API) - 1.4)
Workflow:
Below bubble point:
Bo = 0.9759 + 0.00012 * (Rs*(gamma_g/gamma_o)^0.5 + 1.25*T)^1.2
Rs = gamma_g * (P/18.2 * 10^(0.0125*API - 0.00091*T))^1.2048
Dead oil (Beggs-Robinson):
mu_od = 10^(10^(3.0324 - 0.02023*API) * T^(-1.163)) - 1
Live oil (Beggs-Robinson):
a = 10.715 * (Rs + 100)^(-0.515)
b = 5.44 * (Rs + 150)^(-0.338)
mu_o = a * mu_od^b
mu_g = K * exp(X * rho_g^Y) * 1e-4 (cp)
K = (9.4 + 0.02*M)*T^1.5 / (209 + 19*M + T)
X = 3.5 + 986/T + 0.01*M
Y = 2.4 - 0.2*X
Where M = gas molecular weight, T in Rankine, rho_g in g/cm3.
## PVT Properties at P = 3000 psia, T = 200F
| Property | Value | Units |
|----------|-------|-------|
| Z-factor | 0.842 | — |
| Bubble point (Pb) | 2850 | psia |
| Bo | 1.354 | RB/STB |
| Bg | 0.00523 | RB/scf |
| Rs | 580 | scf/STB |
| Oil viscosity (mu_o) | 0.65 | cp |
| Gas viscosity (mu_g) | 0.018 | cp |
| Oil density | 46.2 | lb/ft3 |
**Note:** Above bubble point — oil is undersaturated. Bo calculated
using above-Pb compressibility correction. Values are from Standing
and Beggs-Robinson correlations (field units).
Typical matching parameters with default ranges:
| Parameter | Symbol | Unit | Default Range |
|---|---|---|---|
| Horizontal permeability | kh | md | 1 - 500 |
| Vertical permeability | kv | md | 0.1 - 50 |
| Porosity | phi | fraction | 0.05 - 0.30 |
| Skin factor | S | — | -3 to +20 |
| Aquifer strength | Jaq | STB/D/psi | 0 - 100 |
| Aquifer volume | Vaq | MMSTB | 1 - 100 |
| Rel perm exponent (oil) | no | — | 1.5 - 4.0 |
| Rel perm exponent (water) | nw | — | 1.5 - 4.0 |
RMS = sqrt( (1/n) * SUM[(q_sim_i - q_obs_i)^2] )
NRMS = RMS / (q_obs_max - q_obs_min)
Good match: NRMS < 0.10 (10% normalized error).
PSO update equations:
v_i(t+1) = w*v_i(t) + c1*r1*(pbest_i - x_i) + c2*r2*(gbest - x_i)
x_i(t+1) = x_i(t) + v_i(t+1)
Where w=0.7 (inertia), c1=c2=1.5 (cognitive/social), r1,r2 ~ U(0,1).
## History Match Results — Well PRD-01
### Best-Fit Parameters
| Parameter | Value | Unit | Range |
|-----------|-------|------|-------|
| kh | 125 | md | 1-500 |
| phi | 0.18 | frac | 0.05-0.30 |
| Skin | 2.5 | — | -3 to 20 |
| Aquifer Jaq | 35 | STB/D/psi | 0-100 |
NRMS = 0.062 (good match)
Iterations: 150, Swarm size: 30
**Note:** History matching is non-unique. Multiple parameter sets may
yield similar mismatch. Always validate against additional data (BHP,
water cut, GOR) before using for forecasting.
Below bubble point:
q/qmax = 1 - 0.2*(Pwf/Pr) - 0.8*(Pwf/Pr)^2
Where:
Determine qmax from one test point (q_test, Pwf_test):
qmax = q_test / (1 - 0.2*(Pwf_test/Pr) - 0.8*(Pwf_test/Pr)^2)
q = C * (Pr^2 - Pwf^2)^n
Where C = deliverability coefficient, n = exponent (0.5-1.0).
Simplified approach for tubing pressure gradient:
(dP/dL) = (rho_m * g * sin(theta) + f * rho_m * v_m^2 / (2*d)) / (1 - rho_m*v_m*v_sg/P)
Flow pattern map (Beggs-Brill):
Determine flow pattern from Froude number and liquid content (lambda_L), then compute liquid holdup correction.
Workflow:
VFPPROD
-- Table Datum Rate WFR GFR THP ALQ
-- No. Depth Type Type Type Type Type
1 8000.0 OIL WCT GOR THP ' ' /
-- Rate values (STB/D)
100 500 1000 2000 3000 5000 /
-- THP values (psia)
100 200 300 400 500 /
-- WCT values (fraction)
0.0 0.2 0.5 0.8 /
-- GOR values (scf/STB)
200 400 600 800 1000 /
-- ALQ values
0 /
-- BHP data (psia) — one value per (Rate, THP, WCT, GOR, ALQ) combination
1200 1350 1500 ...
/
Find the operating point where IPR and VFP (tubing performance) intersect:
## Nodal Analysis — Well PRD-01
### Operating Conditions
| Parameter | Value | Unit |
|-----------|-------|------|
| Reservoir pressure (Pr) | 3500 | psia |
| Wellhead pressure (Pwh) | 200 | psia |
| Tubing ID | 2.992 | inches |
| Depth (TVD) | 8000 | ft |
| GOR | 600 | scf/STB |
| Water cut | 0.20 | fraction |
### Operating Point
| Parameter | Value | Unit |
|-----------|-------|------|
| Oil rate (q_op) | 1850 | STB/D |
| BHP (Pwf_op) | 2200 | psia |
| Drawdown | 1300 | psi |
### Tubing Size Sensitivity
| Tubing ID (in) | q_op (STB/D) | Pwf_op (psia) |
|-----------------|--------------|----------------|
| 2.441 | 1520 | 2450 |
| 2.992 | 1850 | 2200 |
| 3.500 | 2050 | 2050 |
**Note:** Increasing tubing from 2.441" to 2.992" gains 330 STB/D.
Further increase to 3.5" gains only 200 STB/D — diminishing returns.
Validate against actual well test data before sizing.
Sw = (a / (phi^m * Rt) * Rw)^(1/n)
Where:
Typical Archie parameters:
| Rock Type | a | m | n |
|---|---|---|---|
| Sandstone (clean) | 0.62 | 2.15 | 2.0 |
| Sandstone (shaly) | 0.81 | 2.0 | 2.0 |
| Carbonate | 1.0 | 2.0 | 2.0 |
| Unconsolidated | 0.62 | 1.8 | 1.8 |
Kozeny-Carman:
k = (phi^3 * d^2) / (72 * tau^2 * (1-phi)^2)
Where d = grain diameter (cm), tau = tortuosity.
Empirical (semi-log):
log(k) = a + b * phi
Fit a and b from core data (log-linear regression).
Kriging provides the Best Linear Unbiased Estimate (BLUE) of a spatial variable.
Variogram model (spherical):
gamma(h) = C0 + C * [1.5*(h/a) - 0.5*(h/a)^3] for h <= a
gamma(h) = C0 + C for h > a
Where C0 = nugget, C = sill - nugget, a = range, h = lag distance.
Simple kriging:
Z*(x0) = mu + SUM[lambda_i * (Z(xi) - mu)]
Weights lambda_i from solving the kriging system using the variogram.
Workflow:
Produces multiple equiprobable realizations:
Note: Full SGS requires significant computation. This skill provides the methodology and can generate simplified 2D examples.
## Water Saturation — Archie's Equation
### Input
| Parameter | Value |
|-----------|-------|
| Porosity (phi) | 0.18 |
| Rt (formation resistivity) | 25 ohm-m |
| Rw (water resistivity) | 0.04 ohm-m |
| a (tortuosity) | 0.62 |
| m (cementation) | 2.15 |
| n (saturation) | 2.0 |
### Result
| Property | Value |
|----------|-------|
| Sw | 0.23 (23%) |
| So (1-Sw) | 0.77 (77%) |
Hydrocarbon saturation of 77% indicates a productive zone.
Validate with capillary pressure data and log analysis.
Map user request to one of the 5 modules:
Collect required parameters from the user. Provide sensible defaults (with field units) if user omits values. Always state assumptions.
Use Python (stdlib only) or analytical formulas. Reference
references/python_example.py for implementations.
Reference references/equations.md for equation details.
Format as:
If the calculation feeds into a simulation model, provide the relevant Eclipse/tNav keyword block ready for copy-paste.
All outputs follow this pattern:
## [Calculation Title]
### Input Parameters
| Parameter | Value | Unit | Source |
|-----------|-------|------|--------|
| ... | ... | ... | User / Default |
### Results
| Property | Value | Unit |
|----------|-------|------|
| ... | ... | ... |
**Summary:** [1-3 sentence interpretation of results]
**Caveats:**
- [Correlation validity range]
- [Assumptions made]
- [When to use full simulation instead]
| Condition | Action |
|---|---|
| Missing required input | List missing parameters with typical ranges |
| Value outside correlation range | Warn user, compute anyway with disclaimer |
| Negative or non-physical result | Flag as error, suggest input corrections |
| Convergence failure (Z-factor, PSO) | Report iteration count, last estimate, suggest relaxed tolerance |
| Grid too large for inline calculation | Suggest subset or coarser grid |
All correlations use field units by default:
| Quantity | Field Unit | SI Unit | Conversion |
|---|---|---|---|
| Pressure | psia | kPa | 1 psia = 6.895 kPa |
| Temperature | F (Fahrenheit) | C | F = C*9/5 + 32 |
| Length/Depth | ft | m | 1 ft = 0.3048 m |
| Rate (oil) | STB/D | m3/d | 1 STB = 0.1590 m3 |
| Rate (gas) | Mscf/D | m3/d | 1 Mscf = 28.317 m3 |
| Permeability | md | m2 | 1 md = 9.869e-16 m2 |
| Viscosity | cp | Pa-s | 1 cp = 0.001 Pa-s |
| FVF (oil) | RB/STB | Rm3/Sm3 | same ratio |
| FVF (gas) | RB/scf | Rm3/Sm3 | same ratio |
| GOR | scf/STB | Sm3/Sm3 | 1 scf/STB = 0.1781 Sm3/Sm3 |
If user provides SI inputs, convert to field units before calculation, then present results in both unit systems.
references/python_example.pyreferences/equations.md