Glacial cycle

The previous examples focused on benchmarking FastIsostasy against analytical, numerical 1D and numerical 3D solutions. However, these cases were largely idealised. To test the model on more realistic simulations, we now provide compute the GIA response in Antarctica over the last glacial cycle. This includes the use of:

We start by generating a RegionalDomain with intermediate resolution for the sake of the example and load the ice history thanks to the convenience of load_dataset. To get an idea of the ICE6G forcing, the ice thickness is visualised at the last glacial maximum (LGM):

using CairoMakie, FastIsostasy

N = 140
domain = RegionalDomain(3500e3, 3500e3, N, N)   # resolution = 50 km
Lon, Lat = domain.Lon, domain.Lat
(_, _, t), Hice, Hitp = load_dataset("ICE6G_D")
Hice_vec = [Hitp.(Lon, Lat, tk) for tk in t]
k_lgm = argmax([mean(Hice_vec[k]) for k in eachindex(Hice_vec)])
plot_load(domain, Hice_vec[k_lgm])

This already looks like a much more exciting ice thickness field! Here again, the ice history is wrapped into an interpolator, which is passed to an instance of BoundaryConditions. We define the SeaLevel to include the gravitational response by making the surface a LaterallyVariableSeaSurface. Furthermore, we allow the changes in sea level to affect the deformational response of the solid Earth by setting InteractiveSealevelLoad. Finally, we compute the evolution of the barystatic sea level (BSL) according to a piece-wise constant approximation of the ocean surface as a function of the BSL:

it = TimeInterpolatedIceThickness(t .* 1e3, Hice_vec, domain)
bcs = BoundaryConditions(domain, ice_thickness = it)
sealevel = SeaLevel(
    surface = LaterallyVariableSeaSurface(),
    load = InteractiveSealevelLoad(),
    bsl = PiecewiseConstantBSL(),
)
SeaLevel{LaterallyVariableSeaSurface, InteractiveSealevelLoad, PiecewiseConstantBSL{Float32, ReferenceBSL{Float32, FastIsostasy.TimeInterpolation0D{Float32}}}, InternalUpdateBSL}(LaterallyVariableSeaSurface(), InteractiveSealevelLoad(), PiecewiseConstantBSL{Float32, ReferenceBSL{Float32, FastIsostasy.TimeInterpolation0D{Float32}}}(ReferenceBSL{Float32, FastIsostasy.TimeInterpolation0D{Float32}}(0.0f0, 3.625f14, Float32[-150.0, -149.9, -149.8, -149.7, -149.6, -149.5, -149.4, -149.3, -149.2, -149.1  …  69.1, 69.2, 69.3, 69.4, 69.5, 69.6, 69.7, 69.8, 69.9, 70.0], Float32[3.4401262f14, 3.4402312f14, 3.4403148f14, 3.440368f14, 3.4404507f14, 3.4404983f14, 3.4405882f14, 3.440671f14, 3.4407245f14, 3.4408074f14  …  3.852362f14, 3.8525696f14, 3.852777f14, 3.8529833f14, 3.8531923f14, 3.8534044f14, 3.853611f14, 3.853818f14, 3.854026f14, 3.8542305f14], FastIsostasy.TimeInterpolation0D{Float32}(Float32[-150.0, -149.9, -149.8, -149.7, -149.6, -149.5, -149.4, -149.3, -149.2, -149.1  …  69.1, 69.2, 69.3, 69.4, 69.5, 69.6, 69.7, 69.8, 69.9, 70.0], Float32[3.3774267f14, 3.3775297f14, 3.377612f14, 3.3776643f14, 3.377745f14, 3.377792f14, 3.3778804f14, 3.3779616f14, 3.3780143f14, 3.3780955f14  …  3.782149f14, 3.782353f14, 3.7825566f14, 3.7827592f14, 3.7829642f14, 3.7831726f14, 3.7833756f14, 3.7835786f14, 3.783783f14, 3.7839836f14], false)), 0.0f0, 3.625f14), InternalUpdateBSL())

Finally, we load the interpolators of earth structure thanks to the convenience function load_dataset.

