meke_inv_lmix Function

private pure function meke_inv_lmix(ueddy, sn, beta, area, rd_over_dx, depth, cdrag, a_deform, a_rhines, a_eady, a_frict, a_grid) result(inv_l)

Harmonic inverse mixing length 1/Lmix = Sum aX/LX over the five length scales (deformation, frictional, Rhines, Eady, grid). Each scale is gated aX*LX > 0 so a zero weight or a degenerate scale contributes nothing. Returns 1/Lmix (0 ⇒ Lmix degenerate).

Arguments

Type IntentOptional Attributes Name
real(kind=wp), intent(in) :: ueddy
real(kind=wp), intent(in) :: sn
real(kind=wp), intent(in) :: beta
real(kind=wp), intent(in) :: area
real(kind=wp), intent(in) :: rd_over_dx
real(kind=wp), intent(in) :: depth
real(kind=wp), intent(in) :: cdrag
real(kind=wp), intent(in) :: a_deform
real(kind=wp), intent(in) :: a_rhines
real(kind=wp), intent(in) :: a_eady
real(kind=wp), intent(in) :: a_frict
real(kind=wp), intent(in) :: a_grid

Return Value real(kind=wp)


Called by

proc~~meke_inv_lmix~~CalledByGraph proc~meke_inv_lmix meke_inv_lmix proc~meke_length_scales meke_length_scales proc~meke_length_scales->proc~meke_inv_lmix proc~meke_step meke_step proc~meke_step->proc~meke_length_scales proc~run_meke_step run_meke_step proc~run_meke_step->proc~meke_step proc~ocean_dyn_step_split ocean_dyn_step_split proc~ocean_dyn_step_split->proc~run_meke_step proc~engine_step engine_step proc~engine_step->proc~ocean_dyn_step_split

Variables

Type Visibility Attributes Name Initial
real(kind=wp), private :: ldeform
real(kind=wp), private :: leady
real(kind=wp), private :: lfrict
real(kind=wp), private :: lgrid
real(kind=wp), private :: lrhines

Source Code

   pure function meke_inv_lmix(ueddy, sn, beta, area, rd_over_dx, depth, cdrag, &
                               a_deform, a_rhines, a_eady, a_frict, a_grid) result(inv_l)
      !$acc routine seq
      !! Harmonic inverse mixing length `1/Lmix = Sum aX/LX` over the five
      !! length scales (deformation, frictional, Rhines, Eady, grid).  Each
      !! scale is gated `aX*LX > 0` so a zero weight or a degenerate scale
      !! contributes nothing.  Returns 1/Lmix (0 ⇒ Lmix degenerate).
      real(wp), intent(in) :: ueddy, sn, beta, area, rd_over_dx, depth, cdrag
      real(wp), intent(in) :: a_deform, a_rhines, a_eady, a_frict, a_grid
      real(wp) :: inv_l
      real(wp) :: lgrid, ldeform, lfrict, lrhines, leady

      lgrid = sqrt(max(area, 0.0_wp))
      ldeform = lgrid*rd_over_dx
      lfrict = 0.0_wp
      if (cdrag > 0.0_wp) lfrict = depth/cdrag
      lrhines = 0.0_wp
      if (beta > 0.0_wp) lrhines = sqrt(max(ueddy, 0.0_wp)/beta)
      leady = 0.0_wp
      if (sn > 1.0e-15_wp) leady = ueddy/sn

      inv_l = 0.0_wp
      if (a_deform*ldeform > 0.0_wp) inv_l = inv_l + 1.0_wp/(a_deform*ldeform)
      if (a_frict*lfrict > 0.0_wp) inv_l = inv_l + 1.0_wp/(a_frict*lfrict)
      if (a_rhines*lrhines > 0.0_wp) inv_l = inv_l + 1.0_wp/(a_rhines*lrhines)
      if (a_eady*leady > 0.0_wp) inv_l = inv_l + 1.0_wp/(a_eady*leady)
      if (a_grid*lgrid > 0.0_wp) inv_l = inv_l + 1.0_wp/(a_grid*lgrid)
   end function meke_inv_lmix