ismip7_calibration
The ismip7_calibration test group
(compass.landice.tests.ismip7_calibration.Ismip7Calibration)
calibrates MALI’s sub-shelf melt parameterization against the ISMIP7
Antarctic ice-ocean protocol (Reese et al., Sect. 4.2).
The protocol asks each ice-sheet model to fit the free parameter of its melt module against four objective-function terms and to report the 5th, 50th and 95th percentiles of the resulting parameter distribution:
term |
what it constrains |
|---|---|
J1 |
present-day melt integrated over each IMBIE2 drainage basin |
J2 |
present-day melt integrated over bins of equal buttressing importance |
J3 |
the warm-minus-cold basin-mean melt difference of ocean models |
J4 |
observed melt of Pine Island and Dotson, per observation year |
The user’s guide describes the config options in ismip7_calibration.
The test group has two test cases: replication and ais.
framework
Code shared with the other ISMIP7 test groups lives in the landice framework
package compass.landice.ismip7, described in
Land-ice Framework. The modules below are specific to the
calibration.
datasets
compass.landice.tests.ismip7_calibration.datasets is the single
registry of which ocean states feed which objective-function term, and of
where the calibration targets live. Both test cases drive it, so the 8 km
replication and the MALI-mesh calibration cannot drift apart.
compass.landice.tests.ismip7_calibration.datasets.ocean_states()
returns the minimal (7), recommended (11) or all (28) subset of
protocol Table 2. Regional ocean models record the basins they cover, so
that melt outside their domains is discarded.
terms
compass.landice.tests.ismip7_calibration.terms implements J1-J4 in
a form that works on any mesh. The upstream toolbox assumes a uniform
structured grid: it converts cell sums to Gt/yr with a single scalar
reso**2 and takes unweighted means over basins. That is correct on the
ISMIP 8 km grid and wrong on MALI’s 4-20 km mesh, where cell area varies by a
factor of about 25. These functions take an explicit cell-area array
instead, so passing a uniform area reproduces the structured-grid answer
exactly while a real mesh gets an area-weighted one.
quadratic
compass.landice.tests.ismip7_calibration.quadratic implements both
melt formulas in Python: the Burgard et al. (2022) local quadratic of
protocol Eq. (1), and the ISMIP6 non-local quadratic. It serves as the
specification MALI’s Fortran is checked against and as what the replication
drives.
Note that local_quadratic_melt takes the slope angle while MALI’s
config_ismip7_melt_sin_slope is a sine;
compass.landice.tests.ismip7_calibration.quadratic.angle_from_sin_slope()
converts between them.
toolbox
compass.landice.tests.ismip7_calibration.toolbox holds a verbatim
copy of the upstream ISMIP7 parameter-selection toolbox, which implements the
objective function itself. PROVENANCE.md alongside it records the
upstream commit and a SHA256 that is verified on import and asserted by a
unit test, so an accidental edit or a partial update fails loudly rather than
quietly changing published numbers.
objective
compass.landice.tests.ismip7_calibration.objective assembles the
toolbox’s arguments and reduces its output to percentiles. Each term is
built once at a unit parameter value and scaled onto the parameter grid,
which is exact because melt is proportional to the parameter.
replication
landice/ismip7_calibration/replication reproduces the published 8 km
calibration through compass’s own code path, using the Python reference melt
implementation on the ISMIP grid. It runs in about a minute, needs no MALI
run, and must reproduce the published percentiles
K = 4.75e-5 / 8.5e-5 / 1.375e-4
exactly. validate() raises if it does not. This is the check that the
vendored toolbox is being driven correctly; the MALI calibration is built on
the same code path, so if this fails the MALI numbers cannot be trusted
either.
This test case deliberately uses the published inputs, including the spatially varying 8 km salinity fields. It replicates a published calculation, so it must not be changed to match the constant-salinity choice the MALI calibration makes.
ais
landice/ismip7_calibration/ais is the calibration itself, on an Antarctic
MALI mesh.
make_graphBuilds the graph partition file the melt diagnostics run on, once, from the mesh. Doing it here means the test group works on any MALI mesh rather than only on meshes that already have a partition file distributed alongside them.
remap_masksRemaps the ISMIP7 IMBIE2 basins, buttressing (BFRN) bins, floating mask and PIG/Dotson regions onto the MALI mesh, nearest-neighbour throughout since every field is categorical.
Two basin-numbering conventions are in play and they differ by one. ISMIP7’s
basinNumberis 0-based, 0-15, with basin 9 the Eastern Amundsen and basin 14 Ronne-Filchner, which is how the protocol refers to them. MALI’sismip6shelfMelt_basinis 1-based, 1-16, so MALI basin 10 is ISMIP7 basin 9. Both are written, under distinct names, so that neither can be silently reinterpreted as the other – a mistake that mis-assigns every basin while still producing plausible-looking numbers. The step cross-tabulates the result against the mesh’s existingregionCellMasksin both directions and fails below 80% agreement.remap_forcingRemaps the calibration thermal forcing for each ocean state. The observational states cover only about 6% of the ISMIP grid (protocol Sect. A10), so they are filled from the present-day climatology before remapping, exactly as the regional model datasets are distributed (Sect. A9); interpolation then never blends a real value with a missing one. The remapped field is required to be finite everywhere.
Only thermal forcing is remapped. See the salinity note below.
<melt_form>_<ocean_state>One single-timestep MALI melt diagnostic per ocean state and melt form, with the velocity solver off, so Albany is not required.
The run takes one short timestep rather than none: MALI computes melt inside the timestep, not in the initial diagnostic solve, so a zero-length run would produce no melt at all.
There is one run per ocean state, not one per parameter value. Melt is exactly proportional to the melt parameter, so the whole parameter ensemble follows by scaling a single run. That is what makes this 28 runs per melt form rather than about 1300. Do not “improve” this away.
Both melt forms read their parameter from an input stream –
ismip6shelfMelt_gamma0for the ISMIP6 method andismip7shelfMelt_Kfor the ISMIP7 one – rather than from the namelist, so that a single parameter file carries a complete calibration. Each run writes a smallmelt_parameter.ncholding the reference value, which the aggregation divides out again.<melt_form>_<ocean_state>_x<scale>Two extra runs of the reference ocean state at other multiples of the melt parameter, so that the linearity the ensemble design relies on is measured in MALI rather than argued from the code. Only the
ismip7form is scaled this way: its parameter is a namelist option, while the ISMIP6gamma0is read from an input file.verify_meltChecks MALI’s melt against the Python reference evaluated on MALI’s own
TFdraft, which isolates the melt expression from the vertical interpolation; checks that interpolation against an independent implementation written from the protocol, over all four of MALI’s code paths; and measures the linearity in the melt parameter from the scaled runs above.The comparison is restricted to the cells MALI itself computes melt for – floating and connected to the open ocean. MALI leaves
TFdraftand the melt at zero elsewhere, so including those cells would compare against values MALI never calculated.The draft is reconstructed from the mesh file, never taken from the run output. Melt thins the ice over the single timestep, so the output
lowerSurfaceandthicknessare post-step whileTFdraftwas computed pre-step; pairing them is inconsistent by up to a metre of draft.MALI applies the depth dependence of the freezing temperature to the thermal forcing in the two branches that extrapolate downward – below the deepest layer centre, and where the layer below the draft is beneath the bed. The Python reference must do the same, or the two disagree by several kelvin over thousands of cells.
aggregateAggregates melt to basins, buttressing bins and shelf regions. All aggregation is area-weighted: integrals use
melt * areaCelland means are weighted byareaCell. Also reports MALI’s per-basin ice-shelf area against the observed ISMIP7 extent, since J1, J2 and J4 are integrals and any shelf-area mismatch enters the calibrated parameter directly.The contributing cells are the ones MALI computed melt for, as in
verify_melt. Including the rest would not change an integral, since their melt is zero, but it would dilute the area-weighted basin means that J3 is built from.calibrateRuns the 100,000-sample parameter selection per melt form. The objective normalises each term by its own median over the parameter ensemble, so a minimised objective is not comparable between melt forms – only between parameter values within one form.
fit_delta_tFits the per-basin thermal-forcing correction
dT_bafter parameter selection, following protocol Sect. 4.2.1 option 2, as the published quadratic worked example does.dT_bdepends on the melt parameter, so it is fitted separately at the 5th, 50th and 95th percentiles, and a complete MALI parameter file –ismip6shelfMelt_basin,ismip6shelfMelt_deltaTand the parameter itself,ismip7shelfMelt_Korismip6shelfMelt_gamma0– is written for each asmelt_params_<form>_p05.nc,_p50.ncand_p95.nc. These are the deliverable: a projection at a given percentile points its parameter stream at the matching file. Fitting it first would leave the parameter bounds unconstrained where present-day melt is compared with observations, which is the drawback Sect. 4.2.1 names. The toolbox’s ownoptimise_deltaTcannot be used because it sums over structured-gridxandywith a single scalar cell area, so the search is reimplemented area-weighted.dTenters the melt only through the thermal forcing, so melt is recomputed in Python fromTFdraftand no further MALI runs are needed.reportParameter-distribution plots and a summary table.
melt forms and salinity
Two melt forms are calibrated, selected with the melt_forms config
option:
ismip7The Burgard et al. (2022) local quadratic of protocol Eq. (1), calibrating
K.ismip6The non-local quadratic MALI already had, calibrating
gamma0. With a constant salinity this is algebraically identical to the Burgard semi-local form of protocol Eq. (2) – only the decomposition of the constant differs – so this is how the semi-local form is calibrated, rather than as a third melt module.
The calibration uses a constant salinity, set by the salinity config
option and passed to MALI as
config_ismip7_melt_salinity_source = 'constant'. MALI can read a 3-D
salinity field, but the ISMIP7 ocean forcing already processed for the MALI
projections carries thermal forcing only, so a projection has no salinity
field to read. Calibrating against a spatially varying salinity would tune
K for physics the projections cannot run.
Melt is linear in salinity and basin-mean salinity spans about 34.1 to 34.7
against the constant 34.5, so this shifts the calibrated parameter by roughly
1%. Note that the published K was obtained with a locally varying
salinity, so comparison with it is approximate at about that level.
using a MALI build with the ISMIP7 melt method
The ismip7 melt form needs a MALI build that has
config_basal_mass_bal_float = 'ismip7', which the compass MALI-Dev
submodule has had since MALI-Dev/E3SM#191. An older build can still be
pointed at with
[paths]
mpas_model = /path/to/E3SM/components/mpas-albany-landice
Compass only warns when a namelist option is missing from the model’s
defaults, so a build without the ISMIP7 melt method would silently drop
config_ismip7_melt_sin_slope and produce a plausible but wrong
calibration. The
run_state step therefore checks the default namelist at setup and fails
with a clear message instead.