ISEFlow — Ice Sheet Emulator (AIS + GrIS)

ISEFlow is a hybrid flow-based neural network emulator for ice sheet sea-level projections with full uncertainty quantification. It supports both the Antarctic Ice Sheet (AIS) and the Greenland Ice Sheet (GrIS), producing IVAF (ice volume above flotation) change projections driven by ISMIP6 climate forcings for 2015–2100.

Developed at Brown University by Peter Van Katwyk.

GitHub: Brown-SciML/ise Documentation: ise.readthedocs.io PyPI: ise-py


Model Description

ISEFlow is a two-stage hybrid model trained sequentially:

  1. NormalizingFlow — an autoregressive masked affine normalizing flow (via nflows) with a ConditionalDiagonalNormal base distribution. Trained first via maximum likelihood to capture aleatoric (data/structural) uncertainty.

  2. DeepEnsemble — a heterogeneous ensemble of 10 single-layer LSTMs with varying hidden sizes (199–545 units) and sequence lengths (5–10). Each member is trained on [X, z] where z is the NF latent representation, capturing epistemic (model) uncertainty as ensemble disagreement.

Total uncertainty = epistemic + aleatoric (summed).

Architecture summary

Component Type Key parameters
NormalizingFlow Autoregressive masked affine flow nflows, ConditionalDiagonalNormal base
DeepEnsemble 10× LSTM members Hidden: 199–545; Seq len: 5–10
Input features (AIS v1.1.0) 93 features 7 forcing vars + 5 lag steps + ISM one-hot configs
Input features (GrIS v1.1.0) 4 forcing vars + 5 lag steps + ISM one-hot configs
Output IVAF change in mm SLE Per timestep, 2015–2100 (86 steps)

Model Versions

Version Ice Sheets Notes
v1.0.0 AIS only Includes mrro_anomaly (runoff) as a forcing variable
v1.1.0 (current) AIS + GrIS mrro_anomaly removed from AIS; improved joint training

Repository Structure

v1.0.0/
  ISEFlow_AIS_v1-0-0/
    deep_ensemble.pth
    deep_ensemble_metadata.json
    normalizing_flow.pth
    normalizing_flow.pth_metadata.json
    ensemble_members/
      lstm1.pth ... lstm10.pth
v1.1.0/
  ISEFlow_AIS_v1-1-0/
    deep_ensemble.pth
    deep_ensemble_metadata.json
    normalizing_flow.pth
    normalizing_flow.pth_metadata.json
    scaler_X.pkl
    scaler_y.pkl
    ensemble_members/
      member_1.pth ... member_10.pth
  ISEFlow_GrIS_v1-1-0/
    (same structure as AIS)

Usage

Install the ise-py package:

pip install ise-py

Weights are downloaded automatically on first use:

from ise.models.iseflow import ISEFlow_AIS
from ise.data.inputs import ISEFlowAISInputs
import numpy as np

year = np.arange(2015, 2101)

# Option A: pre-computed anomaly inputs
inputs = ISEFlowAISInputs(
    year=year,
    sector=10,
    pr_anomaly=np.zeros(86),
    evspsbl_anomaly=np.zeros(86),
    smb_anomaly=np.zeros(86),
    ts_anomaly=np.zeros(86),
    ocean_thermal_forcing=np.linspace(1.5, 2.5, 86),
    ocean_salinity=np.full(86, 34.5),
    ocean_temperature=np.zeros(86),
    numerics="fd",
    stress_balance="hybrid",
    resolution="8",
    init_method="eq",
    initial_year=2005,
    melt_in_floating_cells="sub-grid",
    icefront_migration="str",
    ocean_forcing_type="open",
    ocean_sensitivity="medium",
    ice_shelf_fracture=False,
    open_melt_type="quad",
    standard_melt_type="nonlocal",
)

# Option B: raw absolute forcing values (anomaly conversion is automatic)
inputs = ISEFlowAISInputs.from_absolute_forcings(
    year=year,
    sector=10,
    pr=np.full(86, 1.3e-5),
    evspsbl=np.full(86, 4e-6),
    smb=np.full(86, 9e-6),
    ts=np.full(86, 255.0),
    ocean_thermal_forcing=np.linspace(1.5, 2.5, 86),
    ocean_salinity=np.full(86, 34.5),
    ocean_temperature=np.zeros(86),
    aogcm="noresm1-m_rcp85",
    numerics="fd",
    stress_balance="hybrid",
    resolution="8",
    init_method="eq",
    initial_year=2005,
    melt_in_floating_cells="sub-grid",
    icefront_migration="str",
    ocean_forcing_type="open",
    ocean_sensitivity="medium",
    ice_shelf_fracture=False,
    open_melt_type="quad",
    standard_melt_type="nonlocal",
)

