Methods

Every number Poros reports has one written definition. This page lists them, with the constants and sources behind them, so any result can be checked in another tool. It describes engine 0.3.0.

The model

STOIIP = A · h · NTG · φ · (1 − Sw) / Boimass in place = STOIIP · ρo, when an oil density is entered

STOIIP is a stock-tank volume, so the density is the stock-tank oil density at standard conditions: the dead oil left once the gas has come out, not reservoir oil. Gross thickness is the full reservoir interval; net-to-gross then removes the non-reservoir part. Oil saturation is 1 − Sw.

InputDemo shapePhysical limitsUnits offered
Area, ALognormalabove 0m², km², ha, acres, ft², mi²
Gross thickness, hLognormalabove 0m, ft
Net-to-gross, NTGBeta0 to 1fraction, %
Porosity, φBeta0 to 1fraction, %
Water saturation, SwBeta0 to 1fraction, %
Formation volume factor, BoiTriangular1.0 or aboverm³/Sm³, rb/STB
Oil density, ρo (optional)As enteredabove 0kg/m³, t/m³, SG

Distributions

Each input takes one of seven distributions. Percentile entry fits a two-parameter distribution from P90 and P10; an entered P50 is a consistency check, with a warning when it sits more than 5% from the fitted median.

  • Lognormal. From P90 and P10: μ = (ln P90 + ln P10) / 2 and σ = (ln P10 − ln P90) / (2z), where z = 1.2815515655446004, the 90th percentile of the standard normal. From mean m and standard deviation s: σ² = ln(1 + (s/m)²) and μ = ln m − σ²/2.
  • Normal. From P90 and P10: μ = (P90 + P10) / 2 and σ = (P10 − P90) / (2z). From mean and standard deviation directly.
  • Beta. On the input's range, 0 to 1 for fractions. The two shape parameters are solved by damped Newton iteration in their logarithms until the fitted P90 and P10 reproduce the entries; a fit that cannot is refused with a message. From mean and standard deviation, by the method of moments on the range.
  • Triangular. Minimum, most likely and maximum, with closed-form quantiles.
  • PERT. A beta on minimum to maximum with α = 1 + 4(mode − min) / (max − min) and β = 1 + 4(max − mode) / (max − min).
  • Uniform. Minimum and maximum.
  • Fixed. One value, used in every run.

Quantiles are closed form for the normal, lognormal, triangular and uniform. The normal quantile is Wichura's AS241, the algorithm R uses, accurate to about 1e−16 across its range. Beta and PERT use an 8,193-point table over normal scores −6 to +6, interpolated on a log scale and accurate to 1e−6 or better, with exact computation beyond that range.

Physical limits

Fractions stay between 0 and 1 and Boi stays at or above 1.0, whatever distribution you choose.

Each uniform draw u maps to F(a) + u · (F(b) − F(a)) before the quantile, where a and b are the limits, so every sample falls inside them with the right shape. Nothing is clamped. The input cards show the effective P90, P50 and P10 after limits, and a warning appears when more than 1% of a fitted distribution lies outside them.

Units and constants

Every constant derives from four exact definitions: 1 ft = 0.3048 m; 1 acre = 43,560 ft²; 1 US gallon = 3.785411784 L; 1 bbl = 42 US gallons.

QuantityValue usedTextbook rounding
Barrels per cubic metre6.2898116.29, 0.003% off
Barrels per acre-foot7,758.3677,758, 0.005% off
Acres per square kilometre247.105
Water at 60 °F, for specific gravity999.016 kg/m³
API gravity141.5 / SG − 131.5

Boi is rb/STB in field units and rm³/Sm³ in SI: the same number, labelled per system. Fractions are stored as fractions and shown as fractions or percent. Field units use M for thousand and MM for million; SI uses M for mega, so every unit carries its full name on hover and none appears as a bare M. Canadian volumes are written 10³ m³ and 10⁶ m³, as published.

PresetAreaThicknessBoiDensityResultsStandard conditions
UKkm²mrm³/Sm³kg/m³MMSTB60 °F and 14.696 psia
USacresftrb/STBSGMMSTB60 °F and 14.696 psia
Middle Eastacresftrb/STBSGMMSTB60 °F and 14.696 psia
Norwaykm²mrm³/Sm³kg/m³million Sm³15 °C and 101.325 kPa
Canadahamrm³/Sm³kg/m³10⁶ m³15 °C and 101.325 kPa