(_, _), Tpan, Titp = load_dataset("Lithothickness_Pan2022")
Tlitho = Titp.(Lon, Lat) .* 1e3                     # convert from m to km
(_, _, _), _, logeta_itp = load_dataset("Viscosity_Pan2022")
(([-179.5, -179.0, -178.5, -178.0, -177.5, -177.0, -176.5, -176.0, -175.5, -175.0  …  175.5, 176.0, 176.5, 177.0, 177.5, 178.0, 178.5, 179.0, 179.5, 180.0], [-90.0, -89.5, -89.0, -88.5, -88.0, -87.5, -87.0, -86.5, -86.0, -85.5  …  85.5, 86.0, 86.5, 87.0, 87.5, 88.0, 88.5, 89.0, 89.5, 90.0], [3.5298448275852134e6, 3.5796896551732332e6, 3.6300000000001593e6, 3.680600706716196e6, 3.731678445228479e6, 3.7827561837463e6, 3.833833922264341e6, 3.884911660773705e6, 3.9359893992920252e6, 3.9870671378111225e6  …  6.151000000000001e6, 6.171000000002125e6, 6.190999999973099e6, 6.2109999999932265e6, 6.231000000027917e6, 6.250999999971964e6, 6.274999999972597e6, 6.298499999991569e6, 6.322000000031837e6, 6.34659999997364e6]), Float32[21.898117 21.812355 … 22.85709 22.764662; 21.898117 21.812355 … 22.854446 22.764662; … ; 21.898117 21.812355 … 22.857298 22.764662; 21.898117 21.812355 … 22.857801 22.764662;;; 22.37607 22.264135 … 23.260921 23.19398; 22.37607 22.264135 … 23.254314 23.19398; … ; 22.37607 22.264135 … 23.269352 23.19398; 22.37607 22.264135 … 23.26836 23.19398;;; 22.761507 22.656908 … 23.116743 23.120834; 22.761507 22.656908 … 23.116238 23.120834; … ; 22.761507 22.656908 … 23.11527 23.120834; 22.761507 22.656908 … 23.115332 23.120834;;; … ;;; 22.42295 22.171955 … 20.865768 20.805326; 22.42295 22.166954 … 20.866772 20.805326; … ; 22.42295 22.181955 … 20.86479 20.805326; 22.42295 22.176954 … 20.864803 20.805326;;; 22.422972 22.17197 … 20.872458 20.811415; 22.422972 22.166971 … 20.873459 20.811415; … ; 22.422972 22.18197 … 20.871456 20.811415; 22.422972 22.176971 … 20.871456 20.811415;;; 22.42297 22.17197 … 20.87197 20.81097; 22.42297 22.16697 … 20.87297 20.81097; … ; 22.42297 22.18197 … 20.87097 20.81097; 22.42297 22.17697 … 20.87097 20.81097], 721×361×64 extrapolate(interpolate((::Vector{Float64},::Vector{Float64},::Vector{Float64}), ::Array{Float32, 3}, Gridded(Linear())), Flat()) with element type Float32:
[:, :, 1] =
 21.8981  21.8124  21.7422  21.6872  …  22.893   22.9051  22.8571  22.7647
 21.8981  21.8124  21.7422  21.6872     22.8855  22.9003  22.8544  22.7647
 21.8981  21.8124  21.7422  21.6872     22.8833  22.8948  22.8508  22.7647
 21.8981  21.8124  21.7422  21.6872     22.8818  22.8899  22.8477  22.7647
 21.8981  21.8124  21.7422  21.6872     22.8769  22.8893  22.848   22.7647
 21.8981  21.8124  21.7422  21.6872  …  22.8724  22.8899  22.849   22.7647
 21.8981  21.8124  21.7422  21.6875     22.8696  22.8907  22.8495  22.7647
 21.8981  21.8124  21.7422  21.6875     22.8668  22.8899  22.8493  22.7647
 21.8981  21.8123  21.7422  21.6874     22.8572  22.8842  22.8475  22.7647
 21.8981  21.8122  21.7422  21.6873     22.8488  22.8774  22.8435  22.7647
  ⋮                                  ⋱                              ⋮
 21.8981  21.8115  21.7422  21.6896     22.9433  22.9287  22.8659  22.7647
 21.8981  21.8118  21.7422  21.6878     22.9359  22.9241  22.864   22.7647
 21.8981  21.8118  21.7422  21.6861     22.9279  22.9207  22.8628  22.7647
 21.8981  21.8118  21.7422  21.6861  …  22.9258  22.9212  22.8632  22.7647
 21.8981  21.8118  21.7422  21.6872     22.923   22.9207  22.8627  22.7647
 21.8981  21.8121  21.7422  21.6872     22.9148  22.9145  22.8598  22.7647
 21.8981  21.8124  21.7422  21.6872     22.9064  22.9083  22.857   22.7647
 21.8981  21.8124  21.7422  21.6872     22.903   22.9081  22.8573  22.7647
 21.8981  21.8124  21.7422  21.6872  …  22.9007  22.9083  22.8578  22.7647

[:, :, 2] =
 22.3761  22.2641  22.1733  22.094   …  23.2252  23.2759  23.2609  23.194
 22.3761  22.2641  22.1733  22.094      23.2104  23.2617  23.2543  23.194
 22.3761  22.2641  22.1733  22.094      23.2072  23.259   23.2526  23.194
 22.3761  22.2641  22.1733  22.094      23.2069  23.2582  23.2527  23.194
 22.3761  22.2641  22.1733  22.094      23.2005  23.258   23.2535  23.194
 22.3761  22.2641  22.1733  22.094   …  23.1946  23.2582  23.2545  23.194
 22.3761  22.2641  22.1733  22.0949     23.1957  23.2582  23.2535  23.194
 22.3761  22.2641  22.1733  22.0949     23.1969  23.2582  23.2525  23.194
 22.3761  22.2643  22.1733  22.0951     23.192   23.2606  23.2546  23.194
 22.3761  22.2644  22.1733  22.0953     23.1849  23.2592  23.2549  23.194
  ⋮                                  ⋱                              ⋮
 22.3761  22.2613  22.1733  22.104      23.2769  23.3149  23.2789  23.194
 22.3761  22.2623  22.1733  22.0986     23.2634  23.3019  23.2724  23.194
 22.3761  22.2623  22.1733  22.0933     23.2498  23.2878  23.2658  23.194
 22.3761  22.2623  22.1733  22.0932  …  23.2479  23.2868  23.265   23.194
 22.3761  22.2623  22.1733  22.094      23.2488  23.2878  23.2661  23.194
 22.3761  22.2632  22.1733  22.094      23.2428  23.2883  23.2673  23.194
 22.3761  22.2641  22.1733  22.094      23.2372  23.2888  23.2684  23.194
 22.3761  22.2641  22.1733  22.094      23.2393  23.2907  23.2694  23.194
 22.3761  22.2641  22.1733  22.094   …  23.2395  23.2888  23.2684  23.194

[:, :, 3] =
 22.7615  22.6569  22.5638  22.4852  …  22.9725  23.0703  23.1167  23.1208
 22.7615  22.6569  22.5638  22.4852     22.9725  23.0693  23.1162  23.1208
 22.7615  22.6569  22.5638  22.4852     22.9559  23.0545  23.1089  23.1208
 22.7615  22.6569  22.5638  22.4852     22.94    23.0396  23.1015  23.1208
 22.7615  22.6569  22.5638  22.4852     22.9396  23.0377  23.1005  23.1208
 22.7615  22.6569  22.5638  22.4852  …  22.943   23.0396  23.1014  23.1208
 22.7615  22.6569  22.5638  22.4852     22.943   23.0396  23.1016  23.1208
 22.7615  22.6569  22.5638  22.4852     22.9429  23.0396  23.1018  23.1208
 22.7615  22.6578  22.5638  22.4861     22.9441  23.0391  23.1014  23.1208
 22.7615  22.6588  22.5638  22.487      22.9435  23.0393  23.1013  23.1208
  ⋮                                  ⋱                              ⋮
 22.7615  22.6571  22.5638  22.4845     22.9805  23.0658  23.1125  23.1208
 22.7615  22.657   22.5638  22.4847     22.9833  23.0667  23.1129  23.1208
 22.7615  22.657   22.5638  22.485      22.9842  23.0676  23.1133  23.1208
 22.7615  22.657   22.5638  22.4851  …  22.9771  23.0676  23.1143  23.1208
 22.7615  22.657   22.5638  22.4852     22.9686  23.0676  23.1152  23.1208
 22.7615  22.657   22.5638  22.4852     22.9679  23.0676  23.1152  23.1208
 22.7615  22.6569  22.5638  22.4852     22.9689  23.0676  23.1153  23.1208
 22.7615  22.6569  22.5638  22.4852     22.9686  23.0675  23.1153  23.1208
 22.7615  22.6569  22.5638  22.4852  …  22.9687  23.0676  23.1153  23.1208

;;; … 

[:, :, 62] =
 22.423  22.172  21.913   22.3061  …  21.1364  20.9679  20.8658  20.8053
 22.423  22.167  21.904   22.2871     21.1413  20.9699  20.8668  20.8053
 22.423  22.162  21.893   22.2681     21.1463  20.9719  20.8678  20.8053
 22.423  22.156  21.884   22.2491     21.1503  20.9739  20.8688  20.8053
 22.423  22.151  21.874   22.2301     21.1552  20.9768  20.8698  20.8053
 22.423  22.146  21.864   22.2111  …  21.1592  20.9798  20.8698  20.8053
 22.423  22.141  22.6312  22.1931     21.1632  20.9808  20.8707  20.8053
 22.423  22.136  22.6182  22.1751     21.1672  20.9828  20.8717  20.8053
 22.423  22.131  22.6052  22.1571     21.1721  20.9848  20.8728  20.8053
 22.423  22.126  22.5912  22.1391     21.1761  20.9868  20.8737  20.8053
  ⋮                                ⋱                              ⋮
 22.423  22.22   22.004   22.4841     21.0927  20.947   20.8598  20.8053
 22.423  22.214  21.994   22.4631     21.0986  20.9499  20.8608  20.8053
 22.423  22.209  21.984   22.4431     21.1036  20.9519  20.8618  20.8053
 22.423  22.203  21.974   22.4241  …  21.1086  20.9549  20.8618  20.8053
 22.423  22.198  21.963   22.4031     21.1125  20.9569  20.8628  20.8053
 22.423  22.193  21.953   22.3831     21.1185  20.9589  20.8638  20.8053
 22.423  22.187  21.944   22.3641     21.1235  20.9609  20.8648  20.8053
 22.423  22.182  21.933   22.3451     21.1284  20.9629  20.8648  20.8053
 22.423  22.177  21.923   22.3251  …  21.1334  20.9659  20.8648  20.8053

[:, :, 63] =
 22.423  22.172  21.913  22.306  …  21.1456  20.9755  20.8725  20.8114
 22.423  22.167  21.904  22.287     21.1507  20.9775  20.8735  20.8114
 22.423  22.162  21.893  22.268     21.1557  20.9795  20.8745  20.8114
 22.423  22.156  21.884  22.249     21.1597  20.9815  20.8755  20.8114
 22.423  22.151  21.874  22.23      21.1647  20.9845  20.8765  20.8114
 22.423  22.146  21.864  22.211  …  21.1687  20.9875  20.8765  20.8114
 22.423  22.141  22.631  22.193     21.1727  20.9885  20.8775  20.8114
 22.423  22.136  22.618  22.175     21.1767  20.9905  20.8785  20.8114
 22.423  22.131  22.605  22.157     21.1817  20.9925  20.8795  20.8114
 22.423  22.126  22.591  22.139     21.1857  20.9945  20.8805  20.8114
  ⋮                              ⋱                              ⋮
 22.423  22.22   22.004  22.484     21.1016  20.9545  20.8665  20.8114
 22.423  22.214  21.994  22.463     21.1076  20.9575  20.8675  20.8114
 22.423  22.209  21.984  22.443     21.1126  20.9595  20.8685  20.8114
 22.423  22.203  21.974  22.424  …  21.1176  20.9625  20.8685  20.8114
 22.423  22.198  21.963  22.403     21.1216  20.9645  20.8695  20.8114
 22.423  22.193  21.953  22.383     21.1276  20.9665  20.8705  20.8114
 22.423  22.187  21.944  22.364     21.1326  20.9685  20.8715  20.8114
 22.423  22.182  21.933  22.345     21.1376  20.9705  20.8715  20.8114
 22.423  22.177  21.923  22.325  …  21.1426  20.9735  20.8715  20.8114

[:, :, 64] =
 22.423  22.172  21.913  22.306  22.513  …  21.145  20.975  20.872  20.811
 22.423  22.167  21.904  22.287  22.482     21.15   20.977  20.873  20.811
 22.423  22.162  21.893  22.268  22.453     21.155  20.979  20.874  20.811
 22.423  22.156  21.884  22.249  22.424     21.159  20.981  20.875  20.811
 22.423  22.151  21.874  22.23   22.395     21.164  20.984  20.876  20.811
 22.423  22.146  21.864  22.211  22.366  …  21.168  20.987  20.876  20.811
 22.423  22.141  22.631  22.193  22.337     21.172  20.988  20.877  20.811
 22.423  22.136  22.618  22.175  22.31      21.176  20.99   20.878  20.811
 22.423  22.131  22.605  22.157  22.282     21.181  20.992  20.879  20.811
 22.423  22.126  22.591  22.139  22.254     21.185  20.994  20.88   20.811
  ⋮                                      ⋱                           ⋮
 22.423  22.22   22.004  22.484  22.141     21.101  20.954  20.866  20.811
 22.423  22.214  21.994  22.463  22.116     21.107  20.957  20.867  20.811
 22.423  22.209  21.984  22.443  22.093     21.112  20.959  20.868  20.811
 22.423  22.203  21.974  22.424  22.068  …  21.117  20.962  20.868  20.811
 22.423  22.198  21.963  22.403  22.046     21.121  20.964  20.869  20.811
 22.423  22.193  21.953  22.383  22.021     21.127  20.966  20.87   20.811
 22.423  22.187  21.944  22.364  21.999     21.132  20.968  20.871  20.811
 22.423  22.182  21.933  22.345  22.573     21.137  20.97   20.871  20.811
 22.423  22.177  21.923  22.325  22.543  …  21.142  20.973  20.871  20.811)

