34
35
36
37 USE spmd_comm_world_mod, ONLY : spmd_comm_world
38#include "implicit_f.inc"
39
40
41
42#include "spmd.inc"
43
44
45
46#include "com01_c.inc"
47#include "com04_c.inc"
48#include "task_c.inc"
49
50
51
52 INTEGER LCOMM, ITAGND(*), FR_CNDS(*), IAD_CNDS(*)
53
54
55
56#ifdef MPI
57 INTEGER MSGTYP,LOC_PROC,NOD,I,J,L,IDEB,IAD,LEN,
58 . NBINDEX,INDEX,MSGOFF,SIZ,IERROR,
59 . STATUS(MPI_STATUS_SIZE),
60 . REQ_S(NSPMD),REQ_R(NSPMD),INDEXI(NSPMD)
61 DATA msgoff/1179/
62 integer
63 . sbuf(lcomm),rbuf(lcomm)
64
65
66
67 loc_proc = ispmd + 1
68 DO i=1,nspmd
69 siz = iad_cnds(i+1)-iad_cnds(i)
70 IF(siz>0)THEN
71 l = iad_cnds(i)
72 msgtyp = msgoff
74 s rbuf(l),siz ,mpi_integer,it_spmd(i),msgtyp,
75 g spmd_comm_world,req_r(i),ierror)
76 ENDIF
77 END DO
78
79
80
81 DO i=1,nspmd
82 DO j=iad_cnds(i),iad_cnds(i+1)-1
83 nod = fr_cnds(j)
84 IF (iabs(itagnd(nod))>ns10e) THEN
85 sbuf(j) = 1
86 ELSE
87 sbuf(j) = 0
88 END IF
89 ENDDO
90 ENDDO
91
92
93
94 DO i=1,nspmd
95 siz = iad_cnds(i+1)-iad_cnds(i)
96 IF(siz>0)THEN
97 l = iad_cnds(i)
98 msgtyp = msgoff
100 + sbuf(l),siz,mpi_integer,it_spmd(i),msgtyp,
101 + spmd_comm_world,req_s(i),ierror)
102 ENDIF
103 ENDDO
104
105
106
107 DO i=1,nspmd
108 siz = iad_cnds(i+1)-iad_cnds(i)
109 IF(siz>0)THEN
110 CALL mpi_wait(req_r(i),status,ierror)
111 DO j=iad_cnds(i),iad_cnds(i+1)-1
112 nod = fr_cnds(j)
113 IF (itagnd(nod)>0) THEN
114 IF (itagnd(nod)<=ns10e.AND.rbuf(j)==1)
115 + itagnd(nod) = itagnd(nod) + ns10e
116 ELSEIF(itagnd(nod)<0) THEN
117 IF (itagnd(nod)>=-ns10e.AND.rbuf(j)==1)
118 + itagnd(nod) = itagnd(nod) - ns10e
119 END IF
120 ENDDO
121 ENDIF
122 ENDDO
123
124
125 DO i = 1, nspmd
126 IF((iad_cnds(i+1)-iad_cnds(i))>0)THEN
127 CALL mpi_wait(req_s(i),status,ierror)
128 ENDIF
129 ENDDO
130
131#endif
132 RETURN
subroutine mpi_isend(buf, cnt, datatype, dest, tag, comm, ireq, ierr)
subroutine mpi_wait(ireq, status, ierr)
subroutine mpi_irecv(buf, cnt, datatype, source, tag, comm, ireq, ierr)