Variants

FNO3D

20.1M

3D Fourier Neural Operator for volumetric reservoir datasets. Uses 3D FFT for spectral convolutions.

Modes: Truncated 3D Fourier modes
Library: neuraloperator
Exact params: 20,087,224

FNO2D

2.4M

2D Fourier Neural Operator for Cartesian grid datasets. Uses 2D FFT.

Modes: Truncated 2D Fourier modes
Library: neuraloperator
Exact params: 2,430,992

Training Provenance

These values are read from the generated benchmark result metadata, not from static method-page copy. When a model is retrained and the website data is regenerated, this section updates with the result records.

Arena training recipe

Epochs: 200
Batch size: 32
Learning rate: 0.0001
Loss: CombinedGradientLoss, MSEGradientLoss

Arena feature sets

Flow Arena input channels vary by fault complexity. Current result records for this method include 3 feature-set definitions.

PORO PERMX SWAT_0 PRESSURE_0 MULTX MULTY DEPTH

Strengths & Weaknesses

Strengths

  • Global receptive field from the first layer — captures long-range pressure communication naturally
  • Resolution-invariant in principle — can generalize across grid sizes
  • Very compact model (0.8M params for 2D, 8.9M for 3D) compared to convolutional alternatives
  • Strong theoretical foundation in operator learning and function space approximation
  • Spectral bias provides implicit regularization for smooth fields like pressure

Weaknesses

  • Spectral truncation can blur sharp discontinuities (saturation fronts, fault boundaries)
  • Assumes periodic boundary conditions implicitly — may introduce artifacts near domain boundaries
  • Requires uniform Cartesian grids for standard FFT — not directly applicable to unstructured meshes
  • Performance degrades on datasets with highly localized features that need many Fourier modes
  • Checkpoint saving/loading requires special handling (state_dict extraction) unlike standard PyTorch models

Results Across Benchmarks

All results for Fourier Neural Operator variants across all benchmark families. Sorted by the first field's rel-L² error by default.

Two-Phase Oil-Water

Loss
9 results
    Pres (bar)Sat (frac) 
#TargetModelLossEpochsrel-L²MREMAErel-L²MREMAEParams
1pressureFNO3DBadawiSingleField2000.03440.03005.154885---5.6M
2combinedFNO3DBadawiCombined2000.04150.03576.1024670.05320.04230.0140225.6M
3combinedFNO2DRelLp2000.04340.03756.4694210.05040.03790.01249014.7M
4combinedFNO2DRelLp2000.05550.04828.6347620.05390.04140.0135962.4M
5pressureFNO2DRelLp2000.05810.05218.838425---14.6M
6pressureFNO2DRelLp2000.05960.05289.173145---2.4M
7saturationFNO2DRelLp200---0.06170.04650.0153502.4M
8saturationFNO2DRelLp200---0.05650.04260.01402714.6M
9saturationFNO3DBadawiSingleField200---0.05550.04310.0144905.6M

CO2 Radial

Loss
5 results
    Pres (bar)Sat (frac) 
#TargetModelLossEpochsrel-L²MREMAErel-L²MREMAEParams
1pressureFNO2DUFNODerivLoss5000.00570.00150.350251---20.2M
2pressureFNO2DRelLp5000.00640.00150.376695---9.0M
3combinedFNO2DRelLp5000.00680.00190.4334460.11529.90450.0031859.0M
4saturationFNO2DUFNODerivLoss500---0.11979.91070.00306720.2M
5saturationFNO2DRelLp500---0.10678.75350.0027239.0M

Flow Arena

Property
Fault
Control
Loss
24 results
    Sat (frac)Pres (bar) 
