subroutine ALL_ALL_j2(p,ptrans,iaction,ksen)
!
use modglobal, only : imax,isen,jmax,jsen,jtot,kmax
use modmpi, only : comm3d,mpierr,my_real,nprocs, barrou
implicit none
!
! include 'param.txt'
!
! include 'mpif.h'
! include 'mpi_cons.txt'
!
integer iaction, ksen
real p(0:imax+1,0:jmax+1,0:kmax+1)
real ptrans(1:imax,1:jtot,1:ksen)
integer i,j,k
!
!
! purpose: do all-to-all communication
!
! data are only distributed over the j-direction for p
! data are only distributed over the k-direction for ptrans
!
! help arrays for sending and receiving
!
real bufin ((imax)*jmax*(kmax))
real bufout((imax)*jmax*(kmax))
!
! help variables
!
integer ii, jstart, jend, proc
integer kstart, kend, jvalue, kvalue
!
!
if(iaction.eq.0)then
!
ii = 0
do proc=0,nprocs-1
kstart = (proc)*ksen+1
kend = (proc+1)*ksen
do k=kstart,kend
do j=1,jmax
do i=1,imax
ii = ii + 1
bufin(ii) = p(i,j,k)
enddo
enddo
enddo
enddo
!
!
ii = 0
!
!
call barrou()
!
call MPI_ALLTOALL(bufin, (imax*jsen*ksen),MY_REAL, &
bufout,(imax*jsen*ksen),MY_REAL, &
comm3d,mpierr)
! bufout = bufin
!
call barrou()
!
ii = 0
!
do proc = 0,nprocs-1
jstart = proc *jsen + 1
jend = (proc+1)*jsen
do k=1,ksen
do j=jstart,jend
do i=1,imax
ii = ii + 1
ptrans(i,j,k) = bufout(ii)
enddo
enddo
enddo
!
enddo
!
!
call barrou()
!
!
elseif(iaction.eq.1)then
!
ii = 0
!
do proc = 0,nprocs-1
jstart = proc *jsen + 1
jend = (proc+1)*jsen
do k=1,ksen
do j=jstart,jend
do i=1,imax
ii = ii + 1
bufin(ii) = ptrans(i,j,k)
enddo
enddo
enddo
!
enddo
!
call barrou()
!
call MPI_ALLTOALL(bufin, (imax*jsen*ksen),MY_REAL, &
bufout,(imax*jsen*ksen),MY_REAL, &
comm3d,mpierr)
! bufout = bufin
!
call barrou()
!
!
ii = 0
!
do proc=0,nprocs-1
kstart = (proc)*ksen+1
kend = (proc+1)*ksen
do k=kstart,kend
do j=1,jmax
do i=1,imax
ii = ii + 1
p(i,j,k) = bufout(ii)
enddo
enddo
enddo
enddo
!
!
call barrou()
endif
!
return
end subroutine ALL_ALL_j2