Split Time Stepping

Ocean motion spans two very different speeds. The barotropic (depth-averaged) mode carries fast external gravity waves, while the baroclinic (depth-varying) mode evolves more slowly. An unsplit explicit time stepper must use a time step short enough for the fast barotropic waves, even though most of the ocean changes much more slowly. A split-explicit time stepper separates the two modes: the baroclinic velocity, thickness and tracers are advanced with the long model time step, while the barotropic mode is subcycled with a much shorter barotropic time step.

Omega provides two time steppers built on the same RK2 scheme:

Config option name

Scheme

SplitExplicitRK2

mode-split RK2, with the barotropic mode subcycled by a forward-backward predictor-corrector scheme

UnsplitRK2

the same RK2 scheme without the mode split

UnsplitRK2 advances the barotropic mode with the full time step, so it needs a time step short enough for the barotropic mode. It is useful as a reference for assessing the effect of mode splitting in SplitExplicitRK2.

UnsplitRK2 and RungeKutta2 both use an unsplit RK2 approach. UnsplitRK2 uses the split-explicit framework with mode splitting disabled and computes the Coriolis term separately, while RungeKutta2 includes it in the potential-vorticity tendency. Both require a time step short enough for external gravity waves.

Configuration

The time stepper is selected in the TimeIntegration section of the configuration file, together with a ModeSplitShare subgroup holding the options for SplitExplicitRK2 and UnsplitRK2:

  TimeIntegration:
    TimeStepper: SplitExplicitRK2
    TimeStep: 0000_00:10:00
    ModeSplitShare:
      BtrTimeStepper: Predictor-Corrector
      BtrTimeStep: 0000_00:00:20
      NTimeStepIteration: 2
      NBclCoriolisIteration: 2
      ReinitSplitVelocity: false

The remaining TimeIntegration options are described in the Time stepping section, and the ModeSplitShare values shown are those of the default configuration. The ModeSplitShare subgroup is required whenever one of the two steppers is selected. Within it, only BtrTimeStep is required, and only for SplitExplicitRK2; the other options fall back to their defaults:

Configuration name

Description

Default

BtrTimeStepper

scheme for the barotropic subcycle; Predictor-Corrector is the only option

Predictor-Corrector

BtrTimeStep

barotropic time step, in the same format as TimeStep; must be positive and shorter than it

required

NTimeStepIteration

positive integer number of predictor-corrector iterations per time step

2

NBclCoriolisIteration

positive integer number of Coriolis iterations in the baroclinic velocity update; forced to 1 for UnsplitRK2

2

ReinitSplitVelocity

recompute the velocity split at every time step; has no effect for UnsplitRK2

false

BtrTimeStepper and BtrTimeStep are ignored by UnsplitRK2, which also always uses a single Coriolis iteration. If NBclCoriolisIteration is supplied, it must still be a positive integer before it is overridden. Keep NTimeStepIteration: 2 for the RK2 predictor-corrector scheme. A single iteration retains only the predictor and reduces temporal accuracy to first order; more iterations do not make this a higher-order Runge Kutta method. The name SplitExplicitRK2 describes its RK2 structure, rather than a guarantee of second-order convergence of the complete split scheme: the current time-stepper test checks first-order convergence for its split configuration.

For UnsplitRK2, a configuration block with all applicable default values explicitly specified is as follows:

  TimeIntegration:
    TimeStepper: UnsplitRK2
    TimeStep: 0000_00:00:20
    ModeSplitShare:
      NTimeStepIteration: 2

The time steps in these examples are illustrative; stability depends on the mesh and the simulated state.

Barotropic time step

The subcycle count parameter NBtrSubcycles is ceil(TimeStep/BtrTimeStep), and the barotropic time step actually used is TimeStep divided by that number, so it is never longer than BtrTimeStep. The resolved values are written to the log at initialization. For the SplitExplicitRK2 example above, the omega.log shows:

SplitExplicitRK2: TimeStep=600 s, BtrTimeStep=20 s, NBtrSubcycles=30, BtrDt=20 s, NTimeStepIteration=2, NBclCoriolisIteration=2

BtrTimeStep must be short enough (approximately 20~30x shorter than TimeStep) to resolve the external gravity waves on the mesh, while TimeStep must satisfy the stability limits of the remaining explicit processes. In each time-step iteration, the complete barotropic subcycling sequence spans twice the model time step. Each individual barotropic step has duration TimeStep/NBtrSubcycles, so a model time step takes 2 * NTimeStepIteration * NBtrSubcycles barotropic steps, 120 in the example above.

Other requirements

SplitExplicitRK2 places two requirements on other sections of the configuration file:

  • HaloWidth in the Decomp section must be at least 3, which is the default. The barotropic subcycle uses the extra halo layers to communicate only once per subcycle. This is checked when the barotropic update is first called; see Domain Decomposition.

  • SSHTendencyEnable in the Tendencies section must be false, which is also the default. The split time stepper computes the barotropic pressure gradient itself. This is checked at initialization; see Tendency Terms.

State variables and restart

The split time steppers carry three state variables in addition to NormalVelocity and PseudoThickness (for both SplitExplicitRK2 and UnsplitRK2):

Field name

Description

Units

Dimensions

NormalBaroclinicVelocity

baroclinic velocity component normal to edge

m/s

NEdges, NVertLayers

NormalBarotropicVelocity

barotropic velocity component normal to edge

m/s

NEdges

BarotropicPressureAnomaly

barotropic pressure anomaly

Pa

NCells

These fields exist only when SplitExplicitRK2 or UnsplitRK2 is selected. They are part of the Restart field group but not the State group, so they are written to restart files but are not needed in the initial-condition file. For SplitExplicitRK2, on a cold start the velocity split is computed from the initial NormalVelocity and PseudoThickness, and the barotropic pressure anomaly from the initial pressure. On a restart, SplitExplicitRK2 reads all three from the restart file instead. UnsplitRK2 initializes its baroclinic velocity from the full NormalVelocity and sets its barotropic velocity to zero on both cold starts and restarts; its barotropic pressure anomaly is unused.