ALRIM-8· Featured
Undrained Reservoir Zone Identification
My thesis. How much of a waterflood's sweep can you reconstruct without running a reservoir simulator?
- WELL
- ALRIM-8
- TYPE
- Oil producer · Subsurface & PE
- SPUD
- 2025 - 2026
- STACK
- Python · resdata · SciPy · QGIS · Volve · Random Forest
- STATUS
- Completed · write-up only
About this project
My bachelor thesis at ITB, supervised by Ivan Kurnia, Ph.D.
Finding bypassed oil in a mature waterflood normally means history-matched dynamic simulation: expensive to run, and needing full recalibration every time new data arrives. The thesis asks a different question. How much of the displacement state can you reconstruct from universal data alone, meaning well completion records, static rock properties, and SCAL laboratory measurements, with no simulator in the loop?
The answer is a hybrid rule score and machine learning framework. The deterministic rule score combines two physically interpretable features: a proxy for injector travel time, and a fault-aware Dijkstra distance to producer perforations. Both are mapped to hierarchical percentile rankings. Critically, every parameter is set from displacement physics rather than tuned against the answer key, which is the constraint that makes the result mean anything at all. The machine learning layer then predicts how those scores move as completions open, so the map updates on the day a perforation changes rather than on a calendar.
Validated on Equinor's publicly released Volve dataset across 60,270 evaluation cells, filtered from 183,545 active cells to only those that ever held movable oil. On the held-out 2016 state it reaches a median per-layer AUC of 0.7277, a rank-corrected combined AUC of 0.6873, and a lift of 1.397 on the undrained class. Performance holds between 0.714 and 0.730 from 2011 to 2016.
The most useful result is the one that looks like a failure. A simple persistence baseline scores 0.9227, well above this model, and that 0.1950 gap is precisely the point: it puts a number on what dynamic simulation data is actually worth, which is the question an operator deciding whether to fund a history match actually needs answered. Redefining the domain on purely static criteria collapses AUC to 0.395, which is the non-circularity check working as intended.
Inside the app




