namespace mom_cvmix_kpp

Overview

Provides the K-Profile Parameterization (KPP) of Large et al., 1994, via CVMix. More…

namespace mom_cvmix_kpp {

// global functions

logical function, public kpp_init(
    paramFile paramFile,
    G G,
    GV GV,
    US US,
    diag diag,
    Time Time,
    CS CS,
    passive passive,
    Waves Waves
    );

subroutine, public kpp_calculate(
    CS CS,
    G G,
    GV GV,
    US US,
    h h,
    uStar uStar,
    buoyFlux buoyFlux,
    Kt Kt,
    Ks Ks,
    Kv Kv,
    nonLocalTransHeat nonLocalTransHeat,
    nonLocalTransScalar nonLocalTransScalar,
    waves waves
    );

subroutine, public kpp_compute_bld(
    CS CS,
    G G,
    GV GV,
    US US,
    h h,
    Temp Temp,
    Salt Salt,
    u u,
    v v,
    EOS EOS,
    uStar uStar,
    buoyFlux buoyFlux,
    Waves Waves
    );

subroutine, public kpp_get_bld(CS CS, BLD BLD, G G);

subroutine, public kpp_nonlocaltransport_temp(
    CS CS,
    G G,
    GV GV,
    h h,
    nonLocalTrans nonLocalTrans,
    surfFlux surfFlux,
    dt dt,
    scalar scalar,
    C_p C_p
    );

subroutine, public kpp_nonlocaltransport_saln(
    CS CS,
    G G,
    GV GV,
    h h,
    nonLocalTrans nonLocalTrans,
    surfFlux surfFlux,
    dt dt,
    scalar scalar
    );

subroutine, public kpp_end(CS CS);

} // namespace mom_cvmix_kpp

Detailed Documentation

Provides the K-Profile Parameterization (KPP) of Large et al., 1994, via CVMix.

The K-Profile Parameterization

