subroutine excis(a,sx,ex,sy,ey,sz,ez,ih,jh)
implicit none
integer sx, ex, sy, ey, sz, ez, ih, jh
real a(sx-ih:ex+ih, sy-jh:ey+jh, sz:ez)
integer status(MPI_STATUS_SIZE)
integer ii, i, j, k
integer reqe, reqw
integer ewsize
real,allocatable, dimension(:) :: sende,recve
real,allocatable, dimension(:) :: sendw,recvw
! Calculate buffer size
ewsize = ih*(ey - sy + 1 + 2*jh)*(ez - sz + 1)
! Allocate send / receive buffers
allocate(sende(ewsize),sendw(ewsize))
allocate(recve(ewsize),recvw(ewsize))
if(nprocx .gt. 1)then
! Send east/west
ii = 0
do i=1,ih
do k=sz,ez
do j=sy-jh,ey+jh
ii = ii + 1
sende(ii) = a(ex-i+1,j,k)
sendw(ii) = a(sx+i-1,j,k)
enddo
enddo
enddo
call MPI_ISEND(sende, ewsize, MY_REAL, nbreast, 6, comm3d, reqe, mpierr)
call MPI_ISEND(sendw, ewsize, MY_REAL, nbrwest, 7, comm3d, reqw, mpierr)
! Receive west/east
call MPI_RECV(recvw, ewsize, MY_REAL, nbrwest, 6, comm3d, status, mpierr)
call MPI_RECV(recve, ewsize, MY_REAL, nbreast, 7, comm3d, status, mpierr)
ii = 0
do i=1,ih
do k=sz,ez
do j=sy-jh,ey+jh
ii = ii + 1
a(sx-i,j,k) = recvw(ii)
a(ex+i,j,k) = recve(ii)
enddo
enddo
enddo
else
! Single processor, make sure the field is periodic
do i=1,ih
do k=sz,ez
do j=sy-jh,ey+jh
a(sx-i,j,k) = a(ex-i+1,j,k)
a(ex+i,j,k) = a(sx+i-1,j,k)
enddo
enddo
enddo
endif
if(nprocx.gt.1)then
call MPI_WAIT(reqe, status, mpierr)
call MPI_WAIT(reqw, status, mpierr)
endif
deallocate (sende, sendw)
deallocate (recve, recvw)
return
end subroutine excis