Module ocean_vert_mix_coeff_mod
OVERVIEW
Vertical viscosity and diffusivity according KPP
This module computes vertical viscosity and diffusivity according to
the Kprofile parameterization scheme of Large, McWilliams, and
Doney (1994). It computes both local and nonlocal mixing.
OTHER MODULES USED
constants_mod
diag_manager_mod
fms_mod
mpp_domains_mod
mpp_mod
ocean_density_mod
ocean_domains_mod
ocean_types_mod
ocean_vert_mix_mod
ocean_workspace_mod
PUBLIC INTERFACE
PUBLIC DATA
None.
PUBLIC ROUTINES

ocean_vert_mix_coeff_init

DESCRIPTION
 Initialization for the KPP vertical mixing scheme
input:
dzt = thickness of vertical levels (m)
km = number of vertical levels
yt = latitude of grid points (deg)
jmt = number of latitudes
dtxcel = time step accelerator as a function of level
dtts = density time step (sec)
dtuv = internal mode time step (sec)
error = logical to signal problems
cifdef = array of character strings for listing enabled "ifdefs"
ifdmax = size of "cifdef"
nifdef = current number of enabled "ifdefs"
vmixset= logical to determine if a vertical mixing scheme was
chosen
output:
lri = logical switch for shear instability mixing
double_diffusion = logical switch for doublediffusive mixing
visc_cbu_limit = visc max due to shear instability (m**2/sec)
diff_cbt_limit = diffusivity .. (m**2/sec)
visc_cbu_iw = visc background due to internal waves(m**2/sec)
diff_cbt_iw = diffusivity .. (m**2/sec)
visc_con_limit = visc due to convective instability (m**2/sec)
diff_con_limit = diffusivity .. (m**2/sec)
Vtc = nondimensional constant used in calc. bulk Ri
cg = constant used in calc.nonlocal transport term
wmt = turbulent velocity scale for momentum
wst = turbulent velocity scale for scaler
error = true if some inconsistancy was found

vertical_mix_coeff

DESCRIPTION
 This subroutine computes the vertical diffusivity and viscosity according
to the KPP scheme of Large etal. In brief, the scheme does the
following:
Compute interior mixing everywhere:
interior mixing gets computed at all cell interfaces due to constant
internal wave background activity ("visc_cbu_iw" and "diff_cbt_iw").
Mixing is enhanced in places of static instability (local Ri < 0).
Additionally, mixing can be enhanced by contribution from shear
instability which is a function of the local Ri.
Double diffusion:
Interior mixing can be enhanced by double diffusion due to salt
fingering and diffusive convection ("double_diffusion=.true.").
Boundary layer:
(A) Boundary layer depth:
at every gridpoint the depth of the oceanic boundary layer
("hbl") gets computed by evaluating bulk richardson numbers.
(B) Boundary layer mixing:
within the boundary layer, above hbl, vertical mixing is
determined by turbulent surface fluxes, and interior mixing at
the lower boundary, i.e. at hbl.
inputs
f = Coriolis parameter (1/s)
jwtype = Jerlov water type (1 to 5)
outputs
hbl = boundary layer depth (meters)
visc_cbu = viscosity coefficient at bottom of U cells (m^2/s)
diff_cbt = diffusion coefficient at bottom of T cells (m^2/s)

bldepth

DESCRIPTION
 The oceanic planetray boundary layer depth, hbl, is determined as
