Sea ice models
The following describes the currently implemented sea ice models, which are
using SpeedyWeather
subtypes(SpeedyWeather.AbstractSeaIce)
1-element Vector{Any}:
ThermodynamicSeaIce
No sea ice
You can set sea_ice = nothing
which will not touch the initial prognostic_variables.sea_ice_concentration
(which when allocated is zero), nor advance it. But you may use set!(simulation, sea_ice_concentration=...)
to set the sea ice concentration manually. No sea ice does not do anything on every time step so your manual modifications will prevail after initialize!
.
To be used like
spectral_grid = SpectralGrid(trunc=31)
model = PrimitiveWetModel(spectral_grid; sea_ice=nothing)
model.sea_ice
Note that in SpeedyWeather the sea ice model and its albedo are defined independently, means you can have a sea ice model without affecting the albedo and sea_ice=nothing
but set the sea ice concentration manually and use its albedo effect, this will be discussed in ThermodynamicSeaIce
below.
Thermodynamic sea ice model
Thermodynamic sea ice models do not account for advection through wind and currents or rheological processes but are only concerned with local freezing, ice growth and melt and the thermodynamic processes involved. The ThermodynamicSeaIce
model defined here uses only sea ice concentration $c$ in units of $[\text{m}^2/\text{m}^2]$ as a prognostic variable.
Melting and freezing is dependend on the sea surface temperature $SST$ at the previous time step $i-1$ and the current $i$ and air-sea fluxes applied to get from one time step to the other. Sea ice may modify the sea surface temperatures SST (particularly in the case of freezing) and so we denote the uncorrected SST with $SST^*$ meaning that the sea ice time step has not been applied yet. The time step size is $\Delta t$.
First determine an insulation factor $r$ ($r=0$ equals full insulation, $r=1$ no insulation) linearly from sea ice concentration which reduces the air-sea flux $F$ used as the tendency for the slab ocean SST
\[\begin{aligned} r &= 1 - c_{i-1} \\ SST_i^* &= SST_{i-1} + \Delta t~r~F \\ \end{aligned}\]
This happens inside the Slab ocean model.
Now determine a tendency in sea ice concentration $\Delta c$ from the melting and freezing, both proportional to the difference of the sea surface temperature to freezing temperature with freeze rate $f$ in $[\text{m}^2/\text{m}^2/K]$ and melt rate $m$ in $[\text{m}^2/\text{m}^2/s/K]$. The freeze rate misses a $1/s$ in the units as it is applied with $1/\Delta t$ below because $\min(SST_i^* - T_f, 0)$ estimates $\Delta t rF$ from above not purely the (insulated) flux $rF$
\[\begin{aligned} \Delta c &= -m \max(SST_i^* - T_f, 0) - \frac{f}{\Delta t} \min(SST_i^* - T_f, 0) \\ c_i^* &= c_{i-1} + \Delta t \Delta c \end{aligned}\]
And we bound the uncorrected sea surface temperature $SST_i^*$ by freezing at $T_f = -1.8˚C$ and the uncorrected sea ice concentration $c_i^*$ in $[0, 1]$ by
\[\begin{aligned} SST_i &= max(SST_i^*, T_f) \\ c_i &= \max( \min( c_i^*, 1) , 0) \end{aligned}\]
Usage
To be created like
sea_ice = ThermodynamicSeaIce(spectral_grid)
ThermodynamicSeaIce{Float32} <: SpeedyWeather.AbstractSeaIce
├ temp_freeze::Float32 = 271.35
├ melt_rate::Float32 = 5.0e-5
└ freeze_rate::Float32 = 0.12
and most often together with an albedo that scales linearly with sea ice concentration
albedo = Albedo(ocean=OceanSeaIceAlbedo(spectral_grid), land=AlbedoClimatology(spectral_grid))
Albedo <: SpeedyWeather.AbstractAlbedo
├ ocean: OceanSeaIceAlbedo{Float32}
└ land: AlbedoClimatology{Float32, Field{Float32, 1, Vector{Float32}, OctahedralGaussianGrid{SpeedyWeather.Architectures.CPU{KernelAbstractions.CPU}, Vector{UnitRange{Int64}}, Vector{Int64}}}}
Using ocean=GlobalConstantAlbedo(0.06)
instead would disable the effect of sea ice on albedo (basically an ocean-coloured sea ice), then passed on to the model constructor
model = PrimitiveWetModel(spectral_grid; sea_ice, albedo)
Note that the insulating factor ($r$ above) of sea ice on air-sea fluxes is controlled in SlabOcean
which takes as keyword argument sea_ice_insulation = (x) -> x
a function of one argument (the sea ice concentration) yielding the reduction of air-sea fluxes, see Slab ocean. So you likely want to map 0 to 0 with that function to have no insulation (i.e. no impact) in the case of no ice.
Output
And output is added like
add!(model, SpeedyWeather.SeaIceConcentrationOutput())
NetCDFOutput{Field{Float32, 1, Vector{Float32}, FullGaussianGrid{SpeedyWeather.Architectures.CPU{KernelAbstractions.CPU}, Vector{UnitRange{Int64}}, Vector{Int64}}}}
├ status: inactive/uninitialized
├ write restart file: true (if active)
├ interpolator: AnvilInterpolator{Float32, SpeedyWeather.RingGrids.GridGeometry{OctahedralGaussianGrid{SpeedyWeather.Architectures.CPU{KernelAbstractions.CPU}, Vector{UnitRange{Int64}}, Vector{Int64}}, Vector{Float32}, Vector{Int64}}, SpeedyWeather.RingGrids.AnvilLocator{Float32, Vector{Float32}, Vector{Int64}}}
├ path: output.nc (overwrite=false)
├ frequency: 21600 seconds
└┐ variables:
├ v: meridional wind [m/s]
├ humid: specific humidity [kg/kg]
├ sic: sea ice concentration [m^2/m^2]
├ temp: temperature [degC]
├ u: zonal wind [m/s]
├ pres: surface pressure [hPa]
└ vor: relative vorticity [s^-1]
or as part of SpeedyWeather.OceanOutput()
which however needs splatting ...
to unpack the tuple
add!(model, SpeedyWeather.OceanOutput()...)
NetCDFOutput{Field{Float32, 1, Vector{Float32}, FullGaussianGrid{SpeedyWeather.Architectures.CPU{KernelAbstractions.CPU}, Vector{UnitRange{Int64}}, Vector{Int64}}}}
├ status: inactive/uninitialized
├ write restart file: true (if active)
├ interpolator: AnvilInterpolator{Float32, SpeedyWeather.RingGrids.GridGeometry{OctahedralGaussianGrid{SpeedyWeather.Architectures.CPU{KernelAbstractions.CPU}, Vector{UnitRange{Int64}}, Vector{Int64}}, Vector{Float32}, Vector{Int64}}, SpeedyWeather.RingGrids.AnvilLocator{Float32, Vector{Float32}, Vector{Int64}}}
├ path: output.nc (overwrite=false)
├ frequency: 21600 seconds
└┐ variables:
├ v: meridional wind [m/s]
├ humid: specific humidity [kg/kg]
├ sst: sea surface temperature [degC]
├ sic: sea ice concentration [m^2/m^2]
├ temp: temperature [degC]
├ u: zonal wind [m/s]
├ pres: surface pressure [hPa]
└ vor: relative vorticity [s^-1]