Build a reservoir model in a browser tab. GridForge turns interpreted surfaces — from GemPy, seismic horizons, or an existing field — into a populated, simulation-ready 3D corner-point grid, then exports a standard ECLIPSE deck. Entirely client-side: nothing is installed, nothing is uploaded.
▶ Try it live: gridforge-demo.nrgnr.app
Forge the model. View the results.
GridForge is the construction counterpart to GridView — GridView inspects a grid, GridForge builds one. Same engine, same look, same privacy promise. #4 in the Workollab open-source oil & gas browser-rebuild series (Auto-DCA → PVT Lab → GridView → GridForge).
The open-source subsurface stack covers almost every step — OPM Flow simulates, ResInsight views, GemPy builds the geology, GSTools does the geostatistics. The missing step is building the corner-point grid itself: going from interpreted structure to a populated, simulation-ready ECLIPSE grid. As a practicing reservoir engineer framed it — GemPy does almost everything; it just misses the last step: specify cell dimensions and azimuth, number of vertical layers, and export ECLIPSE-compatible grid geometry. That last mile is GridForge — and it runs where the desktop/Python tools can't: in a browser, zero-install, private by default.
interpreted surfaces → cell size · azimuth · vertical layers → corner-point grid
→ properties (real or simulated) → ECLIPSE GRDECL
You give it the zone-bounding surfaces; you set the grid like a geomodeler would — areal cell size, azimuth, and vertical layers per zone. GridForge builds a watertight corner-point grid (COORD/ZCORN/ACTNUM), carves the real field footprint via inactive cells, and exports a GRDECL that OPM Flow, ResInsight, and GridView all read.
| Path | How |
|---|---|
| GemPy | export interface surfaces as depth grids → load the gempy-surfaces.json |
| Seismic | drop interpreted horizons as IRAP classic-ASCII grids |
| Existing field | import a binary EGRID (Norne, Volve, SPE10…) — extracts top/base + real PORO/PERM from INIT |
| From scratch | wells + logs + tops → minimum-curvature trajectories → kriged surfaces (engine-built) |
Seven one-click presets ship: a synthetic anticline, real Norne & Volve, SPE9/SPE10/Fluvial, and interpreted seismic horizons.
- Deterministic — depth trend + lateral heterogeneity, or the real PORO/PERM of an imported field.
- SGS — Sequential Gaussian Simulation conditioned to wells (single realization).
- Uncertainty — multi-realization ensemble with a P10/P50/Mean/P90 view selector and a STOIIP P10/P50/P90 range.
Orientation gizmo, camera presets (iso/top/front/side), colour legend, vertical exaggeration, cell inspector (click → i,j,k · depth · porosity · perm), slice (I/J/K crop), cell-edges toggle, PNG export, and a share link that restores the exact view.
- ECLIPSE GRDECL — corner-point geometry + properties, simulation-ready.
- Field-unit volumetrics — GRV/NRV/PV/HCPV (MMrb) and STOIIP (MMSTB).
The engine is rebuilt from scratch in zero-dependency TypeScript — which only matters if it's
correct. It's validated against the established libraries, not against itself
(reference/validate/):
| Layer | Reference | Result |
|---|---|---|
| Variograms + kriging | GSTools | machine precision (γ <1e-12, kriging <1e-6) |
| SGS realizations | GSTools CondSRF | statistically equivalent (sill, variogram, E-type mean) |
| Grid geometry (faulted) | resdata / ResInsight | machine precision — found & fixed a real MAPAXES bug |
| Simulation-readiness | OPM Flow | runs to completion; pore volume exact (0.0000%) |
| De-fault fidelity | real Norne/Volve | quantified (top RMS 6–11 m; faults flattened) |
Every number is reproducible from the scripts in reference/validate/.
- Faults are a vertical-throw approximation — split-pillar faulting (
FAULTS) is the headline Phase-5 work; it flattens fault throws (up to 184 m Norne / 325 m Volve, per the validation). - Facies & seismic cokriging exist in the engine but aren't exposed in the UI yet.
- Raw seismic-cube interpretation is out of scope — GridForge ingests the interpreted horizons.
geo-core/ @workollab/geo-core zero-dep corner-point engine (GRDECL/EGRID I/O, geometry, mesh)
engine/ @workollab/gridforge-engine builder: ingestion, surfaces, gridding, geostats, volumetrics
app/ Vite + React + three.js the wizard + 3D viewer
reference/ converters + validation scripts (GSTools / OPM Flow / resdata) + example data
geo-core is the shared engine (also powers GridView), vendored here so the repo builds standalone —
see geo-core/README.md.
npm run install:all # geo-core → engine → app
npm run build # geo-core → engine → app (single self-contained chain)
npm test # engine vitest (67 tests, incl. the GSTools validation)
npm --prefix app run devBrowser-native, MIT, zero runtime dependencies beyond React/three in the app — you own the code.
