35
36
37
39
40
41
42 USE spmd_comm_world_mod, ONLY : spmd_comm_world
43#include "implicit_f.inc"
44
45
46
47#include "spmd.inc"
48
49
50
51#include "com01_c.inc"
52
53#include "task_c.inc"
54#include "sphcom.inc"
55
56
57
58 INTEGER (NISP,*), ISORTSP, IPARTSP(*)
60 . spbuf(nspbuf,*), v(3,*), ms(*)
61
62
63
64#ifdef MPI
65 INTEGER P, I, NN, , IDEB, MSGTYP, LOC_PROC,
66 . IERROR, ICELL, INOD,
67 . REQ_SD(), REQ_SD2(NSPMD),
68 . STATUS(MPI_STATUS_SIZE),MSGOFF,MSGOFF2
69 my_real,
DIMENSION(:,:),
ALLOCATABLE :: bufs, bufr
70
71 INTEGER, DIMENSION(NSPMD) :: DISPLS_ISPHR,DISPLS_ISPHS
72 INTEGER, DIMENSION(NSPMD) :: SEND_SIZE_ISPHR,RCV_SIZE_ISPHS
73 INTEGER :: TOTAL_SEND_SIZE_ISPHR,TOTAL_RCV_SIZE_ISPHS
74 INTEGER :: REQUEST_ISPHR
75
76 INTEGER, DIMENSION(NSPMD) :: DISPLS_BUFS,DISPLS_BUFR
77 INTEGER, DIMENSION(NSPMD) :: SEND_SIZE_BUFS,RCV_SIZE_BUFR
78 INTEGER :: TOTAL_SEND_SIZE_BUFS,TOTAL_RCV_SIZE_BUFR
79 INTEGER :: REQUEST_BUFS
80 DATA msgoff/2008/
81 DATA msgoff2/2009/
82
83
84
85 loc_proc = ispmd+1
86
87
88
89
90
91
92 displs_isphr(1:nspmd) = 0
93 displs_isphs(1:nspmd) = 0
94 send_size_isphr(1:nspmd) = 0
95 rcv_size_isphs(1:nspmd) = 0
96 total_send_size_isphr = 0
97 total_rcv_size_isphs = 0
98
99
100 displs_isphr(1) = 0
101 displs_isphs(1) = 0
102 DO p=1,nspmd
103 send_size_isphr(p) =
psphr(p)
104 rcv_size_isphs(p) =
psphs(p)
105 total_send_size_isphr = total_send_size_isphr + send_size_isphr(p)
106 total_rcv_size_isphs = total_rcv_size_isphs + rcv_size_isphs(p)
107 ENDDO
108 DO p=2,nspmd
109 displs_isphr(p) = displs_isphr(p-1) + send_size_isphr(p-1)
110 displs_isphs(p) = displs_isphs(p-1) + rcv_size_isphs(p-1)
111 ENDDO
112
113
114
115
116
118 . send_size_isphr,total_send_size_isphr,displs_isphr,
119 . total_rcv_size_isphs,rcv_size_isphs,displs_isphs,
120 . request_isphr,spmd_comm_world,nspmd)
121
122
123
124
125
126
127
128
129 displs_bufs(1:nspmd) = 0
130 displs_bufr(1:nspmd) = 0
131 send_size_bufs(1:nspmd) = 0
132 rcv_size_bufr(1:nspmd) = 0
133 total_send_size_bufs = 0
134 total_rcv_size_bufr = 0
135
136
137 displs_bufs(1) = 0
138 displs_bufr(1) = 0
139
140 DO p=1,nspmd
141 send_size_bufs(p) =
psphs(p)
142 rcv_size_bufr(p) =
psphr(p)
143 total_send_size_bufs = total_send_size_bufs + send_size_bufs(p)
144 total_rcv_size_bufr = total_rcv_size_bufr + rcv_size_bufr(p)
145 ENDDO
146
147 DO p=2,nspmd
148 displs_bufs(p) = displs_bufs(p-1) + 7*send_size_bufs(p-1)
149 displs_bufr(p) = displs_bufr(p-1) + 7*rcv_size_bufr(p-1)
150 ENDDO
151
152 ALLOCATE( bufs(7,total_send_size_bufs) )
153 ALLOCATE( bufr(7,total_rcv_size_bufr) )
154
155 total_send_size_bufs = 7*total_send_size_bufs
156 total_rcv_size_bufr = 7*total_rcv_size_bufr
157 send_size_bufs(1:nspmd) = 7*send_size_bufs(1:nspmd)
158 rcv_size_bufr(1:nspmd) = 7*rcv_size_bufr(1:nspmd)
159
160
161#if _PLMPI
162
163
164
165#else
166
167
168 CALL mpi_wait(request_isphr,status,ierror)
169
170#endif
171
172
173
174 ideb = 0
175 nn = 0
176 DO p = 1, nspmd
177
178 nn = 0
181 IF(isortsp == 1)THEN
182 nn = nn + 1
183 icell =
lsphs(ideb+n)
184 inod = kxsp(3,icell)
185 bufs(1,ideb+nn) = spbuf(2,icell)
186 bufs(2,ideb+nn) = spbuf(12,icell)
187 bufs(3,ideb+nn) = v(1,inod)
188 bufs(4,ideb+nn) = v(2,inod)
189 bufs(5,ideb+nn) = v(3,inod)
190 bufs(6,ideb+nn) = kxsp(2,icell)
191 bufs(7,ideb+nn) = ipartsp(icell)
192 ELSEIF(
isphs(ideb+n)==1)
THEN
193 nn = nn + 1
194 icell =
lsphs(ideb+n)
195 inod = kxsp(3,icell)
196 bufs(1,ideb+nn) = spbuf(2,icell)
197 bufs(2,ideb+nn) = spbuf(12,icell)
198 bufs(3,ideb+nn) = v(1,inod)
199 bufs(4,ideb+nn) = v(2,inod)
200 bufs(5,ideb+nn) = v(3,inod)
201 bufs(6,ideb+nn) = kxsp(2,icell)
202 bufs(7,ideb+nn) = ipartsp(icell)
203 END IF
204 END DO
205 ideb = ideb +
psphs(p)
206
207 END IF
208 END DO
209
210
211
212
213
215 . send_size_bufs,total_send_size_bufs,displs_bufs,
216 . total_rcv_size_bufr,rcv_size_bufr,displs_bufr,
217 . request_bufs,spmd_comm_world,nspmd)
218
219
220
221
222#if _PLMPI
223
224
225
226#else
227
228
229 CALL mpi_wait(request_bufs,status,ierror)
230
231#endif
232
233
234 ideb = 0
235 nn = 0
236 DO p = 1, nspmd
237
239 nn = 0
241 IF(isortsp == 1)THEN
242 nn = nn + 1
243 xsphr(7,ideb+n) = bufr(1,ideb+nn)
244 xsphr(8,ideb+n) = bufr(2,ideb+nn)
245 xsphr(9,ideb+n) = bufr(3,ideb+nn)
246 xsphr(10,ideb+n)= bufr(4,ideb+nn)
247 xsphr(11,ideb+n)= bufr(5,ideb+nn)
248 xsphr(13,ideb+n)= bufr(6,ideb+nn)
249 xsphr(14,ideb+n)= bufr(7,ideb+nn)
250 ELSEIF(
isphr(ideb+n)==1)
THEN
251 nn = nn + 1
252 xsphr(7,ideb+n) = bufr(1,ideb+nn)
253 xsphr(8,ideb+n) = bufr(2,ideb+nn)
254 xsphr(9,ideb+n) = bufr(3,ideb+nn)
255 xsphr(10,ideb+n)= bufr(4,ideb+nn)
256 xsphr(11,ideb+n)= bufr(5,ideb+nn)
257 xsphr(13,ideb+n)= bufr(6,ideb+nn)
258 xsphr(14,ideb+n)= bufr(7,ideb+nn)
259 END IF
260 END DO
261 ideb = ideb +
psphr(p)
262 END IF
263 END DO
264
265 DEALLOCATE( bufs )
266 DEALLOCATE( bufr )
267
268#endif
269 RETURN
subroutine mpi_wait(ireq, status, ierr)
integer, dimension(:), allocatable isphs
integer, dimension(:), allocatable lsphs
integer, dimension(:), allocatable isphr
integer, dimension(:), allocatable psphr
integer, dimension(:), allocatable psphs
subroutine spmd_ialltoallv(sendbuf, recvbuf, send_size, total_send_size, sdispls, total_rcv_size, rcv_size, rdispls, request, comm, nb_proc)
subroutine spmd_ialltoallv_int(sendbuf, recvbuf, send_size, total_send_size, sdispls, total_rcv_size, rcv_size, rdispls, request, comm, nb_proc)