39 * IAD_ELEM ,FR_ELEM,INTLIST,NBINTC,
40 * IAD_I25 ,FR_I25 ,SFR_I25,FLAG)
50 USE spmd_comm_world_mod,
ONLY : spmd_comm_world
51#include "implicit_f.inc"
66 INTEGER (NPARI,*),IAD_ELEM(2,*),FR_ELEM(*),
67 * ITAB(*),INTLIST(*),NBINTC,FLAG
69 * iad_i25(nbintc+1,nspmd), sfr_i25,fr_i25(sfr_i25)
71 TYPE(intbuf_struct_) INTBUF_TAB(*)
76 INTEGER STATUS(MPI_STATUS_SIZE)
77 INTEGER P,LENSD,LENRV,IERROR,
78 * siz,loc_proc,msgtyp,ideb(ninter),idb,proc,
79 * msgoff,msgoff2,msgoff3,msgoff4,msgoff5
80 INTEGER I,J,L,NB,NL,NN,K,N,NOD,MODE,LEN,ALEN,ND,FLG,NIN,NTY,
82 * surf,surfr,subtriar,kleave,kleave_r,proc_r,i_stok,it,ct,ms,
86 * time_s_1, time_s_2, time_sr_1, time_sr_2
88 *
DIMENSION(:),
ALLOCATABLE :: bbufs, bbufr,rrecbuf
90 *
DIMENSION(:,:),
ALLOCATABLE :: rsendbuf
93 INTEGER,
DIMENSION(:,:),
ALLOCATABLE :: ISENDBUF
94 INTEGER,
DIMENSION(:),
ALLOCATABLE :: IRECBUF
95 INTEGER,
DIMENSION(:),
ALLOCATABLE :: SNIDX
96 INTEGER,
DIMENSION(:),
ALLOCATABLE :: ITRI,INDTRI,ISCANDR
97 INTEGER,
DIMENSION(:),
ALLOCATABLE:: REQ_SI,REQ_RI,REQ_S,IADS
98 INTEGER,
DIMENSION(:),
ALLOCATABLE:: REQ_S2,REQ_R,REQ_R2,IADR
106 SAVE iads,iadr,bbufs,bbufr,req_s,req_s2,
107 * req_si,req_r,req_r2,
108 * rrecbuf,irecbuf,rsendbuf,isendbuf,
109 * ilen,rlen,len,lensd,lenrv
117 assert(.NOT.(
ALLOCATED(req_si)))
118 assert(.NOT.(
ALLOCATED(req_ri)))
119 assert(.NOT.(
ALLOCATED(req_s)))
120 assert(.NOT.(
ALLOCATED(req_s2)))
121 assert(.NOT.(
ALLOCATED(req_r)))
122 assert(.NOT.(
ALLOCATED(req_r2)))
123 assert(.NOT.(
ALLOCATED(iadr)))
124 assert(.NOT.(
ALLOCATED(iads)))
126 ALLOCATE(req_si(nspmd))
127 ALLOCATE(req_ri(nspmd))
128 ALLOCATE(req_s(nspmd))
129 ALLOCATE(req_s2(nspmd))
130 ALLOCATE(req_r(nspmd))
131 ALLOCATE(req_r2(nspmd))
132 ALLOCATE(iadr(nspmd+1))
133 ALLOCATE(iads(nspmd+1))
162 lensd = lensd +
nsnfi(nin)%P(p)*alen
163 lenrv = lenrv +
nsnsi(nin)%P(p)*alen
167 iadr(nspmd+1)=lenrv+1
171 ALLOCATE(bbufs(lensd),stat=ierror)
173 CALL ancmsg(msgid=20,anmode=aninfo)
181 ALLOCATE(bbufr(lenrv),stat=ierror)
183 CALL ancmsg(msgid=20,anmode=aninfo)
189 siz=iadr(p+1)-iadr(p)
192 CALL mpi_irecv( bbufr(iadr(p)),siz,real,it_spmd(p
203 IF (p/= loc_proc)
THEN
210 bbufs(l) =
irtlm_fi(nin)%P(1,nn+ideb(nin))
211 bbufs(l+1) =
irtlm_fi(nin)%P(2,nn+ideb(nin))
212 bbufs(l+2) =
irtlm_fi(nin)%P(3,nn+ideb(nin))
213 bbufs(l+3) =
irtlm_fi(nin)%P(4,nn+ideb(nin))
214 bbufs(l+4) =
time_sfi(nin)%P(2*(nn+ideb(nin)-1)+1)
215 bbufs(l+5) =
time_sfi(nin)%P(2*(nn+ideb(nin)-1)+2)
218 ideb(nin)=ideb(nin)+nb
225 . bbufs(iads(p)),siz,real ,it_spmd(p),msgtyp,
226 . spmd_comm_world,req_si(p),ierror )
248 siz=iadr(p+1)-iadr(p)
253 CALL mpi_wait(req_r(p),status,ierror)
265 nd =
nsvsi(nin)%P(ideb(nin)+k)
268 sn = intbuf_tab(nin)%NSV(nd)
269 time_s_1 = intbuf_tab(nin)%TIME_S(2*(nd-1)+1)
270 time_s_2 = intbuf_tab(nin)%TIME_S(2*(nd-1)+2)
272 kleave = intbuf_tab(nin)%IRTLM(4*(nd-1)+3)
273 surfr = nint(bbufr(iadr(p)+l))
274 subtriar = nint(bbufr(iadr(p)+l+1))
276 proc_r = nint(bbufr(iadr(p)+l+3))
277 time_sr_1 = bbufr(iadr(p)+l+4)
278 time_sr_2 = bbufr(iadr(p)+l+5)
282 ELSEIF(kleave_r == -1)
THEN
285 intbuf_tab(nin)%IRTLM(4*(nd-1)+1) = 0
287 intbuf_tab(nin)%IRTLM(4*(nd-1)+3) = -1
288 intbuf_tab(nin)%IRTLM(4*(nd-1)+4) = proc_r
290 ELSEIF (surf > 0)
THEN
292 IF(time_s_1 == ep20)
THEN
294 IF(surfr > 0 .AND. time_sr_1 /= ep20)
THEN
305 intbuf_tab(nin)%IRTLM(4*(nd-1)+1) = surfr
306 intbuf_tab(nin)%IRTLM(4*(nd-1)+2) = subtriar
307 intbuf_tab(nin)%IRTLM(4*(nd-1)+3) = kleave_r
308 intbuf_tab(nin)%IRTLM(4*(nd-1)+4) = proc_r
309 intbuf_tab(nin)%TIME_S(2*(nd-1)+1) = time_sr_1
310 intbuf_tab(nin)%TIME_S(2*(nd-1)+2) = time_sr_2
327 IF(surfr > 0 .AND. time_sr_1 /= ep20 .AND. time_sr_2 /= ep20)
THEN
329 IF(time_s_2 == time_sr_2)
THEN
331 intbuf_tab(nin)%IRTLM(4*(nd-1)+1) = surfr
332 intbuf_tab(nin)%IRTLM(4*(nd-1)+2) = subtriar
333 intbuf_tab(nin)%IRTLM(4*(nd-1)+3) = kleave_r
334 intbuf_tab(nin)%IRTLM(4*(nd-1)+4) = proc_r
338 ELSEIF(time_s_2 > time_sr_2)
THEN
339 intbuf_tab(nin)%IRTLM(4*(nd-1)+1) = surfr
340 intbuf_tab(nin)%IRTLM(4*(nd-1)+2) = subtriar
341 intbuf_tab(nin)%IRTLM(4*(nd-1)+3) = kleave_r
342 intbuf_tab(nin)%IRTLM(4*(nd-1)+4) = proc_r
344 intbuf_tab(nin)%TIME_S(2*(nd-1)+2) = time_sr_2
351 IF(time_s_1 == time_sr_1)
THEN
352 IF(-surfr > -surf)
THEN
353 intbuf_tab(nin)%IRTLM(4*(nd-1)+1) = surfr
355 intbuf_tab(nin)%IRTLM(4*(nd-1)+3) = kleave_r
356 intbuf_tab(nin)%IRTLM(4*(nd
359 ELSEIF(time_sr_1 > time_s_1)
THEN
360 intbuf_tab(nin)%IRTLM(4*(nd-1)+1) = surfr
361 intbuf_tab(nin)%IRTLM(4*(nd-1)+2) = subtriar
362 intbuf_tab(nin)%IRTLM(4*(nd-1)+3) = kleave_r
363 intbuf_tab(nin)%IRTLM(4*(nd-1)+4) = proc_r
364 intbuf_tab(nin)%TIME_S(2*(nd-1)+1) = time_sr_1
374 ideb(nin)=ideb(nin)+nb
386 siz=iads(p+1)-iads(p)
389 CALL mpi_wait(req_si(p),status,ierror)
393 IF (
ALLOCATED(bbufs))
DEALLOCATE(bbufs)
394 IF (
ALLOCATED(bbufr))
DEALLOCATE(bbufr)
402 assert(iad_i25(1,i) >= 0)
405 iads(nspmd+1)=sfr_i25+1
412 ALLOCATE(isendbuf(ilen,sfr_i25))
413 ALLOCATE(irecbuf(ilen*sfr_i25))
414 ALLOCATE(rsendbuf(rlen,sfr_i25))
415 ALLOCATE(rrecbuf(rlen*sfr_i25))
419 siz = iads(p+1)-iads(p)
422 li = (iads(p)-1)*ilen+1
423 lr = (iads(p)-1)*rlen+1
428 s irecbuf(li),len,mpi_integer,it_spmd(p),msgtyp,
429 g spmd_comm_world,req_r(p),ierror)
435 s rrecbuf(lr),len,real,it_spmd(p),msgtyp,
436 g spmd_comm_world,req_r2(p),ierror)
449 DO i=iad_i25(ni,p),iad_i25(ni+1,p
454 sn = intbuf_tab(nin)%NSV(nd)
456 isendbuf(1,nb) = itab(sn)
457 isendbuf(2,nb) = intbuf_tab(nin)%IRTLM(4*(nd-1)+1)
458 isendbuf(3,nb) = intbuf_tab(nin)%IRTLM(4*(nd-1)+2)
459 isendbuf(4,nb) = intbuf_tab(nin)%IRTLM(4*(nd-1)+3)
460 isendbuf(5,nb) = intbuf_tab(nin)%IRTLM(4*(nd-1)+4)
461 rsendbuf(1,nb) = intbuf_tab(nin)%TIME_S(2*(nd-1)+1)
462 rsendbuf(2,nb) = intbuf_tab(nin)%TIME_S(2*(nd-1)+2)
473 siz = iads(p+1) - iads(p)
478 s isendbuf(1,l),siz*ilen,mpi_integer,it_spmd(p),msgtyp,
479 g spmd_comm_world,req_s(p),ierror)
484 s rsendbuf(1,l),siz*rlen,real,it_spmd(p),msgtyp,
485 g spmd_comm_world,req_s2(p),ierror)
503 siz = iads(p+1)-iads(p)
506 CALL mpi_wait(req_r(p),status,ierror)
509 CALL mpi_wait(req_r2(p),status,ierror)
521 DO k=iad_i25(ni,p),iad_i25(ni+1,p)-1
523 sn = intbuf_tab(nin)%NSV(nd)
525 time_s_1 = intbuf_tab(nin)%TIME_S(2*(nd-1)+1)
526 time_s_2 = intbuf_tab(nin)%TIME_S(2*(nd-1)+2)
527 surf = intbuf_tab(nin)%IRTLM(4*(nd-1)+1)
528 kleave = intbuf_tab(nin)%IRTLM(4*(nd-1)+3)
529 surfr = irecbuf((idb-1)*ilen+2)
530 subtriar = irecbuf((idb-1)*ilen+3)
531 kleave_r = irecbuf((idb-1)*ilen+4)
532 proc_r = irecbuf((idb-1)*ilen+5)
533 time_sr_1 = rrecbuf((idb-1)*rlen+1)
534 time_sr_2 = rrecbuf((idb-1)*rlen+2)
539 ELSEIF(kleave_r == -1)
THEN
542 intbuf_tab(nin)%IRTLM(4*(nd-1)+1) = 0
543 intbuf_tab(nin)%IRTLM(4*(nd-1)+2) = 0
544 intbuf_tab(nin)%IRTLM(4*(nd-1)+3) = -1
545 intbuf_tab(nin)%IRTLM(4*(nd-1)+4) = proc_r
547 ELSEIF (surf > 0)
THEN
549 IF(time_s_1 == ep20)
THEN
551 IF(surfr > 0 .AND. time_sr_1 /= ep20)
THEN
562 intbuf_tab(nin)%IRTLM(4*(nd-1)+1) = surfr
563 intbuf_tab(nin)%IRTLM(4*(nd-1)+2) = subtriar
564 intbuf_tab(nin)%IRTLM(4*(nd-1)+3) = kleave_r
565 intbuf_tab(nin)%IRTLM(4*(nd-1)+4) = proc_r
566 intbuf_tab(nin)%TIME_S(2*(nd-1)+1) = time_sr_1
567 intbuf_tab(nin)%TIME_S(2*(nd-1)+2) = time_sr_2
587 IF(surfr > 0 .AND. time_sr_1 /= ep20 .AND. time_sr_2 /= ep20)
THEN
589 IF(time_s_2 == time_sr_2)
THEN
591 intbuf_tab(nin)%IRTLM(4*(nd-1)+1) = surfr
592 intbuf_tab(nin)%IRTLM(4*(nd-1)+2) = subtriar
593 intbuf_tab(nin)%IRTLM(4*(nd-1)+3) = kleave_r
594 intbuf_tab(nin)%IRTLM(4*(nd-1)+4) = proc_r
598 ELSEIF(abs(time_s_2) > abs(time_sr_2))
THEN
600 intbuf_tab(nin)%IRTLM(4*(nd-1)+2) = subtriar
601 intbuf_tab(nin)%IRTLM(4*(nd-1)+3) = kleave_r
602 intbuf_tab(nin)%IRTLM(4*(nd-1)+4) = proc_r
604 intbuf_tab(nin)%TIME_S(2*(nd-1)+2) = time_sr_2
613 IF(time_s_1 == time_sr_1)
THEN
614 IF(-surfr > -surf)
THEN
615 intbuf_tab(nin)%IRTLM(4*(nd-1)+1) = surfr
616 intbuf_tab(nin)%IRTLM(4*(nd-1)+2) = subtriar
617 intbuf_tab(nin)%IRTLM(4*(nd-1)+3) = kleave_r
618 intbuf_tab(nin)%IRTLM(4*(nd-1)+4) = proc_r
621 ELSEIF(time_sr_1 > time_s_1)
THEN
622 intbuf_tab(nin)%IRTLM(4*(nd-1)+1) = surfr
623 intbuf_tab(nin)%IRTLM(4*(nd-1)+2) = subtriar
624 intbuf_tab(nin)%IRTLM(4*(nd-1)+3) = kleave_r
625 intbuf_tab(nin)%IRTLM(4*(nd-1)+4) = proc_r
626 intbuf_tab(nin)%TIME_S(2*(nd-1)+1) = time_sr_1
643 siz = iads(p+1)-iads(p)
645 CALL mpi_wait(req_s(p),status,ierror)
646 CALL mpi_wait(req_s2(p),status,ierror)
650 IF(
ALLOCATED(isendbuf))
DEALLOCATE(isendbuf)
651 IF(
ALLOCATED(irecbuf))
DEALLOCATE(irecbuf)
652 IF(
ALLOCATED(rsendbuf))
DEALLOCATE(rsendbuf)
653 IF(
ALLOCATED(rrecbuf))
DEALLOCATE(rrecbuf)
672 lensd = lensd +
nsnsi(nin)%P(p)*alen
673 lenrv = lenrv +
nsnfi(nin)%P(p)*alen
677 iadr(nspmd+1)=lenrv+1
680 ALLOCATE(bbufs(lensd),stat=ierror)
682 CALL ancmsg(msgid=20,anmode=aninfo)
689 ALLOCATE(bbufr(lenrv),stat=ierror)
691 CALL ancmsg(msgid=20,anmode=aninfo)
701 CALL mpi_irecv( bbufr(iadr(p)),siz,real,it_spmd(p),msgtyp,
702 * spmd_comm_world,req_r(p),ierror )
711 IF (p/= loc_proc)
THEN
719 nd =
nsvsi(nin)%P(ideb(nin)+nn)
720 nod=intbuf_tab(nin)%NSV(nd)
722 bbufs(l )=intbuf_tab(nin)%IRTLM(4*(nd-1)+1)
723 bbufs(l+1)=intbuf_tab(nin)%IRTLM(4*(nd-1)+2)
724 bbufs(l+2)=intbuf_tab(nin)%IRTLM(4*(nd-1)+3)
725 bbufs(l+3)=intbuf_tab(nin)%IRTLM(4*(nd-1)+4)
726 bbufs(l+4)=intbuf_tab(nin)%TIME_S(2*(nd-1)+1)
727 bbufs(l+5)=intbuf_tab(nin)%TIME_S(2*(nd-1)+2)
730 ideb(nin)=ideb(nin)+nb
739 . bbufs(iads(p)),siz,real ,it_spmd(p),msgtyp,
740 . spmd_comm_world,req_si(p),ierror )
761 siz=iadr(p+1)-iadr(p)
764 CALL mpi_wait(req_r(p),status,ierror)
776 irtlm_fi(nin)%P(1,ideb(nin)+k)=bbufr(iadr(p)+l)
777 irtlm_fi(nin)%P(2,ideb(nin)+k)=bbufr(iadr(p)+l+1)
778 irtlm_fi(nin)%P(3,ideb(nin)+k)=bbufr(iadr(p)+l+2)
779 irtlm_fi(nin)%P(4,ideb(nin)+k)=bbufr(iadr(p)+l+3)
780 time_sfi(nin)%P(2*(ideb(nin)+k-1)+1) =bbufr(iadr(p)+l+4)
781 time_sfi(nin)%P(2*(ideb(nin)+k-1)+2) =bbufr(iadr(p)+l+5)
785 ideb(nin)=ideb(nin)+nb
796 siz=iads(p+1)-iads(p)
799 CALL mpi_wait(req_si(p),status,ierror)
805 IF(
ALLOCATED(bbufs))
DEALLOCATE(bbufs)
806 IF(
ALLOCATED(bbufr))
DEALLOCATE(bbufr)
807 IF(
ALLOCATED( req_si ))
DEALLOCATE(req_si)
808 IF(
ALLOCATED( req_ri ))
DEALLOCATE(req_ri)
809 IF(
ALLOCATED( req_s ))
DEALLOCATE(req_s)
810 IF(
ALLOCATED( req_s2 ))
DEALLOCATE(req_s2)
811 IF(
ALLOCATED( req_r ))
DEALLOCATE(req_r)
812 IF(
ALLOCATED( req_r2 ))
DEALLOCATE(req_r2)
813 IF(
ALLOCATED( iadr ))
DEALLOCATE(iadr)
814 IF(
ALLOCATED( iads ))
DEALLOCATE(iads)