pure subroutine drain_swept_flux_y_weno(nx, ny, nz, nghost, periodic, areaT, uhh, &
hprev, tr, wet_T, recon, F)
!! Meridional analogue of drain_swept_flux_x_weno.
integer, intent(in) :: nx, ny, nz, nghost, recon
logical, intent(in) :: periodic
real(wp), intent(in) :: areaT(nx, ny)
real(wp), intent(in) :: uhh(nx, ny + 1, nz)
real(wp), intent(in) :: hprev(nx, ny, nz)
real(wp), intent(in) :: tr(nx, ny, nz)
real(wp), intent(in) :: wet_T(nx, ny)
real(wp), intent(inout) :: F(nx, ny + 1, nz)
integer :: i, j, k, rung_max, avail_up, avail_down
real(wp) :: u, cfl, vol, conc
rung_max = recon + 1
do concurrent(k=1:nz, i=1:nx)
F(i, 1, k) = 0.0_wp
F(i, ny + 1, k) = 0.0_wp
end do
do concurrent(k=1:nz, j=2:ny, i=1:nx) local(u, cfl, vol, conc, avail_up, avail_down)
u = uhh(i, j, k)
if (u > 0.0_wp) then
vol = max(areaT(i, j - 1)*hprev(i, j - 1, k), DRAIN_MIN_VOL)
cfl = min(u/vol, 1.0_wp)
if (periodic) then
avail_up = ny
avail_down = ny
else
avail_up = j - nghost
avail_down = ny - nghost - j + 2
end if
conc = weno_face_conc_y(nx, ny, nz, tr, wet_T, i, j - 1, k, 1, &
avail_up, avail_down, rung_max, cfl)
F(i, j, k) = u*conc
else if (u < 0.0_wp) then
vol = max(areaT(i, j)*hprev(i, j, k), DRAIN_MIN_VOL)
cfl = min(-u/vol, 1.0_wp)
if (periodic) then
avail_up = ny
avail_down = ny
else
avail_up = ny - nghost - j + 2
avail_down = j - nghost
end if
conc = weno_face_conc_y(nx, ny, nz, tr, wet_T, i, j, k, -1, &
avail_up, avail_down, rung_max, cfl)
F(i, j, k) = u*conc
else
F(i, j, k) = 0.0_wp
end if
end do
end subroutine drain_swept_flux_y_weno