_CVMix_KPP.dox

1/*! \page CVMix_KPP The K-Profile Parameterization
2
3 The K-Profile Parameterization (KPP) of \cite large1994 is
4 implemented via the Community Vertical Mixing package, [CVMix](http://cvmix.github.io/),
5 which is called directly by this module.
6
7 The formulation and implementation of KPP is described in great detail in the
8 [CVMix manual](https://github.com/CVMix/CVMix-description/raw/master/cvmix.pdf) (written by our own Steve Griffies).
9
10 \section section_KPP_nutshell KPP in a nutshell
11
12 Large et al., \cite large1994, decompose the parameterized boundary layer turbulent flux of a scalar, \f$ s \f$, as
13 \f[ \overline{w^\prime s^\prime} = -K \partial_z s + K \gamma_s(\sigma), \f]
14 where \f$ \sigma = -z/h \f$ is a non-dimensional coordinate within the boundary layer of depth \f$ h \f$.
15 \f$ K \f$ is the eddy diffusivity and is a function of position within the boundary layer as well as a
16 function of the surface forcing:
17 \f[ K = h w_s(\sigma) G(\sigma) . \f]
18 Here, \f$ w_s \f$ is the vertical velocity scale of the boundary layer turbulence and \f$ G(\sigma) \f$ is
19 a "shape function" which is described later.
20 The last term is the "non-local transport" which involves a function \f$ \gamma_s(\sigma) \f$ that is matched
21 to the forcing but is not actually needed in the final implementation.
22 Instead, the entire non-local transport term can be equivalently written
23 \f[ K \gamma_s(\sigma) = C_s G(\sigma) Q_s \f]
24 where \f$ Q_s \f$ is the surface flux of \f$ s \f$ and \f$ C_s \f$ is a constant.
25 The vertical structure of the redistribution (non-local) term is solely due to the shape function,
26 \f$ G(\sigma) \f$.
27 In our implementation of KPP, we allow the shape functions used for \f$ K \f$ and for the non-local transport
28 to be chosen independently.
29
30 [google_thread_NLT]: https://groups.google.com/forum/#!msg/CVMix-dev/i6rF-eHOtKI/Ti8BeyksrhAJ
31 "Extreme values of non-local transport"
32
33 The particular shape function most widely used in the atmospheric community is
34 \f[ G(\sigma) = \sigma (1-\sigma)^2 \f]
35 which satisfies the boundary conditions
36 \f$ G(0) = 0 \f$,
37 \f$ G(1) = 0 \f$,
38 \f$ G^\prime(0) = 1 \f$, and
39 \f$ G^\prime(1) = 0 \f$.
40 Large et al, 1994, alter the function so as to match interior diffusivities but we have found that this leads
41 to inconsistencies within the formulation (see google groups thread
42 [Extreme values of non-local transport][google_thread_NLT]).
43 Instead, we use either the above form, or even simpler forms that use alternative upper boundary conditions.
44
45 The KPP boundary layer depth is a function of the bulk Richardson number, Rib.
46 But to compute Rib, we need the boundary layer depth. To address this circular
47 logic, we compute Rib for each vertical cell in a column, assuming the BL depth
48 equals to the depth of the given grid cell. Once we have a vertical array of Rib(k),
49 we then call the OBLdepth routine from CVMix to compute the actual
50 OBLdepth. We optionally then "correct" the OBLdepth by cycling through once more,
51 this time knowing the OBLdepth from the first pass. This "correction" step is not
52 used by NCAR. It has been found in idealized MOM6 tests to not be necessary.
53
54\sa
55kpp_calculate(), kpp_applynonlocaltransport()
56
57*/