Skip to content
workollabPublic

About

No description, website, or topics provided.

Resources

Stars

3 stars

Watchers

1 watching

Forks

Latest commit

 

History

23 Commits

Folders and files

Repository files navigation

GridForge

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 — build, populate, and inspect a corner-point grid in the browser

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 gap it fills

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.

What it does

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.

Input paths

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.

Property modelling (in-browser, off-thread)

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

The viewer

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.

Outputs

  • ECLIPSE GRDECL — corner-point geometry + properties, simulation-ready.
  • Field-unit volumetrics — GRV/NRV/PV/HCPV (MMrb) and STOIIP (MMSTB).

Validated against the reference tools

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

Honest limits (v1)

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

Layout

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.

Build & test

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 dev

Browser-native, MIT, zero runtime dependencies beyond React/three in the app — you own the code.

About

No description, website, or topics provided.

Resources

Stars

3 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages