subroutine poison_face_x_3d(fld, nxl, nyl, ng, nz, qnan, pw, pe, ps, pn)
!! Poison x-face 3D ghost bands. Seam-face exclusion: see poison_face_x_2d.
integer, intent(in) :: nxl, nyl, ng, nz
real(wp), intent(inout) :: fld(nxl + 2*ng + 1, nyl + 2*ng, nz)
real(wp), intent(in) :: qnan
logical, intent(in) :: pw, pe, ps, pn
integer :: nxf, nyt, i, j, k
nxf = nxl + 2*ng + 1
nyt = nyl + 2*ng
if (pw) then
do concurrent(k=1:nz, j=1:nyt, i=1:ng)
fld(i, j, k) = qnan
end do
end if
if (pe) then
do concurrent(k=1:nz, j=1:nyt, i=ng + nxl + 2:nxf)
fld(i, j, k) = qnan
end do
end if
if (ps) then
do concurrent(k=1:nz, j=1:ng, i=1:nxf)
fld(i, j, k) = qnan
end do
end if
if (pn) then
do concurrent(k=1:nz, j=ng + nyl + 1:nyt, i=1:nxf)
fld(i, j, k) = qnan
end do
end if
end subroutine poison_face_x_3d