41 1 IPARI ,NEWFRONT,ISENDTO ,IRCVFROM,
42 2 NSENSOR ,NBINTC ,INTLIST ,ISLEN7 ,IRLEN7 ,
43 3 ISLEN11 ,IRLEN11 ,ISLEN17 ,IRLEN17 ,IRLEN7T ,
44 4 ISLEN7T ,IRLEN20 ,ISLEN20 ,IRLEN20T,ISLEN20T,
45 5 IRLEN20E,ISLEN20E,SENSOR_TAB,INTBUF_TAB, MODE)
58 USE spmd_comm_world_mod,
ONLY : spmd_comm_world
59#include "implicit_f.inc"
76 INTEGER ,
INTENT(IN) :: NSENSOR
77 INTEGER NBINTC,ISLEN7,IRLEN7,ISLEN11,IRLEN11,ISLEN17,IRLEN17,
78 . IRLEN7T,ISLEN7T,IRLEN20,ISLEN20 ,IRLEN20T,ISLEN20T,
80 . IPARI(NPARI,NINTER),
81 . newfront(*), intlist(*),
82 . isendto(ninter+1,*) ,ircvfrom(ninter+1,*)
84 TYPE(INTBUF_STRUCT_) INTBUF_TAB(*)
85 TYPE (SENSOR_STR_) ,
DIMENSION(NSENSOR) ,
INTENT(IN) :: SENSOR_TAB
90 INTEGER NSEG, LEN, NI, ITYP, OLD_LEN,
91 . N, P, I, J, K, L, PP, NIN ,IDEB, IDEB2, IDEB3, II,
92 . LENOUT, I0, NS, INTTH,
93 . NOINT, MULTIMP, ITY, I_STOK_G, ISTK,
94 . SIZE, ALEN, LOC_PROC, MSGTYP,
95 . msgoff, msgoff2, msgoff3, msgoff4,
96 . ierror, ierror2, idebut(nspmd+ninter),
97 . status(mpi_status_size),req_s(nspmd),
98 . isubtmp(ninter,2,nspmd),isubtmp2(ninter,2,nspmd),
99 . idebut2(ninter), isens,interact,
101 INTEGER :: SIZ,IDEB_EDGE,NB_SUBINT
102 INTEGER :: INDEX_PROC
103 LOGICAL :: ONLY_INTER_7
111 . startt,gap,maxbox,minbox,stopt,dist,tzinf,dist0,
112 . xmax,
ymax, zmax, xmin, ymin, zmin,ts
181 IF(ity==7.OR.ity==10.OR.
182 . ity==22.OR.ity==23.OR.ity==24.OR.
183 . ity==20.OR.ity==11.OR.ity==17.OR.
189 IF(ity == 7.OR.ity == 11.OR.ity == 24.OR.ity == 25)
THEN
190 isens = ipari(64,nin)
193 ts = sensor_tab(isens)%TSTART
194 IF (tt>=ts) interact = 1
196 startt= intbuf_tab(nin)%VARIABLES(3)
197 stopt = intbuf_tab(nin)%VARIABLES(11)
198 IF (startt<=tt.AND.tt<=stopt) interact = 1
201 dist = intbuf_tab(nin)%VARIABLES(5)
208 IF (ity == 25 .OR. (dist<=zero.AND.interact/=0))
THEN
209 IF(isendto(nin,loc_proc)/=0.OR.
210 . ircvfrom(nin,loc_proc)/=0)
THEN
218 intbuf_tab(nin)%VARIABLES(5) = -dist
225 len =
nsnfi(nin)%P(p)
230 IF (ipari(36,nin)>0.AND.ipari(7,nin)/=17)
THEN
234 IF(ipari(7,nin)==25.AND. ipari(58,nin) > 0)
THEN
243 IF (ity == 20 .OR. (ity == 25.AND. ipari(58,nin) > 0))
THEN
267 only_inter_7 = .true.
268 IF (p/=loc_proc)
THEN
272 IF(newfront(nin)==2)
THEN
273 IF(isendto(nin,p)/=0.OR.ircvfrom(nin,p)/=0)
THEN
275 IF(ity/=7.AND.ity/=11) only_inter_7 = .false.
277 IF(isendto(nin,p)/=0.AND.ircvfrom(nin,loc_proc)/=0)
icomm2_send(p) = 1
278 IF(ircvfrom(nin,p)/=0.AND.isendto(nin,loc_proc)/=0)
icomm2_rcv(p) = 1
281 IF(.NOT.only_inter_7)
THEN
290 s
sizbuf_s(p)%P(1),l,mpi_integer,it_spmd(p),msgtyp,
305 . mpi_integer,it_spmd(p),
322 ALLOCATE(
msgbuf_s(p)%P(len),stat=ierror)
325 CALL ancmsg(msgid=20,anmode=aninfo)
332 IF(newfront(nin)==2)
THEN
333 IF(
nsnfi(nin)%P(p)>0)
THEN
339 idebut(nin) = idebut(nin) + len
342 IF(ipari(7,nin) == 20 .OR. (ipari(7,nin) == 25.AND. ipari(58,nin) > 0))
THEN
343 IF(
nsnfie(nin)%P(p)>0)
THEN
348 assert(
nsvfie(nin)%P(ideb2+i) > 0)
351 idebut2(nin) = idebut2(nin) + len
359 s
msgbuf_s(p)%P(1),ideb,mpi_integer,it_spmd(p),msgtyp,
365 ELSEIF( mode == 2 )
THEN
390 IF(newfront(nin) == 2)
THEN
391 IF(isendto(nin,loc_proc)/=0.OR.
392 . ircvfrom(nin,loc_proc)/=0)
THEN
394 nsnsi(nin)%P(p) = len
396 IF(ity == 20 .OR. (ity == 25.AND. ipari(58,nin) > 0))
THEN
406 ALLOCATE(
msgbuf_r(p)%P(len),stat=ierror)
408 CALL ancmsg(msgid=20,anmode=aninfo)
442 IF(newfront(nin)==2)
THEN
444 IF(
ASSOCIATED(
nsvsi(nin)%P))
DEALLOCATE
447 len = len +
nsnsi(nin)%P(p)
450 IF(len>0)
ALLOCATE(
nsvsi(nin)%P(len),stat=ierror)
452 CALL ancmsg(msgid=20,anmode=aninfo
456 len =
nsnsi(nin)%P(p)
464 idebut(p) = idebut(p) + len
468 IF(ipari(7,nin) == 20 .OR. (ipari(7,nin) == 25.AND. ipari(58,nin) > 0) )
THEN
473 len = len +
nsnsie(nin)%P(p)
476 IF(len>0)
ALLOCATE(
nsvsie(nin)%P(len),stat=ierror)
478 CALL ancmsg(msgid=20,anmode=aninfo)
492 idebut(p) = idebut(p) + len
527 IF(newfront(nin)==2.AND.ipari
528 + ipari(7,nin)/=17)
THEN
531 len =
nsnsi(nin)%P(p)
535 ns =
nsvsi(nin)%P(ideb+i)
537 lenout = lenout + intbuf_tab(nin)%ADDSUBS(ns+1)-
538 . intbuf_tab(nin)%ADDSUBS(ns) + 1
542 isubtmp(nin,1,p) = lenout
544 IF(ipari(7,nin) ==25 .AND. ipari(58,nin) > 0)
THEN
552 ns =
nsvsie(nin)%P(ideb+i)
554 lenout = lenout + intbuf_tab(nin)%ADDSUBE(ns+1)-
555 . intbuf_tab(nin)%ADDSUBE(ns) + 1
562 isubtmp(nin,2,p) = lenout
573 lenout = lenout + isubtmp(nin,1,p)
574 IF(newfront(nin)==2.AND.ipari(36,nin)>0.AND.
575 + (ipari(7,nin) == 7.OR.ipari(7,nin) == 11.OR.ipari(7,nin) == 24.OR.ipari(7,nin) == 25))
THEN
576 lenout = lenout + isubtmp(nin,1,p) -
nsnsi(nin)%P(p)
578 IF(newfront(nin)==2.AND.ipari(36,nin)>0.AND.
579 + ipari(7,nin)==25)
THEN
580 IF(ipari(58,nin) /= 0)
THEN
581 lenout = lenout + 2*isubtmp(nin,2,p) -
nsnsie(nin)%P(p)
589 ALLOCATE(
msgbuf_s(p)%P(lenout),stat=ierror)
591 CALL ancmsg(msgid=20,anmode=aninfo)
597 s isubtmp(1,1,p),siz,mpi_integer,it_spmd(p),msgtyp,
598 g spmd_comm_world,req_s(p),ierror)
611 CALL mpi_recv(isubtmp2(1,1,p),siz,mpi_integer,it_spmd(p),
612 . msgtyp,spmd_comm_world,status,ierror)
616 IF(newfront(nin)==2.AND.ipari(36,nin)>0.AND.
617 + ipari(7,nin)/=17)
THEN
619 nb_subint = isubtmp2(nin,1,p) -
nsnfi(nin)%P(p)
621 lenout = lenout + isubtmp2(nin,1,p)
622 IF(ipari(7,nin) == 7.OR.ipari(7,nin) == 11.OR.ipari(7,nin) == 24.OR.ipari(7,nin) == 25)
THEN
623 lenout = lenout + nb_subint
625 IF(ipari(7,nin)==25)
THEN
626 IF(ipari(58,nin) /= 0)
THEN
629 lenout = lenout + 2*isubtmp2(nin,2,p) -
nsnfie(nin)%P(p)
638 ALLOCATE(
msgbuf_r(p)%P(lenout),stat=ierror)
640 CALL ancmsg(msgid=20,anmode=aninfo)
651 CALL mpi_wait(req_s(p),status,ierror)
663 IF(newfront(nin)==2.AND.ipari(36,nin)>0.AND.
664 + ipari(7,nin)/=17)
THEN
667 len =
nsnsi(nin)%P(p)
671 ns =
nsvsi(nin)%P(ideb+i)
674 msgbuf_s(p)%P(i0) = intbuf_tab(nin)%ADDSUBS(ns+1)-
675 . intbuf_tab(nin)%ADDSUBS(ns)
677 DO j = intbuf_tab(nin)%ADDSUBS(ns),
678 . intbuf_tab(nin)%ADDSUBS(ns+1)-1
682 IF(ipari(7,nin) == 7.OR.ipari(7,nin) == 11.OR.ipari(7,nin) == 24.OR.ipari(7,nin) == 25)
THEN
683 DO j = intbuf_tab(nin)%ADDSUBS(ns),
684 . intbuf_tab(nin)%ADDSUBS(ns+1)-1
686 msgbuf_s(p)%P(i0) = intbuf_tab(nin)%INFLG_SUBS(j)
694 IF(ipari(7,nin) == 25 .AND. ipari(58,nin) /= 0)
THEN
702 ns =
nsvsie(nin)%P(ideb_edge+i)
705 msgbuf_s(p)%P(i0) = intbuf_tab(nin)%ADDSUBE(ns+1)-
706 . intbuf_tab(nin)%ADDSUBE(ns)
710 DO j = intbuf_tab(nin)%ADDSUBE(ns),
711 . intbuf_tab(nin)%ADDSUBE(ns+1)-1
713 msgbuf_s(p)%P(i0) = intbuf_tab(nin)%LISUBE(j)
716 DO j = intbuf_tab(nin)%ADDSUBE(ns),
717 . intbuf_tab(nin)%ADDSUBE(ns+1)-1
719 msgbuf_s(p)%P(i0) = intbuf_tab(nin)%INFLG_SUBE(j)
724 ideb_edge = ideb_edge + len
738 g spmd_comm_world,req_s(p),ierror)
751 . msgtyp,spmd_comm_world,status,ierror)
766 IF(newfront(nin)==2.AND.ipari(36,nin)>0.AND.
767 + ipari(7,nin)/=17)
THEN
768 IF(
ASSOCIATED(
lisubsfi(nin)%P))
DEALLOCATE
775 ALLOCATE(
lisubsfi(nin)%P(len),stat=ierror)
777 CALL ancmsg(msgid=20,anmode=aninfo)
780 IF(ipari(7,nin) == 7.OR.ipari(7,nin) == 11.OR.ipari(7,nin) == 24.OR.ipari(7,nin) == 25)
THEN
784 CALL ancmsg(msgid=20,anmode=aninfo)
792 len = len +
nsnfi(nin)%P(p)
794 ALLOCATE(
addsubsfi(nin)%P(len),stat=ierror)
796 CALL ancmsg(msgid=20,anmode=aninfo)
804 DO i = 1,
nsnfi(nin)%P(p)
813 idebut(p) = idebut(p) + len + 1
814 IF(ipari(7,nin) == 7.OR.ipari(7,nin) == 11.OR.ipari(7,nin) == 24.OR.ipari(7,nin) == 25)
THEN
819 idebut(p) = idebut(p) + len
823 ideb3 = ideb3 +
nsnfi(nin)%P(p)
831 len = len +
nsnfi(nin)%P(p)
833 ALLOCATE(
addsubsfi(nin)%P(len),stat=ierror)
835 CALL ancmsg(msgid=20,anmode=aninfo)
841 DO i = 1,
nsnfi(nin)%P(p)
845 ideb3 = ideb3 +
nsnfi(nin)%P(p)
848 IF(ipari(7,nin) == 25 .AND. ipari(58,nin) > 0)
THEN
858 ALLOCATE(
lisubsfie(nin)%P(len),stat=ierror)
860 CALL ancmsg(msgid=20,anmode=aninfo)
863 IF(ipari(7,nin)==25)
THEN
867 CALL ancmsg(msgid=20,anmode=aninfo)
875 len = len +
nsnfie(nin)%P(p)
880 CALL ancmsg(msgid=20,anmode=aninfo)
888 DO i = 1,
nsnfie(nin)%P(p)
900 idebut(p) = idebut(p) + len + 1
906 idebut(p) = idebut(p) + len
909 ideb3 = ideb3 +
nsnfie(nin)%P(p)
917 len = len +
nsnfi(nin)%P(p)
921 CALL ancmsg(msgid=20,anmode=aninfo)
927 DO i = 1,
nsnfi(nin)%P(p)
931 ideb3 = ideb3 +
nsnfi(nin)%P(p)
940 CALL mpi_wait(req_s(p),status,ierror)
979 IF(newfront(nin)==2) newfront(nin)=0
981 intth = ipari(47,nin)
984 IF(ityp==7.OR.ityp==10.OR.ityp==22.OR.
985 . ityp==23.OR.ityp==24)
THEN
988 islen7 = islen7 +
nsnsi(nin)%P(p)
989 irlen7 = irlen7 +
nsnfi(nin)%P(p)
994 islen7t = islen7t +
nsnsi(nin)%P(p)
995 irlen7t = irlen7t +
nsnfi(nin)%P(p)
998 ELSEIF(ityp == 11)
THEN
1001 islen11 = islen11 +
nsnsi(nin)%P(p)
1002 irlen11 = irlen11 +
nsnfi(nin)%P(p)
1005 ELSEIF(ityp == 17)
THEN
1007 islen17 = islen17 +
nsnsi(nin)%P(p)
1008 irlen17 = irlen17 +
nsnfi(nin)%P(p)
1010 ELSEIF(ityp == 20)
THEN
1014 islen20 = islen20 +
nsnsi(nin)%P(p)
1015 irlen20 = irlen20 +
nsnfi(nin)%P(p)
1016 islen20e= islen20e+
nsnsie(nin)%P(p)
1017 irlen20e= irlen20e+
nsnfie(nin)%P(p)
1021 islen20t = islen20t +
nsnsi(nin)%P(p)
1022 irlen20t = irlen20t +
nsnfi(nin)%P(p)
1023 islen20e= islen20e+
nsnsie(nin)%P(p)
1024 irlen20e= irlen20e+
nsnfie(nin)%P(p)
1027 ELSEIF(ityp == 25)
THEN
1029 iedge = ipari(58,nin)
1034 IF( iedge /= 0)
THEN
1043 IF( iedge /= 0)
THEN