Downloads · 30 days
5
24% of all-time downloads
ForceX-AI/GeoForce-CNN-v1.1
GeoForce-CNN-v1.1 is a other model from ForceX-AI. Use it for the other task on the model card, and read the license before you ship it in a product. It is set up for pytorch. The card lists the license as apache-2.0.
GeoForce is a physics-informed convolutional neural network (CNN) that predicts temperature and pressure field evolution in geothermal reservoirs. It replaces computationally expensive numerical simulators with a comp…
Downloads · 30 days
5
24% of all-time downloads
All-time downloads
21
Public
Repo size
249 KB
Likes
0
Public
Click a slice to open those files.
.pt249 KB · 72%
From the Hugging Face model README
GeoForce is a physics-informed convolutional neural network (CNN) that predicts temperature and pressure field evolution in geothermal reservoirs. It replaces computationally expensive numerical simulators with a compact 57,802-parameter model that runs in 3.2ms on CPU — a 282,350x speedup over finite-difference simulation.
<div align="center">| Metric | Value |
|---|---|
| Temperature RMSE | 3.31°C |
| Temperature R² | 0.994 |
| Pressure RMSE | 0.354 MPa |
| Pressure R² | 0.997 |
| Physics Violations | 0.0% |
| Inference Time | 3.19 ms (CPU) |
| Speedup vs Simulator | 282,350x |
| Parameters | 57,802 |
GeoForce maps static reservoir properties (temperature, permeability, porosity, depth, well locations, pressure) directly to spatiotemporal temperature and pressure fields over a 20-year production horizon. It was designed for rapid uncertainty quantification and well placement optimization in Indonesian geothermal systems.
Encoder-Residual-Decoder CNN:
Input (batch, 6, 32, 32)
↓
[Encoder]
ConvBlock: Conv2d(6→32, 3×3) + BatchNorm + ReLU
ConvBlock: Conv2d(32→32, 3×3) + BatchNorm + ReLU
↓
[Middle]
ResidualBlock: Conv→BN→ReLU→Conv→BN + skip → ReLU
ResidualBlock: Conv→BN→ReLU→Conv→BN + skip → ReLU
↓
[Decoder]
ConvBlock: Conv2d(32→32, 3×3) + BatchNorm + ReLU
Conv2d(32→10, 1×1) + Sigmoid
↓
Output (batch, 10, 32, 32)
→ Channels 0-4: Temperature at years 4, 8, 12, 16, 20
→ Channels 5-9: Pressure at years 4, 8, 12, 16, 20
| Channel | Content | Normalization |
|---|---|---|
| 0 | Initial temperature field (°C) | (T - 25) / 325 |
| 1 | Log₁₀ permeability (m²) | (log_k + 16) / 4 |
| 2 | Well mask (Gaussian decay) | [0, 1] |
| 3 | Base pressure (Pa) | (P - 5e6) / 20e6 |
| 4 | Porosity | (φ - 0.01) / 0.14 |
| 5 | Depth (m) | (z - 800) / 1700 |
The training loss combines data-driven MSE with three physics constraints:
L_total = L_data + 0.1 × L_physics
L_physics = 0.1 × L_temporal + 0.01 × L_spatial + 0.001 × L_darcy
import torch
import numpy as np
from reservoir_cnn import ReservoirCNN
# Load model
model = ReservoirCNN(in_channels=6, n_time_steps=5, base_filters=32)
checkpoint = torch.load("geoforce_cnn_v1.1.pt", map_location="cpu", weights_only=False)
model.load_state_dict(checkpoint["model_state_dict"])
model.eval()
# Prepare input: 6-channel tensor on 32×32 grid
# Example: Kamojang-like reservoir
base_temp = 245.0 # °C
log_perm = -14.0 # log10(m²)
base_pressure = 15e6 # Pa (15 MPa)
porosity = 0.08
depth = 1500.0 # m
n_wells = 3
# Normalize inputs
inp = torch.zeros(1, 6, 32, 32)
inp[0, 0] = (base_temp - 25) / 325 # Temperature
inp[0, 1] = (log_perm + 16) / 4 # Permeability
# Channel 2: well mask (place wells with Gaussian decay)
for _ in range(n_wells):
wx, wy = np.random.randint(4, 28, size=2)
for i in range(32):
for j in range(32):
d = ((i - wy)**2 + (j - wx)**2) / 50.0
inp[0, 2, i, j] = max(inp[0, 2, i, j].item(), np.exp(-d))
inp[0, 3] = (base_pressure - 5e6) / 20e6 # Pressure
inp[0, 4] = (porosity - 0.01) / 0.14 # Porosity
inp[0, 5] = (depth - 800) / 1700 # Depth
# Run inference
with torch.no_grad():
output = model(inp) # (1, 10, 32, 32) normalized [0,1]
# Denormalize to physical units
temperature = output[0, :5] * 350.0 # °C, shape (5, 32, 32)
pressure = output[0, 5:] * 50e6 # Pa, shape (5, 32, 32)
print(f"Year 20 avg temperature: {temperature[4].mean():.1f}°C")
print(f"Year 20 avg pressure: {pressure[4].mean()/1e6:.2f} MPa")
| Year | Temp RMSE (°C) | Pressure RMSE (MPa) |
|---|---|---|
| 4 | 4.025 | 0.356 |
| 8 | 3.262 | 0.364 |
| 12 | 3.333 | 0.326 |
| 16 | 3.005 | 0.332 |
| 20 | 2.811 | 0.390 |
| Method | Temp Accuracy | Inference | Hardware |
|---|---|---|---|
| TOUGH2 (full physics) | Exact | 15-30 min | CPU |
| USGS Brady Hot Springs ML | < 3.68% relative | 0.9 s | GPU |
| Fourier Neural Operator | ~1-3% error | ~10 ms | GPU required |
| GeoForce v1.1 | 3.31°C RMSE (1.3%) | 3.2 ms | CPU only |
| Version | Params | Temp R² | Pressure R² | Status |
|---|---|---|---|---|
| v1.0 | 56,938 | 0.975 | -0.003 | Retired (pressure prediction failed) |
| v1.1 | 57,802 | 0.994 | 0.997 | Current — all thresholds pass |
The v1.0 failure was caused by compressing three physical parameters (pressure, porosity, depth) into a single input channel. Each parameter now has its own dedicated channel in v1.1. Full failure analysis is documented in the technical report.
| File | Description |
|---|---|
geoforce_cnn_v1.1.pt | PyTorch checkpoint (244 KB) |
reservoir_cnn.py | Model architecture (ReservoirCNN class) |
validation_metrics_v1.1.json | Full validation results on 100 test samples |
hyperparams.yaml | Training configuration |
training_log.json | Complete training history (402 epochs) |
technical-report.md | Full technical report with methodology and failure analysis |
@software{geoforce2026,
title={GeoForce: Physics-Informed CNN Surrogate for Geothermal Reservoir Prediction},
author={Riupassa, Robi Dany},
year={2026},
publisher={ForceX AI},
url={https://huggingface.co/ForceX-AI/GeoForce-CNN-v1.1},
version={1.1.0}
}
ForceX AI builds AI-powered tools for the energy industry — geothermal, renewable, oil & gas, and nuclear. Our models are trained on real simulation data and validated against industry benchmarks.