the shallowest depth where the bulk richardson number is
equal to the critical value, Ricr.
Bulk Richardson numbers are evaluated by computing velocity and
buoyancy differences between values at zt(kl) and surface
reference values.
In this configuration, the reference values are equal to the
values in the surface layer.
When using a very fine vertical grid, these values should be
computed as the vertical average of velocity and buoyancy from
the surface down to epsilon*zt(kl).
When the bulk richardson number at k exceeds Ricr, hbl is
linearly interpolated between grid levels zt(k) and zt(k1).
The water column and the surface forcing are diagnosed for
stable/ustable forcing conditions, and where hbl is relative
to grid points (caseA), so that conditional branches can be
avoided in later subroutines.
model
real zt(1:nk) = vertical grid (m)
real dzt(1:nk) = layer thicknesses (m)
input
real dbloc(ij_bounds,nk) = local delta buoyancy (m/s^2)
real dbsfc(ij_bounds,nk) = delta buoyancy w/ respect to sfc(m/s)^2
real ustar(ij_bounds) = surface friction velocity (m/s)
real Bo(ij_bounds) = surface turbulent buoyancy forcing(m^2/s^3)
real Bosol(ij_bounds) = radiative buoyancy forcing (m^2/s^3)
real f(ij_bounds) = Coriolis parameter (1/s)
integer jwtype(ij_bounds) = Jerlov water type (1 to 5)
output
real hbl(ij_bounds) ! boundary layer depth (m)
real bfsfc(ij_bounds) !Bo+radiation absorbed to d=hbf*hbl(m^2/s^3)
real stable(ij_bounds) ! =1 in stable forcing; =0 unstable
real caseA(ij_bounds) ! =1 in case A, =0 in case B
integer kbl(ij_bounds) ! index of first grid level below hbl

wscale

DESCRIPTION
 Compute turbulent velocity scales.
Use a 2Dlookup table for wm and ws as functions of ustar and
zetahat (=vonk*sigma*hbl*bfsfc).
Note: the lookup table is only used for unstable conditions
(zehat <= 0), in the stable domain wm (=ws) gets computed
directly.
model
input
real sigma(ij_bounds) = normalized depth (d/hbl)
real hbl(ij_bounds) = boundary layer depth (m)
real ustar(ij_bounds) = surface friction velocity (m/s)
real bfsfc(ij_bounds) = total surface buoyancy flux (m^2/s^3)
output
real wm(ij_bounds),ws(ij_bounds) ! turbulent velocity scales at sigma
local
real zehat ! = zeta * ustar**3

ri_iwmix

DESCRIPTION
 Compute interior viscosity and diffusivity due
to shear instability (dependent on a local richardson number),
to background internal wave activity, and
to static instability (local richardson number < 0).
inputs:
nk = number of vertical levels
visc_cbu_iw = background "visc_cbu" (m**2/sec) due to internal waves
diff_cbt_iw = background "diff_cbt" (m**2/sec) due to internal waves
visc_cbu_limit = largest "visc_cbu" in regions of gravitational
instability (m**2/sec)
diff_cbt_limit = largest "diff_cbt" in regions of gravitational
instability (m**2/sec)
outputs:
visc_cbu = viscosity coefficient at bottom of "u" cells (m**2/s)
diff_cbt = diffusion coefficient at bottom of "t" cells (m**2/s)

ddmix

DESCRIPTION
 Rrho dependent interior flux parameterization.
Add doublediffusion diffusivities to Rimix values at blending
interface and below. salt fingering code modified july 2003
by stephen.griffies@noaa.gov based on NCAR CCSM2.x
inputs:
nk = number of vertical levels
real talpha(imt,km,jmw) ! d(rho)/ d(pot.temperature) (kg/m^3/C)
real sbeta(imt,km,jmw) ! d(rho)/ d(salinity) (kg/m^3/PSU)
outputs:
diff_cbt = diffusion coefficient at bottom of "t" cells (m**2/s)
local
real alphaDT(imt,km,jmw) ! alpha * DT across interfaces
real betaDS(imt,km,jmw) ! beta * DS across interfaces

blmix_kpp

DESCRIPTION
 Mixing coefficients within boundary layer depend on surface
