This file contains the CCPP-compliant SATMEDMF scheme (updated version) which computes subgrid vertical turbulence mixing using scale-aware TKE-based moist eddy-diffusion mass-flux (TKE-EDMF) parameterization (by Jongil Han). More...
Functions/Subroutines | |
| subroutine | satmedmfvdifq::satmedmfvdifq_init (satmedmf, isatmedmf, isatmedmf_vdifq, errmsg, errflg) |
| subroutine | satmedmfvdifq::satmedmfvdifq_run (im, km, ntrac, ntcw, ntrw, ntiw, ntke, grav, pi, rd, cp, rv, hvap, hfus, fv, eps, epsm1, def_1, def_2, def_3, sa3dtke, dku3d_h, dku3d_e, rtg, u1, v1, t1, q1, usfco, vsfco, use_oceanuv, swh, hlw, xmu, garea, zvfun, sigmaf, psk, rbsoil, zorl, u10m, v10m, fm, fh, tsea, heat, evap, stress, spd1, kpbl, prsi, del, prsl, prslk, phii, phil, delt, tte_edmf, dspheat, dusfc, dvsfc, dtsfc, dqsfc, hpbl, dkt, dku, tkeh, kinver, xkzm_m, xkzm_h, xkzm_s, dspfac, bl_upfr, bl_dnfr, rlmx, elmx, sfc_rlm, tc_pbl, use_lpt, do_canopy, cplaqm, claie, cfch, cfrt, cclu, cpopu, ntqv, dtend, dtidx, index_of_temperature, index_of_x_wind, index_of_y_wind, index_of_process_pbl, gen_tend, ldiag3d, ten_t, ten_u, ten_v, errmsg, errflg) |
| subroutine | tridi_mod::tridi1 (l, n, cl, cm, cu, r1, au, a1) |
| Routine to solve the tridiagonal system to calculate temperature and moisture at \( t + \Delta t \); part of two-part process to calculate time tendencies due to vertical diffusion. | |
| subroutine | tridi_mod::tridi2 (l, n, cl, cm, cu, r1, r2, au, a1, a2) |
| This subroutine .. | |
| subroutine | tridi_mod::tridin (l, n, nt, cl, cm, cu, r1, r2, au, a1, a2) |
| Routine to solve the tridiagonal system to calculate u- and v-momentum at \( t + \Delta t \); part of two-part process to calculate time tendencies due to vertical diffusion. | |
| subroutine | tridi_mod::tridit (l, n, nt, cl, cm, cu, rt, au, at) |
| This subroutine solves tridiagonal problem for TKE. | |
| subroutine | mfpbltq_mod::mfpbltq (im, ix, km, kmpbl, ntcw, ntrac1, delt, |
| This subroutine computes mass flux and updraft parcel properties for thermals driven by surface heating. | |
| subroutine | mfscuq_mod::mfscuq (im, ix, km, kmscu, ntcw, ntrac1, delt, |
| This subroutine computes mass flux and downdraft parcel properties for stratocumulus-top-driven turbulence. | |
This file contains the CCPP-compliant SATMEDMF scheme (updated version) which computes subgrid vertical turbulence mixing using scale-aware TKE-based moist eddy-diffusion mass-flux (TKE-EDMF) parameterization (by Jongil Han).
This subroutine contains all of the logic for the scale-aware TKE-based moist eddy-diffusion mass-flux (TKE-EDMF, updated version) scheme. For local turbulence mixing, a TKE closure model is used. Updated version of satmedmfvdif.f (May 2019) to have better low level inversion, to reduce the cold bias in lower troposphere, and to reduce the negative wind speed bias in upper troposphere
Incorporate the LES-based changes for TC simulation (Chen et al.,2022 [37]) with additional improvements on MF working with Cu schemes Xiaomin Chen, 5/2/2022
Incorporate the TTE-EDMF; if (tte_edmf=.true.), TKE-EDMF scheme becomes TTE-EDMF scheme and the variable 'te' is read as TTE; if (tte_edmf=.false.), the variable 'te' is read as TKE, 5/22/2025
| subroutine mfpbltq_mod::mfpbltq | ( | integer | im, |
| integer | ix, | ||
| integer | km, | ||
| integer | kmpbl, | ||
| integer | ntcw, | ||
| integer | ntrac1, | ||
| real(kind=kind_phys) | delt | ||
| ) |
This subroutine computes mass flux and updraft parcel properties for thermals driven by surface heating.
Definition at line 16 of file mfpbltq.f.
Referenced by satmedmfvdifq_can_mod::satmedmfvdifq_can(), and satmedmfvdifq::satmedmfvdifq_run().
| subroutine mfscuq_mod::mfscuq | ( | integer | im, |
| integer | ix, | ||
| integer | km, | ||
| integer | kmscu, | ||
| integer | ntcw, | ||
| integer | ntrac1, | ||
| real(kind=kind_phys) | delt | ||
| ) |
This subroutine computes mass flux and downdraft parcel properties for stratocumulus-top-driven turbulence.
Definition at line 14 of file mfscuq.f.
Referenced by satmedmfvdifq_can_mod::satmedmfvdifq_can(), and satmedmfvdifq::satmedmfvdifq_run().
| subroutine satmedmfvdifq::satmedmfvdifq_init | ( | logical, intent(in) | satmedmf, |
| integer, intent(in) | isatmedmf, | ||
| integer, intent(in) | isatmedmf_vdifq, | ||
| character(len=*), intent(out) | errmsg, | ||
| integer, intent(out) | errflg | ||
| ) |
Definition at line 45 of file satmedmfvdifq.F.
| subroutine satmedmfvdifq::satmedmfvdifq_run | ( | integer, intent(in) | im, |
| integer, intent(in) | km, | ||
| integer, intent(in) | ntrac, | ||
| integer, intent(in) | ntcw, | ||
| integer, intent(in) | ntrw, | ||
| integer, intent(in) | ntiw, | ||
| integer, intent(in) | ntke, | ||
| real(kind=kind_phys), intent(in) | grav, | ||
| real(kind=kind_phys), intent(in) | pi, | ||
| real(kind=kind_phys), intent(in) | rd, | ||
| real(kind=kind_phys), intent(in) | cp, | ||
| real(kind=kind_phys), intent(in) | rv, | ||
| real(kind=kind_phys), intent(in) | hvap, | ||
| real(kind=kind_phys), intent(in) | hfus, | ||
| real(kind=kind_phys), intent(in) | fv, | ||
| real(kind=kind_phys), intent(in) | eps, | ||
| real(kind=kind_phys), intent(in) | epsm1, | ||
| real(kind=kind_phys), dimension(:,:), intent(in) | def_1, | ||
| real(kind=kind_phys), dimension(:,:), intent(in) | def_2, | ||
| real(kind=kind_phys), dimension(:,:), intent(in) | def_3, | ||
| logical, intent(in) | sa3dtke, | ||
| dku3d_h, | |||
| dku3d_e, | |||
| real(kind=kind_phys), dimension(:,:,:), intent(inout) | rtg, | ||
| real(kind=kind_phys), dimension(:,:), intent(in) | u1, | ||
| real(kind=kind_phys), dimension(:,:), intent(in) | v1, | ||
| real(kind=kind_phys), dimension(:,:), intent(in) | t1, | ||
| real(kind=kind_phys), dimension(:,:,:), intent(in) | q1, | ||
| real(kind=kind_phys), dimension(:), intent(in) | usfco, | ||
| real(kind=kind_phys), dimension(:), intent(in) | vsfco, | ||
| logical, intent(in) | use_oceanuv, | ||
| real(kind=kind_phys), dimension(:,:), intent(in) | swh, | ||
| real(kind=kind_phys), dimension(:,:), intent(in) | hlw, | ||
| real(kind=kind_phys), dimension(:), intent(in) | xmu, | ||
| real(kind=kind_phys), dimension(:), intent(in) | garea, | ||
| real(kind=kind_phys), dimension(:), intent(in) | zvfun, | ||
| real(kind=kind_phys), dimension(:), intent(in) | sigmaf, | ||
| real(kind=kind_phys), dimension(:), intent(in) | psk, | ||
| real(kind=kind_phys), dimension(:), intent(in) | rbsoil, | ||
| real(kind=kind_phys), dimension(:), intent(in) | zorl, | ||
| real(kind=kind_phys), dimension(:), intent(in) | u10m, | ||
| real(kind=kind_phys), dimension(:), intent(in) | v10m, | ||
| real(kind=kind_phys), dimension(:), intent(in) | fm, | ||
| real(kind=kind_phys), dimension(:), intent(in) | fh, | ||
| real(kind=kind_phys), dimension(:), intent(in) | tsea, | ||
| real(kind=kind_phys), dimension(:), intent(in) | heat, | ||
| real(kind=kind_phys), dimension(:), intent(in) | evap, | ||
| real(kind=kind_phys), dimension(:), intent(in) | stress, | ||
| real(kind=kind_phys), dimension(:), intent(in) | spd1, | ||
| integer, dimension(:), intent(out) | kpbl, | ||
| real(kind=kind_phys), dimension(:,:), intent(in) | prsi, | ||
| real(kind=kind_phys), dimension(:,:), intent(in) | del, | ||
| real(kind=kind_phys), dimension(:,:), intent(in) | prsl, | ||
| real(kind=kind_phys), dimension(:,:), intent(in) | prslk, | ||
| real(kind=kind_phys), dimension(:,:), intent(in) | phii, | ||
| real(kind=kind_phys), dimension(:,:), intent(in) | phil, | ||
| real(kind=kind_phys), intent(in) | delt, | ||
| logical, intent(in) | tte_edmf, | ||
| logical, intent(in) | dspheat, | ||
| real(kind=kind_phys), dimension(:), intent(out) | dusfc, | ||
| real(kind=kind_phys), dimension(:), intent(out) | dvsfc, | ||
| real(kind=kind_phys), dimension(:), intent(out) | dtsfc, | ||
| real(kind=kind_phys), dimension(:), intent(out) | dqsfc, | ||
| real(kind=kind_phys), dimension(:), intent(out) | hpbl, | ||
| real(kind=kind_phys), dimension(:,:), intent(out) | dkt, | ||
| real(kind=kind_phys), dimension(:,:), intent(out) | dku, | ||
| real(kind=kind_phys), dimension(:,:), intent(inout) | tkeh, | ||
| integer, dimension(:), intent(in) | kinver, | ||
| real(kind=kind_phys), intent(in) | xkzm_m, | ||
| real(kind=kind_phys), intent(in) | xkzm_h, | ||
| real(kind=kind_phys), intent(in) | xkzm_s, | ||
| real(kind=kind_phys), intent(in) | dspfac, | ||
| real(kind=kind_phys), intent(in) | bl_upfr, | ||
| real(kind=kind_phys), intent(in) | bl_dnfr, | ||
| real(kind=kind_phys), intent(in) | rlmx, | ||
| real(kind=kind_phys), intent(in) | elmx, | ||
| integer, intent(in) | sfc_rlm, | ||
| integer, intent(in) | tc_pbl, | ||
| integer, intent(in) | use_lpt, | ||
| logical, intent(in) | do_canopy, | ||
| logical, intent(in) | cplaqm, | ||
| real(kind=kind_phys), dimension(:), intent(in), optional | claie, | ||
| real(kind=kind_phys), dimension(:), intent(in), optional | cfch, | ||
| real(kind=kind_phys), dimension(:), intent(in), optional | cfrt, | ||
| real(kind=kind_phys), dimension(:), intent(in), optional | cclu, | ||
| real(kind=kind_phys), dimension(:), intent(in), optional | cpopu, | ||
| integer, intent(in) | ntqv, | ||
| real(kind=kind_phys), dimension(:,:,:), intent(inout), optional | dtend, | ||
| integer, dimension(:,:), intent(in) | dtidx, | ||
| integer, intent(in) | index_of_temperature, | ||
| integer, intent(in) | index_of_x_wind, | ||
| integer, intent(in) | index_of_y_wind, | ||
| integer, intent(in) | index_of_process_pbl, | ||
| logical, intent(in) | gen_tend, | ||
| logical, intent(in) | ldiag3d, | ||
| real(kind=kind_phys), dimension(:,:), intent(out) | ten_t, | ||
| real(kind=kind_phys), dimension(:,:), intent(out) | ten_u, | ||
| real(kind=kind_phys), dimension(:,:), intent(out) | ten_v, | ||
| character(len=*), intent(out) | errmsg, | ||
| integer, intent(out) | errflg | ||
| ) |
satmedmfvdifq_run() computes subgrid vertical turbulence mixing using the scale-aware TKE-based moist eddy-diffusion mass-flux (EDMF) parameterization of Han and Bretherton (2019) [77] .
zi and zl)gdx)tke and tkeh)The calculation of the boundary layer height follows Troen and Mahrt (1986) [194] section 3. The approach is to find the level in the column where a modified bulk Richardson number exceeds a critical value.
\[ Rb_{cr}=0.16(10^{-7}R_{0})^{-0.18} \]
\[ R_{0}=\frac{U_{10}}{f_{0}z_{0}} \]
where \(U_{10}\) is the wind speed at 10m above the ground surface, \(f_0\) the Coriolis parameter, and \(z_{0}\) the surface roughness length. To avoid too much variation, we restrict \(Rb_{cr}\) to vary within the range of 0.15~0.35\[ \zeta = Ri_{sfc}\frac{F_m^2}{F_h} = \frac{z}{L} \]
where \(F_m\) and \(F_h\) are surface Monin-Obukhov stability functions calculated in sfc_diff.f and \(L\) is the Obukhov length.\[ \phi_m=(1-16\frac{0.1h}{L})^{-1/4} \phi_h=(1-16\frac{0.1h}{L})^{-1/2} \]
\[ \phi_m=\phi_t=(1+5\frac{0.1h}{L}) \]
\[ w_s=(u_*^3+7\alpha\kappa w_*^3)^{1/3} \]
where \(u_*\) (ustar) is the surface friction velocity, \(\alpha\) is the ratio of the surface layer height to the PBL height (specified as sfcfrac =0.1), \(\kappa =0.4\) is the von Karman constant, and \(w_*\) is the convective velocity scale defined as eqn23 of Han et al.(2019):\[ w_{*}=[(g/T)\overline{(w'\theta_v^{'})}_0h]^{1/3} \]
\[ l_2=min(l_{up},l_{down}) \]
and dissipation length scale \(l_d\) is given by:\[ l_d=(l_{up}l_{down})^{1/2} \]
where \(l_{up}\) and \(l_{down}\) are the distances that a parcel having an initial TKE can travel upward and downward before being stopped by buoyancy effects.Definition at line 89 of file satmedmfvdifq.F.
References mfpbltq_mod::mfpbltq(), mfscuq_mod::mfscuq(), tridi_mod::tridi2(), tridi_mod::tridin(), and tridi_mod::tridit().
| subroutine tridi_mod::tridi1 | ( | integer | l, |
| integer | n, | ||
| real(kind=kind_phys), dimension(l,2:n) | cl, | ||
| real(kind=kind_phys), dimension(l,n) | cm, | ||
| real(kind=kind_phys), dimension(l,n-1) | cu, | ||
| real(kind=kind_phys), dimension(l,n) | r1, | ||
| real(kind=kind_phys), dimension(l,n-1) | au, | ||
| real(kind=kind_phys), dimension(l,n) | a1 | ||
| ) |
| subroutine tridi_mod::tridi2 | ( | integer | l, |
| integer | n, | ||
| real(kind=kind_phys), dimension(l,2:n) | cl, | ||
| real(kind=kind_phys), dimension(l,n) | cm, | ||
| real(kind=kind_phys), dimension(l,n-1) | cu, | ||
| real(kind=kind_phys), dimension(l,n) | r1, | ||
| real(kind=kind_phys), dimension(l,n) | r2, | ||
| real(kind=kind_phys), dimension(l,n-1) | au, | ||
| real(kind=kind_phys), dimension(l,n) | a1, | ||
| real(kind=kind_phys), dimension(l,n) | a2 | ||
| ) |
This subroutine ..
Definition at line 52 of file tridi.f.
Referenced by satmedmfvdifq_can_mod::satmedmfvdifq_can(), and satmedmfvdifq::satmedmfvdifq_run().
| subroutine tridi_mod::tridin | ( | integer | l, |
| integer | n, | ||
| integer | nt, | ||
| real(kind=kind_phys), dimension(l,2:n) | cl, | ||
| real(kind=kind_phys), dimension(l,n) | cm, | ||
| real(kind=kind_phys), dimension(l,n-1) | cu, | ||
| real(kind=kind_phys), dimension(l,n) | r1, | ||
| real(kind=kind_phys), dimension(l,n*nt) | r2, | ||
| real(kind=kind_phys), dimension(l,n-1) | au, | ||
| real(kind=kind_phys), dimension(l,n) | a1, | ||
| real(kind=kind_phys), dimension(l,n*nt) | a2 | ||
| ) |
Routine to solve the tridiagonal system to calculate u- and v-momentum at \( t + \Delta t \); part of two-part process to calculate time tendencies due to vertical diffusion.
Definition at line 97 of file tridi.f.
Referenced by satmedmfvdifq_can_mod::satmedmfvdifq_can(), and satmedmfvdifq::satmedmfvdifq_run().
| subroutine tridi_mod::tridit | ( | integer | l, |
| integer | n, | ||
| integer | nt, | ||
| real(kind=kind_phys), dimension(l,2:n) | cl, | ||
| real(kind=kind_phys), dimension(l,n) | cm, | ||
| real(kind=kind_phys), dimension(l,n-1) | cu, | ||
| real(kind=kind_phys), dimension(l,n*nt) | rt, | ||
| real(kind=kind_phys), dimension(l,n-1) | au, | ||
| real(kind=kind_phys), dimension(l,n*nt) | at | ||
| ) |
This subroutine solves tridiagonal problem for TKE.
Definition at line 166 of file tridi.f.
Referenced by satmedmfvdifq_can_mod::satmedmfvdifq_can(), and satmedmfvdifq::satmedmfvdifq_run().