pure subroutine evp_zeta_impl(sh_dd, sh_dt, sh_ds, i_ec2, pres_mice, mice, &
del_sh_min_pr, del_sh, zeta, nx, ny)
!! del_sh / zeta (:1082-1095). `shear_at_T` averages the 4
!! surrounding corner sh_Ds values.
integer, intent(in) :: nx, ny
real(wp), intent(in) :: sh_dd(nx, ny), sh_dt(nx, ny)
real(wp), intent(in) :: sh_ds(nx + 1, ny + 1)
real(wp), intent(in) :: i_ec2
real(wp), intent(in) :: pres_mice(nx, ny), mice(nx, ny)
real(wp), intent(in) :: del_sh_min_pr(nx, ny)
real(wp), intent(out) :: del_sh(nx, ny), zeta(nx, ny)
integer :: i, j
real(wp) :: shear_at_t, denom
do concurrent(j=1:ny, i=1:nx) local(shear_at_t, denom)
shear_at_t = 0.25_wp*((sh_ds(i, j) + sh_ds(i + 1, j + 1)) + &
(sh_ds(i, j + 1) + sh_ds(i + 1, j)))
del_sh(i, j) = sqrt(sh_dd(i, j)**2 + i_ec2*(sh_dt(i, j)**2 + shear_at_t**2))
denom = max(del_sh(i, j), del_sh_min_pr(i, j)*pres_mice(i, j))
if (denom /= 0.0_wp) then
zeta(i, j) = 0.5_wp*pres_mice(i, j)*mice(i, j)/denom
else
zeta(i, j) = 0.0_wp
end if
end do
end subroutine evp_zeta_impl