SPEED
EXCHANGE_INTEGER.f90 File Reference

Go to the source code of this file.

Functions/Subroutines

subroutine exchange_integer (nsend, buff_send, nrecv, buff_recv, nproc, proc_send, proc_recv, comm, status, ierr, myid)
 Exchanges integers between MPI processes.
 

Function/Subroutine Documentation

◆ exchange_integer()

subroutine exchange_integer ( integer*4  nsend,
integer*4, dimension(nsend)  buff_send,
integer*4  nrecv,
integer*4, dimension(nrecv)  buff_recv,
integer*4  nproc,
integer*4, dimension(nproc)  proc_send,
integer*4, dimension(nproc)  proc_recv,
integer*4  comm,
integer*4, dimension(speed_status_size)  status,
integer*4  ierr,
integer*4  myid 
)

Exchanges integers between MPI processes.

Author
Ilario Mazzieri
Date
September, 2013
Version
1.0
Parameters
[in]nsendnumber of values to be sent
[in]buff_sendbuffer containing the values to be sent
[in]nrecvnumber of values to be received
[in]buff_recvbuffer for the values to be received
[in]nprocnumber of processors
[in]proc_sendvector containing the number of values to be sent to each proc.
[in]proc_recvvector containing the number of values to be received from each proc.
[in]commMPI communicator
[in]statusMPI status
[in]ierrMPI error tag
[in]myidMPI id

Definition at line 35 of file EXCHANGE_INTEGER.f90.

38
39 implicit none
40 include 'SPEED.MPI'
41
42 integer*4 :: nsend,nrecv,nproc,comm,ierr,tag,myid
43 integer*4 :: ip,ir,is
44
45 integer*4, dimension(nproc) :: proc_send,proc_recv
46 integer*4, dimension(SPEED_STATUS_SIZE) :: status
47 integer*4, dimension(nproc) :: request,requests
48
49! real*8, dimension(*) :: buff_send,buff_recv
50 integer*4, dimension(nsend) :: buff_send
51 integer*4, dimension(nrecv) :: buff_recv
52
53 tag=2120
54
55
56
57 is = 1
58 do ip = 1, nproc
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)
63 endif
64 is = is +proc_send(ip)
65 enddo
66
67 ir = 1
68 do ip = 1, nproc
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)
73 endif
74 ir = ir +proc_recv(ip)
75 enddo
76
77 do ip = 1, nproc
78 if (proc_send(ip).gt.0) then
79 call mpi_wait(requests(ip),status,ierr)
80 endif
81 enddo
82 do ip = 1, nproc
83 if (proc_recv(ip).gt.0) then
84 call mpi_wait(request(ip),status,ierr)
85 endif
86 enddo
87
88 speed_tag = speed_tag +1
89 if (speed_tag.gt.speed_tag_max) speed_tag = speed_tag_min
90
91 return
92