37 nproc,proc_send,proc_recv,&
38 comm,status,ierr,myid)
43 integer*4 :: nsend,nrecv,nproc,comm,ierr,tag,myid
46 integer*4,
dimension(nproc) :: proc_send,proc_recv
47 integer*4,
dimension(SPEED_STATUS_SIZE) :: status
48 integer*4,
dimension(nproc) :: request,requests
51 real*8,
dimension(nsend) :: buff_send
52 real*8,
dimension(nrecv) :: buff_recv
58 if (proc_send(ip).gt.0)
then
59 call mpi_isend(buff_send(is:(is +proc_send(ip) -1)),&
60 proc_send(ip),speed_double,(ip -1),&
61 tag,comm,requests(ip),ierr)
63 is = is +proc_send(ip)
68 if (proc_recv(ip).gt.0)
then
69 call mpi_irecv(buff_recv(ir:(ir +proc_recv(ip) -1)),&
70 proc_recv(ip),speed_double,(ip -1),&
71 mpi_any_tag,comm,request(ip),ierr)
73 ir = ir +proc_recv(ip)
77 if (proc_send(ip).gt.0)
then
78 call mpi_wait(requests(ip),status,ierr)
82 if (proc_recv(ip).gt.0)
then
83 call mpi_wait(request(ip),status,ierr)
87 speed_tag = speed_tag +1
88 if (speed_tag.gt.speed_tag_max) speed_tag = speed_tag_min
subroutine exchange_double(nsend, buff_send, nrecv, buff_recv, nproc, proc_send, proc_recv, comm, status, ierr, myid)
Exchanges double between MPI processes.