pure subroutine ice_gather_flux_y_impl(vh, val, tr_flux_y_work, ncat, nx, ny)
!! Meridional twin of `ice_gather_flux_x_impl`.
integer, intent(in) :: ncat, nx, ny
real(wp), intent(in) :: vh(nx, ny + 1, ncat)
real(wp), intent(in) :: val(nx, ny, ncat)
real(wp), intent(out) :: tr_flux_y_work(nx, ny + 1, ncat)
integer :: i, j, c
do concurrent(j=1:ny + 1, i=1:nx, c=1:ncat)
if (j == 1) then
tr_flux_y_work(i, j, c) = val(i, 1, c)
else if (j == ny + 1) then
tr_flux_y_work(i, j, c) = val(i, ny, c)
else if (vh(i, j, c) >= 0.0_wp) then
tr_flux_y_work(i, j, c) = val(i, j - 1, c)
else
tr_flux_y_work(i, j, c) = val(i, j, c)
end if
end do
end subroutine ice_gather_flux_y_impl