<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="1.8.18">
  <compounddef id="CVMix_KPP" kind="page">
    <compoundname>CVMix_KPP</compoundname>
    <title>The K-Profile Parameterization</title>
    <briefdescription>
    </briefdescription>
    <detaileddescription>
<para>The K-Profile Parameterization (KPP) of <ref refid="citelist_1CITEREF_large1994" kindref="member">[25]</ref> is implemented via the Community Vertical Mixing package, <ulink url="http://cvmix.github.io/">CVMix</ulink>, which is called directly by this module.</para>
<para>The formulation and implementation of KPP is described in great detail in the <ulink url="https://github.com/CVMix/CVMix-description/raw/master/cvmix.pdf">CVMix manual</ulink> (written by our own Steve Griffies).</para>
<sect1 id="CVMix_KPP_1section_KPP_nutshell">
<title>KPP in a nutshell</title>
<para>Large et al., <ref refid="citelist_1CITEREF_large1994" kindref="member">[25]</ref>, decompose the parameterized boundary layer turbulent flux of a scalar, <formula id="438">$ s $</formula>, as <formula id="439">\[ \overline{w^\prime s^\prime} = -K \partial_z s + K \gamma_s(\sigma), \]</formula> where <formula id="440">$ \sigma = -z/h $</formula> is a non-dimensional coordinate within the boundary layer of depth <formula id="441">$ h $</formula>. <formula id="442">$ K $</formula> is the eddy diffusivity and is a function of position within the boundary layer as well as a function of the surface forcing: <formula id="443">\[ K = h w_s(\sigma) G(\sigma) . \]</formula> Here, <formula id="444">$ w_s $</formula> is the vertical velocity scale of the boundary layer turbulence and <formula id="445">$ G(\sigma) $</formula> is a &quot;shape function&quot; which is described later. The last term is the &quot;non-local transport&quot; which involves a function <formula id="446">$ \gamma_s(\sigma) $</formula> 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 <formula id="447">\[ K \gamma_s(\sigma) = C_s G(\sigma) Q_s \]</formula> where <formula id="448">$ Q_s $</formula> is the surface flux of <formula id="438">$ s $</formula> and <formula id="449">$ C_s $</formula> is a constant. The vertical structure of the redistribution (non-local) term is solely due to the shape function, <formula id="445">$ G(\sigma) $</formula>. In our implementation of KPP, we allow the shape functions used for <formula id="442">$ K $</formula> and for the non-local transport to be chosen independently.</para>
<para>The particular shape function most widely used in the atmospheric community is <formula id="450">\[ G(\sigma) = \sigma (1-\sigma)^2 \]</formula> which satisfies the boundary conditions <formula id="451">$ G(0) = 0 $</formula>, <formula id="452">$ G(1) = 0 $</formula>, <formula id="453">$ G^\prime(0) = 1 $</formula>, and <formula id="454">$ G^\prime(1) = 0 $</formula>. 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 <ulink url="https://groups.google.com/forum/#!msg/CVMix-dev/i6rF-eHOtKI/Ti8BeyksrhAJ">Extreme values of non-local transport</ulink>). Instead, we use either the above form, or even simpler forms that use alternative upper boundary conditions.</para>
<para>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 &quot;correct&quot; the OBLdepth by cycling through once more, this time knowing the OBLdepth from the first pass. This &quot;correction&quot; step is not used by NCAR. It has been found in idealized MOM6 tests to not be necessary.</para>
<para><simplesect kind="see"><para><ref refid="namespacemom__cvmix__kpp_1a94d77471726028da980fd9f998b4173f" kindref="member">kpp_calculate()</ref>, kpp_applynonlocaltransport() </para>
</simplesect>
</para>
</sect1>
    </detaileddescription>
  </compounddef>
</doxygen>
