48 USE spmd_comm_world_mod,
ONLY : spmd_comm_world
49#include "implicit_f.inc"
62 INTEGER :: MSR(*), ILOC(*), ITAB(*)
69 INTEGER,
DIMENSION(:),
ALLOCATABLE :: BUFR_ID,BUFS_ID
70 my_real,
DIMENSION(:),
ALLOCATABLE :: bufr_dist,bufs_dist
72INTEGER RQS(2*(NSPMD-1))
75 INTEGER STAT(MPI_STATUS_SIZE,2*(NSPMD-1))
76 INTEGER STAT2(MPI_STATUS_SIZE)
78 INTEGER TAB_RANK(NSPMD-1),TAB_BUFPOS(NSPMD-1)
79 INTEGER BUFLEN,BUFPOS,RMAX_UID_LOCAL,RMAX_UID_REMOTE
81 INTEGER MSGOFF,MSGOFF2
91 buflen = buflen+buffer(i)%NBSECND_TOT
94 ALLOCATE(bufr_id(buflen))
95 ALLOCATE(bufs_id(buflen))
96 ALLOCATE(bufr_dist(buflen))
97 ALLOCATE(bufs_dist(buflen
100 bufr_dist(1:buflen) = 0
101 bufs_dist(1:buflen) = 0
107 IF( ispmd /= i-1)
THEN
108 DO j = 1,buffer(i)%NBSECND_TOT
109 n = buffer(i)%SECND_ID(j)
111 bufs_dist(bufpos + j -1) = distance(n)
113 bufs_id(bufpos + j -1) = itab(msr(iloc(n)))
116 n = buffer(i)%NBSECND_TOT
124 tab_bufpos(k1) = bufpos
128 . mpi_int,i-1,tag,spmd_comm_world,rqs(k),ierr)
130 . mpi_int,i-1,tag,spmd_comm_world,rqr1(k1),ierr)
136 . real,i-1,tag,spmd_comm_world,rqs(k),ierr)
138 . real,i-1,tag,spmd_comm_world,rqr2(k2),ierr)
150 bufpos = tab_bufpos(i) - 1
152 IF(ispmd /= i-1)
THEN
153 n = buffer(i)%NBSECND_TOT
155 k = buffer(i)%SECND_ID(j)
157 dist1 = bufs_dist(bufpos+j)
158 dist2 = bufr_dist(bufpos+j)
159 rmax_uid_remote=bufr_id(bufpos+j)
163 rmax_uid_local = itab(msr(iloc(k)))
164 IF(dist1 > dist2 .OR.
165 . (dist1 == dist2 .AND. rmax_uid_local > rmax_uid_remote) .OR.
166 . (rmax_uid_local == rmax_uid_remote .AND. i-1 < ispmd))
THEN
188 DEALLOCATE(bufr_id,bufs_id)
189 DEALLOCATE(bufr_dist,bufs_dist)
250 . ITAB,BUFFER,FRONTIER,INDEX_IN_COMM)
264 USE spmd_comm_world_mod,
ONLY : spmd_comm_world
265#include "implicit_f.inc"
273#include "com01_c.inc"
278 INTEGER :: NSV(*), ILOC(*), ITAB(*)
279 INTEGER :: NBSECNDS,INDEX_IN_COMM(*)
280 TYPE(front8) FRONTIER(*)
281 TYPE(buft8) BUFFER(*)
286 INTEGER,
DIMENSION(:),
ALLOCATABLE :: BUFR_ID,BUFR_IDR
287 INTEGER I,J,K,L,N,P,IERR
288 INTEGER RQS(2*(NSPMD-1))
289 INTEGER RQR(2*(NSPMD-1))
291 INTEGER STAT(MPI_STATUS_SIZE,2*(NSPMD-1))
292 INTEGER TAG,NB_SECND_SENT(NSPMD),NB_SECND_RECV(NSPMD)
294 INTEGER BUFLEN,(NSPMD),RMAX_UID_LOCAL,RMAX_UID_REMOTE
296 INTEGER MSGOFF,MSGOFF2
303 nb_secnd_sent(1:nspmd) = 0
308 IF(index_in_comm(iloc(i))>0)
THEN
309 k = index_in_comm(iloc(i))
310 DO j = 1,frontier(k)%NBCOM
311 p = frontier(k)%PROCLIST(j)
312 nb_secnd_sent(p) = nb_secnd_sent(p) + 1
313 nb_secnd_tot = nb_secnd_tot +1
320 ALLOCATE(bufr_id(nb_secnd_tot*2))
326 bufpos(i+1) = 2*nb_secnd_sent(i) + bufpos(i)
333 IF(index_in_comm(iloc(i))>0)
THEN
334 k = index_in_comm(iloc(i))
335 DO j = 1,frontier(k)%NBCOM
336 p = frontier(k)%PROCLIST(j)
337 n = frontier(k)%BUF_INDEX(j)
341 bufr_id(bufpos(p)) = itab(nsv(i))
342 bufr_id(bufpos(p)+1) = n
343 bufpos(p) = bufpos(p) + 2
349 nb_secnd_recv(1:nspmd) = 0
359 IF(ispmd /= i-1 .AND.buffer(i)%NBMAIN >0 )
THEN
362 . mpi_int,i-1,tag,spmd_comm_world,rqs(k),ierr)
364 . mpi_int,i-1,tag,spmd_comm_world,rqr(k),ierr)
374 IF(ispmd /= i-1)
THEN
375 buflen = buflen + nb_secnd_recv(i)
379 ALLOCATE(bufr_idr(buflen*2))
391 IF(ispmd /= i-1)
THEN
392 j = nb_secnd_sent(i)*2
396 . mpi_int,i-1,tag,spmd_comm_world,rqs(ksent),ierr)
399 j = nb_secnd_recv(i)*2
403 . mpi_int,i-1,tag,spmd_comm_world,rqr(krecv),ierr)
409 IF(ksent > 0 )
CALL mpi_waitall(ksent, rqs,stat,ierr)
410 IF(krecv > 0 )
CALL mpi_waitall(krecv, rqr,stat,ierr)
419 rmax_uid_local = itab(nsv(isecnd))
421 IF(ispmd /= i-1)
THEN
428 rmax_uid_remote = bufr_idr(2*k-1)
429 IF(rmax_uid_local == rmax_uid_remote)
THEN
430 imain = bufr_idr(2*k)
431 iloc(isecnd) = buffer(i)%MAIN_ID(imain)
455 . ITAB,BUFFER,FRONTIER,INDEX_IN_COMM)
469 USE spmd_comm_world_mod,
ONLY : spmd_comm_world
470#include "implicit_f.inc"
474#include "com01_c.inc"
479 INTEGER :: NSV(*), ILOC(*), ITAB(*)
480 INTEGER :: INDEX_IN_COMM(*)
482 TYPE(front8) FRONTIER(*)
483 TYPE(buft8) BUFFER(*)
494 IF(ispmd /= p-1)
THEN
495 buffer(p)%NBSECND = 0
501 IF(index_in_comm(iloc(i))>0)
THEN
502 k = index_in_comm(iloc(i))
503 DO j = 1,frontier(k)%NBCOM
504 p = frontier(k)%PROCLIST(j)
505 n = frontier(k)%BUF_INDEX(j)
506 buffer(p)%NBSECND(n) = buffer(p)%NBSECND(n) + 1
514 buffer(i)%NBSECND_TOT = 0
515 DO j = 1,buffer(i)%NBMAIN
516 buffer(i)%NBSECND_TOT = buffer(i)%NBSECND_TOT +
517 . buffer(i)%NBSECND(j)
521 DEALLOCATE(buffer(i)%SECND_UID)
522 DEALLOCATE(buffer(i)%SECND_ID)
528 ALLOCATE(buffer(i)%SECND_UID(buffer(i)%NBSECND_TOT))
529 ALLOCATE(buffer(i)%SECND_ID(buffer(i)%NBSECND_TOT))
543 IF(index_in_comm(iloc(i)) > 0)
THEN
544 k = index_in_comm(iloc(i))
545 DO j = 1,frontier(k)%NBCOM
546 p = frontier(k)%PROCLIST(j)
547 n = frontier(k)%BUF_INDEX(j)
549 buffer(p)%SECND_ID(pt(p)) = i
550 buffer(p)%SECND_UID(pt(p)) = itab(nsv(i))
572 . TAB_RMAX, TAB_RMAX_UID,
589 USE spmd_comm_world_mod,
ONLY : spmd_comm_world
590#include "implicit_f.inc"
598#include "com01_c.inc"
603 INTEGER :: ITAB(*),IRTL(*)
604 INTEGER :: TAB_RMAX_UID(4,*),HAS_MOVED(*)
605 my_real :: TAB_RMAX(*)
606 TYPE(BUFT8) BUFFER(*)
612 INTEGER,
DIMENSION(:),
ALLOCATABLE :: BUFR_ID,BUFS_ID
613 my_real,
DIMENSION(:),
ALLOCATABLE :: BUFR,BUFS
615 INTEGER RQS(2*(NSPMD-1))
616 INTEGER RQR(2*(NSPMD-1))
617 INTEGER STAT(MPI_STATUS_SIZE,2*(NSPMD-1))
620 INTEGER RMAX_UID_LOCAL(4),RMAX_UID_REMOTE(4)
621 INTEGER ,BUFPOS2,HAS_MOVED_ON_REMOTE
624 INTEGER MSGOFF,MSGOFF2
628 INTEGER IS_SUP_FACE_ID
629 EXTERNAL is_sup_face_id
638 buflen = buflen+buffer(i)%NBSECND_TOT
641 ALLOCATE(bufr_id(buflen*5))
642 ALLOCATE(bufr(buflen))
643 ALLOCATE(bufs_id(buflen*5))
644 ALLOCATE(bufs(buflen))
645 bufr_id(1:buflen*5) = 0
646 bufr(1:buflen) = zero
647 bufs_id(1:buflen*5) = 0
648 bufs(1:buflen) = zero
655 IF( ispmd /= i-1)
THEN
656 DO j = 1,buffer(i)%NBSECND_TOT
657 n = buffer(i)%SECND_ID(j)
659 bufs(bufpos2 - 1+(j-1)+1) = tab_rmax(n)
660 bufs_id(bufpos1 - 1 + (j-1)*5+1) = tab_rmax_uid(1,n)
661 bufs_id(bufpos1 - 1 + (j-1)*5+2) = tab_rmax_uid(2,n)
662 bufs_id(bufpos1 - 1 + (j-1)*5+3) = tab_rmax_uid(3,n)
663 bufs_id(bufpos1 - 1 + (j-1)*5+4) = tab_rmax_uid(4,n)
664 bufs_id(bufpos1 - 1 + (j-1)*5+5) = has_moved(n)
667 n = buffer(i)%NBSECND_TOT
673 CALL mpi_isend(bufs_id(bufpos1),n*5,mpi_int,i-1,tag,spmd_comm_world,rqs(nbrq),ierr)
674 CALL mpi_irecv(bufr_id(bufpos1),n*5,mpi_int,i-1,tag,spmd_comm_world,rqr(nbrq),ierr)
675 bufpos1 = bufpos1 + 5*n
678 CALL mpi_isend(bufs(bufpos2),n,real,i-1,tag,spmd_comm_world,rqs(nbrq),ierr)
679 CALL mpi_irecv(bufr(bufpos2),n,real,i-1,tag,spmd_comm_world,rqr(nbrq),ierr)
680 bufpos2 = bufpos2 + n
693 IF(ispmd /= i-1)
THEN
694 n = buffer(i)%NBSECND_TOT
696 k = buffer(i)%SECND_ID(j)
697 rmax2 = bufr((j-1)+1+bufpos2)
698 rmax_uid_remote(1) = bufr_id((j-1)*5+1+bufpos1)
699 rmax_uid_remote(2) = bufr_id((j-1)*5+2+bufpos1)
700 rmax_uid_remote(3) = bufr_id((j-1)*5+3+bufpos1)
701 rmax_uid_remote(4) = bufr_id((j-1)*5+4+bufpos1)
702 has_moved_on_remote = bufr_id((j-1)*5+5+bufpos1)
705 rmax_uid_local(1) = tab_rmax_uid(1,k)
706 rmax_uid_local(2) = tab_rmax_uid(2,k)
707 rmax_uid_local(3) = tab_rmax_uid(3,k)
708 rmax_uid_local(4) = tab_rmax_uid(4,k)
710 iflag = is_sup_face_id(rmax_uid_local,rmax_uid_remote)
712 IF(has_moved(k) == 1)
THEN
717 IF(has_moved_on_remote == 0)
THEN
720 ELSEIF( rmax1 < rmax2 .OR. (rmax1 == rmax2 .AND. iflag == 1))
THEN
725 bufpos1 = bufpos1 + 5*n
726 bufpos2 = bufpos2 + n
729 DEALLOCATE(bufr_id,bufs_id)
730 DEALLOCATE(bufr,bufs)