38
39
40
43
44
45
46 USE spmd_comm_world_mod, ONLY : spmd_comm_world
47#include "implicit_f.inc"
48
49
50
51#include "spmd.inc"
52
53
54
55#include "com01_c.inc"
56#include "com04_c.inc"
57#include "task_c.inc"
58#include "sphcom.inc"
59
60
61
62 INTEGER KXSP(NISP,*),IXSP(KVOISPH,*),
63 . WSP2SORT(*), IREDUCE, LGAUGE(3,*)
64
65
66
67#ifdef MPI
68 INTEGER P, I, NN, , NN0, NSP, IDEB, , IG,
69 . MSGTYP, , NBIRECV,
70 . IERROR, , LEN, NVOIS1, NVOIS2,
71 . REQ_SD(NSPMD), REQ_SD2(NSPMD),
72 . INDEX(NSPHR), STATUS(MPI_STATUS_SIZE),
73 . MSGOFF,MSGOFF2
75 . xsphtmp(
sizspt,
nsphr), sbufcom(2,nspmd),bufcom(2,nspmd)
76
77 INTEGER :: REQUEST_SBUF
78
79 INTEGER :: REQUEST_INDEX
80 INTEGER, DIMENSION(NSPMD) :: DISPLS_INDEX,DISPLS_LSPHS
81 INTEGER, DIMENSION(NSPMD) :: SEND_SIZE_INDEX,
82 INTEGER ::TOTAL_SEND_SIZE_INDEX,TOTAL_RCV_SIZE_LSPHS
83 DATA msgoff/2004/
84 DATA msgoff2/2005/
85
86
87
88 loc_proc = ispmd+1
89
90
91
92 ideb = 0
93 nn = 0
94 DO p = 1, nspmd
95 IF(p/=loc_proc)THEN
96 sbufcom(1,p) = ireduce
98 nn0 = nn
99 DO i = 1, nsp
100 IF(xsphr(1,i+ideb)<zero)THEN
101 nn = nn + 1
102 index(i+ideb) = nn
103 xsphtmp(1,nn) = -xsphr(1,i+ideb)
104 xsphtmp(2,nn) = xsphr(2,i+ideb)
105 xsphtmp(3,nn) = xsphr(3,i+ideb)
106 xsphtmp(4,nn) = xsphr(4,i+ideb)
107 xsphtmp(5,nn) = xsphr(5,i+ideb)
108 xsphtmp(6,nn) = xsphr(6,i+ideb)
109 END IF
110 END DO
111 ideb = ideb + nsp
113 msgtyp = msgoff
114 sbufcom(2,p) =
psphr(p)
115 ELSE
116 sbufcom(1:2,p) = zero
117 END IF
118 END DO
119
120
121
122
124 . 2*nspmd,2,request_sbuf,spmd_comm_world)
125
126
127
129
130 ierror = 0
131 IF(ALLOCATED(xsphr))DEALLOCATE(xsphr)
132
134 ierror = ierror + ierror1
135 IF(ALLOCATED(wacompr))DEALLOCATE(wacompr)
136
138 ierror = ierror + ierror1
139
141
143 ierror = ierror + ierror1
144 IF(nspcond>0) THEN
145
148 ierror = ierror + ierror1
149 END IF
150 IF(ierror/=0) THEN
151 CALL ancmsg(msgid=20,anmode=aninfo)
153 END IF
154 xsphr = 0
155
156
157 IF(nspcond>0)THEN
158
159
160 initv = 1
161 ELSE
162 initv = 0
163 END IF
165 xsphr(1,i) = xsphtmp(1,i)
166 xsphr(2,i) = xsphtmp(2,i)
167 xsphr(3,i) = xsphtmp(3,i)
168 xsphr(4,i) = xsphtmp(4,i)
169 xsphr(5,i) = xsphtmp(5,i)
170 xsphr(6,i) = xsphtmp(6,i)
172 END DO
173
174
175
176 DO i=1, nsp2sort
177 n=wsp2sort(i)
178 nvois1 = kxsp(4,n)
179 nvois2 = kxsp(5,n)
180 DO nn = 1, nvois1
181 IF(ixsp(nn,n)<zero) THEN
182
183 ixsp(nn,n) = -index(-ixsp(nn,n))
184
185 isphr(-ixsp(nn,n)) = 1
186 END IF
187 END DO
188 DO nn = nvois1+1,nvois2
189 IF(ixsp(nn,n)<zero) THEN
190
191 ixsp(nn,n) = -index(-ixsp(nn,n))
192 END IF
193 END DO
194 END DO
195
196
197
198 DO ig=1, nbgauge
199 IF(lgauge(1,ig) > -(numels+1))cycle
200 n=numsph+ig
201 nvois1 = kxsp(4,n)
202 nvois2 = kxsp(5,n)
203 DO nn = 1, nvois1
204 IF(ixsp(nn,n)<zero) THEN
205
206 ixsp(nn,n) = -index(-ixsp(nn,n))
207
208 isphr(-ixsp(nn,n)) = 1
209 END IF
210 END DO
211 DO nn = nvois1+1,nvois2
212 IF(ixsp(nn,n)<zero) THEN
213
214 ixsp(nn,n) = -index(-ixsp(nn,n))
215 END IF
216 END DO
217 END DO
218
219
220
221 ideb = 0
222 DO p = 1, nspmd
224 IF(loc_proc/=p.AND.nsp>0)THEN
225 DO i = 1, nsp
226 index(ideb+i) = nint(xsphr(1,i+ideb))
227 END DO
228 msgtyp = msgoff2
229 ideb = ideb + nsp
230 END IF
231 END DO
232
233
234
235
236#if _PLMPI
237
238
239
240#else
241
242
243 CALL mpi_wait(request_sbuf,status,ierror)
244
245#endif
246
248 DO p = 1, nspmd
249 IF(p/=loc_proc)THEN
250 msgtyp = msgoff
251 ireduce =
max(ireduce,nint(bufcom(1,p)))
252 psphs(p) = nint(bufcom(2,p))
254 END IF
255 END DO
256
259
262 ierror = ierror + ierror1
263 IF(ierror/=0) THEN
264 CALL ancmsg(msgid=20,anmode=aninfo)
266 END IF
267 ideb = 1
268 DO p = 1, nspmd
269 IF(p/=loc_proc.AND.
psphs(p)>0)
THEN
270 msgtyp = msgoff2
271 ideb = ideb +
psphs(p)
272 END IF
273 END DO
274
275
276
277
278 displs_index(1:nspmd) = 0
279 displs_lsphs(1:nspmd) = 0
280 send_size_index(1:nspmd) = 0
281 rcv_size_lsphs(1:nspmd) = 0
282 total_send_size_index = 0
283 total_rcv_size_lsphs = 0
284
285
286 displs_index(1) = 0
287 displs_lsphs(1) = 0
288 DO p=1,nspmd
289 IF(p/=loc_proc) THEN
290 send_size_index(p) =
psphr(p)
291 rcv_size_lsphs(p) =
psphs(p)
292 ENDIF
293 total_send_size_index = total_send_size_index + send_size_index(p)
294 total_rcv_size_lsphs = total_rcv_size_lsphs + rcv_size_lsphs(p)
295 ENDDO
296 DO p=2,nspmd
297 displs_index(p) = displs_index(p-1) + send_size_index(p-1)
298 displs_lsphs(p) = displs_lsphs(p-1) + rcv_size_lsphs(p-1)
299 ENDDO
300
301
302
303
304
305
307 . send_size_index,total_send_size_index,displs_index,
308 . total_rcv_size_lsphs,rcv_size_lsphs,displs_lsphs,
309 . request_index,spmd_comm_world,nspmd)
310
311
312#if _PLMPI
313
314
315
316#else
317
318
319 CALL mpi_wait(request_index,status,ierror)
320
321#endif
322
323#endif
324 RETURN
subroutine mpi_wait(ireq, status, ierr)
integer, dimension(:), allocatable isphs
integer, dimension(:), allocatable lsphs
integer, dimension(:), allocatable isphr
integer, dimension(:), allocatable psphr
integer, parameter sizspc
integer, dimension(:), allocatable psphs
integer, parameter sizspt
integer, parameter sizspw
integer, dimension(:,:), allocatable ispsymr
subroutine spmd_ialltoall(sendbuf, recvbuf, total_send_size, send_size, total_rcv_size, rcv_size, request, comm)
subroutine spmd_ialltoallv_int(sendbuf, recvbuf, send_size, total_send_size, sdispls, total_rcv_size, rcv_size, rdispls, request, comm, nb_proc)
subroutine ancmsg(msgid, msgtype, anmode, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, r1, r2, r3, r4, r5, r6, r7, r8, r9, c1, c2, c3, c4, c5, c6, c7, c8, c9, prmode)