# API reference

## Basic structs

`FastIsostasy.ComputationDomain`

— Type```
ComputationDomain
ComputationDomain(W, n)
ComputationDomain(Wx, Wy, Nx, Ny)
```

Return a struct containing all information related to geometry of the domain and potentially used parallelism. To initialize one with `2*W`

and `2^n`

grid cells:

`Omega = ComputationDomain(W, n)`

If a rectangular domain is needed, run:

`Omega = ComputationDomain(Wx, Wy, Nx, Ny)`

`FastIsostasy.PhysicalConstants`

— Type`PhysicalConstants`

Return a struct containing important physical constants. Comes with default values that can however be changed by the user, for instance by running:

`c = PhysicalConstants(rho_ice = 0.93) # (kg/m^3)`

All constants are given in SI units (kilogram, meter, second).

`FastIsostasy.LayeredEarth`

— Type`LayeredEarth(Omega; layer_boundaries, layer_viscosities)`

Return a struct containing all information related to the lateral variability of solid-Earth parameters. To initialize with values other than default, run:

```
Omega = ComputationDomain(3000e3, 7)
lb = [100e3, 300e3]
lv = [1e19, 1e21]
p = LayeredEarth(Omega, layer_boundaries = lb, layer_viscosities = lv)
```

which initializes a lithosphere of thickness $T_1 = 100 \mathrm{km}$, a viscous channel between $T_1$ and $T_2 = 200 \mathrm{km}$ and a viscous halfspace starting at $T_2$. This represents a homogenous case. For heterogeneous ones, simply make `lb::Vector{Matrix}`

, `lv::Vector{Matrix}`

such that the vector elements represent the lateral variability of each layer on the grid of `Omega::ComputationDomain`

.

`FastIsostasy.ReferenceState`

— Type`ReferenceState`

Return a struct containing the reference state.

`FastIsostasy.CurrentState`

— Type`CurrentState`

Return a mutable struct containing the geostate which will be updated over the simulation. The geostate contains all the states of the [`FastIsoProblem`

] to be solved.

`FastIsostasy.FastIsoTools`

— Type`FastIsoTools(Omega, c, p)`

Return a `struct`

containing pre-computed tools to perform forward-stepping of the model. This includes the Green's functions for the computation of the lithosphere and geoid displacement, plans for FFTs, interpolators of the load and the viscosity over time and preallocated arrays.

`FastIsostasy.SolverOptions`

— Type`Options`

Return a struct containing the options relative to solving a `FastIsoProblem`

.

`FastIsostasy.OceanSurfaceChange`

— Type`OceanSurfaceChange(; z0 = 0.0)`

Return a `mutable struct OceanSurfaceChange`

containing:

`z_k`

: the GMSL at current time step`k`

.`A_k`

: the ocean surface at current time step`k`

.`z`

: a vector of GMSL values used as knots for interpolation.`A`

: a vector of ocean surface values used as knots for interpolation.`A_itp`

: an interpolator of ocean surface over depth. Bias-free for present-day.`A_pd`

: the present-day ocean surface.`res`

: residual of the nonlinear equation solved numerically.

An `osc::OceanSurfaceChange`

can be used as function to update `osc.z_k`

and `osc.A_k`

based on `osc.A_itp`

and an input `delta_V`

by running:

`osc(delta_V)`

`FastIsostasy.FastIsoProblem`

— Type```
FastIsoProblem(Omega, c, p, t_out)
FastIsoProblem(Omega, c, p, t_out, Hice)
FastIsoProblem(Omega, c, p, t_out, t_Hice, Hice)
```

Return a struct containing all the other structs needed for the forward integration of the model over `Omega::ComputationDomain`

with parameters `c::PhysicalConstants`

and `p::LayeredEarth`

. The outputs are stored at `t_out::Vector{<:AbstractFloat}`

.

## Mechanics

`FastIsostasy.solve!`

— Method`solve!(fip)`

Solve the isostatic adjustment problem defined in `fip::FastIsoProblem`

.

`FastIsostasy.init`

— Function`init(fip)`

Initialize an `ode::CoupledODEs`

, aimed to be used in `step!`

.

`FastIsostasy.step!`

— Function`step!(fip)`

Step `fip::FastIsoProblem`

over `tspan`

and based on `ode::CoupledODEs`

, typically obtained by `init`

.

`FastIsostasy.update_diagnostics!`

— Function`update_diagnostics!(dudt, u, fip, t)`

Update all the diagnotisc variables, i.e. all fields of `fip.now`

apart from the displacement, which requires an integrator.

`FastIsostasy.lv_elva!`

— Function`lv_elva!(dudt, u, fip, t)`

Update the displacement rate `dudt`

of the viscous response according to LV-ELVA.

`FastIsostasy.update_elasticresponse!`

— Function`update_elasticresponse!(fip::FastIsoProblem)`

Update the elastic response by convoluting the Green's function with the load anom. To use coefficients differing from ^{[Farrell1972]}, see FastIsoTools.

## Parameter inversion

`FastIsostasy.InversionConfig`

— Type`InversionConfig`

Struct containing configuration parameters for a [`InversionProblem`

].

Need to choose regularization factor α ∈ (0,1], When you have enough observation data α=1: no regularization

update_freq 1 : approximate posterior cov matrix with an uninformative prior 0 : weighted average between posterior cov matrix with an uninformative prior and prior

`FastIsostasy.InversionData`

— Type`InversionData`

Struct containing data (either observational or output of a golden standard model) for a [`InversionProblem`

].

`FastIsostasy.InversionProblem`

— Type`InversionProblem`

Struct containing variables and configs for the inversion of Solid-Earth parameter fields. For now, only viscosity can be inverted but future versions will support lithosphere rigidity. For now, the unscented Kalman inversion is the only method available but ensemble Kalman inversion will be available in future.

`FastIsostasy.solve!`

— Method`solve!(paraminv::InversionProblem)`

Return `priors`

and `ukiobj`

that allow to extract the results of the parameter inversion as initialized in `paraminv`

.

## Convenience

`FastIsostasy.load_dataset`

— Function`load_dataset(name) → (dims), field, interpolator`

Return the `dims::Tuple{Vararg{Vector}}`

, the `field<:Array`

and the `interpolator`

corresponding to a data set defined by a unique `name::String`

. For instance:

`(lon180, lat, t), Hice, Hice_itp = load_dataset("ICE6G_D")`

Following options are available for parameter fields:

- "ICE6G
*D": ice loading history from ICE6G*D. - "Wiens2022": viscosity field from (Wiens et al. 2022)
- "Lithothickness_Pan2022": lithospheric thickness field from (Pan et al. 2022)
- "Viscosity_Pan2022": viscosity field from (Pan et al. 2022)

Following options are available for model results:

- "Spada2011"
- "LatychevGaussian"
- "LatychevICE6G"

`FastIsostasy.reinit_structs_cpu`

— Function`reinit_structs_cpu(Omega, p)`

Reinitialize `Omega::ComputationDomain`

and `p::LayeredEarth`

on the CPU, mostly for post-processing purposes.

`FastIsostasy.write_out!`

— Function`write_out!(fip::FastIsoProblem)`

Write results in output vectors if the load is updated internally. If the load is updated externally, the user is responsible for writing results.

`FastIsostasy.savefip`

— Function`savefip(filename, fip; T = Float32)`

Save the output of `fip::FastIsoProblem`

as NetCDF file under `filename`

.