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