pure subroutine ice_gather_flux_y_layer_impl(vh, val4, layer, tr_flux_y_work, ncat, nk, nx, ny)
!! Meridional twin of `ice_gather_flux_x_layer_impl`.
integer, intent(in) :: layer, ncat, nk, nx, ny
real(wp), intent(in) :: vh(nx, ny + 1, ncat)
real(wp), intent(in) :: val4(nx, ny, ncat, nk)
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) = val4(i, 1, c, layer)
else if (j == ny + 1) then
tr_flux_y_work(i, j, c) = val4(i, ny, c, layer)
else if (vh(i, j, c) >= 0.0_wp) then
tr_flux_y_work(i, j, c) = val4(i, j - 1, c, layer)
else
tr_flux_y_work(i, j, c) = val4(i, j, c, layer)
end if
end do
end subroutine ice_gather_flux_y_layer_impl