Numbers on screen pass through one formatter: one decimal place from 10 upwards, three significant figures below 10, and whole numbers from a million. Percentages show one decimal place, or two significant figures below 1%. So 196.94 reads 196.9, 19.95 reads 20.0 and 0.229 reads 0.229.

Sampling

  • Monte Carlo. Every draw is independent and uniform.
  • Latin Hypercube. Splits each input's range into equal-probability slices and samples every slice once, so results settle in fewer runs. It draws once inside each of n equal-probability slices, in an independent random order per input.
  • Random numbers. xoshiro128** seeded through splitmix32. Two 32-bit outputs combine into one 53-bit uniform strictly inside 0 to 1, so no quantile is ever asked for at exactly 0 or 1.
  • Seed. The same seed and inputs always give the same results, so any shared link can be checked. Each input draws from its own stream, derived from the seed and the input's name, so adding or removing an input never changes the others' samples.
  • Number of runs. More runs give steadier percentiles; the convergence chart shows when you have enough. Runs go from 1,000 to 1,000,000. Up to 100,000 runs the workspace re-runs 300 ms after each edit; above that, Run updates it.

Correlation

Porosity, NTG and saturation come from the same logs, so they move together; ignoring that understates the range.

Correlations are Spearman rank targets, met by Iman-Conover reordering on its own random stream. Rank targets convert to normal-score targets by ρ = 2 sin(π ρₛ / 6), the exact relation for normal variables, and van der Waerden scores carry them. Reordering keeps each input's exact values, so its distribution and its Latin Hypercube slices survive. Targets that cannot hold together are refused, naming the pair to change, and the rank correlations actually reached are shown after each run.

Statistics

  • Percentiles. Linear interpolation between sorted results, Hyndman and Fan's type 7, the default in NumPy and in Excel's PERCENTILE.INC.
  • P90, P50 and P10. P90 is the low case: a 90% chance the true volume is at least this large. P90 is the 10th percentile of results and P10 the 90th.
  • Intervals. Each percentile carries a 99.9% order-statistic interval: the sorted results at ranks n·p ± 3.29·√(n·p·(1 − p)). The mean carries mean ± 3.29 · sd / √n. Under Latin Hypercube the true error is smaller, so these are conservative.
  • Settled. A run is settled when the P90, P50 and P10 intervals all sit within ±1% of their values. When one does not, the warning suggests n · (widest / 1%)² runs, rounded up and capped at 1,000,000.
  • Mean and spread. Mean and standard deviation (n − 1) of the results, summed with compensation so long runs lose no precision.
  • P10/P90 ratio. How wide the uncertainty is; it narrows as appraisal data comes in.
  • Swanson's mean. 0.3 · P90 + 0.4 · P50 + 0.3 · P10. A quick mean from P90, P50 and P10; if it disagrees with the simulated mean, check the inputs.
  • Inputs at P50. The result with every input at its own P50. It usually differs from the simulated P50, which is why both are shown.
  • Exceedance curve. Read across from any volume to see the chance of finding at least that much. It is drawn from 1,001 evenly spaced percentiles.
  • Histogram. Bins by the Freedman-Diaconis rule over the full range, capped at 60, drawn on the exceedance curve's axis.
  • Log-probability. Results at 15 chances from 99% to 1% against a lognormal fitted to the logarithms of the positive results. A straight run means lognormal; a bend shows where the results depart.
  • Convergence. Shows the percentiles settling as runs accumulate; flat lines mean enough runs. Percentiles are recomputed at 20 checkpoints spaced evenly on a log scale from 1,000 runs.

Sensitivity

  • Swing tornado. How far each input alone moves the answer, from its own P90 to its own P10. Every other input stays at its P50; bars start from the inputs-at-P50 result and are sorted by width.
  • Rank correlation. Spearman correlation between each input and STOIIP across all runs.
  • Contribution to variance. Which inputs create the uncertainty, and so which measurements would narrow it most. Squared rank correlations, scaled to total 100% and signed by direction. With correlated inputs the shares overlap, and the chart says so.
  • Spider plot. STOIIP with one input stepped from its 10th to its 90th percentile in nine steps, the others at P50.