forcing and the magnitude and gradient of interior mixing below
the boundary layer ("matching").
CAUTION: if mixing bottoms out at hbl = zt(nk) then
fictitious layer at nk+1 is needed with small but finite width
dzt(nk+1) (eg. epsln = 1.e20).
inputs:
real ustar(ij_bounds) ! surface friction velocity (m/s)
real bfsfc(ij_bounds) ! surface buoyancy forcing (m^2/s^3)
real hbl(ij_bounds) ! boundary layer depth (m)
real stable(ij_bounds) ! = 1 in stable forcing
real caseA(ij_bounds) ! = 1 in case A
integer kbl(ij_bounds) ! index of first grid level below hbl
outputs:
visc_cbu = viscosity coefficient at bottom of "u" cells (m**2/s)
diff_cbt = diffusion coefficient at bottom of "t" cells (m**2/s)
real dkm1(ij_bounds,3) = boundary layer diff_cbt at kbl1 level
real blmc(ij_bounds,nk,3) = boundary layer mixing coeff.(m**2/s)
real ghats(ij_bounds,nk) = nonlocal scalar transport
local:
real gat1(ij_bounds,3)
real dat1(ij_bounds,3)
real sigma(ij_bounds) = normalized depth (d / hbl)
real ws(ij_bounds), wm(ij_bounds) = turbulent velocity scales (m/s)

enhance

DESCRIPTION
 Enhance the diffusivity at the kbl.5 interface
input
integer kbl(ij_bounds) = grid above hbl
real hbl(ij_bounds) = boundary layer depth (m)
real dkm1(ij_bounds,3) = bl diffusivity at kbl1 grid level
real caseA(ij_bounds) = 1 in caseA, = 0 in case B
input/output
real ghats(ij_bounds,nk) = nonlocal transport (s/m**2)
modified ghats at kbl(i)1 interface
output
real blmc(ij_bounds,nk,3) = enhanced boundary layer mixing coefficient
local
real delta = fraction hbl lies beteen zt neighbors

ri_for_kpp

DESCRIPTION
 Compute Richardson number on tracer and velocity cell bottoms.
rit = richardson number at bottom of T cells
riu = richardson number at bottom of U cells
NAMELIST
&ocean_vert_mix_coeff_kpp_nml

diffusion_kpp_on
Logical switch to enable kpp diffusion. Default
is true.
[logical]

lri
logical switch for shear instability mixing
[logical]

double_diffusion
Logical switch for doublediffusive mixing.
Default is true.
[logical]

diff_cbt_iw
Background vertical diffusivity. Note that if using BryanLewis as a
background diffusivity, then should set diff_cbt_iw=0.0.
[real, units: m^2/sec]

visc_cbu_iw
Background vertical viscosity
[real, units: m^2/sec]

visc_cbu_limit
Enhanced vertical viscosity due to shear instability
[real, units: m^2/sec]

diff_cbt_limit
Enhanced vertical diffusivity due to shear instability
[real, units: m^2/sec]

visc_con_limit
Enhanced vertical viscosity in regions of convection
[real, units: m^2/sec]

diff_con_limit
Enhanced vertical diffusivity in regions of convection
[real, units: m^2/sec]

concv
constant for pure convection (eqn. 23 of Large etal)
[real, units: dimensionless]

Ricr
Critical bulk Richardson number. Default from NCAR is
0.3, though this number has a large uncertainty and some
find that 1.0 can be of use.
[real, units: dimensionless]

non_local_kpp
logical switch for enabling the nonlocal mixing aspect of kpp.
Default is .true. as this is what the original KPP scheme suggests.
[logical]

smooth_blmc
Smooth boundary layer diffusitivies to remove grid scale noise.
Such noise is apparent in the diagnosed mixed layer depth as well
as the SST, especially when running coupled models where forcing
has high temporal frequency.
[logical]
DATA SETS
None.
ERROR MESSAGES
None.
REFERENCES
 W.G. Large and J.C. McWilliams and S.C. Doney
Oceanic vertical mixing: A review and a model with
a nonlocal boundary layer parameterization
Reviews of Geophysics (1994) vol 32 pages 363403
COMPILER SPECIFICS
None.
PRECOMPILER OPTIONS
None.
LOADER OPTIONS
None.
TEST PROGRAM
None.
KNOWN BUGS
None.
NOTES
Original numerical algorithm by Bill Large at NCAR June 6, 1994
Equation numbers in the code refer to the Large etal paper.
Surface fresh water contributes to surface buoyancy via conversion to
a locally implied salt flux.
FUTURE PLANS
None.