epbl_lf17_la Function

public pure function epbl_lf17_la(ustar_w, zsl, ustokes, kphil) result(la)

Turbulent Langmuir number La = sqrt(u*/u_s_SL): the Stokes drift averaged over the surface layer of thickness zsl under the Phillips spectrum, in the singularity-safe form (Breivik et al. 2016 with Webb & Fox-Kemper 2015 directional spreading). No MIN_LANGMUIR / LA_DEPTH_MIN floors — those belong to MOM6’s profile-averaging wave paths, not LF17.

Arguments

Type IntentOptional Attributes Name
real(kind=wp), intent(in) :: ustar_w

Water-side u* (m/s).

real(kind=wp), intent(in) :: zsl

Surface-layer average depth (m) = la_frac_hbl * BLD.

real(kind=wp), intent(in) :: ustokes

From epbl_lf17_wave_state.

real(kind=wp), intent(in) :: kphil

From epbl_lf17_wave_state.

Return Value real(kind=wp)


Calls

proc~~epbl_lf17_la~~CallsGraph proc~epbl_lf17_la epbl_lf17_la proc~one_m_exp_x one_m_exp_x proc~epbl_lf17_la->proc~one_m_exp_x

Called by

proc~~epbl_lf17_la~~CalledByGraph proc~epbl_lf17_la epbl_lf17_la proc~epbl_column_kernel epbl_column_kernel proc~epbl_column_kernel->proc~epbl_lf17_la proc~epbl_compute epbl_compute proc~epbl_compute->proc~epbl_column_kernel proc~vmix_apply_in_stage vmix_apply_in_stage proc~vmix_apply_in_stage->proc~epbl_compute proc~run_stage run_stage proc~run_stage->proc~vmix_apply_in_stage proc~run_stage_split run_stage_split proc~run_stage_split->proc~vmix_apply_in_stage proc~ocean_dyn_step ocean_dyn_step proc~ocean_dyn_step->proc~run_stage proc~ocean_dyn_step_split ocean_dyn_step_split proc~ocean_dyn_step_split->proc~run_stage_split

Variables

Type Visibility Attributes Name Initial
real(kind=wp), private :: r1
real(kind=wp), private :: r3
real(kind=wp), private :: r5
real(kind=wp), private :: root2kz
real(kind=wp), private :: ustokes_sl
real(kind=wp), private :: xkz

Source Code

   pure function epbl_lf17_la(ustar_w, zsl, ustokes, kphil) result(la)
      !! Turbulent Langmuir number La = sqrt(u*/u_s_SL): the Stokes
      !! drift averaged over the surface layer of thickness `zsl`
      !! under the Phillips spectrum, in the singularity-safe form
      !! (Breivik et al. 2016 with Webb & Fox-Kemper 2015 directional
      !! spreading).  No MIN_LANGMUIR / LA_DEPTH_MIN floors — those
      !! belong to MOM6's profile-averaging wave paths, not LF17.
      !$acc routine seq
      real(wp), intent(in) :: ustar_w
         !! Water-side u* (m/s).
      real(wp), intent(in) :: zsl
         !! Surface-layer average depth (m) = la_frac_hbl * BLD.
      real(wp), intent(in) :: ustokes, kphil
         !! From `epbl_lf17_wave_state`.
      real(wp) :: la

      real(wp) :: xkz, root2kz, r1, r3, r5, ustokes_sl

      xkz = kphil*zsl
      root2kz = sqrt(2.0_wp*xkz)
      r1 = (0.302_wp - 1.68_wp*xkz)*one_m_exp_x(2.0_wp*xkz)
      r3 = (0.1264_wp + 0.64_wp*xkz)*one_m_exp_x(5.12_wp*xkz)
      if (root2kz > 1.0e-3_wp) then
         r5 = sqrt(LT_PI)*(root2kz*(-0.84_wp*erfc(root2kz) + &
                                    0.2_wp*erfc(1.6_wp*root2kz)) + &
                           0.1182_wp*(erfc(1.6_wp*root2kz) - erfc(root2kz))/root2kz)
      else
         r5 = -0.64_wp*sqrt(LT_PI)*root2kz + &
              (-0.14184_wp + 1.0839648_wp*root2kz*root2kz)
      end if
      ! Floor is a pure numerical guard (UStokes_sl -> 0+ for very
      ! deep surface layers); La then goes huge and the enhancement
      ! vanishes, which is the correct limit.
      ustokes_sl = max(ustokes*(0.715_wp + r1 + r3 + r5), 1.0e-10_wp)
      la = sqrt(ustar_w/ustokes_sl)
   end function epbl_lf17_la