40
41
42
45 USE intbufdef_mod
46
47
48
49 USE spmd_comm_world_mod, ONLY : spmd_comm_world
50#include "implicit_f.inc"
51
52
53#include "spmd.inc"
54
55
56
57#include "param_c.inc"
58#include "com04_c.inc"
59#include "task_c.inc"
60#include "com01_c.inc"
61
62
63
64 INTEGER, INTENT(IN) ::
65 INTEGER, DIMENSION(NPARI,*), INTENT(IN) :: IPARI
66 INTEGER, DIMENSION(NUMNOD), INTENT(IN) :: (NUMNOD)
67 INTEGER, DIMENSION(*), INTENT(IN) :: INTLIST(*)
68 TYPE(INTBUF_STRUCT_),DIMENSION(NINTER) :: INTBUF_TAB
69
70
71
72
73
74
75
76
77
78
79
80#ifdef MPI
81 INTEGER STATUS(MPI_STATUS_SIZE),
82 * REQ_SI(PARASIZ),REQ_RI(PARASIZ),REQ_S(PARASIZ),
83 * REQ_S2(PARASIZ),REQ_R(PARASIZ),REQ_R2(PARASIZ)
84 INTEGER P,LENSD,LENRV,IADS(PARASIZ+1),IADR(PARASIZ+1),IERROR,
85 * SIZ,LOC_PROC,MSGTYP,IDEBS(NINTER),IDEBR(NINTER),IDB,PROC,
86 * MSGOFF,MSGOFF2,LENSD_0,LENRV_0
87 INTEGER IADINT(NINTER,NSPMD)
88
89 INTEGER I,J,L,NB,NL,NN,K,N,LEN,ND,FLG,NIN,NTY,
90 * NSN,SN,SSIZ,
91 * IT,LEN_NSNSI,NSNR,NI,NP,ALEN,NOD,NOD1,,
92 * SIZE_LOC, I_STOK,INACTI,IFQ,ITIED,NRTS
93
94 INTEGER, DIMENSION(:), ALLOCATABLE :: TAB_SEND,TAB_LOC
95 INTEGER, DIMENSION(:), ALLOCATABLE :: IBUFS, IBUFR
96
97 TYPE(int_pointer), DIMENSION(:), ALLOCATABLE :: TAG_LOC,TAB_NSVSI
98
99 DATA msgoff/240/
100 DATA msgoff2/241/
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115 IF(nspmd == 1)RETURN
116
117 ierror = 0
118 IF(nspmd>1) THEN
119
120
121
122
123
124 IF(ninter>0) THEN
125 ALLOCATE(tab_send(ninter*nspmd), stat=ierror)
126 IF(ierror/=0) THEN
127 CALL ancmsg(msgid=20,anmode=aninfo)
129 ENDIF
130 ALLOCATE(tab_loc(ninter*nspmd), stat=ierror)
131 IF(ierror/=0) THEN
132 CALL ancmsg(msgid=20,anmode=aninfo)
134 ENDIF
135 tab_loc(1:ninter*nspmd) = 0
136 ENDIF
137
138 loc_proc = ispmd+1
139 iads(1:nspmd+1) = 0
140 iadr(1:nspmd+1) = 0
141 lensd_0 = 0
142 lenrv_0 = 0
143
144 alen = 1
145 DO p=1,nspmd
146 iads(p)=lensd_0+1
147 DO ni=1,nbintc
148 nin = intlist(ni)
149 nty=ipari(7,nin)
150 IF(nty==7.OR.nty==10.OR.nty==20.OR.nty==24.OR.nty==25.OR.nty==11)THEN
151 lensd_0 = lensd_0 +
nsnfi(nin)%P(p)*alen
152 tab_loc(nin+ninter*(p-1)) = tab_loc(nin+ninter
153 ENDIF
154 ENDDO
155 ENDDO
156 iads(nspmd+1)=lensd_0+1
157
158
160 . tab_send(1),ninter,mpi_integer,
161 . spmd_comm_world,ierror)
162
163
164
165
166
167
168
169 DO p=1,nspmd
170 iadr(p) = lenrv_0 + 1
171 DO ni=1,nbintc
172 nin = intlist(ni)
173 nty=ipari(7,nin)
174 IF(nty==7.OR.nty==10.OR.nty==20.OR.nty==24.OR.nty==25.OR.nty==11)THEN
175 lenrv_0 = lenrv_0 + tab_send(nin+ninter*(p-1))*alen
176 ENDIF
177 ENDDO
178 ENDDO
179 iadr(nspmd+1) = lenrv_0 + 1
180
181
182 IF(lensd_0>0) THEN
183 ALLOCATE(ibufs(lensd_0),stat=ierror)
184 IF(ierror/=0) THEN
185 CALL ancmsg(msgid=20,anmode=aninfo)
187 ENDIF
188 ENDIF
189
190
191 IF(lenrv_0>0) THEN
192 ALLOCATE(ibufr(lenrv_0),stat=ierror)
193 IF(ierror/=0) THEN
194 CALL ancmsg(msgid=20,anmode=aninfo)
196 ENDIF
197 ALLOCATE(tab_nsvsi(ninter),stat=ierror)
198 IF(ierror/=0) THEN
199 CALL ancmsg(msgid=20,anmode=aninfo)
201 ENDIF
202
203 DO ni=1,nbintc
204 nin = intlist(ni)
205 nty = ipari(7,nin)
206 IF(nty==7.OR.nty==10.OR.nty==20.OR.nty==24.OR.nty==25.OR.nty==11)THEN
207 nsnr = ipari(24,nin)
208 lenrv_0 = 0
209 DO p=1,nspmd
210 lenrv_0 = lenrv_0 + tab_send(nin+ninter*(p-1))
211 ENDDO
212 ALLOCATE(tab_nsvsi(nin)%P(lenrv_0), stat=ierror)
213 IF(ierror/=0) THEN
214 CALL ancmsg(msgid=20,anmode=aninfo)
216 ENDIF
217 tab_nsvsi(nin)%P(1:lenrv_0) = 0
218 ENDIF
219 ENDDO
220 ENDIF
221
222
223 DO p=1, nspmd
224 siz=iadr(p+1)-iadr(p)
225 IF (siz > 0) THEN
226 msgtyp = msgoff
227 CALL mpi_irecv( ibufr(iadr(p)),siz,mpi_integer,it_spmd(p),msgtyp,
228 . spmd_comm_world,req_r(p),ierror )
229 ENDIF
230 ENDDO
231
232
233 l=1
234 idebs=0
235 DO p=1, nspmd
236 iads(p)=l
237 IF (p/= loc_proc) THEN
238 DO ni=1,nbintc
239 nin = intlist(ni)
240 nty = ipari(7,nin)
241 IF(nty==7.OR.nty==10.OR.nty==20.OR.nty==24.OR.nty==25.OR.nty==11) THEN
243 IF(nb>0) THEN
244 DO nn=1,nb
245 ibufs(l) =
nsvfi(nin)%P(idebs(nin)+nn)
246 l=l+alen
247 ENDDO
248 idebs(nin)=idebs(nin)+nb
249 ENDIF
250 ENDIF
251 ENDDO
252 siz = l-iads(p)
253 IF(siz>0)THEN
254 msgtyp = msgoff
255 CALL mpi_isend( ibufs(iads(p)),siz,mpi_integer,it_spmd(p),msgtyp,
256 . spmd_comm_world,req_si(p),ierror )
257 ENDIF
258 ENDIF
259 ENDDO
260
261
262 l=0
263 idebr = 0
264
265 DO p=1, nspmd
266 l=0
267 siz=iadr(p+1)-iadr(p)
268 IF (siz > 0) THEN
269 msgtyp = msgoff
270
271 CALL mpi_wait(req_r(p),status,ierror)
272 DO ni=1,nbintc
273 nin = intlist(ni)
274 nty = ipari(7,nin)
275 IF(nty==7.OR.nty==10.OR.nty==20.OR.nty==24.OR.nty==25.OR.nty==11)THEN
276 nb = tab_send(nin+ninter*(p-1))
277 IF (nb > 0)THEN
278 DO k=1,nb
279 tab_nsvsi(nin)%P(idebr(nin)+k) = ibufr(iadr(p)+l)
280 l=l+alen
281 ENDDO
282 idebr(nin)=idebr(nin)+nb
283 ENDIF
284 ENDIF
285 ENDDO
286 ENDIF
287! l=l+siz
288 ENDDO
289
290
291
292 DO p = 1, nspmd
293 IF (p==nspmd)THEN
294 siz=lensd_0-iads(p)
295 ELSE
296 siz=iads(p+1)-iads(p)
297 ENDIF
298 IF(siz>0) THEN
299 CALL mpi_wait(req_si(p),status,ierror)
300 ENDIF
301 ENDDO
302
303
304
305
306
307
308
309
310
311
312 IF(ALLOCATED(ibufs)) DEALLOCATE(ibufs)
313 IF(ALLOCATED(ibufr)) DEALLOCATE(ibufr)
314 lensd = 0
315 lenrv = 0
316 alen = 1
317 iads(:) = 0
318 iadr(:) = 0
319 DO p=1,nspmd
320 iads(p)=lensd+1
321 iadr(p)=lenrv+1
322 DO ni=1,nbintc
323 nin = intlist(ni)
324 nty=ipari(7,nin)
325 IF(nty==7.OR.nty==10.OR.nty==20.OR.nty==24.OR.nty==25.OR.nty==11)THEN
326 lensd = lensd + tab_send(nin+ninter*(p-1))*alen
327 lenrv = lenrv +
nsnfi(nin)%P(p)*alen
328 ENDIF
329 ENDDO
330 ENDDO
331 iads(nspmd+1)=lensd+1
332 iadr(nspmd+1)=lenrv+1
333
334
335 IF(lensd>0) THEN
336 ALLOCATE(ibufs(lensd),stat=ierror)
337 IF(ierror/=0) THEN
338 CALL ancmsg(msgid=20,anmode=aninfo)
340 ENDIF
341 ENDIF
342
343
344 IF(lenrv>0) THEN
345 ALLOCATE(ibufr(lenrv),stat=ierror)
346 IF(ierror/=0) THEN
347 CALL ancmsg(msgid=20,anmode=aninfo)
349 ENDIF
350 ENDIF
351
352
353 DO p=1, nspmd
354 siz=iadr(p+1)-iadr(p)
355 IF (siz > 0) THEN
356 msgtyp = msgoff2
357 CALL mpi_irecv( ibufr(iadr(p)),siz,mpi_integer,it_spmd
358 . spmd_comm_world,req_r(p),ierror )
359 ENDIF
360 ENDDO
361
362
363 l=1
364 idebs = 0
365 DO p=1, nspmd
366 iads(p)=l
367 IF (p/= loc_proc) THEN
368 DO ni=1,nbintc
369 nin = intlist(ni)
370 nty = ipari(7,nin)
371 IF(nty==7.OR.nty==10.OR.nty==20.OR.nty==24.OR.nty==25) THEN
372 nb = tab_send(nin+ninter*(p-1))
373 IF(nb>0) THEN
374 DO nn=1,nb
375 nd = tab_nsvsi(nin)%P(idebs(nin)+nn)
376 nod = intbuf_tab(nin)%NSV(nd)
377 ibufs(l)= tag(nod)
378 l=l+alen
379 ENDDO
380 idebs(nin)=idebs(nin)+nb
381 ENDIF
382 ELSEIF (nty == 11)THEN
383 nb = tab_send(nin+ninter*(p-1))
384 IF(nb>0) THEN
385 DO nn=1,nb
386 nd = tab_nsvsi(nin)%P(idebs(nin)+nn)
387 nod1 = intbuf_tab(nin)%IRECTS(2*(nd-1)+1)
388 nod2 = intbuf_tab(nin)%IRECTS(2*(nd-1)+2)
389 IF(tag(nod1)==1 .OR.tag(nod2)==1)THEN
390 ibufs(l)= 1
391 ELSE
392 ibufs(l)= 0
393 ENDIF
394 l = l+alen
395 ENDDO
396 idebs(nin)=idebs(nin)+nb
397 ENDIF
398 ENDIF
399 ENDDO
400 siz = l-iads(p)
401 IF(siz>0)THEN
402 msgtyp = msgoff2
403 CALL mpi_isend( ibufs(iads(p)),siz,mpi_integer,it_spmd(p),msgtyp,
404 . spmd_comm_world,req_si(p),ierror )
405 ENDIF
406 ENDIF
407 ENDDO
408
409
410
411 ALLOCATE( tag_loc(ninter) )
412 DO ni=1,nbintc
413 nin = intlist(ni)
414 nty = ipari(7,nin)
415 IF(nty==7.OR.nty==10.OR.nty==20.OR.nty==24.OR.nty==25.OR.nty==11)THEN
416 nsnr = ipari(24,nin)
417 ALLOCATE(tag_loc(nin)%P(nsnr), stat=ierror)
418 IF(ierror/=0) THEN
419 CALL ancmsg(msgid=20,anmode=aninfo)
421 ENDIF
422 tag_loc(nin)%P(1:nsnr) = 0
423 ENDIF
424 ENDDO
425
426
427 l=0
428 idebr(:) = 0
429 DO p=1, nspmd
430 l=0
431 siz=iadr(p+1)-iadr(p)
432 IF (siz > 0) THEN
433 msgtyp = msgoff2
434
435 CALL mpi_wait(req_r(p),status,ierror)
436
437 DO ni=1,nbintc
438 nin = intlist(ni)
439 nty = ipari(7,nin)
440 IF(nty==7.OR.nty==10.OR.nty==20.OR.nty==24.OR.nty==25.OR.nty==11)THEN
442 IF (nb > 0)THEN
443 DO k=1,nb
444 nd = idebr(nin)+k
445 tag_loc(nin)%P(nd) = - ibufr(iadr(p)+l)
446 l=l+alen
447 ENDDO
448 idebr(nin) = idebr(nin) + nb
449 ENDIF
450 ENDIF
451 ENDDO
452 ENDIF
453 ENDDO
454
455
456 DO p = 1, nspmd
457 IF (p==nspmd)THEN
458 siz=lensd-iads(p)
459 ELSE
460 siz=iads(p+1)-iads(p)
461 ENDIF
462 IF(siz>0) THEN
463 CALL mpi_wait(req_si(p),status,ierror)
464 ENDIF
465 ENDDO
466
467
468 DO ni=1,nbintc
469 nin = intlist(ni)
470 nty = ipari(7,nin)
471 nsn = ipari(5,nin)
472 nsnr = ipari(24,nin)
473 i_stok = intbuf_tab(nin)%I_STOK(1)
474 inacti = ipari(22,nin)
475 ifq = ipari(31,nin)
476 itied = ipari(85,nin)
477 nrts = ipari(3,nin)
478 IF(nty==7.OR.nty==10.OR.nty==20.OR.nty==24.OR.nty==25.OR.nty==11) THEN
480 . nsnr,nsn,nty,inacti,ifq,itied,nrts)
481 ENDIF
482 intbuf_tab(nin)%I_STOK(1) = i_stok
483 ENDDO
484
485 IF(ALLOCATED(ibufs)) DEALLOCATE(ibufs)
486 IF(ALLOCATED(ibufr)) DEALLOCATE(ibufr)
487 IF(ALLOCATED(tab_nsvsi)) DEALLOCATE(tab_nsvsi)
488 IF(ALLOCATED(tab_loc)) DEALLOCATE(tab_loc)
489 IF(ALLOCATED(tab_send)) DEALLOCATE(tab_send)
490 DEALLOCATE( tag_loc )
491
492 ENDIF
493#endif
494 RETURN
subroutine mpi_isend(buf, cnt, datatype, dest, tag, comm, ireq, ierr)
subroutine mpi_wait(ireq, status, ierr)
subroutine mpi_alltoall(sendbuf, sendcnt, sendtype, recvbuf, recvcnt, recvtype, comm, ierr)
subroutine mpi_irecv(buf, cnt, datatype, source, tag, comm, ireq, ierr)
type(int_pointer), dimension(:), allocatable nsvfi
type(int_pointer), dimension(:), allocatable nsnfi
subroutine spmd_check_tag(nin, i_stok, intbuf_tab, tag, nsnr, nsn, nty, inacti, ifq, itied, nrts)
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)