Private types and functions
Documentation for ClimaSeaIce.jl's internal interfaces.
ClimaSeaIce
ClimaSeaIce.ForwardEulerTimeStepper — Method
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.
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: ASeaIceModelusingSplitRungeKuttaTimeStepper.Δt: The time increment for this substep.
See also: rk_substep!, cache_current_fields!
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!
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:
Dynamic step: Compute advective tendencies and update ice thickness
hand concentrationℵviadynamic_time_step!.Thermodynamic step: Apply column physics (melting/freezing) via
thermodynamic_time_step!. This step is performed all at once since thermodynamics is local column physics.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: ASeaIceModelusingSplitRungeKuttaTimeStepper.Δτ: 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!
ClimaSeaIce.SeaIceThermodynamics
ClimaSeaIce.SeaIceThermodynamics.LinearLiquidus — Type
LinearLiquidus(FT=Oceananigans.defaults.FloatType,
slope = 0.054, # psu / ᵒC
freshwater_melting_temperature = 0) # ᵒCReturn 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.
ClimaSeaIce.SeaIceThermodynamics.HeatBoundaryConditions
ClimaSeaIce.SeaIceThermodynamics.HeatBoundaryConditions.IceWaterThermalEquilibrium — Method
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,
ClimaSeaIce.EnthalpyMethodSeaIceModels
ClimaSeaIce.EnthalpyMethodSeaIceModels.EnthalpyMethodSeaIceModel — Method
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.
ClimaSeaIce.EnthalpyMethodSeaIceModels.compute_tendencies! — Method
Calculate the right-hand-side of the free surface displacement (η) equation.
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).
ClimaSeaIce.SeaIceDynamics
ClimaSeaIce.SeaIceDynamics.u_velocity_tendency — Method
compute explicit ice u-velocity tendencies
ClimaSeaIce.SeaIceDynamics.v_velocity_tendency — Method
compute explicit ice v-velocity tendencies