36 USE spmd_mod
37
38
39
40#include "implicit_f.inc"
41
42
43
44#include "spmd.inc"
45
46
47
48#include "com01_c.inc"
49#include "task_c.inc"
50
51
52
53 INTEGER NODNX_SMS(*), IAD_ELEM(2,*), FR_ELEM(*), SIZE, LENR
55 . v(SIZE,*)
56
57
58
59#ifdef MPI
60 INTEGER MSGTYP,I,NOD,LOC_PROC,IERROR, MSGOFF,
61 . SIZ,J,L,NB_NOD,K,
62 . STATUS(MPI_STATUS_SIZE),
63 . IAD_SEND(NSPMD+1),IAD_RECV(NSPMD+1),
64 . REQ_R(NSPMD),REQ_S(NSPMD)
66 . rbuf(size*lenr), sbuf(size*lenr), w(SIZE,lenr)
67 DATA msgoff/213/
68
69
70
71 loc_proc = ispmd + 1
72 l = 1
73 iad_recv(1) = 1
74 DO i=1,nspmd
75
76 siz = 0
77 DO j=iad_elem(1,i),iad_elem(1,i+1)-1
78 nod = fr_elem(j)
79 IF(nodnx_sms(nod)/=0)THEN
80 siz = siz + SIZE
81 END IF
82 END DO
83
84 IF(siz/=0)THEN
85 msgtyp = msgoff
87 s rbuf(l),siz,real,it_spmd(i),msgtyp,
88 g spmd_comm_world,req_r(i),ierror)
89 l = l + siz
90 ENDIF
91 iad_recv(i+1) = l
92 END DO
93 l = 1
94 iad_send(1) = 1
95 DO i=1,nspmd
96#include "vectorize.inc"
97 DO j=iad_elem(1,i),iad_elem(1,i+1)-1
98 nod = fr_elem(j)
99 IF(nodnx_sms(nod)/=0)THEN
100 DO k=1,SIZE
101 sbuf(l+k-1) = v(k,nod)
102 END DO
103 l = l + SIZE
104 END IF
105 END DO
106 iad_send(i+1) = l
107 ENDDO
108
109
110
111 DO i=1,nspmd
112
113
114 IF(iad_send(i+1)-iad_send(i)>0)THEN
115 msgtyp = msgoff
116 siz = iad_send(i+1)-iad_send(i)
117 l = iad_send(i)
119 s sbuf(l),siz,real,it_spmd(i),msgtyp,
120 g spmd_comm_world,req_s(i),ierror)
121 ENDIF
122
123 ENDDO
124
125 DO j=1,iad_elem(1,nspmd+1)-1
126 nod = fr_elem(j)
127 IF(nodnx_sms(nod)/=0)THEN
128 DO k=1,SIZE
129 w(k,j) = v(k,nod)
130 v(k,nod) = zero
131 END DO
132 END IF
133 END DO
134
135 DO i = 1, loc_proc-1
136
137 IF(iad_recv(i+1)-iad_recv(i)>0)THEN
138 CALL mpi_wait(req_r(i),status,ierror)
139 l = iad_recv(i)
140#include "vectorize.inc"
141 DO j=iad_elem(1,i),iad_elem(1,i+1)-1
142 nod = fr_elem(j)
143 IF(nodnx_sms(nod)/=0) THEN
144 DO k=1,SIZE
145 v(k,nod) = v(k,nod)+rbuf(l+k-1)
146 END DO
147 l = l + SIZE
148 END IF
149 END DO
150 ENDIF
151 END DO
152
153 DO j=1,iad_elem(1,nspmd+1)-1
154 nod = fr_elem(j)
155 IF(nodnx_sms(nod)/=0)THEN
156 DO k=1,SIZE
157 v(k,nod) = v(k,nod) + w(k,j)
158 END DO
159 END IF
160 END DO
161
162 DO i = loc_proc+1,nspmd
163
164 IF(iad_recv(i+1)-iad_recv(i)>0)THEN
165 CALL mpi_wait(req_r(i),status,ierror)
166 l = iad_recv(i)
167#include "vectorize.inc"
168 DO j=iad_elem(1,i),iad_elem(1,i+1)-1
169 nod = fr_elem(j)
170 IF(nodnx_sms(nod)/=0) THEN
171 DO k=1,SIZE
172 v(k,nod) = v(k,nod)+rbuf(l+k-1)
173 END DO
174 l = l + SIZE
175 END IF
176 END DO
177 ENDIF
178 END DO
179
180 DO i = 1, nspmd
181
182 IF(iad_send(i+1)-iad_send(i)>0)THEN
183 CALL mpi_wait(req_s(i),status,ierror)
184 ENDIF
185 ENDDO
186
187#endif
188 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)