Module ocean_vert_kpp_test_mod
OVERVIEW
Vertical viscosity and diffusivity according KPP.
This module has extra code options to handle regions of extremely fresh water.
It also has options for both the Cgrid and Bgrid.
It is undergoing further development in collaboration with NCAR scientists.
So it will undergo significant change during 2012.
This module computes vertical viscosity and diffusivity according to
the K-profile parameterization scheme of Large, McWilliams, and
Doney (1994). It computes both local and non-local mixing.
The code has been updated to MOM4p1, so that vertical grid increments
are suitable for generalized vertical coordinate models. When run
as geopotential model, there will be some differences, since the
MOM4.0 code (available in ocean_vert_kpp_mom4p0.F90) incorrectly
ignored the free surface undulations affecting the top model grid
cell thickness.
OTHER MODULES USED
constants_mod
diag_manager_mod
fms_mod
mpp_domains_mod
mpp_mod
ocean_density_mod
ocean_domains_mod
ocean_parameters_mod
ocean_tracer_util_mod
ocean_types_mod
ocean_vert_util_mod
ocean_workspace_mod
PUBLIC INTERFACE
PUBLIC ROUTINES
-
ocean_vert_kpp_test_init
-
DESCRIPTION
-
Initialization for the KPP vertical mixing scheme
-
vert_mix_kpp_test
-
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.
NOTE: Use smf_bgrid since this uses the primary smf array read in from
the coupler in ocean_core/ocean_sbc.F90 when using the FMS coupler.
-
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(k-1).
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.
input
real dbloc = local delta buoyancy (m/s^2)
real dbsfc = delta buoyancy w/ respect to sfc(m/s)^2
real ustar = surface friction velocity (m/s)
real Bo = surface turbulent buoyancy forcing(m^2/s^3)
real Bosol = radiative buoyancy forcing (m^2/s^3)
real f = Coriolis parameter (1/s)
output
real hbl ! boundary layer depth (m)
real bfsfc !Bo+radiation absorbed to d=hbf*hbl(m^2/s^3)
real stable ! =1 in stable forcing; =0 unstable
real caseA ! =1 in case A, =0 in case B
integer kbl ! index of first grid level below hbl
-
wscale
-
DESCRIPTION
-
Compute turbulent velocity scales.
Use a 2D-lookup table for wm and ws as functions of ustar and
zetahat (=von_karman*sigma*hbl*bfsfc).
Note: the lookup table is only used for unstable conditions
(zehat <= 0), in the stable domain wm (=ws) gets computed
directly.
Note: the loop has been doubled to allow NEC compilers for vectorisation.
Speed gain was observed at the SX-6.
Later compiler versions may do better.
input
real sigma = normalized depth (d/hbl)
real hbl = boundary layer depth (m)
real ustar = surface friction velocity (m/s)
real bfsfc = total surface buoyancy flux (m^2/s^3)
output
real wm,ws ! 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).
Diffusion and viscosity coefficients are on bottom
of T-cells.
-
ddmix
-
DESCRIPTION
-
Rrho dependent interior flux parameterization.
Add double-diffusion diffusivities to Ri-mix values at blending
interface and below. salt fingering code modified july 2003
by stephen.griffies based on NCAR CCSM2.x
real talpha ! d(rho)/ d(pot.temperature) (kg/m^3/C)
real sbeta ! d(rho)/ d(salinity) (kg/m^3/PSU)
diff_cbt = diffusion coefficient at bottom of "t" cells (m**2/s)
local
real alphaDT ! alpha * DT across interfaces
real betaDS ! 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.e-20).
inputs:
real ustar ! surface friction velocity (m/s)
real bfsfc ! surface buoyancy forcing (m^2/s^3)
real hbl ! boundary layer depth (m)
real stable ! = 1 in stable forcing
real caseA ! = 1 in case A
integer kbl ! index of first grid level below hbl
outputs:
visc_cbt = viscosity coefficient at bottom of "t" cells (m**2/s)
diff_cbt = diffusion coefficient at bottom of "t" cells (m**2/s)
real dkm1(,3) = boundary layer diff_cbt at kbl-1 level
real blmc(,nk,3) = boundary layer mixing coeff.(m**2/s)
real ghats(,nk) = nonlocal scalar transport
local:
real gat1(,3)
real dat1(,3)
real sigma() = normalized depth (d / hbl)
real ws(), wm() = turbulent velocity scales (m/s)
-
enhance
-
DESCRIPTION
-
Enhance the diffusivity at the kbl-.5 interface
input
integer kbl = grid above hbl
real hbl = boundary layer depth (m)
real dkm1 = bl diffusivity at kbl-1 grid level
real caseA = 1 in caseA, = 0 in case B
input/output
real ghats = nonlocal transport (s/m**2)
modified ghats at kbl(i)-1 interface
output
real blmc = enhanced boundary layer mixing coefficient
local
real delta = fraction hbl lies beteen zt neighbors
-
watermass_diag_init
-
DESCRIPTION
-
Initialization of watermass diagnostic output files.
-
watermass_diag
-
DESCRIPTION
-
Diagnose effects from KPP nonlocal on the watermass transformation.
NAMELIST
&ocean_vert_kpp_test_nml
-
use_this_module
Logical switch to enable kpp diffusion. Default is false.
[logical]
-
debug_this_module
Logical switch for debugging. Default debug_this_module=.false.
[logical]
-
shear_instability
logical switch for shear instability mixing.
Default shear_instability=.true.
[logical]
-
double_diffusion
Logical switch for double-diffusive mixing.
Default double_diffusion=.true.
[logical]
-
diff_cbt_iw
Background vertical diffusivity. Note that if using Bryan-Lewis 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 non-local 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.
Default smooth_blmc=.false.
Warning: This smoother can cause some problems with ghat in regions
of zero surface forcing. To understand details, one needs
the paper of Large et al. Vertical diffusion has the general form
<wx> = K(x_z - ghats)
In the surface layer a vertical scale function ws is estimated.
We have K ~ ws and ghats ~1/ws. If wind stress is zero the vertical
scale ws becomes zero too. Hence, ghats is very large
(something finite, since it is divided by ws+epsln). Now it may happen,
that the bouyancy flux becomes negative (~ -10-30). This enables
the nonlocal scheme. Because the mixing coefficient in the
surface boundary layer scales with ws the corresponding
time tendency should be of the order (1/ws * ws = finite). However,
if smooth_blmc is enabled, it may happen, that from neighbouring
points with different mixing depth a finite value for
the mixing coefficient leaks in. In this case
the tracer time tendency from the nonlocal scheme becomes huge
and the model fails.
The smoother destroys the consistency between ghats and diff_cbt.
In most cases this should not matter, but the example shows,
that sudden model failure is possible under otherwise
stable and smooth conditions.
[logical]
-
kl_min
Lower loop index for finding new kbl. Needed for use with certain
tests of OBC, where kl_min=1 needed, whereas default in original
implementation has kl_min=2. Default in MOM is kl_min=2.
[integer]
-
kbl_standard_method
For computing kbl as in the MOM4p0d code, which is taken from
the original NCAR scheme. If false, then will slightly modify
the logic. The modified logic has been found necessary when running
with as few as two grid cells in the vertical.
Default kbl_standard_method=.true.
[logical]
-
limit_with_hekman
Limiting the boundary layer depth with the Ekman depth may result in a
shallow boundary layer. In this case the internal values of the vertical
mixing and viscosity coefficients may be large. This results in
unrealistically large non-local vertical mixing
Default limit_with_hekman=.true.
[logical]
-
limit_ghats
Limits the non-local vertical tracer flux to the value of the tracer
surface flux.
Default limit_ghats=.false.
[logical]
-
hbl_with_rit
The default method for determination of the boundary layer depth may fail
if the water column is instable (negative Richardson number) below or above
the layer that contains the diagnosed hbl.
With hbl_with_rit=.true. the search for the boundary layer depth is continued
downward in this case even if the bulk Richardson number exceeds the
critical value. This removes a lot of noise from the boundary layer depth.
Default hbl_with_rit=.false.
[logical]
-
radiation_large
Remove the shortwave radiation leaving the boundary layer to the ocean interior
(hence, not absorbed in the boundary layer) from non-local vertical heat flux
Default radiation_large=.false.
[logical]
-
radiation_zero
Remove the all shortwave radiation from non-local vertical heat flux.
Default radiation_zero=.false.
[logical]
-
radiation_iow
Keep only the shortwave radiation absorbed between the surface and a certain level
in non-local vertical heat flux through this level.
Default radiation_iow=.false.
[logical]
-
bvf_from_below
Use BV-freq. at the cell bottom instead of the cell top
as in Danabasoglu et al. (2006).
Default bvf_from_below=.false., as this will recover
older behaviour.
[logical]
-
variable_vtc
Make vtc dependent on BV-freq. as in Danabasoglu et al. (2006).
Default variable_vtc=.false., as this will recover
older behaviour.
[logical]
-
use_max_shear
Use maximum shear instead of 4-point average
(as in Danabasoglu et al. (2006)).
Default use_max_shear=.false., as this will recover
legacy behaviour.
[logical]
-
linear_hbl
Use linear interpolation to find the position of hbl.
If set to false, then use the quadratic interpolation
as in Danabasoglu et al. (2006). The quadratic approach
generally yields a slightly deeper surface boundary layer.
Default linear_hbl=.true., as this will recover
older behaviour.
[logical]
-
wsfc_combine_runoff_calve
For computing wsfc as in the MOM4p0d code, where we combine
the runoff+calving into a single field called river.
The alternative keeps the fields separate, as would be appropriate
for a land model that separately tracks the tracer content in the
calving and runoff.
Default wsfc_combine_runoff_calve=.true., as this will recover
the previous behaviour, to the bit.
[logical]
-
smooth_ri_kmax_eq_kmu
When smoothing the Richardson number, we do so over a vertical
column with max k-levels set by either kmt or kmu. The proper
approach is kmu, since we are smoothing riu. But for backwards
compatibility, we default to smooth_ri_kmax_eq_kmu=.false.
[logical]
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 363-403
-
Danabasoglu etal (2006)
Diurnal coupling in the tropical oceans of CCSM3
Journal of Climate (2006) vol 19 pages 2347--2365
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.