02

Data science and ML

A Monte Carlo engine that estimates oil in place from uncertain inputs. It runs entirely in your browser, and every result can be shared as a link that reproduces it exactly.

Live at poros.sintim.studioPhase 1 completeRuns in your browser

poros.sintim.studio
The Poros workspace on the Volve case: the inputs, the P90, P50 and P10 result and the exceedance curve
The simulation card: 200,000 runs, seed 3 and Latin Hypercube sampling
The correlations card: porosity and water saturation at a target of −0.38, reached −0.380

// The workspace, open on the Volve field

Engine
Monte CarloLatin Hypercube sampling, inputs correlated by rank
Built with
TypeScript, React, Next.js, D3 and Web Workers, tested with Vitest, Playwright and axe-core
Tested
392 tests247 on the engine, 145 on the app
Status
Phase 1 livePhase 2 planned

Why it exists

Put a number
on the uncertainty.

Poros began as a Python desktop app I wrote for a course assessment. Looking back at it, it fell short in ways that mattered: it let inputs drift into physically unrealistic values, and it forced a bell curve onto a lopsided result, which put the low case in the wrong place.

So I kept the script as a reference and built Poros from scratch: a simulation engine with bounded distributions, correlated sampling, sensitivity analysis and convergence checks, running entirely in the browser. One rule held throughout: nothing counted as done until a test proved it.

Inputs that stay physical

Every input is sampled inside its physical limits, however wide a range you give it.

Inputs that move together

Porosity, net-to-gross and water saturation come from the same logs, so Poros lets you correlate them, and each keeps its exact distribution.

The answer as a curve

Oil in place multiplies its inputs, so the answer is lopsided. Poros reads the low, middle and high cases straight off the results.

How it works

Ranges in,
evidence out.

// 01

Describe the uncertainty

Each input is a distribution, entered as a low, best and high case, or as a minimum, most likely and maximum. A live curve shows its shape, with the physical limits shaded.

poros.sintim.studio
The workspace with the inputs scrolled to porosity, water saturation and Boi, beside the results

// 02

Read the answer

Hundreds of thousands of runs settle into a low, middle and high case (P90, P50 and P10) on one curve. The Sensitivity tab shows which inputs drive the spread; on Volve, it's thickness and area.

poros.sintim.studio
The Distribution tab, with the exceedance curve read at the Directorate's 18.7 million Sm³
poros.sintim.studio
The Sensitivity tab: a swing tornado, contribution to variance and a spider plot

// 03

Know when to trust it

Every result carries a confidence interval, and Poros tells you when you've run enough for it to settle. The Benchmarks page reruns its tests in your browser each time it opens.

poros.sintim.studio
The Convergence tab, with the percentiles settling as runs accumulate
poros.sintim.studio
The top of the Benchmarks page: the three questions, the live status line and Statoil's 1993 estimate for Volve rerun

// 04

Compare and share

Up to four cases share one chart. A link carries the whole case, inputs and seed included, so the same browser engine gives the same numbers anywhere. Any case prints as an A4 report.

poros.sintim.studio
Four Volve scenarios compared on one chart of exceedance curves
poros.sintim.studio
The printable report for the Volve case

How it's checked

Checked against
the record.

Each time the Benchmarks page opens, it reruns Poros in your browser against three kinds of evidence.

Does it reproduce real estimates?

Statoil's own 1993 estimate for Volve, rerun from the report's inputs, comes back with the same average to within 0.3%.

Does an independent check agree?

A separate Python implementation of the same method gives the same low, middle and high cases to within 0.21%.

Is the maths exact?

Where the answer can be worked out by hand, Poros matches it to one part in a billion.

Where a published paper's own numbers don't add up, the test says so and shows why.

What 1993 teaches

Before Volve was appraised, Statoil's high case was 12.8 million Sm³, with oil assumed only down to the spill point. The official figure today is 18.7, because the oil went deeper. A simulation can only spread the uncertainty it is given. On today's inputs, the official figure sits inside Poros's range, towards its high end, and no input was tuned to put it there.

On a phone

Inputs in a drawer,
results up front.

The Poros front page on a phone

// front page

The workspace results on a phone

// results

The inputs drawer on a phone

// inputs drawer

Open
Poros.

It opens on the Volve case. Change any input and the results update about 300 milliseconds later, for runs of up to 100,000.

Volve data: Equinor and the Volve licence partners, Equinor Open Data Licence

Back to Portfolio