The K-\/\+Profile Parameterization (K\+PP) of \cite{large1994} is implemented via the Community Vertical Mixing package, \href{http://cvmix.github.io/}{\texttt{ C\+V\+Mix}}, which is called directly by this module.

The formulation and implementation of K\+PP is described in great detail in the \href{https://github.com/CVMix/CVMix-description/raw/master/cvmix.pdf}{\texttt{ C\+V\+Mix manual}} (written by our own Steve Griffies).\hypertarget{CVMix_KPP_section_KPP_nutshell}{}\doxysection{K\+P\+P in a nutshell}\label{CVMix_KPP_section_KPP_nutshell}
Large et al., \cite{large1994}, 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 \char`\"{}shape function\char`\"{} which is described later. The last term is the \char`\"{}non-\/local transport\char`\"{} 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 K\+PP, 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 \href{https://groups.google.com/forum/\#!msg/CVMix-dev/i6rF-eHOtKI/Ti8BeyksrhAJ}{\texttt{ Extreme values of non-\/local transport}}). Instead, we use either the above form, or even simpler forms that use alternative upper boundary conditions.

The K\+PP 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 O\+B\+Ldepth routine from C\+V\+Mix to compute the actual O\+B\+Ldepth. We optionally then \char`\"{}correct\char`\"{} the O\+B\+Ldepth by cycling through once more, this time knowing the O\+B\+Ldepth from the first pass. This \char`\"{}correction\char`\"{} step is not used by N\+C\+AR. It has been found in idealized M\+O\+M6 tests to not be necessary.

\begin{DoxySeeAlso}{See also}
kpp\+\_\+calculate(), kpp\+\_\+applynonlocaltransport() 
\end{DoxySeeAlso}
