Sea Ice Timestepping

ClimaSeaIce.jl supports two timestepping schemes for evolving the sea ice state: Forward Euler and Split Runge-Kutta 3rd order. The default is Split Runge-Kutta 3rd order.

Overview

Sea ice timestepping in ClimaSeaIce separates the physics into three distinct steps that are performed sequentially within each substep:

  1. Dynamic step: Advection of ice thickness and concentration
  2. Thermodynamic step: Column physics (melting and freezing)
  3. Momentum step: Evolution of ice velocities

This operator-splitting approach allows each physical process to be treated with an appropriate numerical method.

Forward Euler Timestepper

The ForwardEuler is the simplest timestepping scheme advances the state via:

\[U^{n+1} = U^n + Δt \, G^n\]

where $U^n$ is the state at timestep $n$ and $G^n$ is the tendency.

To use ForwardEuler, use the timestepper keyword argument when constructing the SeaIceModel:

using ClimaSeaIce
using Oceananigans

grid = RectilinearGrid(size=(16, 16, 1), extent=(1, 1, 1))
model = SeaIceModel(grid; timestepper = :ForwardEuler)

# output
SeaIceModel{CPU, RectilinearGrid}(time = 0 seconds, iteration = 0)
├── grid: 16×16×1 RectilinearGrid{Float64, Periodic, Periodic, Bounded} on CPU with 3×3×1 halo
├── timestepper: ForwardEulerTimeStepper
├── ice_thermodynamics: SlabThermodynamics
├── snow_thermodynamics: Nothing
├── advection: Nothing
└── external_heat_fluxes:
    ├── top: Int64
    └── bottom: Int64

Forward Euler is first-order accurate and may require smaller time steps for stability.

Split Runge-Kutta Timestepper (Default)

The Split Runge-Kutta 3rd order (SplitRungeKutta3) scheme is a 3rd-order accurate low-storage method following the framework described by Silvestri et al. 2026. It performs three substeps per full time step. This is the default timestepper and is recommended for most applications.

model = SeaIceModel(grid; timestepper = :SplitRungeKutta3)  # default

# output
SeaIceModel{CPU, RectilinearGrid}(time = 0 seconds, iteration = 0)
├── grid: 16×16×1 RectilinearGrid{Float64, Periodic, Periodic, Bounded} on CPU with 3×3×1 halo
├── timestepper: SplitRungeKuttaTimeStepper(3)
├── ice_thermodynamics: SlabThermodynamics
├── snow_thermodynamics: Nothing
├── advection: Nothing
└── external_heat_fluxes:
    ├── top: Int64
    └── bottom: Int64

Algorithm

The SplitRungeKutta3 scheme follows Oceananigans' implementation of the low-storage framework described by Silvestri et al. 2026. At the beginning of each full time step, the current state is cached via cache_current_fields!. Then, three substeps are performed via rk_substep!, each with a different time increment and weighting.

Each substep performs the following operations in sequence:

  1. Compute advective tendencies for ice thickness $h$ and concentration $ℵ$
  2. Update $h$ and $ℵ$ via dynamic_time_step!
  3. Apply thermodynamic fluxes (melting/freezing)
  4. Update ice momentum (implicit or split-explicit)

Advantages

  • Third-order temporal accuracy
  • Larger stable time steps compared to Forward Euler
  • Consistent with Oceananigans' ocean model timestepping

Choosing a Timestepper

TimestepperOrderStabilityUse Case
ForwardEuler1stRequires small ΔtSimple tests, debugging
SplitRungeKutta33rdLarger stable ΔtProduction simulations

For coupled ocean-sea ice simulations with ClimaOcean.jl, the SplitRungeKutta3 timestepper is recommended as it matches the ocean model's default timestepping scheme.