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:
NormalizingFlow — an autoregressive masked affine normalizing flow (via
nflows) with aConditionalDiagonalNormalbase distribution. Trained first via maximum likelihood to capture aleatoric (data/structural) uncertainty.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]wherezis 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