MOM6
|
Provides the K-Profile Parameterization (KPP) of Large et al., 1994, via CVMix.
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).
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.
Data Types | |
type | kpp_cs |
Control structure for containing KPP parameters/data. More... | |
Functions/Subroutines | |
logical function, public | kpp_init (paramFile, G, GV, US, diag, Time, CS, passive, Waves) |
Initialize the CVMix KPP module and set up diagnostics Returns True if KPP is to be used, False otherwise. More... | |
subroutine, public | kpp_calculate (CS, G, GV, US, h, uStar, buoyFlux, Kt, Ks, Kv, nonLocalTransHeat, nonLocalTransScalar, waves) |
KPP vertical diffusivity/viscosity and non-local tracer transport. More... | |
subroutine, public | kpp_compute_bld (CS, G, GV, US, h, Temp, Salt, u, v, EOS, uStar, buoyFlux, Waves) |
Compute OBL depth. More... | |
subroutine | kpp_smooth_bld (CS, G, GV, h) |
Apply a 1-1-4-1-1 Laplacian filter one time on BLD to reduce any horizontal two-grid-point noise. More... | |
subroutine, public | kpp_get_bld (CS, BLD, G) |
Copies KPP surface boundary layer depth into BLD. More... | |
subroutine, public | kpp_nonlocaltransport_temp (CS, G, GV, h, nonLocalTrans, surfFlux, dt, scalar, C_p) |
Apply KPP non-local transport of surface fluxes for temperature. More... | |
subroutine, public | kpp_nonlocaltransport_saln (CS, G, GV, h, nonLocalTrans, surfFlux, dt, scalar) |
Apply KPP non-local transport of surface fluxes for salinity. This routine is a useful prototype for other material tracers. More... | |
subroutine, public | kpp_end (CS) |
Clear pointers, deallocate memory. More... | |
Variables | |
integer, parameter, private | nlt_shape_cvmix = 0 |
Use the CVMix profile. More... | |
integer, parameter, private | nlt_shape_linear = 1 |
Linear, \( G(\sigma) = 1-\sigma \). More... | |
integer, parameter, private | nlt_shape_parabolic = 2 |
Parabolic, \( G(\sigma) = (1-\sigma)^2 \). More... | |
integer, parameter, private | nlt_shape_cubic = 3 |
Cubic, \( G(\sigma) = 1 + (2\sigma-3) \sigma^2\). More... | |
integer, parameter, private | nlt_shape_cubic_lmd = 4 |
Original shape, \( G(\sigma) = \frac{27}{4} \sigma (1-\sigma)^2 \). More... | |
integer, parameter, private | sw_method_all_sw = 0 |
Use all shortwave radiation. More... | |
integer, parameter, private | sw_method_mxl_sw = 1 |
Use shortwave radiation absorbed in mixing layer. More... | |
integer, parameter, private | sw_method_lv1_sw = 2 |
Use shortwave radiation absorbed in layer 1. More... | |
integer, parameter, private | lt_k_constant = 1 |
Constant enhance K through column. More... | |
integer, parameter, private | lt_k_scaled = 2 |
Enhance K scales with G(sigma) More... | |
integer, parameter, private | lt_k_mode_constant = 1 |
Prescribed enhancement for K. More... | |
integer, parameter, private | lt_k_mode_vr12 = 2 |
Enhancement for K based on. More... | |
integer, parameter, private | lt_k_mode_rw16 = 3 |
Enhancement for K based on. More... | |
integer, parameter, private | lt_vt2_mode_constant = 1 |
Prescribed enhancement for Vt2. More... | |
integer, parameter, private | lt_vt2_mode_vr12 = 2 |
Enhancement for Vt2 based on. More... | |
integer, parameter, private | lt_vt2_mode_rw16 = 3 |
Enhancement for Vt2 based on. More... | |
integer, parameter, private | lt_vt2_mode_lf17 = 4 |
Enhancement for Vt2 based on. More... | |
integer | ncall_smooth = 0 |
subroutine, public mom_cvmix_kpp::kpp_calculate | ( | type(kpp_cs), pointer | CS, |
type(ocean_grid_type), intent(in) | G, | ||
type(verticalgrid_type), intent(in) | GV, | ||
type(unit_scale_type), intent(in) | US, | ||
real, dimension(szi_(g),szj_(g),szk_(g)), intent(in) | h, | ||
real, dimension(szi_(g),szj_(g)), intent(in) | uStar, | ||
real, dimension(szi_(g),szj_(g),szk_(g)+1), intent(in) | buoyFlux, | ||
real, dimension(szi_(g),szj_(g),szk_(g)+1), intent(inout) | Kt, | ||
real, dimension(szi_(g),szj_(g),szk_(g)+1), intent(inout) | Ks, | ||
real, dimension(szi_(g),szj_(g),szk_(g)+1), intent(inout) | Kv, | ||
real, dimension(szi_(g),szj_(g),szk_(g)+1), intent(inout) | nonLocalTransHeat, | ||
real, dimension(szi_(g),szj_(g),szk_(g)+1), intent(inout) | nonLocalTransScalar, | ||
type(wave_parameters_cs), optional, pointer | waves | ||
) |
KPP vertical diffusivity/viscosity and non-local tracer transport.
cs | Control structure | |
[in] | g | Ocean grid |
[in] | gv | Ocean vertical grid |
[in] | us | A dimensional unit scaling type |
waves | Wave CS | |
[in] | h | Layer/level thicknesses [H ~> m or kg m-2] |
[in] | ustar | Surface friction velocity [Z T-1 ~> m s-1] |
[in] | buoyflux | Surface buoyancy flux [L2 T-3 ~> m2 s-3] |
[in,out] | kt | (in) Vertical diffusivity of heat w/o KPP (out) Vertical diffusivity including KPP [Z2 T-1 ~> m2 s-1] |
[in,out] | ks | (in) Vertical diffusivity of salt w/o KPP (out) Vertical diffusivity including KPP [Z2 T-1 ~> m2 s-1] |
[in,out] | kv | (in) Vertical viscosity w/o KPP (out) Vertical viscosity including KPP [Z2 T-1 ~> m2 s-1] |
[in,out] | nonlocaltransheat | Temp non-local transport [m s-1] |
[in,out] | nonlocaltransscalar | scalar non-local transport [m s-1] |
Definition at line 590 of file MOM_CVMix_KPP.F90.
References lt_k_constant, lt_k_mode_constant, lt_k_mode_rw16, lt_k_mode_vr12, lt_k_scaled, mom_error_handler::mom_error(), nlt_shape_cubic, nlt_shape_cubic_lmd, nlt_shape_linear, nlt_shape_parabolic, sw_method_all_sw, sw_method_lv1_sw, and sw_method_mxl_sw.
subroutine, public mom_cvmix_kpp::kpp_compute_bld | ( | type(kpp_cs), pointer | CS, |
type(ocean_grid_type), intent(inout) | G, | ||
type(verticalgrid_type), intent(in) | GV, | ||
type(unit_scale_type), intent(in) | US, | ||
real, dimension(szi_(g),szj_(g),szk_(g)), intent(in) | h, | ||
real, dimension(szi_(g),szj_(g),szk_(g)), intent(in) | Temp, | ||
real, dimension(szi_(g),szj_(g),szk_(g)), intent(in) | Salt, | ||
real, dimension(szib_(g),szj_(g),szk_(g)), intent(in) | u, | ||
real, dimension(szi_(g),szjb_(g),szk_(g)), intent(in) | v, | ||
type(eos_type), pointer | EOS, | ||
real, dimension(szi_(g),szj_(g)), intent(in) | uStar, | ||
real, dimension(szi_(g),szj_(g),szk_(g)+1), intent(in) | buoyFlux, | ||
type(wave_parameters_cs), optional, pointer | Waves | ||
) |
Compute OBL depth.
cs | Control structure | |
[in,out] | g | Ocean grid |
[in] | gv | Ocean vertical grid |
[in] | us | A dimensional unit scaling type |
[in] | h | Layer/level thicknesses [H ~> m or kg m-2] |
[in] | temp | potential/cons temp [degC] |
[in] | salt | Salinity [ppt] |
[in] | u | Velocity i-component [L T-1 ~> m s-1] |
[in] | v | Velocity j-component [L T-1 ~> m s-1] |
eos | Equation of state | |
[in] | ustar | Surface friction velocity [Z T-1 ~> m s-1] |
[in] | buoyflux | Surface buoyancy flux [L2 T-3 ~> m2 s-3] |
waves | Wave CS |
Definition at line 892 of file MOM_CVMix_KPP.F90.
References mom_wave_interface::get_langmuir_number(), kpp_smooth_bld(), lt_vt2_mode_constant, lt_vt2_mode_lf17, lt_vt2_mode_rw16, and lt_vt2_mode_vr12.
subroutine, public mom_cvmix_kpp::kpp_end | ( | type(kpp_cs), pointer | CS | ) |
Clear pointers, deallocate memory.
cs | Control structure |
Definition at line 1603 of file MOM_CVMix_KPP.F90.
subroutine, public mom_cvmix_kpp::kpp_get_bld | ( | type(kpp_cs), pointer | CS, |
real, dimension(szi_(g),szj_(g)), intent(inout) | BLD, | ||
type(ocean_grid_type), intent(in) | G | ||
) |
Copies KPP surface boundary layer depth into BLD.
cs | Control structure for this module | |
[in] | g | Grid structure |
[in,out] | bld | bnd. layer depth [m] |
Definition at line 1469 of file MOM_CVMix_KPP.F90.
Referenced by mom_lateral_boundary_diffusion::lateral_boundary_diffusion(), and mom_neutral_diffusion::neutral_diffusion_calc_coeffs().
logical function, public mom_cvmix_kpp::kpp_init | ( | type(param_file_type), intent(in) | paramFile, |
type(ocean_grid_type), intent(in) | G, | ||
type(verticalgrid_type), intent(in) | GV, | ||
type(unit_scale_type), intent(in) | US, | ||
type(diag_ctrl), intent(in), target | diag, | ||
type(time_type), intent(in) | Time, | ||
type(kpp_cs), pointer | CS, | ||
logical, intent(out), optional | passive, | ||
type(wave_parameters_cs), optional, pointer | Waves | ||
) |
Initialize the CVMix KPP module and set up diagnostics Returns True if KPP is to be used, False otherwise.
[in] | paramfile | File parser |
[in] | g | Ocean grid |
[in] | gv | Vertical grid structure. |
[in] | us | A dimensional unit scaling type |
[in] | diag | Diagnostics |
[in] | time | Model time |
cs | Control structure | |
[out] | passive | Copy of passiveMode |
waves | Wave CS |
Definition at line 181 of file MOM_CVMix_KPP.F90.
References mom_file_parser::closeparameterblock(), lt_k_constant, lt_k_mode_constant, lt_k_mode_rw16, lt_k_mode_vr12, lt_k_scaled, lt_vt2_mode_constant, lt_vt2_mode_lf17, lt_vt2_mode_rw16, lt_vt2_mode_vr12, mom_error_handler::mom_error(), nlt_shape_cubic, nlt_shape_cubic_lmd, nlt_shape_cvmix, nlt_shape_linear, nlt_shape_parabolic, mom_file_parser::openparameterblock(), mom_diag_mediator::register_diag_field(), sw_method_all_sw, sw_method_lv1_sw, and sw_method_mxl_sw.
subroutine, public mom_cvmix_kpp::kpp_nonlocaltransport_saln | ( | type(kpp_cs), intent(in) | CS, |
type(ocean_grid_type), intent(in) | G, | ||
type(verticalgrid_type), intent(in) | GV, | ||
real, dimension(szi_(g),szj_(g),szk_(g)), intent(in) | h, | ||
real, dimension(szi_(g),szj_(g),szk_(g)+1), intent(in) | nonLocalTrans, | ||
real, dimension(szi_(g),szj_(g)), intent(in) | surfFlux, | ||
real, intent(in) | dt, | ||
real, dimension(szi_(g),szj_(g),szk_(g)), intent(inout) | scalar | ||
) |
Apply KPP non-local transport of surface fluxes for salinity. This routine is a useful prototype for other material tracers.
[in] | cs | Control structure |
[in] | g | Ocean grid |
[in] | gv | Ocean vertical grid |
[in] | h | Layer/level thickness [H ~> m or kg m-2] |
[in] | nonlocaltrans | Non-local transport [nondim] |
[in] | surfflux | Surface flux of scalar [conc H s-1 ~> conc m s-1 or conc kg m-2 s-1] |
[in] | dt | Time-step [s] |
[in,out] | scalar | Scalar (scalar units [conc]) |
Definition at line 1543 of file MOM_CVMix_KPP.F90.
Referenced by mom_diabatic_driver::diabatic_ale(), mom_diabatic_driver::diabatic_ale_legacy(), and mom_diabatic_driver::layered_diabatic().
subroutine, public mom_cvmix_kpp::kpp_nonlocaltransport_temp | ( | type(kpp_cs), intent(in) | CS, |
type(ocean_grid_type), intent(in) | G, | ||
type(verticalgrid_type), intent(in) | GV, | ||
real, dimension(szi_(g),szj_(g),szk_(g)), intent(in) | h, | ||
real, dimension(szi_(g),szj_(g),szk_(g)+1), intent(in) | nonLocalTrans, | ||
real, dimension(szi_(g),szj_(g)), intent(in) | surfFlux, | ||
real, intent(in) | dt, | ||
real, dimension(szi_(g),szj_(g),szk_(g)), intent(inout) | scalar, | ||
real, intent(in) | C_p | ||
) |
Apply KPP non-local transport of surface fluxes for temperature.
[in] | cs | Control structure |
[in] | g | Ocean grid |
[in] | gv | Ocean vertical grid |
[in] | h | Layer/level thickness [H ~> m or kg m-2] |
[in] | nonlocaltrans | Non-local transport [nondim] |
[in] | surfflux | Surface flux of scalar [conc H s-1 ~> conc m s-1 or conc kg m-2 s-1] |
[in] | dt | Time-step [s] |
[in,out] | scalar | temperature |
[in] | c_p | Seawater specific heat capacity [J kg-1 degC-1] |
Definition at line 1483 of file MOM_CVMix_KPP.F90.
Referenced by mom_diabatic_driver::diabatic_ale(), mom_diabatic_driver::diabatic_ale_legacy(), and mom_diabatic_driver::layered_diabatic().
|
private |
Apply a 1-1-4-1-1 Laplacian filter one time on BLD to reduce any horizontal two-grid-point noise.
cs | Control structure | |
[in,out] | g | Ocean grid |
[in] | gv | Ocean vertical grid |
[in] | h | Layer/level thicknesses [H ~> m or kg m-2] |
Definition at line 1350 of file MOM_CVMix_KPP.F90.
References ncall_smooth.
Referenced by kpp_compute_bld().
|
private |
Constant enhance K through column.
Definition at line 53 of file MOM_CVMix_KPP.F90.
Referenced by kpp_calculate(), and kpp_init().
|
private |
Prescribed enhancement for K.
Definition at line 53 of file MOM_CVMix_KPP.F90.
Referenced by kpp_calculate(), and kpp_init().
|
private |
Enhancement for K based on.
Definition at line 53 of file MOM_CVMix_KPP.F90.
Referenced by kpp_calculate(), and kpp_init().
|
private |
Enhancement for K based on.
Definition at line 53 of file MOM_CVMix_KPP.F90.
Referenced by kpp_calculate(), and kpp_init().
|
private |
Enhance K scales with G(sigma)
Definition at line 53 of file MOM_CVMix_KPP.F90.
Referenced by kpp_calculate(), and kpp_init().
|
private |
Prescribed enhancement for Vt2.
Definition at line 53 of file MOM_CVMix_KPP.F90.
Referenced by kpp_compute_bld(), and kpp_init().
|
private |
Enhancement for Vt2 based on.
Definition at line 53 of file MOM_CVMix_KPP.F90.
Referenced by kpp_compute_bld(), and kpp_init().
|
private |
Enhancement for Vt2 based on.
Definition at line 53 of file MOM_CVMix_KPP.F90.
Referenced by kpp_compute_bld(), and kpp_init().
|
private |
Enhancement for Vt2 based on.
Definition at line 53 of file MOM_CVMix_KPP.F90.
Referenced by kpp_compute_bld(), and kpp_init().
|
private |
Definition at line 68 of file MOM_CVMix_KPP.F90.
Referenced by kpp_smooth_bld().
|
private |
Cubic, \( G(\sigma) = 1 + (2\sigma-3) \sigma^2\).
Definition at line 46 of file MOM_CVMix_KPP.F90.
Referenced by kpp_calculate(), and kpp_init().
|
private |
Original shape, \( G(\sigma) = \frac{27}{4} \sigma (1-\sigma)^2 \).
Definition at line 47 of file MOM_CVMix_KPP.F90.
Referenced by kpp_calculate(), and kpp_init().
|
private |
|
private |
Linear, \( G(\sigma) = 1-\sigma \).
Definition at line 44 of file MOM_CVMix_KPP.F90.
Referenced by kpp_calculate(), and kpp_init().
|
private |
Parabolic, \( G(\sigma) = (1-\sigma)^2 \).
Definition at line 45 of file MOM_CVMix_KPP.F90.
Referenced by kpp_calculate(), and kpp_init().
|
private |
Use all shortwave radiation.
Definition at line 50 of file MOM_CVMix_KPP.F90.
Referenced by kpp_calculate(), and kpp_init().
|
private |
Use shortwave radiation absorbed in layer 1.
Definition at line 52 of file MOM_CVMix_KPP.F90.
Referenced by kpp_calculate(), and kpp_init().
|
private |
Use shortwave radiation absorbed in mixing layer.
Definition at line 51 of file MOM_CVMix_KPP.F90.
Referenced by kpp_calculate(), and kpp_init().