36 nproc,proc_send,proc_recv,&
37 comm,status,ierr,myid)
42 integer*4 :: nsend,nrecv,nproc,comm,ierr,tag,myid
45 integer*4,
dimension(nproc) :: proc_send,proc_recv
46 integer*4,
dimension(SPEED_STATUS_SIZE) :: status
47 integer*4,
dimension(nproc) :: request,requests
50 integer*4,
dimension(nsend) :: buff_send
51 integer*4,
dimension(nrecv) :: buff_recv
59 if (proc_send(ip).gt.0)
then
60 call mpi_isend(buff_send(is:(is +proc_send(ip) -1)),&
61 proc_send(ip),speed_integer,(ip -1),&
62 tag,comm,requests(ip),ierr)
64 is = is +proc_send(ip)
69 if (proc_recv(ip).gt.0)
then
70 call mpi_irecv(buff_recv(ir:(ir +proc_recv(ip) -1)),&
71 proc_recv(ip),speed_integer,(ip -1),&
72 mpi_any_tag,comm,request(ip),ierr)
74 ir = ir +proc_recv(ip)
78 if (proc_send(ip).gt.0)
then
79 call mpi_wait(requests(ip),status,ierr)
83 if (proc_recv(ip).gt.0)
then
84 call mpi_wait(request(ip),status,ierr)
88 speed_tag = speed_tag +1
89 if (speed_tag.gt.speed_tag_max) speed_tag = speed_tag_min
subroutine exchange_integer(nsend, buff_send, nrecv, buff_recv, nproc, proc_send, proc_recv, comm, status, ierr, myid)
Exchanges integers between MPI processes.