Views
No views yet
nflows) with a
ConditionalDiagonalNormal base distribution. Trained first via maximum likelihood to capture
aleatoric (data/structural) uncertainty.[X, z] where z is
the NF latent representation, capturing epistemic (model) uncertainty as ensemble
disagreement.| 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) |
| 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 |
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)ise-py package:pip install ise-py1from ise.models.iseflow import ISEFlow_AIS
2from ise.data.inputs import ISEFlowAISInputs
3import numpy as np
4
5year = np.arange(2015, 2101)
6
7# Option A: pre-computed anomaly inputs
8inputs = ISEFlowAISInputs(
9 year=year,
10 sector=10,
11 pr_anomaly=np.zeros(86),
12 evspsbl_anomaly=np.zeros(86),
13 smb_anomaly=np.zeros(86),
14 ts_anomaly=np.zeros(86),
15 ocean_thermal_forcing=np.linspace(1.5, 2.5, 86),
16 ocean_salinity=np.full(86, 34.5),
17 ocean_temperature=np.zeros(86),
18 numerics="fd",
19 stress_balance="hybrid",
20 resolution="8",
21 init_method="eq",
22 initial_year=2005,
23 melt_in_floating_cells="sub-grid",
24 icefront_migration="str",
25 ocean_forcing_type="open",
26 ocean_sensitivity="medium",
27 ice_shelf_fracture=False,
28 open_melt_type="quad",
29 standard_melt_type="nonlocal",
30)
31
32# Option B: raw absolute forcing values (anomaly conversion is automatic)
33inputs = ISEFlowAISInputs.from_absolute_forcings(
34 year=year,
35 sector=10,
36 pr=np.full(86, 1.3e-5),
37 evspsbl=np.full(86, 4e-6),
38 smb=np.full(86, 9e-6),
39 ts=np.full(86, 255.0),
40 ocean_thermal_forcing=np.linspace(1.5, 2.5, 86),
41 ocean_salinity=np.full(86, 34.5),
42 ocean_temperature=np.zeros(86),
43 aogcm="noresm1-m_rcp85",
44 numerics="fd",
45 stress_balance="hybrid",
46 resolution="8",
47 init_method="eq",
48 initial_year=2005,
49 melt_in_floating_cells="sub-grid",
50 icefront_migration="str",
51 ocean_forcing_type="open",
52 ocean_sensitivity="medium",
53 ice_shelf_fracture=False,
54 open_melt_type="quad",
55 standard_melt_type="nonlocal",
56)
57
58# Load model and predict
59model = ISEFlow_AIS(version="v1.1.0")
60predictions, uncertainties = model.predict(inputs)
61
62print(predictions.shape) # (86, 1) — mm SLE, 2015-2100
63print(uncertainties["epistemic"]) # epistemic uncertainty per timestep
64print(uncertainties["aleatoric"]) # aleatoric uncertainty per timestep
65print(uncertainties["total"]) # total = epistemic + aleatoric1from ise.models.iseflow import ISEFlow_GrIS
2from ise.data.inputs import ISEFlowGrISInputs
3import numpy as np
4
5year = np.arange(2015, 2101)
6
7inputs = ISEFlowGrISInputs.from_absolute_forcings(
8 year=year,
9 sector=1,
10 smb=np.full(86, -200.0),
11 st=np.full(86, -20.0),
12 ocean_thermal_forcing=np.linspace(2.2, 3.5, 86),
13 basin_runoff=np.linspace(0.01, 0.10, 86),
14 aogcm="hadgem2-es_rcp85",
15 initial_year=1990,
16 numerics="fe",
17 ice_flow_model="ho",
18 initialization="dav",
19 initial_smb="ra3",
20 velocity="joughin",
21 bedrock_topography="morlighem",
22 surface_thickness="None",
23 geothermal_heat_flux="g",
24 res_min=1.0,
25 res_max=7.5,
26 standard_ocean_forcing=True,
27 ocean_sensitivity="medium",
28 ice_shelf_fracture=False,
29)
30
31model = ISEFlow_GrIS(version="v1.1.0")
32predictions, uncertainties = model.predict(inputs)| 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 |
from_absolute_forcings() + aogcm= to convert raw values automatically.| 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) |
random_state=42)1@software{vankatwyk2026ise,
2 author = {Van Katwyk, Peter},
3 title = {{ISE}: {Ice Sheet Emulator}},
4 year = {2026},
5 version = {2.0.0},
6 publisher = {GitHub},
7 url = {https://github.com/Brown-SciML/ise},
8}1@article{vankatwyk_iseflow,
2 title = {ISEFlow: A Flow-Based Neural Network Emulator for Improved Sea Level Projections and Uncertainty Quantification},
3 author = {Van Katwyk, Peter},
4 year = {2025},
5}