The sea-level-rise (SLR) component represents thermal expansion, glaciers,
the Greenland ice sheet (GIS), the Antarctic ice sheet (AIS), and future
changes in land-water storage (LWS). The formulation is deliberately small
and deterministic so it can be evaluated both by the MIMOSA simulator and
as part of the Pyomo optimisation model.
All component values are expressed as metres above the 1900 global mean
sea-level reference. The values at the model start are linearly interpolated
between zero in 1900 and the central 2025 estimates below. This makes the
reference year explicit and prevents a run starting before 2025 from using
2025 sea-level values.
The component option projection selects a coherent low, central, or
high deterministic response set. The sets use identical historical
initial conditions, but different sensitivities, response times, and AIS
fast-response assumptions. The default is central.
The projection can be selected before model construction with:
params["model structure"]["sealevelrise options"]["projection"] = "high"
Thermal expansion
Thermal expansion is represented by a fast and a slow response box. Each
box relaxes towards a temperature-dependent equilibrium:
\[
S_{i,t}=\beta_i T_{t-1}+
\left(S_{i,t-1}-\beta_i T_{t-1}\right)e^{-\Delta t/\tau_i},
\qquad i\in\{\text{fast},\text{slow}\}.
\]
The exact exponential update makes the response independent of the chosen
numerical time step for a constant temperature forcing.
This two-timescale equation is a reduced-form approximation chosen for
MIMOSA, rather than a direct reproduction of an ocean model. The first-order
relaxation form follows BRICK v0.2 (Wong et al., 2017, Sect. 3.2.4,
Eqs. 9--10). Splitting it into fast and slow boxes represents the upper- and
deep-ocean distinction in SURFER v2.0 (Martínez Montero et al., 2022,
Sects. 2.3.1 and 2.4.3). MIMOSA's equilibrium sensitivities and response
times are calibrated jointly against the AR6 thermal-expansion contributions
in Table 9.9 of Fox-Kemper et al. (2021); they are not the coefficients from
either BRICK or SURFER.
Glaciers
The glacier contribution relaxes towards the capped equilibrium proposed
by Martínez Montero et al. (2022):
\[
S^*_{\mathrm{GL}}(T)=P_{\mathrm{GL}}
\tanh\left(\frac{T}{\zeta_{\mathrm{GL}}}\right),
\]
\[
S_{\mathrm{GL},t}=S^*_{\mathrm{GL}}(T_{t-1})+
\left(S_{\mathrm{GL},t-1}-S^*_{\mathrm{GL}}(T_{t-1})\right)
e^{-\Delta t/\tau_{\mathrm{GL}}}.
\]
This replaces the previous formulation, in which all glaciers eventually
melted under any sustained temperature above -1 degree C.
Greenland ice sheet
Greenland follows a SIMPLE-style delayed equilibrium. Its equilibrium
contribution is a normalised logistic function bounded by the ice sheet's
sea-level potential. Its response time decreases smoothly with warming:
\[
S^*_{\mathrm{GIS}}(T)=P_{\mathrm{GIS}}
\frac{\sigma((T-T_c)/w)-\sigma(-T_c/w)}
{1-\sigma(-T_c/w)},
\]
\[
\tau_{\mathrm{GIS}}(T)=\tau_0e^{-\gamma T}.
\]
Antarctic ice sheet
A single lagged Antarctic subsurface-ocean temperature proxy drives the AIS
response. A smooth threshold term represents the possibility of faster ice
loss at high warming while retaining differentiability for optimisation:
\[
T_{A,t}=\lambda_A T_{t-1}+
\left(T_{A,t-1}-\lambda_A T_{t-1}\right)e^{-\Delta t/\tau_A},
\]
\[
S_{\mathrm{AIS},t}=S_{\mathrm{AIS},t-1}+\Delta t
\left[r_0+r_1T_{A,t}+r_f\sigma((T_{A,t}-T_{crit})/w_A)\right]
\left(1-\frac{S_{\mathrm{AIS},t-1}}{P_{\mathrm{AIS}}}\right).
\]
The scaling and delay between global surface warming and Antarctic
subsurface-ocean warming are motivated by LARMIP-2 (Levermann et al., 2020,
Sect. 2.2). The AIS rate equation itself is a deliberately simpler MIMOSA
parameterisation, not a reproduction of LARMIP-2 or SURFER. Its smooth fast
term is inspired by the threshold representation of uncertain rapid
Antarctic disintegration in Wong et al. (2017). The ordinary background and
temperature-response rates are calibrated against the AR6 AIS contributions
in Table 9.9. The high parameter set is intended as a low-likelihood,
high-impact sensitivity case and not as the upper endpoint of the AR6 likely
range.
Land-water storage
AR6 projects an approximately scenario-independent land-water contribution
of 0.03 m between 1995--2014 and 2100. Because the historical contribution
is already implicit in MIMOSA's 2025 initial total, only its future anomaly
is added explicitly:
\[
S_{\mathrm{LWS},t}=S_{\mathrm{LWS},t-1}+\Delta t\,r_{\mathrm{LWS}},
\qquad r_{\mathrm{LWS}}=0.0004\ \mathrm{m\,yr^{-1}}.
\]
Total sea-level rise
\[
S_t=S_{\mathrm{thermal},t}+S_{\mathrm{GL},t}
+S_{\mathrm{GIS},t}+S_{\mathrm{AIS},t}+S_{\mathrm{LWS},t}.
\]
Calibration against IPCC AR6
The process papers motivate the compact equation forms; they do not imply
that every coefficient is transferred unchanged. The three coherent
parameter sets are outcome-calibrated against AR6 WGI Table 9.9 and the
warming-level assessment in Chapter 12. Consequently, increasing the
glacier or ordinary AIS response remains consistent with the cited equation
structure while bringing total SLR into the assessed AR6 ranges. The
following benchmark prescribes a linear warming path from 1.27 degrees C in
2025 to the stated 2100 warming level. Values are metres relative to 1900:
The MIMOSA columns in this table and the component table below are generated
directly from the current component equations. After changing the SLR
formulation or parameters, regenerate both tables from the repository root:
python docs/scripts/generate_slr_benchmark.py
A model test compares the committed CSV files with a fresh calculation so
that outdated documentation is detected automatically.
AR6 Chapter 12 reports the warming-level values relative to 1995--2014.
The table adds the assessed 0.158 m rise from 1900 to 1995--2014, following
the AR6 Summary for Policymakers. The comparison is a calibration diagnostic,
not a claim that a warming level uniquely determines SLR: the preceding
temperature pathway and rate of warming also affect the lagged components.
Under this diagnostic, the low set tracks the lower edge of the AR6 likely
range and central remains within it. High exceeds the likely range at 3 and
4 degrees C by design, representing rapid Antarctic loss. For transparency,
the central 2100 component values at 2, 3, and 4 degrees C respectively are:
References:
Source code in mimosa/components/sealevelrise.py
| def get_constraints(
m: AbstractModel, context: ModelContext
) -> Sequence[GeneralConstraint]:
r"""
The sea-level-rise (SLR) component represents thermal expansion, glaciers,
the Greenland ice sheet (GIS), the Antarctic ice sheet (AIS), and future
changes in land-water storage (LWS). The formulation is deliberately small
and deterministic so it can be evaluated both by the MIMOSA simulator and
as part of the Pyomo optimisation model.
All component values are expressed as metres above the 1900 global mean
sea-level reference. The values at the model start are linearly interpolated
between zero in 1900 and the central 2025 estimates below. This makes the
reference year explicit and prevents a run starting before 2025 from using
2025 sea-level values.
The component option `projection` selects a coherent `low`, `central`, or
`high` deterministic response set. The sets use identical historical
initial conditions, but different sensitivities, response times, and AIS
fast-response assumptions. The default is `central`.
The projection can be selected before model construction with:
```python
params["model structure"]["sealevelrise options"]["projection"] = "high"
```
# Thermal expansion
Thermal expansion is represented by a fast and a slow response box. Each
box relaxes towards a temperature-dependent equilibrium:
$$
S_{i,t}=\beta_i T_{t-1}+
\left(S_{i,t-1}-\beta_i T_{t-1}\right)e^{-\Delta t/\tau_i},
\qquad i\in\{\text{fast},\text{slow}\}.
$$
The exact exponential update makes the response independent of the chosen
numerical time step for a constant temperature forcing.
This two-timescale equation is a reduced-form approximation chosen for
MIMOSA, rather than a direct reproduction of an ocean model. The first-order
relaxation form follows BRICK v0.2 (Wong et al., 2017, Sect. 3.2.4,
Eqs. 9--10). Splitting it into fast and slow boxes represents the upper- and
deep-ocean distinction in SURFER v2.0 (Martínez Montero et al., 2022,
Sects. 2.3.1 and 2.4.3). MIMOSA's equilibrium sensitivities and response
times are calibrated jointly against the AR6 thermal-expansion contributions
in Table 9.9 of Fox-Kemper et al. (2021); they are not the coefficients from
either BRICK or SURFER.
# Glaciers
The glacier contribution relaxes towards the capped equilibrium proposed
by Martínez Montero et al. (2022):
$$
S^*_{\mathrm{GL}}(T)=P_{\mathrm{GL}}
\tanh\left(\frac{T}{\zeta_{\mathrm{GL}}}\right),
$$
$$
S_{\mathrm{GL},t}=S^*_{\mathrm{GL}}(T_{t-1})+
\left(S_{\mathrm{GL},t-1}-S^*_{\mathrm{GL}}(T_{t-1})\right)
e^{-\Delta t/\tau_{\mathrm{GL}}}.
$$
This replaces the previous formulation, in which all glaciers eventually
melted under any sustained temperature above -1 degree C.
# Greenland ice sheet
Greenland follows a SIMPLE-style delayed equilibrium. Its equilibrium
contribution is a normalised logistic function bounded by the ice sheet's
sea-level potential. Its response time decreases smoothly with warming:
$$
S^*_{\mathrm{GIS}}(T)=P_{\mathrm{GIS}}
\frac{\sigma((T-T_c)/w)-\sigma(-T_c/w)}
{1-\sigma(-T_c/w)},
$$
$$
\tau_{\mathrm{GIS}}(T)=\tau_0e^{-\gamma T}.
$$
# Antarctic ice sheet
A single lagged Antarctic subsurface-ocean temperature proxy drives the AIS
response. A smooth threshold term represents the possibility of faster ice
loss at high warming while retaining differentiability for optimisation:
$$
T_{A,t}=\lambda_A T_{t-1}+
\left(T_{A,t-1}-\lambda_A T_{t-1}\right)e^{-\Delta t/\tau_A},
$$
$$
S_{\mathrm{AIS},t}=S_{\mathrm{AIS},t-1}+\Delta t
\left[r_0+r_1T_{A,t}+r_f\sigma((T_{A,t}-T_{crit})/w_A)\right]
\left(1-\frac{S_{\mathrm{AIS},t-1}}{P_{\mathrm{AIS}}}\right).
$$
The scaling and delay between global surface warming and Antarctic
subsurface-ocean warming are motivated by LARMIP-2 (Levermann et al., 2020,
Sect. 2.2). The AIS rate equation itself is a deliberately simpler MIMOSA
parameterisation, not a reproduction of LARMIP-2 or SURFER. Its smooth fast
term is inspired by the threshold representation of uncertain rapid
Antarctic disintegration in Wong et al. (2017). The ordinary background and
temperature-response rates are calibrated against the AR6 AIS contributions
in Table 9.9. The high parameter set is intended as a low-likelihood,
high-impact sensitivity case and not as the upper endpoint of the AR6 likely
range.
# Land-water storage
AR6 projects an approximately scenario-independent land-water contribution
of 0.03 m between 1995--2014 and 2100. Because the historical contribution
is already implicit in MIMOSA's 2025 initial total, only its future anomaly
is added explicitly:
$$
S_{\mathrm{LWS},t}=S_{\mathrm{LWS},t-1}+\Delta t\,r_{\mathrm{LWS}},
\qquad r_{\mathrm{LWS}}=0.0004\ \mathrm{m\,yr^{-1}}.
$$
# Total sea-level rise
$$
S_t=S_{\mathrm{thermal},t}+S_{\mathrm{GL},t}
+S_{\mathrm{GIS},t}+S_{\mathrm{AIS},t}+S_{\mathrm{LWS},t}.
$$
## Calibration against IPCC AR6
The process papers motivate the compact equation forms; they do not imply
that every coefficient is transferred unchanged. The three coherent
parameter sets are outcome-calibrated against AR6 WGI Table 9.9 and the
warming-level assessment in Chapter 12. Consequently, increasing the
glacier or ordinary AIS response remains consistent with the cited equation
structure while bringing total SLR into the assessed AR6 ranges. The
following benchmark prescribes a linear warming path from 1.27 degrees C in
2025 to the stated 2100 warming level. Values are metres relative to 1900:
<div class="tiny_table table_first_col_header" markdown>
{{ read_csv_macro("docs/assets/data/slr_ar6_benchmark.csv") }}
</div>
The MIMOSA columns in this table and the component table below are generated
directly from the current component equations. After changing the SLR
formulation or parameters, regenerate both tables from the repository root:
```shell
python docs/scripts/generate_slr_benchmark.py
```
A model test compares the committed CSV files with a fresh calculation so
that outdated documentation is detected automatically.
AR6 Chapter 12 reports the warming-level values relative to 1995--2014.
The table adds the assessed 0.158 m rise from 1900 to 1995--2014, following
the AR6 Summary for Policymakers. The comparison is a calibration diagnostic,
not a claim that a warming level uniquely determines SLR: the preceding
temperature pathway and rate of warming also affect the lagged components.
Under this diagnostic, the low set tracks the lower edge of the AR6 likely
range and central remains within it. High exceeds the likely range at 3 and
4 degrees C by design, representing rapid Antarctic loss. For transparency,
the central 2100 component values at 2, 3, and 4 degrees C respectively are:
<div class="tiny_table table_first_col_header" markdown>
{{ read_csv_macro("docs/assets/data/slr_ar6_components.csv") }}
</div>
References:
- [Fox-Kemper et al. (2021), IPCC AR6 WGI Chapter 9](https://www.ipcc.ch/report/ar6/wg1/chapter/chapter-9/).
- [IPCC AR6 WGI Chapter 12, climate impact-driver projections](https://www.ipcc.ch/report/ar6/wg1/chapter/chapter-12/).
- [IPCC AR6 WGI Summary for Policymakers](https://www.ipcc.ch/report/ar6/wg1/chapter/summary-for-policymakers/).
- [Bakker, Applegate and Keller (2016), SIMPLE](https://doi.org/10.1016/j.envsoft.2016.05.003).
- [Martínez Montero et al. (2022), SURFER v2.0](https://doi.org/10.5194/gmd-15-8059-2022).
- [Wong et al. (2017), BRICK v0.2](https://doi.org/10.5194/gmd-10-2741-2017).
- [Levermann et al. (2020), LARMIP-2](https://doi.org/10.5194/esd-11-35-2020).
- [Wong, Bakker and Keller (2017), Antarctic fast dynamics](https://doi.org/10.1007/s10584-017-2039-4).
"""
projection = context.option("sealevelrise", "projection", default="central")
try:
slr_params = SLR_PROJECTION_PARAMETER_SETS[projection]
except KeyError as exc:
valid = ", ".join(SLR_PROJECTION_PARAMETER_SETS)
raise ValueError(
f"Unknown SLR projection parameter set '{projection}'. "
f"Expected one of: {valid}."
) from exc
# A common reference year and rounded central component values at the
# default model start. Their 0.23 m sum is consistent with the assessed
# historical rise and recent component trends. Values are metres of global
# mean SLR above the 1900 reference.
m.slr_reference_year = Param(initialize=1900)
m.slr_initial_year = Param(initialize=2025)
# Thermal expansion: fast upper-ocean and slow deep-ocean response boxes.
m.slr_thermal_fast = Var(m.t, within=NonNegativeReals, units=quant.unit("m"))
m.slr_thermal_slow = Var(m.t, within=NonNegativeReals, units=quant.unit("m"))
m.slr_thermal = Var(m.t, within=NonNegativeReals, units=quant.unit("m"))
m.slr_thermal_fast_init = Param(initialize=0.045)
m.slr_thermal_slow_init = Param(initialize=0.025)
m.slr_thermal_fast_sensitivity = Param(
initialize=slr_params["thermal_fast_sensitivity"]
)
m.slr_thermal_slow_sensitivity = Param(
initialize=slr_params["thermal_slow_sensitivity"]
)
m.slr_thermal_fast_timescale = Param(
initialize=slr_params["thermal_fast_timescale"]
)
m.slr_thermal_slow_timescale = Param(
initialize=slr_params["thermal_slow_timescale"]
)
# Glaciers. The 0.32 m potential follows the AR6 parametric extrapolation.
m.slr_cumgsic = Var(m.t, within=NonNegativeReals, units=quant.unit("m"))
m.slr_gsic_init = Param(initialize=0.090)
m.slr_gsic_total_ice = Param(initialize=0.32)
m.slr_gsic_temp_sensitivity = Param(
initialize=slr_params["gsic_temp_sensitivity"]
)
m.slr_gsic_timescale = Param(initialize=slr_params["gsic_timescale"])
# Greenland. The potential is the sea-level equivalent of the full ice
# sheet; the remaining parameters govern equilibrium and response speed.
m.slr_cumgis = Var(m.t, within=NonNegativeReals, units=quant.unit("m"))
m.slr_gis_init = Param(initialize=0.045)
m.slr_gis_total_ice = Param(initialize=7.3)
m.slr_gis_threshold = Param(initialize=slr_params["gis_threshold"])
m.slr_gis_transition_width = Param(
initialize=slr_params["gis_transition_width"]
)
m.slr_gis_base_timescale = Param(
initialize=slr_params["gis_base_timescale"]
)
m.slr_gis_timescale_sensitivity = Param(
initialize=slr_params["gis_timescale_sensitivity"]
)
# Antarctica. The proxy temperature is in degrees C above pre-industrial;
# rates are metres of sea-level equivalent per year.
m.slr_antarctic_ocean_temp = Var(
m.t, units=quant.unit("degC_above_PI")
)
m.slr_ais_ocean_temp_init = Param(initialize=0.30)
m.slr_ais_ocean_temp_scaling = Param(
initialize=slr_params["ais_ocean_temp_scaling"]
)
m.slr_ais_ocean_temp_timescale = Param(
initialize=slr_params["ais_ocean_temp_timescale"]
)
m.slr_cumais = Var(m.t, within=NonNegativeReals, units=quant.unit("m"))
m.slr_ais_init = Param(initialize=0.025)
# Effective vulnerable Antarctic stock, rather than the full AIS potential.
m.slr_ais_total_ice = Param(initialize=5.0)
m.slr_ais_background_rate = Param(
initialize=slr_params["ais_background_rate"]
)
m.slr_ais_temp_sensitivity = Param(
initialize=slr_params["ais_temp_sensitivity"]
)
m.slr_ais_fast_rate = Param(initialize=slr_params["ais_fast_rate"])
m.slr_ais_fast_threshold = Param(
initialize=slr_params["ais_fast_threshold"]
)
m.slr_ais_fast_transition_width = Param(
initialize=slr_params["ais_fast_transition_width"]
)
# Future land-water-storage anomaly. Its historical contribution is
# implicit in the common 2025 initial total, avoiding double counting.
m.slr_cumlws = Var(m.t, within=NonNegativeReals, units=quant.unit("m"))
m.slr_lws_rate = Param(initialize=0.0004)
m.total_SLR = Var(m.t, within=NonNegativeReals, units=quant.unit("m"))
constraints = [
GlobalEquation(
m.slr_thermal_fast,
lambda m, t: (
slr_thermal_expansion(
m.slr_thermal_fast[t - 1],
m.temperature[t - 1],
m.slr_thermal_fast_sensitivity,
m.slr_thermal_fast_timescale,
m,
m.period_length[t],
)
if t > 0
else slr_initial_value(m.slr_thermal_fast_init, m)
),
),
GlobalEquation(
m.slr_thermal_slow,
lambda m, t: (
slr_thermal_expansion(
m.slr_thermal_slow[t - 1],
m.temperature[t - 1],
m.slr_thermal_slow_sensitivity,
m.slr_thermal_slow_timescale,
m,
m.period_length[t],
)
if t > 0
else slr_initial_value(m.slr_thermal_slow_init, m)
),
),
GlobalEquation(
m.slr_thermal,
lambda m, t: m.slr_thermal_fast[t] + m.slr_thermal_slow[t],
),
GlobalEquation(
m.slr_cumgsic,
lambda m, t: (
slr_gsic(
m.slr_cumgsic[t - 1],
m.temperature[t - 1],
m,
m.period_length[t],
)
if t > 0
else slr_initial_value(m.slr_gsic_init, m)
),
),
GlobalEquation(
m.slr_cumgis,
lambda m, t: (
slr_gis(
m.slr_cumgis[t - 1],
m.temperature[t - 1],
m,
m.period_length[t],
)
if t > 0
else slr_initial_value(m.slr_gis_init, m)
),
),
GlobalEquation(
m.slr_antarctic_ocean_temp,
lambda m, t: (
slr_antarctic_ocean_temperature(
m.slr_antarctic_ocean_temp[t - 1],
m.temperature[t - 1],
m,
m.period_length[t],
)
if t > 0
else slr_initial_value(m.slr_ais_ocean_temp_init, m)
),
),
GlobalEquation(
m.slr_cumais,
lambda m, t: (
slr_ais(
m.slr_cumais[t - 1],
m.slr_antarctic_ocean_temp[t],
m,
m.period_length[t],
)
if t > 0
else slr_initial_value(m.slr_ais_init, m)
),
),
GlobalEquation(
m.slr_cumlws,
lambda m, t: (
m.slr_cumlws[t - 1]
+ m.period_length[t] * m.slr_lws_rate
if t > 0
else 0.0
),
),
GlobalEquation(
m.total_SLR,
lambda m, t: (
m.slr_thermal[t]
+ m.slr_cumgsic[t]
+ m.slr_cumgis[t]
+ m.slr_cumais[t]
+ m.slr_cumlws[t]
),
),
]
return constraints
|