The K-Profile Parameterization (KPP) of Large et al., 1994, (http://dx.doi.org/10.1029/94RG01872) is implemented via the Community Vertical Mixing package, CVMix, which is called directly by this module.

The formulation and implementation of KPP is described in great detail in the CVMix manual (written by our own Steve Griffies).

KPP in a nutshell

Large et al., 1994, decompose the parameterized boundary layer turbulent flux of a scalar, \(s\), as

\[\overline{w^\prime s^\prime} = -K \partial_z s + K \gamma_s(\sigma),\]

where \(\sigma = -z/h\) is a non-dimensional coordinate within the boundary layer of depth \(h\). \(K\) is the eddy diffusivity and is a function of position within the boundary layer as well as a function of the surface forcing:

\[K = h w_s(\sigma) G(\sigma) .\]

Here, \(w_s\) is the vertical velocity scale of the boundary layer turbulence and \(G(\sigma)\) is a “shape function” which is described later. The last term is the “non-local transport” which involves a function \(\gamma_s(\sigma)\) that is matched to the forcing but is not actually needed in the final implementation. Instead, the entire non-local transport term can be equivalently written

\[K \gamma_s(\sigma) = C_s G(\sigma) Q_s\]

where \(Q_s\) is the surface flux of \(s\) and \(C_s\) is a constant. The vertical structure of the redistribution (non-local) term is solely due to the shape function, \(G(\sigma)\). In our implementation of KPP, we allow the shape functions used for \(K\) and for the non-local transport to be chosen independently.

The particular shape function most widely used in the atmospheric community is

\[G(\sigma) = \sigma (1-\sigma)^2\]

which satisfies the boundary conditions \(G(0) = 0\), \(G(1) = 0\), \(G^\prime(0) = 1\), and \(G^\prime(1) = 0\). Large et al, 1994, alter the function so as to match interior diffusivities but we have found that this leads to inconsistencies within the formulation (see google groups thread Extreme values of non-local transport). Instead, we use either the above form, or even simpler forms that use alternative upper boundary conditions.

The KPP boundary layer depth is a function of the bulk Richardson number, Rib. But to compute Rib, we need the boundary layer depth. To address this circular logic, we compute Rib for each vertical cell in a column, assuming the BL depth equals to the depth of the given grid cell. Once we have a vertical array of Rib(k), we then call the OBLdepth routine from CVMix to compute the actual OBLdepth. We optionally then “correct” the OBLdepth by cycling through once more, this time knowing the OBLdepth from the first pass. This “correction” step is not used by NCAR. It has been found in idealized MOM6 tests to not be necessary.

See also:

kpp_calculate(), kpp_applynonlocaltransport()

Global Functions

logical function, public kpp_init(
    paramFile paramFile,
    G G,
    GV GV,
    US US,
    diag diag,
    Time Time,
    CS CS,
    passive passive,
    Waves Waves
    )

Initialize the CVMix KPP module and set up diagnostics Returns True if KPP is to be used, False otherwise.

Parameters:

paramfile

File parser

g

Ocean grid

gv

Vertical grid structure.

us

A dimensional unit scaling type

diag

Diagnostics

time

Model time

cs

Control structure

passive

Copy of passiveMode

waves

Wave CS

subroutine, public kpp_calculate(
    CS CS,
    G G,
    GV GV,
    US US,
    h h,
    uStar uStar,
    buoyFlux buoyFlux,
    Kt Kt,
    Ks Ks,
    Kv Kv,
    nonLocalTransHeat nonLocalTransHeat,
    nonLocalTransScalar nonLocalTransScalar,
    waves waves
    )

KPP vertical diffusivity/viscosity and non-local tracer transport.

Parameters:

cs

Control structure

g

Ocean grid

gv

Ocean vertical grid

us

A dimensional unit scaling type

waves

Wave CS

h

Layer/level thicknesses [H ~> m or kg m-2]

ustar

Surface friction velocity [Z T-1 ~> m s-1]

buoyflux

Surface buoyancy flux [L2 T-3 ~> m2 s-3]

kt

(in) Vertical diffusivity of heat w/o KPP (out) Vertical diffusivity including KPP [Z2 T-1 ~> m2 s-1]

ks

(in) Vertical diffusivity of salt w/o KPP (out) Vertical diffusivity including KPP [Z2 T-1 ~> m2 s-1]

kv

(in) Vertical viscosity w/o KPP (out) Vertical viscosity including KPP [Z2 T-1 ~> m2 s-1]

nonlocaltransheat

Temp non-local transport [m s-1]

nonlocaltransscalar

scalar non-local transport [m s-1]

subroutine, public kpp_compute_bld(
    CS CS,
    G G,
    GV GV,
    US US,
    h h,
    Temp Temp,
    Salt Salt,
    u u,
    v v,
    EOS EOS,
    uStar uStar,
    buoyFlux buoyFlux,
    Waves Waves
    )

Compute OBL depth.

Parameters:

cs

Control structure

g

Ocean grid

gv

Ocean vertical grid

us

A dimensional unit scaling type

h

Layer/level thicknesses [H ~> m or kg m-2]

temp

potential/cons temp [degC]

salt

Salinity [ppt]

u

Velocity i-component [L T-1 ~> m s-1]

v

Velocity j-component [L T-1 ~> m s-1]

eos

Equation of state

ustar

Surface friction velocity [Z T-1 ~> m s-1]

buoyflux

Surface buoyancy flux [L2 T-3 ~> m2 s-3]

waves

Wave CS

subroutine, public kpp_get_bld(CS CS, BLD BLD, G G)

Copies KPP surface boundary layer depth into BLD.

Parameters:

cs

Control structure for this module

g

Grid structure

bld

bnd. layer depth [m]

subroutine, public kpp_nonlocaltransport_temp(
    CS CS,
    G G,
    GV GV,
    h h,
    nonLocalTrans nonLocalTrans,
    surfFlux surfFlux,
    dt dt,
    scalar scalar,
    C_p C_p
    )

Apply KPP non-local transport of surface fluxes for temperature.

Parameters:

cs

Control structure

g

Ocean grid

gv

Ocean vertical grid

h

Layer/level thickness [H ~> m or kg m-2]

nonlocaltrans

Non-local transport [nondim]

surfflux

Surface flux of scalar [conc H s-1 ~> conc m s-1 or conc kg m-2 s-1]

dt

Time-step [s]

scalar

temperature

c_p

Seawater specific heat capacity [J kg-1 degC-1]

subroutine, public kpp_nonlocaltransport_saln(
    CS CS,
    G G,
    GV GV,
    h h,
    nonLocalTrans nonLocalTrans,
    surfFlux surfFlux,
    dt dt,
    scalar scalar
    )

Apply KPP non-local transport of surface fluxes for salinity. This routine is a useful prototype for other material tracers.

Parameters:

cs

Control structure

g

Ocean grid

gv

Ocean vertical grid

h

Layer/level thickness [H ~> m or kg m-2]

nonlocaltrans

Non-local transport [nondim]

surfflux

Surface flux of scalar [conc H s-1 ~> conc m s-1 or conc kg m-2 s-1]

dt

Time-step [s]

scalar

Scalar (scalar units [conc])

subroutine, public kpp_end(CS CS)

Clear pointers, deallocate memory.

Parameters:

cs

Control structure