PUBLIC INTERFACE ~ PUBLIC ROUTINES ~ NAMELIST

Module ocean_vert_kpp_test_mod

Contact:  A. Rosati Martin Schmidt
Reviewers:  Bill Large Stephen Griffies M.J. Harrison
Change History: WebCVS Log


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

ocean_vert_kpp_test_init:
vert_mix_kpp_test:
bldepth:
wscale:
ri_iwmix:
ddmix:
blmix_kpp:
enhance:
watermass_diag_init:
watermass_diag:


PUBLIC ROUTINES

  1. ocean_vert_kpp_test_init

    DESCRIPTION
    Initialization for the KPP vertical mixing scheme


  2. 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.


  3. 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


  4. 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


  5. 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.


  6. 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


  7. 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)


  8. 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


  9. watermass_diag_init

    DESCRIPTION
    Initialization of watermass diagnostic output files.


  10. 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

  1. 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
  2. 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.


top