Validation

Eight conditions stop a run and five only warn. Every message names the input, the value entered and what would fix it, and the same messages appear beside the field.

Blocking
RuleStops the run when
Missing valuea field needed by the distribution is empty
OrderP90 is not below P10, or P50, most likely or the minimum is out of order
Physical limita value lies outside its physical limits, or a standard deviation is not above 0
Boundsbounds loosen the physical limits or leave no part of the distribution
Fitthe distribution cannot be fitted to the entries
Correlationa target is outside −1 to 1, repeated, on a fixed or missing input, or the set cannot hold together
Mass without densityresults are asked for in tonnes with no oil density
Simulationruns are not a whole number from 1,000 to 1,000,000, or the seed is not a whole number from 0 to 4,294,967,295
Warnings
RuleWarns when
Truncationmore than 1% of a fitted distribution lies outside its limits
P50 mismatchan entered P50 sits more than 5% from the fitted median
Not settledany percentile interval is wider than ±1%
Porosity and Swporosity and water saturation are correlated positively
Density rangemore than 1% of the density lies outside 0.70 to 1.05 t/m³

Reproducibility

A case link holds the whole case, compressed into the address. Opened anywhere, it gives bit-identical results in the same browser engine, because the seed fixes every random stream and every result carries the engine version that produced it. Runs happen in a Web Worker inside the browser; nothing is sent to a server.

The engine is checked against ten benchmark fixtures, from exact answers to published studies, and against an independent NumPy and SciPy implementation that shares no code with it. The Benchmarks page runs them live.

Terms

The one-line explanations used across the workspace, each with the section that gives its long form.

Latin Hypercube sampling
Splits each input's range into equal-probability slices and samples every slice once, so results settle in fewer runs.
Seed
The same seed and inputs always give the same results, so any shared link can be checked.
Number of runs
More runs give steadier percentiles; the convergence chart shows when you have enough.
P90 / P50 / P10
P90 is the low case: a 90% chance the true volume is at least this large.
Exceedance curve
Read across from any volume to see the chance of finding at least that much.
P10/P90 ratio
How wide the uncertainty is; it narrows as appraisal data comes in.
Swanson's mean
A quick mean from P90, P50 and P10; if it disagrees with the simulated mean, check the inputs.
Physical limits
Fractions stay between 0 and 1 and Boi stays at or above 1.0, whatever distribution you choose.
Correlation
Porosity, NTG and saturation come from the same logs, so they move together; ignoring that understates the range.
Gross thickness
The full reservoir interval; net-to-gross then removes the non-reservoir part.
Swing tornado
How far each input alone moves the answer, from its own P90 to its own P10.
Contribution to variance
Which inputs create the uncertainty, and so which measurements would narrow it most.
Convergence chart
Shows the percentiles settling as runs accumulate; flat lines mean enough runs.

Sources

  • SPE, Guidelines for Application of the Petroleum Resources Management System
  • PetroWiki, Resources and reserves models
  • Norwegian Offshore Directorate, conversion table
  • North Sea Transition Authority, reserves and resources report
  • Iman, R. L. and Conover, W. J. (1982). A distribution-free approach to inducing rank correlation among input variables. Communications in Statistics: Simulation and Computation 11(3).
  • McKay, M. D., Beckman, R. J. and Conover, W. J. (1979). A comparison of three methods for selecting values of input variables in the analysis of output from a computer code. Technometrics 21(2).
  • Hyndman, R. J. and Fan, Y. (1996). Sample quantiles in statistical packages. The American Statistician 50(4).
  • Wichura, M. J. (1988). Algorithm AS 241: the percentage points of the normal distribution. Applied Statistics 37(3).
  • Blackman, D. and Vigna, S. (2021). Scrambled linear pseudorandom number generators. ACM Transactions on Mathematical Software 47(4).
  • Freedman, D. and Diaconis, P. (1981). On the histogram as a density estimator: L2 theory. Zeitschrift für Wahrscheinlichkeitstheorie und verwandte Gebiete 57(4).
  • Hurst, A., Brown, G. C. and Swanson, R. I. (2000). Swanson's 30-40-30 rule. AAPG Bulletin 84(12).
  • The benchmark studies and their links are listed with each fixture on the Benchmarks page.