PUBLIC INTERFACE ~ PUBLIC ROUTINES ~ NAMELIST

Module ocean_vert_kpp_mom4p0_mod

Contact:  A. Rosati
Reviewers:  Bill Large Stephen Griffies M.J. Harrison Hyun-Chul Lee
Change History: WebCVS Log


OVERVIEW

Vertical viscosity and diffusivity according KPP using code from MOM4p0, which is hard-wired for full cell GEOPOTENTIAL vertical coordinate model. It remains part of MOM for legacy purposes.

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. This module contains code that is hard-wired for GEOPOTENTIAL coordinates, and so is NOT generally recommended. It remains part of MOM for legacy purposes. This version of KPP has been implemented only for the Bgrid. This module also adds mixing due to barotropic tide drag (coastal_tide_mix) and baroclinic tides (int_tide_mix). The barotropic (coastal_tides) and baroclinic (int_tides) mixing schemes are directly analogous to those available in the module ocean_vert_tidal.F90. However, some of the averaging and smoothing operations differ, and so detailed comparisons will show differences. We retain the code here, in KPP, for legacy purposes.


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_workspace_mod

PUBLIC INTERFACE

ocean_vert_kpp_mom4p0_init:
vert_mix_kpp_mom4p0:
bldepth:
wscale:
ri_iwmix:
ddmix:
blmix_kpp:
enhance:
ri_for_kpp:
watermass_diag_init:
watermass_diag:


PUBLIC ROUTINES

  1. ocean_vert_kpp_mom4p0_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
    dtimet = forward time step for tracer diffusion (sec)
    dtimeu = forward time step for velcotiy friction (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: shear_instability = logical switch for shear instability mixing
    double_diffusion = logical switch for double-diffusive 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 = non-dimensional 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


  2. vert_mix_kpp_mom4p0

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


  4. wscale

    DESCRIPTION
    Compute turbulent velocity scales. Use a 2D-lookup 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


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


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


  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(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 kbl-1 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)


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


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


  10. watermass_diag_init

    DESCRIPTION
    Initialization of watermass diagnostic output files.


  11. watermass_diag

    DESCRIPTION
    Diagnose effects from KPP nonlocal on the watermass transformation.



NAMELIST

&ocean_vert_kpp_mom4p0_nml

use_this_module
Logical switch to enable kpp diffusion. Default is 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.
[logical]
coastal_tidal_mix
For adding an extra vertical shear associated with tidal mixing. This method has found to be of use for mixing near shelves.
[logical]
p_tide
The p constant in the Munk-Anderson scheme Default p_tide=-0.25
[real]
sigma_tide
The sigma constant in the Munk-Anderson scheme Default sigma_tide=3.0
[real]
int_tidal_mix
For adding an internal tidal mixing over rough topography. This method has found to be of use for mixing in the rough topography in open ocean. Default int_tidal_mix=.false.
[logical]
int_tide_zeta1
Shallow depth for computation of internal tide. Default int_tide_zeta1=300.0
[real, units: metre]
int_tide_zeta2
Deeper depth for computation of internal tide. Default int_tide_zeta2=1800.0
[real, units: metre]
int_tide_min_depth
Minimum depth for internal tide mixing to be computed. Default int_tide_min_depth=100.0
[real, units: metre]
int_tide_q
Fraction of internal tide energy locally dissipated. Default int_tide_q=.33333
[real, units: dimensionless]
int_tide_gamma
Dimensionless efficiency for converting energy dissipation to diffusivity. Default int_tide_gamma=0.2
[real, units: dimensionless]
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]


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. Hyun-Chul Lee, A. Rosati, and M.J. Spelman Barotropic tidal mixing impact in a coupled climate model: ocean condition and meridional overturning circulation in the northern Atlantic Ocean Modelling, vol 11, pages 464--477


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