Private types and functions

Documentation for ClimaSeaIce.jl's internal interfaces.

ClimaSeaIce

ClimaSeaIce.ForwardEulerTimeStepperMethod
ForwardEulerTimeStepper(grid, prognostic_fields;
                        implicit_solver = nothing,
                        Gⁿ = map(similar, prognostic_fields))

Return a first-order Forward-Euler timestepper (ForwardEulerTimeStepper) on grid, with tracers. The tendency fields Gⁿ, usually equal to the prognostic_fields passed as positional argument, can be specified via optional kwargs.

The first-order Forward-Euler timestepper steps forward the state Uⁿ by Δt via

Uⁿ⁺¹ = Uⁿ + Δt * Gⁿ

where Uⁿ is the state at the $n$-th timestep and Gⁿ is the tendency at the $n$-th timestep.

source
ClimaSeaIce.dynamic_time_step!Method
dynamic_time_step!(model::RKSeaIceModel, Δt)

Update ice thickness h and concentration based on advective tendencies stored in model.timestepper.Gⁿ for a Runge-Kutta substep.

Unlike the Forward Euler version, this function uses the cached previous state Ψ⁻ (stored by cache_current_fields!) as the base state for the update:

\[\begin{align*} h^{n+1} = h^n + Δt G_h^n \\ ℵ^{n+1} = ℵ^n + Δt G_ℵ^n \end{align*}\]

where hⁿ and ℵⁿ are retrieved from model.timestepper.Ψ⁻.

The kernel _dynamic_step_tracers! also handles:

  • Clipping negative thickness and concentration values
  • Resetting concentration when thickness is zero (and vice versa)
  • Ridging: when ℵ > 1, concentration is capped at 1 and thickness is adjusted to conserve ice volume

Arguments

  • model: A SeaIceModel using SplitRungeKuttaTimeStepper.
  • Δt: The time increment for this substep.

See also: rk_substep!, cache_current_fields!

source
Oceananigans.TimeSteppers.cache_current_fields!Method
cache_current_fields!(model::RKSeaIceModel)

Cache the current prognostic fields (ice thickness h, ice concentration , and any additional tracers) into the timestepper's Ψ⁻ storage before performing a Runge-Kutta substep.

This function is called by Oceananigans' SplitRungeKuttaTimeStepper at the beginning of each full time step to store the state Uⁿ that is needed for computing the RK3 weighted average.

See also: rk_substep!, dynamic_time_step!

source
Oceananigans.TimeSteppers.rk_substep!Method
rk_substep!(model::RKSeaIceModel, Δτ, callbacks)

Perform a single Runge-Kutta substep for the sea ice model, advancing the state by Δτ.

The substep consists of three sequential operations:

  1. Dynamic step: Compute advective tendencies and update ice thickness h and concentration via dynamic_time_step!.

  2. Thermodynamic step: Apply column physics (melting/freezing) via thermodynamic_time_step!. This step is performed all at once since thermodynamics is local column physics.

  3. Momentum step: Advance ice velocities using either an implicit or split-explicit scheme via time_step_momentum!.

This function is called by Oceananigans' SplitRungeKuttaTimeStepper for each of the three RK3 substeps within a full time step.

Arguments

  • model: A SeaIceModel using SplitRungeKuttaTimeStepper.
  • Δτ: The substep time increment (a fraction of the full time step Δt).
  • callbacks: Callbacks to execute during the substep (currently unused).

See also: cache_current_fields!, dynamic_time_step!

source

ClimaSeaIce.SeaIceThermodynamics

ClimaSeaIce.SeaIceThermodynamics.LinearLiquidusType
LinearLiquidus(FT=Oceananigans.defaults.FloatType,
               slope = 0.054, # psu / ᵒC
               freshwater_melting_temperature = 0) # ᵒC

Return a linear model for the dependence of the melting temperature of saltwater on salinity,

\[Tₘ(S) = T₀ - m S ,\]

where $Tₘ(S)$ is the melting temperature as a function of salinity $S$, $T₀$ is the melting temperature of freshwater, and $m$ is the ratio between the melting temperature and salinity (in other words the linear model should be thought of as defining $m$ and could be written $m ≡ (T₀ - Tₘ) / S$. The signs are arranged so that $m > 0$ for saltwater).

The defaults assume that salinity is given in practical salinity units psu and temperature is in degrees Celsius.

Note: the function melting_temperature(liquidus, salinity) returns the melting temperature given salinity.

source

ClimaSeaIce.SeaIceThermodynamics.HeatBoundaryConditions

ClimaSeaIce.SeaIceThermodynamics.HeatBoundaryConditions.IceWaterThermalEquilibriumMethod
IceWaterThermalEquilibrium(; external_fluxes::Tuple=tuple(), salinity=0)

Represents an ice-water interface in heat equilibrium, such that the bottom temperature $T_b$ is equal to the melting temperature,

\[T_b = Tₘ(S)\]

where $S$ is the salinity at the ice-water boundary.

Both freezing and melting may occur at an ice-water boundary. The rate of change of the ice-water interface, $d h_b / dt$, is related to the sum of fluxes into the ice-water interface,

source

ClimaSeaIce.EnthalpyMethodSeaIceModels

ClimaSeaIce.EnthalpyMethodSeaIceModels.EnthalpyMethodSeaIceModelMethod
EnthalpyMethodSeaIceModel(; grid,
                            closure = default_closure(grid),
                            ice_heat_capacity = 2090.0 / reference_density,
                            water_heat_capacity = 3991.0 / reference_density,
                            fusion_enthalpy = 3.3e5 / reference_density,
                            boundary_conditions = NamedTuple())

Return a thermodynamic model for ice sandwiched between an atmosphere and ocean on an Eulerian grid.

source

ClimaSeaIce.Rheologies

ClimaSeaIce.Rheologies.initialize_rheology!Method
initialize_rheology!(model, rheology::ElastoViscoPlasticRheology)

Initialize the elasto-visco-plastic rheology. In this step we calculate the ice strength given the ice mass (thickness and concentration).

source

ClimaSeaIce.SeaIceDynamics