SPEED
EXCHANGE_DOUBLE.f90 File Reference

Go to the source code of this file.

Functions/Subroutines

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

Function/Subroutine Documentation

◆ exchange_double()

subroutine exchange_double ( integer*4  nsend,
real*8, dimension(nsend)  buff_send,
integer*4  nrecv,
real*8, 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 double 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 36 of file EXCHANGE_DOUBLE.f90.

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

Referenced by compute_energy_error().

Here is the caller graph for this function: