← All examples
55

Canonical Grid model

Petroleum starter - Reservoir volumetrics

Uniform oil reservoir screening. Area in acres, net pay in ft, FVF in reservoir bbl/STB. No recovery factor or reserves classification is implied.

Scale
Small
Source
petroleum-reservoir-volumetrics.grid
Length
60 lines
Collection
Advanced language
Level
Intermediate
Runtime
Portable
Version
1.0.0
petroleum-reservoir-volumetrics.grid
Get Grid
MODEL "Petroleum starter - Reservoir volumetrics"
DESCRIPTION "Uniform oil reservoir screening. Area in acres, net pay in ft, FVF in reservoir bbl/STB. No recovery factor or reserves classification is implied."
VERSION "1.0.0"
TAGS "petroleum", "starter", "volumetrics", "scenarios"

strict

# Inputs and physical bounds
input Area_acres = 640
  VALIDATE BETWEEN 0 AND 1000000 MESSAGE "Area must be between 0 and 1,000,000 acres in this screening model."
input NetPay_ft = 50
  VALIDATE BETWEEN 0 AND 10000 MESSAGE "Net pay must be between 0 and 10,000 ft."
input Porosity = 0.20
  VALIDATE BETWEEN 0 AND 1 MESSAGE "Porosity must be a fraction between 0 and 1."
input WaterSaturation = 0.25
  VALIDATE BETWEEN 0 AND 1 MESSAGE "Water saturation must be a fraction between 0 and 1."
input OilFVF_rb_stb = 1.20
  VALIDATE BETWEEN 0.1 AND 10 MESSAGE "FVF must be positive; this starter accepts 0.1 to 10 reservoir bbl/STB."

# Rounded conventional field coefficient: preserve the published study baseline.
output OOIP_stb IS number = 7758 * Area_acres * NetPay_ft * Porosity * (1 - WaterSaturation) / OilFVF_rb_stb
output OOIP_million_stb IS number = OOIP_stb / 1000000
output Assumptions = "Uniform net pay and porosity; oil and water only. 7758 is a rounded bbl/acre-ft coefficient. In-place volume is not recoverable reserves."
output ScenarioGuide = "I/O: save Baseline, change Porosity to 0.25, save Higher porosity, then reset inputs. Expected OOIP: 31.032 -> 38.790 -> 31.032 million STB."

# Deterministic sensitivity, not a probability distribution.
PorosityCases = [0.10, 0.15, 0.20, 0.25, 0.30]
Sensitivity = MAP(PorosityCases, (fraction) => {
  porosity: fraction,
  million_stb: 7758 * Area_acres * NetPay_ft * fraction * (1 - WaterSaturation) / OilFVF_rb_stb / 1000000
})

# A readable sheet accompanies the I/O view.
A1 = "Oil initially in place (million STB)"
B1 = OOIP_million_stb
A2 = "Porosity (fraction)"
B2 = Porosity
A3 = Assumptions
A4 = ScenarioGuide

Charts_1!type = "charts"
Charts_1!config = <toml>
  version = 1
  kind = "charts"
  title = "Reservoir volumetrics"

  [layout]
  title = "Deterministic porosity sensitivity"
  x_axis = "Porosity (fraction)"
  y_axis = "Oil initially in place (million STB)"

  [[charts]]
  type = "line"
  bind = "Sensitivity"
  x = "porosity"
  y = "million_stb"
  label = "In-place oil"
</toml>

END MODEL