The number of layers and the depth of viscous half-space are arbitrary parameters that have to be defined by the user. We here use a relatively shallow model (half-space begins at 300 km depth) with 1 equalisation layer and 3 intermediate layers.

mindepth = maximum(Tlitho) + 1e3
layerboundary_vec = range(mindepth, stop = 300e3, length = 3)
lb = cat(Tlitho, [fill(lbval, domain.nx, domain.ny)
    for lbval in layerboundary_vec]..., dims=3)
rlb = c.r_equator .- lb
nlb = size(rlb, 3)
lv_3D = 10 .^ cat([logeta_itp.(Lon, Lat, rlb[:, :, k]) for k in 1:nlb]..., dims=3)

eta_lowerbound = 1e16
lv_3D[lv_3D .< eta_lowerbound] .= eta_lowerbound
maskactive = gaussian_smooth(Hice_vec[k_lgm], domain, 0.05, 0) .> 10
solidearth = SolidEarth(
    domain,
    layer_boundaries = lb,
    layer_viscosities = lv_3D,
    maskactive = maskactive,    # required when using `InteractiveSealevelLoad`
)
fig = plot_earth(domain, solidearth)

This already looks like a much more exciting solid Earth structure!

Finally, we define the output struct, the Simulation and run! it.

nout = NativeOutput(vars = [:u, :ue, :dz_ss, :z_ss, :H_ice], t = [-26f3, -12f3, 0])
sim = Simulation(domain, bcs, sealevel, solidearth; nout = nout)
run!(sim)
println("Computation time: ", sim.nout.computation_time)

Ok, that was fast! Let's visualise three snapshots of displacements that roughly correspond to LGM, the end of the meltwater pulse 1A and the present-day:

copts = (colormap = :PuOr, colorrange = (-500, 500))
fig = plot_out_over_time(sim, :u_tot, [-26f3, -12f3, 0], copts)

This looks very much like what is obtained by Seakon (Swierczek-Jereczek et al., 2024, Fig.9.g), a 3D GIA model.