Skip to content

Sea-level rise

Back to general structure

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:

2100 warming AR6 median [likely range] low central high
2 degrees C 0.668 [0.558--0.848] 0.547 0.619 0.825
3 degrees C 0.778 [0.658--0.968] 0.644 0.741 1.162
4 degrees C 0.858 [0.738--1.068] 0.737 0.858 1.531

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:

Component 2 degrees C 3 degrees C 4 degrees C
Thermal expansion 0.217 0.277 0.338
Glaciers 0.151 0.167 0.177
Greenland 0.102 0.143 0.187
Antarctica 0.12 0.122 0.125
Land-water storage 0.03 0.03 0.03

References:

Source code in mimosa/components/sealevelrise.py
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
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