#DatasetModelLossEpochsrel-L²MREMAErel-L²MREMAEParams
1geostat_nf_rateFNO3DAbsLp(p=2)2000.21760.42390.0507800.04220.03617.76592920.1M
2geostat_nf_bhpFNO3DAbsLp(p=2)2000.22070.44220.0514820.03710.03208.00722320.1M
3geostat_nf_bhpFNO3DMSE2000.23450.48610.0546430.03920.03378.40831920.1M
4geostat_nf_rateFNO3DMSE2000.24130.47470.0514820.04720.03988.51949520.1M
5channels_nf_bhpFNO3DAbsLp(p=2)2000.30620.64820.0814730.06300.052213.10432320.1M
6geostat_zt_bhpFNO3DAbsLp(p=2)2000.30790.57820.0698020.06040.049012.34344220.1M
7geostat_zt_bhpFNO3DMSE2000.31010.57400.0679880.06160.050012.46008620.1M
8channels_nf_bhpFNO3DMSE2000.31250.71850.0828720.06300.051913.00543320.1M
9geostat_zt_rateFNO3DMSE2000.32150.59660.0725880.09990.076017.91421320.1M
10geostat_zt_rateFNO3DAbsLp(p=2)2000.32240.60410.0754250.09930.076318.03529920.1M
11channels_nf_rateFNO3DAbsLp(p=2)2000.35080.65500.0808350.07660.061213.28094820.1M
12channels_nf_rateFNO3DMSE2000.35620.71760.0800300.08010.063913.71211020.1M
13geostat_vt_bhpFNO3DMSE2000.36300.67940.0833880.08100.066516.65666235.7M
14geostat_vt_bhpFNO3DAbsLp(p=2)2000.36360.73980.0935020.07780.063616.00071035.7M
15geostat_vt_rateFNO3DAbsLp(p=2)2000.37440.72870.0981380.10980.083020.21324535.7M
16geostat_vt_rateFNO3DMSE2000.37910.72030.0847280.11900.090321.36562335.7M
17channels_zt_bhpFNO3DAbsLp(p=2)2000.40800.76720.0895090.08600.069717.26177020.1M
18channels_zt_bhpFNO3DMSE2000.41190.82440.0907420.08560.068817.07597220.1M
19channels_zt_rateFNO3DMSE2000.43010.80420.0918050.12410.095022.02802320.1M
20channels_zt_rateFNO3DAbsLp(p=2)2000.43280.77920.0948150.12270.094021.86976620.1M
21channels_vt_bhpFNO3DAbsLp(p=2)2000.47080.91260.1058090.10080.079920.02664435.7M
22channels_vt_bhpFNO3DMSE2000.47850.93930.1020660.10390.082420.65451435.7M
23channels_vt_rateFNO3DAbsLp(p=2)2000.48230.93590.1094710.14580.110626.30604935.7M
24channels_vt_rateFNO3DMSE2000.48860.96460.1112280.15050.113826.80335035.7M

CO2 Nested

1 results
   Pres (bar) 
#ModelLossEpochsrel-L²MREMAEParams
1FNO3DRelLp2000.00038.79e-50.02023213.2M

Two-Phase 3D Channels

6 results
    Pres (bar)Sat (frac) 
#TargetModelLossEpochsrel-L²MREMAErel-L²MREMAEParams
1pressureFNO3DRelLp5000.00210.00150.491382---9.0M
2combinedFNO3DRelLp5000.00220.00170.5396200.22230.14420.0311669.0M
3pressureFNO3DRelLp2000.00240.00180.582078---9.0M
4combinedFNO3DRelLp2000.00260.00200.6400250.23080.17860.0364669.0M
5saturationFNO3DRelLp200---0.23120.16480.0344809.0M
6saturationFNO3DRelLp500---0.23100.15710.0333969.0M

Training Curves

FNO2D - Two-Phase Oil-Water (combined)

FNO2D - Two-Phase Oil-Water (combined)

FNO2D - Two-Phase Oil-Water (pressure)

FNO2D - Two-Phase Oil-Water (pressure)

FNO2D - Two-Phase Oil-Water (saturation)

FNO2D - Two-Phase Oil-Water (saturation)

FNO2D - CO2 Radial (pressure)

FNO2D - CO2 Radial (saturation)

Architecture

