8.4.5. KL10: Vertical Mixing Due to Breaking Internal Waves¶
(in directory: pkg/kl10/)
Authors: Jody M. Klymak
8.4.5.1. Introduction¶
The [KL10] parameterization for breaking internal waves is meant to represent mixing in the ocean “interior” due to convective instability. Many mixing schemes in the presence of unstable stratification simply turn on an arbitrarily large diffusivity and viscosity in the overturning region. This assumes the fluid completely mixes, which is probably not a terrible assumption, but it also makes estimating the turbulence dissipation rate in the overturning region meaningless.
The KL10 scheme overcomes this limitation by estimating the viscosity and diffusivity from a combination of the Ozmidov relation and the Osborn relation, assuming a turbulent Prandtl number of one. The Ozmidov relation says that outer scale of turbulence in an overturn will scale with the strength of the turbulence \(\epsilon\), and the stratification \(N\), as
The Osborn relation relates the strength of the dissipation to the vertical diffusivity as
where \(\Gamma\approx 0.2\) is the mixing ratio of buoyancy flux to thermal dissipation due to the turbulence. Combining the two gives us
The ocean turbulence community often approximates the Ozmidov scale by the rootmeansquare of the Thorpe displacement, \(\delta_z\), in an overturn [Tho77]. The Thorpe displacement is the distance one would have to move a water parcel for the water column to be stable, and is readily measured in a measured profile by sorting the profile and tracking how far each parcel moves during the sorting procedure. This method gives an imperfect estimate of the turbulence, but it has been found to agree on average over a large range of overturns [Mou96, SG94, WG94].
The algorithm coded here is a slight simplification of the usual Thorpe method for estimating turbulence in overturning regions. Usually, overturns are identified and \(N\) is averaged over the overturn. Here, instead we estimate
where \(N_s(z)\) is the local sorted stratification. This saves complexity in the code and adds a slight inaccuracy, but we don’t believe is biased.
We assume a turbulent Prandtl number of 1, so \(A_v=K_{v}\).
We also calculate and output a turbulent dissipation from this scheme. We do not simply evaluate the overturns for \(\epsilon\) using (8.1). Instead we compute the vertical shear terms that the viscosity is acting on:
There are straightforward caveats to this approach, covered in [KL10].
If your resolution is too low to resolve the breaking internal waves, you won’t have any turbulence.
If the model resolution is too high, the estimates of \(\epsilon_v\) will start to be exaggerated, particularly if the run in nonhydrostatic. That is because there will be significant shear at small scales that represents the turbulence being parameterized in the scheme. At very high resolutions direct numerical simulation or more sophisticated largeeddy schemes should be used.
We find that grid cells of approximately 10 to 1 aspect ratio are a good rule of thumb for achieving good results are usual oceanic scales. For a site like the Hawaiian Ridge, and Luzon Strait, this means 10m vertical resolusion and approximately 100m horizontal. The 10m resolution can be relaxed if the stratification drops, and we often WKBstretch the grid spacing with depth.
The dissipation estimate is useful for pinpoiting the location of turbulence, but again, is grid size dependent to some extent, and should be treated with a grain of salt. It will also not include any numerical dissipation such as you may find with higher order advection schemes.
8.4.5.2. KL10 configuration and compiling¶
As with all MITgcm packages, KL10 can be turned on or off at compile time
using the
packages.conf
file by addingkl10
to it,or using
genmake2
addingenable=kl10
ordisable=kl10
switchesRequired packages and CPP options: No additional packages are required.
(see Section [sec:buildingCode]).
KL10 has no compiletime options (KL10_OPTIONS.h
is empty).
8.4.5.3. Runtime parameters¶
Runtime parameters are set in files data.pkg
and data.kl10
which are read in kl10_readparms.F
. Runtime parameters may be
broken into 3 categories: (i) switching on/off the package at runtime,
(ii) required MITgcm flags, (iii) package flags and parameters.
8.4.5.3.1. Enabling the package¶
The KL10 package is switched on at runtime by setting
useKL10 = .TRUE.
in data.pkg
.
8.4.5.3.2. Required MITgcm flags¶
The following flags/parameters of the MITgcm dynamical kernel need to be set in conjunction with KL10:

enable implicit vertical viscosity 

enable implicit vertical diffusion 
8.4.5.3.3. Package flags and parameters¶
Table 8.9 summarizes the runtime
flags that are set in data.kl10
, and their default values.
Flag/parameter 
default 
Description 

KLviscMax 
300 m^{2} s^{–1} 
Maximum viscosity the scheme will ever give (useful for stability) 
KLdumpFreq 

Dump frequency of KL10 field snapshots 
KLtaveFreq 

Averaging and dump frequency of KL10 fields 
KLwriteState 

write KL10 state to file 
8.4.5.4. Equations and key routines¶
8.4.5.4.1. KL10_CALC:¶
Toplevel routine. Calculates viscosity and diffusivity on the grid cell
centers. Note that the runtime parameters viscAz
and diffKzT
act
as minimum viscosity and diffusivities. So if there are no overturns (or
they are weak) then these will be returned.
8.4.5.4.2. KL10_CALC_VISC:¶
Calculates viscosity on the W and S grid faces for U and V respectively.
8.4.5.4.3. KL10_CALC_DIFF:¶
Calculates the added diffusion from KL10.
8.4.5.5. KL10 diagnostics¶
Diagnostics output is available via the diagnostics package (see Section [sec:pkg:diagnostics]). Available output fields are summarized here:

<Name>Levsgrid< Units >< Tile (max=80c)

KLviscAr Nr SM m^2/s KL10 vertical eddy viscosity coefficient
KLdiffKr Nr SM m^2/s Vertical diffusion coefficient for salt, temperature, & tracers
KLeps  Nr SM m^3/s^3 Turbulence dissipation estimate.
8.4.5.6. References¶
Klymak and Legg, 2010, Oc. Modell..
8.4.5.7. Experiments and tutorials that use KL10¶
Modified Internal Wave experiment, in internal_wave verification directory