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
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