# Load model and predict
model = ISEFlow_AIS(version="v1.1.0")
predictions, uncertainties = model.predict(inputs)

print(predictions.shape)            # (86, 1) — mm SLE, 2015-2100
print(uncertainties["epistemic"])   # epistemic uncertainty per timestep
print(uncertainties["aleatoric"])   # aleatoric uncertainty per timestep
print(uncertainties["total"])       # total = epistemic + aleatoric

Greenland Ice Sheet (GrIS)

from ise.models.iseflow import ISEFlow_GrIS
from ise.data.inputs import ISEFlowGrISInputs
import numpy as np

year = np.arange(2015, 2101)

inputs = ISEFlowGrISInputs.from_absolute_forcings(
    year=year,
    sector=1,
    smb=np.full(86, -200.0),
    st=np.full(86, -20.0),
    ocean_thermal_forcing=np.linspace(2.2, 3.5, 86),
    basin_runoff=np.linspace(0.01, 0.10, 86),
    aogcm="hadgem2-es_rcp85",
    initial_year=1990,
    numerics="fe",
    ice_flow_model="ho",
    initialization="dav",
    initial_smb="ra3",
    velocity="joughin",
    bedrock_topography="morlighem",
    surface_thickness="None",
    geothermal_heat_flux="g",
    res_min=1.0,
    res_max=7.5,
    standard_ocean_forcing=True,
    ocean_sensitivity="medium",
    ice_shelf_fracture=False,
)

model = ISEFlow_GrIS(version="v1.1.0")
predictions, uncertainties = model.predict(inputs)

Input Variables

AIS v1.1.0 Forcings

Variable Description Units
pr_anomaly Precipitation anomaly (vs. 1995–2014 baseline) kg m⁻² s⁻¹
evspsbl_anomaly Evaporation/sublimation anomaly kg m⁻² s⁻¹
smb_anomaly Surface mass balance anomaly kg m⁻² s⁻¹
ts_anomaly Surface temperature anomaly K
ocean_thermal_forcing Ocean thermal forcing (absolute) °C
ocean_salinity Ocean salinity (absolute) PSU
ocean_temperature Ocean temperature (absolute) °C

Atmospheric anomalies are computed relative to the ISMIP6 1995–2014 sector-averaged climatology. Use from_absolute_forcings() + aogcm= to convert raw values automatically.

GrIS v1.1.0 Forcings

Variable Description
aSMB SMB anomaly vs. 1960–1989 MAR baseline
aST Surface temperature anomaly
ocean_thermal_forcing Ocean thermal forcing (absolute)
basin_runoff Basin-integrated runoff (absolute)

Training Data

Trained on ISMIP6 projections:

  • AIS: 18 drainage sectors, 8 km resolution
  • GrIS: 6 drainage basins, 5 km resolution
  • Period: 2015–2100 (86 annual timesteps)
  • Split: 70% train / 15% val / 15% test (random_state=42)

Performance

Model performance is evaluated on held-out ISMIP6 test projections. See the associated paper for quantitative metrics (RMSE, CRPS, coverage).


Citation

If you use ISEFlow in your research, please cite:

@software{vankatwyk2026ise,
  author       = {Van Katwyk, Peter},
  title        = {{ISE}: {Ice Sheet Emulator}},
  year         = {2026},
  version      = {2.0.0},
  publisher    = {GitHub},
  url          = {https://github.com/Brown-SciML/ise},
}

And the associated paper:

@article{vankatwyk_iseflow,
  title   = {ISEFlow: A Flow-Based Neural Network Emulator for Improved Sea Level Projections and Uncertainty Quantification},
  author  = {Van Katwyk, Peter},
  year    = {2025},
}

License

MIT License. See LICENSE.md.


Contact

Peter Van Katwyk — pvankatwyk@gmail.com Brown University, Department of Earth, Environmental and Planetary Sciences

Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support