Fluid Properties¶
Overview¶
Fluid properties describe how oil, gas, and water behave at reservoir conditions. In petroleum engineering, these are called PVT (Pressure-Volume-Temperature) properties because they depend primarily on pressure and temperature. BORES computes most PVT properties automatically from a few key inputs using industry-standard correlations.
You do not need to supply every fluid property manually. When you call bores.reservoir_model(), the factory estimates formation volume factors, solution gas-oil ratio, gas compressibility factor, densities, and other derived properties from the inputs you provide: pressure, temperature, oil specific gravity (or API gravity), and gas specific gravity. This design lets you build a complete model from commonly available field data without needing a full PVT laboratory report.
If you do have laboratory PVT data or equation-of-state results, you can provide them as PVT tables instead of relying on correlations. See PVT Tables for that workflow.
Oil Properties¶
Oil properties are the most complex because they depend on whether gas is dissolved in the oil (saturated) or all gas is in solution (undersaturated).
Key Oil Inputs¶
| Parameter | Units | Typical Range | Description |
|---|---|---|---|
oil_specific_gravity_grid | dimensionless | 0.75 - 0.95 | Oil specific gravity relative to water |
oil_viscosity_grid | cP | 0.5 - 100+ | Dead oil viscosity at reservoir temperature |
oil_bubble_point_pressure_grid | psi | 500 - 5000 | Pressure below which gas liberates from oil |
import bores
grid_shape = (20, 20, 5)
oil_sg = bores.build_uniform_grid(grid_shape, value=0.85) # ~35 API
oil_visc = bores.build_uniform_grid(grid_shape, value=1.5) # cP
bubble_pt = bores.build_uniform_grid(grid_shape, value=2500.0) # psi
The oil specific gravity of 0.85 corresponds to about 35 degrees API, which is a light crude oil. API gravity and specific gravity are related by:
Properties Computed by the Factory¶
From your oil inputs plus pressure and temperature, bores.reservoir_model() computes:
- Solution gas-oil ratio (\(R_s\)): Volume of gas dissolved per volume of oil at surface conditions (SCF/STB). Uses the Standing correlation.
- Oil formation volume factor (\(B_o\)): Ratio of oil volume at reservoir conditions to surface conditions (RB/STB). Accounts for dissolved gas expansion. Uses Standing or Vasquez-Beggs.
- Oil compressibility (\(c_o\)): Isothermal compressibility of oil (psi\(^{-1}\)).
- Oil density: Computed from specific gravity, \(B_o\), and \(R_s\).
- Live oil viscosity: Adjusted from dead oil viscosity for dissolved gas using the Beggs-Robinson correlation.
Gas Properties¶
Gas behavior is described by the real gas law, where the compressibility factor \(Z\) accounts for deviations from ideal gas behavior.
Key Gas Inputs¶
| Parameter | Units | Typical Range | Description |
|---|---|---|---|
gas_specific_gravity | dimensionless | 0.55 - 1.5 | Gas gravity relative to air (methane ~ 0.55) |
model = bores.reservoir_model(
# ... other parameters ...
gas_specific_gravity=0.65, # Light hydrocarbon gas
)
Properties Computed by the Factory¶
- Gas compressibility factor (\(Z\)): Hall-Yarborough or Dranchuk-Abou-Kazeem correlation.
- Gas formation volume factor (\(B_g\)): ft³/SCF. Computed from \(Z\), \(p\), and \(T\).
- Gas viscosity (\(\mu_g\)): Lee-Gonzalez-Eakin correlation.
- Gas density: Computed from molecular weight, \(Z\), \(p\), and \(T\).
Gas Gravity Values
Common gas specific gravities:
- Methane (CH4): 0.553
- Natural gas (typical): 0.60 - 0.75
- CO2: 1.52
- Nitrogen (N2): 0.967
Water Properties¶
Water is typically the simplest phase. BORES computes water properties from the water specific gravity and reservoir conditions.
model = bores.reservoir_model(
# ... other parameters ...
water_specific_gravity=1.02, # Slightly saline formation water
)
BORES computes water formation volume factor (\(B_w\)), water compressibility (\(c_w\)), water viscosity (\(\mu_w\)), and water density from the specific gravity and reservoir conditions.
Default Water Properties
If you do not specify water_specific_gravity, BORES defaults to 1.0 (fresh water). For saline formation water, typical values range from 1.01 to 1.15 depending on salinity.
PVT Correlations¶
BORES uses the following industry-standard correlations:
| Property | Correlation | Reference |
|---|---|---|
| Bubble point pressure | Standing (1947) | Standing, M.B. |
| Solution GOR (\(R_s\)) | Standing (1947) | Standing, M.B. |
| Oil FVF (\(B_o\)) | Standing / Vasquez-Beggs | Vasquez and Beggs (1980) |
| Oil compressibility | Vasquez-Beggs | Vasquez and Beggs (1980) |
| Dead oil viscosity | Beggs-Robinson | Beggs and Robinson (1975) |
| Live oil viscosity | Beggs-Robinson | Beggs and Robinson (1975) |
| Gas Z-factor | Hall-Yarborough/Dranchuk-Abou-Kazeem | Hall and Yarborough (1973) |
| Gas viscosity | Lee-Gonzalez-Eakin | Lee, Gonzalez, Eakin (1966) |
| Water properties | McCain | McCain (1990) |
These correlations are implemented in bores.correlations as both scalar functions (in core.py) and vectorized array functions (in arrays.py) for grid-wide evaluation.
How reservoir_model() Works¶
The bores.reservoir_model() factory follows this sequence:
- Validate inputs: Check grid shapes match, saturations sum to 1, values are in physical ranges.
- Estimate missing oil properties: From oil specific gravity, viscosity, and bubble point, compute \(R_s\), \(B_o\), \(c_o\), density, and live oil viscosity using PVT correlations.
- Estimate gas properties: From gas specific gravity and reservoir conditions, compute \(Z\), \(B_g\), \(\mu_g\), and gas density.
- Estimate water properties: From water specific gravity, compute \(B_w\), \(c_w\), \(\mu_w\), and water density.
- Build the grid: Construct the internal grid data structure with transmissibilities and cell volumes.
- Return the model: An immutable
ReservoirModelobject.
You can override any computed property by providing it explicitly. For example, if you have lab-measured gas viscosity, pass gas_viscosity_grid and BORES will use your values instead of the Lee-Gonzalez correlation.
Accessing Fluid Properties¶
After building the model, you can inspect all computed fluid properties:
import bores
model = bores.reservoir_model(...)
# Oil properties
Rs = model.fluid_properties.solution_gas_oil_ratio_grid # SCF/STB
Bo = model.fluid_properties.oil_formation_volume_factor_grid # RB/STB
oil_density = model.fluid_properties.oil_density_grid # lbm/ft³
# Gas properties
Bg = model.fluid_properties.gas_formation_volume_factor_grid # RB/SCF
z_factor = model.fluid_properties.gas_compressibility_factor_grid
# Pressure and saturation
pressure = model.fluid_properties.pressure_grid
So = model.fluid_properties.oil_saturation_grid
Sw = model.fluid_properties.water_saturation_grid
Sg = model.fluid_properties.gas_saturation_grid
All properties are NumPy arrays with the same shape as your grid.
Correlation Limitations
PVT correlations are empirical fits to experimental data and have limited accuracy. They work well for conventional light-to-medium oils (25-45 API) with hydrocarbon gases. For heavy oils (below 20 API), CO2-rich systems, or near-critical fluids, consider using PVT tables from equation-of-state calculations or laboratory measurements. See PVT Tables for details.