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 |
BtrTimeStep |
barotropic time step, in the same format as |
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 |
2 |
ReinitSplitVelocity |
recompute the velocity split at every time step; has no effect for |
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:
HaloWidthin theDecompsection 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.SSHTendencyEnablein theTendenciessection 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.