The Fourier Neural Operator (FNO), introduced by Li et al. (2021), represents a fundamentally different approach to learning PDE surrogates. Instead of operating directly in physical space like convolutional networks, FNO performs convolutions in Fourier space via the Fast Fourier Transform (FFT). This spectral approach enables global receptive fields at every layer — each Fourier mode interacts with the entire spatial domain — making FNO naturally suited for problems with long-range spatial correlations like pressure diffusion.

The architecture consists of a lifting layer (projecting inputs to a higher-dimensional channel space), a sequence of Fourier layers (each performing spectral convolution followed by a local linear transform and nonlinearity), and a projection layer mapping back to the output space. The spectral convolutions truncate high-frequency modes, acting as a learned low-pass filter that implicitly regularizes the solution.

FNO has a key theoretical advantage: it is resolution-invariant in principle, meaning a model trained on one grid resolution can be evaluated on another without retraining. In practice, this property is approximate and works best when the underlying physics is smooth.

We use the NVIDIA NeuralOperator library implementation, which provides optimized 2D and 3D variants. The 3D version (FNO3D) treats the spatial domain as a 3D volume, while the 2D version (FNO2D) is used for Cartesian 2D datasets.

Model Summary

FNO2D

FNO2DWrapper(
  (model): FNO(
    (positional_embedding): GridEmbeddingND()
    (fno_blocks): FNOBlocks(
      (convs): ModuleList(
        (0-3): 4 x SpectralConv(
          (weight): DenseTensor(shape=torch.Size([64, 64, 16, 9]), rank=None)
        )
      )
      (fno_skips): ModuleList(
        (0-3): 4 x Flattened1dConv(
          (conv): Conv1d(64, 64, kernel_size=(1,), stride=(1,), bias=False)
        )
      )
      (channel_mlp): ModuleList(
        (0-3): 4 x ChannelMLP(
          (fcs): ModuleList(
            (0): Conv1d(64, 32, kernel_size=(1,), stride=(1,))
            (1): Conv1d(32, 64, kernel_size=(1,), stride=(1,))
          )
        )
      )
      (channel_mlp_skips): ModuleList(
        (0-3): 4 x SoftGating()
      )
    )
    (lifting): ChannelMLP(
      (fcs): ModuleList(
        (0): Conv1d(86, 128, kernel_size=(1,), stride=(1,))
        (1): Conv1d(128, 64, kernel_size=(1,), stride=(1,))
      )
    )
    (projection): ChannelMLP(
      (fcs): ModuleList(
        (0): Conv1d(64, 128, kernel_size=(1,), stride=(1,))
        (1): Conv1d(128, 80, kernel_size=(1,), stride=(1,))
      )
    )
  )
)

FNO3D

FNO3DWrapper(
  (model): FNO(
    (positional_embedding): GridEmbeddingND()
    (fno_blocks): FNOBlocks(
      (convs): ModuleList(
        (0-3): 4 x SpectralConv(
          (weight): DenseTensor(shape=torch.Size([48, 48, 4, 32, 17]), rank=None)
        )
      )
      (fno_skips): ModuleList(
        (0-3): 4 x Flattened1dConv(
          (conv): Conv1d(48, 48, kernel_size=(1,), stride=(1,), bias=False)
        )
      )
      (channel_mlp): ModuleList(
        (0-3): 4 x ChannelMLP(
          (fcs): ModuleList(
            (0): Conv1d(48, 24, kernel_size=(1,), stride=(1,))
            (1): Conv1d(24, 48, kernel_size=(1,), stride=(1,))
          )
        )
      )
      (channel_mlp_skips): ModuleList(
        (0-3): 4 x SoftGating()
      )
    )
    (lifting): ChannelMLP(
      (fcs): ModuleList(
        (0): Conv1d(8, 96, kernel_size=(1,), stride=(1,))
        (1): Conv1d(96, 48, kernel_size=(1,), stride=(1,))
      )
    )
    (projection): ChannelMLP(
      (fcs): ModuleList(
        (0): Conv1d(48, 96, kernel_size=(1,), stride=(1,))
        (1): Conv1d(96, 40, kernel_size=(1,), stride=(1,))
      )
    )
  )
)