ResFlow
ResFlow generates 3D reservoir facies (sand and mud) with one flow-matching model for eight simulated siliciclastic environments: deep-water lobes, a distributary delta, and six fluvial classes. It is conditioned on geological parameters and wells, and it generates single 64×64×32 volumes or whole fields of any size in one pass. These are the weights of the paper SiliciclasticReservoirs: A Million-Reservoir Dataset and Flow-Matching Foundation Model for 3D Siliciclastic Reservoir Generation (NeurIPS 2026, Track on Evaluations and Datasets).
Code: github.com/SciLM-ai/ResFlow · Dataset: SciLM/SiliciclasticReservoirs · Benchmark: ResBench · Simulator: ResMill
Quick start
pip install git+https://github.com/SciLM-ai/ResFlow
import resflow
model = resflow.load_pretrained() # this repository
vols = model.generate('meander', n=8) # (8, 64, 64, 32) uint8, 1 = sand
vols = model.generate('lobe', n=4, ntg=0.35, width_cells=30, azimuth=45)
ens = model.generate('meander', n=32, # every realisation honours the well exactly
wells=[resflow.Well(x=32, y=32, facies=column)])
field = model.generate_field('lobe', shape=(512, 512, 32), ntg=0.5)
A walkthrough notebook is in the code repository at examples/pretrained/quickstart.ipynb. A GPU is recommended:
on an NVIDIA GH200 a 64×64×32 volume takes about 1.6 s in batches of 128 and a 512×512×32 field about 4 minutes.
A CPU works, but takes tens of minutes per volume.
Inputs
| Input | Meaning |
|---|---|
| environment | lobe, pv_shoestring, cb_labyrinth, cb_jigsaw, sh_distal, sh_proximal, meander, delta |
ntg |
sand fraction of the volume (0–1) |
width_cells, depth_cells |
characteristic body width and thickness, in cells |
azimuth |
flow direction in degrees, 0 = along +x (default 0) |
asp |
lobe aspect ratio (lobe) |
mCHsinu |
channel sinuosity (channels, delta) |
mFFCHprop |
fraction of abandoned channels plugged with mud (channels, delta) |
probAvulInside |
in-belt avulsion probability (channels, delta) |
trunk_length_fraction |
share of the trunk kept free of bifurcations (delta) |
wells / observed |
vertical Well(x, y, facies), or an array of known cells: 1 sand, 0 mud, −1 unknown |
Parameters left out take the environment's typical value (the median over its training data), and
model.parameters(env) lists each one with its training range. In generate_field any parameter can also be an
(X, Y) map, so trends can vary across one reservoir. Volumes have axes (x, y, z) with z = 0 at the base; cells are
100 m laterally for lobes and 10 m for channels and deltas, and 1 m vertically.
Model
A 32.6M-parameter 3D diffusion transformer (4×4×2 patches, 12 blocks, width 384, 6 heads, QK-norm, 3D rotary positions with θ = 100, adaptive layer norm) trained with conditional flow matching. The 18-number condition vector holds the environment one-hot, NTG, width, depth, the sine and cosine of the azimuth, and five environment-specific parameters; wells enter as two extra input channels. Sampling uses Heun's method with 100 steps and classifier-free guidance 3. Volumes use global attention as in training; fields switch to sliding-window attention of ±12 tokens per axis, so any extent is generated whole, without tiling.
Training used 900,000 volumes of SiliciclasticReservoirs (all eight environments) for 40 epochs on 16 NVIDIA GH200 GPUs (global batch 512, AdamW, peak learning rate 5.77×10⁻⁴, cosine schedule, about 7.5 hours). These weights are the final epoch-40 exponential moving average.
Evaluation
On ResBench, which scores each check against the simulator's own run-to-run variability (1 means indistinguishable from the simulator, lower is better), ResFlow scores 2.56 overall: 2.33 on unconditional volumes, 3.12 on well-conditioned volumes, and 2.24 on fields. Given the same inputs, it is closer to the simulator than GANSim-3D, DiffSIM and a 3D latent diffusion model in every environment where they were compared, and it beats single-environment specialists with its own architecture and recipe in six of eight environments. Details are in the paper.
Limitations
- Trained only on simulated reservoirs from the ResMill simulator, and not validated on real subsurface data. Forecasting a specific real reservoir needs separate calibration.
- Covers the eight training environments only; parameter values outside the training ranges are not supported (the API warns).
- Under a fixed input it underestimates the simulator's uncertainty in most channel environments, so its ensembles understate uncertainty there.
- Distal sheets contain isolated sand specks; at field scale, connectivity in shoestring and delta fields deviates most from the simulator.
Citation
@inproceedings{baghishov2026siliciclastic,
title = {SiliciclasticReservoirs: A Million-Reservoir Dataset and Flow-Matching Foundation Model
for 3D Siliciclastic Reservoir Generation},
author = {Baghishov, Ilgar and Rustamzade, Elnara and Henkelman, Graeme and Foster, John T. and Pyrcz, Michael J.},
booktitle = {Advances in Neural Information Processing Systems (NeurIPS), Track on Evaluations and Datasets},
year = {2026}
}
License
MIT.
- Downloads last month
- 11