108
109
110
112
113
114
115
116 USE spmd_comm_world_mod, ONLY : spmd_comm_world
117#include "implicit_f.inc"
118
119
120
121#include "spmd.inc"
122
123
124
125#include "com01_c.inc"
126#include "task_c.inc"
127
128
129
130 TYPE (FAILWAVE_STR_) ,TARGET :: FAILWAVE
131
132
133
134#ifdef MPI
135 INTEGER I,J,K,L,M,ND
136 INTEGER NDDIM
137
138
139
140 INTEGER MSGTYP,NOD,LOC_PROC, SIZ,NB_NOD,NB,MAXLEV,VALUE
141
142 INTEGER STATUS(MPI_STATUS_SIZE),IERROR
143
144 INTEGER MSGOFF1,MSGOFF2
145 INTEGER IAD_SEND(NSPMD+1),IAD_RECV(NSPMD+1)
146 INTEGER SEND_SIZ(NSPMD),RECV_SIZ(NSPMD)
147 INTEGER SIZ_SEND,SIZ_RECV
148
149 INTEGER REQ_S1(NSPMD), REQ_S2(NSPMD)
150 INTEGER REQ_R1(NSPMD), REQ_R2(NSPMD)
151
152 INTEGER, DIMENSION(:), ALLOCATABLE :: SBUFI,
153 INTEGER, DIMENSION(:), ALLOCATABLE :: SEND_BUF,RECV_BUF
154
155
156 DATA msgoff1/1280/
157 DATA msgoff2/1281/
158
159 nddim=failwave%NDDL
160 loc_proc = ispmd + 1
161
162
163
164
165 siz = failwave%FWAVE_IAD(nspmd+1)-failwave%FWAVE_IAD(1)
166 ALLOCATE(rbufi(siz))
167 ALLOCATE(sbufi(siz))
168
169
170
171
172 l = 1
173 iad_recv(1) = 1
174 DO i=1,nspmd
175 siz = failwave%FWAVE_IAD(i+1)-failwave%FWAVE_IAD(i)
176 IF (siz > 0)THEN
177 msgtyp = msgoff1
179 s rbufi(l),siz,mpi_integer,it_spmd(i),msgtyp,
180 g spmd_comm_world,req_r1(i),ierror)
181 l = l + siz
182 ENDIF
183 iad_recv(i+1) = l
184 END DO
185
186
187
188 send_siz(1:nspmd)=0
189
190 l = 1
191 iad_send(1) = 1
192 recv_siz(1:nspmd)=0
193 DO i=1,nspmd
194 DO j=failwave%FWAVE_IAD(i),failwave%FWAVE_IAD(i+1)-1
195 nod = failwave%FWAVE_FR(j)
196 sbufi(l) = failwave%MAXLEV(nod)
197 send_siz(i) = send_siz(i)+failwave%MAXLEV(nod)*nddim
198 l = l + 1
199 END DO
200 iad_send(i+1) = l
201 ENDDO
202
203
204
205 DO i=1,nspmd
206 IF(failwave%FWAVE_IAD(i+1)-failwave%FWAVE_IAD(i)>0)THEN
207 msgtyp = msgoff1
208 siz = iad_send(i+1)-iad_send(i)
209 l = iad_send(i)
211 s sbufi(l),siz,mpi_integer,it_spmd(i),msgtyp,
212 g spmd_comm_world,req_s1(i),ierror)
213 ENDIF
214 ENDDO
215
216
217
218 recv_siz(1:nspmd)=0
219
220 DO i = 1, nspmd
221 nb_nod = failwave%FWAVE_IAD(i+1)-failwave%FWAVE_IAD(i)
222
223 IF (nb_nod > 0)THEN
224 CALL mpi_wait(req_r1(i),status,ierror)
225 l = iad_recv(i)
226
227 DO j=failwave%FWAVE_IAD(i),failwave%FWAVE_IAD(i+1)-1
228 recv_siz(i) = recv_siz(i) + rbufi(l)*nddim
229 l = l + 1
230 END DO
231 ENDIF
232 END DO
233
234
235
236
237
238 DO i
239 IF (failwave%FWAVE_IAD(i+1)-failwave%FWAVE_IAD(i) > 0)THEN
240 CALL mpi_wait(req_s1(i),status,ierror)
241 ENDIF
242 ENDDO
243
244
245
246
247
248 iad_send(1)=1
249 iad_recv(1)=1
250
251 DO i=1,nspmd
252 iad_send(i+1)=iad_send(i)+send_siz(i)
253 iad_recv(i+1)=iad_recv(i)+recv_siz(i)
254 ENDDO
255
256 siz_send = (iad_send(nspmd+1)-iad_send(1))
257 siz_recv = (iad_recv(nspmd+1)-iad_recv(1))
258
259 ALLOCATE(send_buf(siz_send))
260 ALLOCATE(recv_buf(siz_recv))
261
262
263
264
265
266 l = 1
267 DO i=1,nspmd
268 siz = iad_recv(i+1)-iad_recv(i)
269 IF (siz > 0)THEN
270 msgtyp = msgoff2
272 s recv_buf(l),siz,mpi_integer,it_spmd(i),msgtyp,
273 g spmd_comm_world,req_r2(i),ierror)
274 l = l + siz
275 ENDIF
276 END DO
277
278
279
280
281
282 k=1
283 DO i=1,nspmd
284 DO j=failwave%FWAVE_IAD(i),failwave%FWAVE_IAD(i+1)-1
285 nd = failwave%FWAVE_FR(j)
286 DO l=1,failwave%MAXLEV(nd)
287 DO m=1,nddim
288 send_buf(k) = failwave%FWAVE_NOD(m,nd,l)
289 k = k +1
290 ENDDO
291 ENDDO
292 ENDDO
293 ENDDO
294
295
296
297
298 DO i=1,nspmd
299 siz = iad_send(i+1)-iad_send(i)
300 IF (siz > 0)THEN
301 l = iad_send(i)
302
303 msgtyp = msgoff2
305 s send_buf(l),siz,mpi_integer,it_spmd(i),msgtyp,
306 g spmd_comm_world,req_s2(i),ierror)
307 ENDIF
308 ENDDO
309
310
311
312
313
314 recv_siz(1:nspmd)=0
315
316 DO i = 1, nspmd
317 siz = iad_recv(i+1)-iad_recv(i)
318 IF (siz > 0)THEN
319 CALL mpi_wait(req_r2(i),status,ierror)
320 l = iad_recv(i)
321
322 DO j=failwave%FWAVE_IAD(i),failwave%FWAVE_IAD(i+1)-1
323
324 nb=rbufi(j)
325 IF (nb > 0)THEN
326 nd = failwave%FWAVE_FR(j)
327 IF (failwave%WAVE_MOD == 1) THEN
328 DO m=1,nb
329 DO k=1,nddim
330 VALUE = recv_buf(l)
331 failwave%FWAVE_NOD(k,nd,1)=
max(
VALUE,failwave%FWAVE_NOD(k,nd,1))
332
333 l=l+1
334 ENDDO
335 ENDDO
336 ELSE
337 DO m=1,nb
338 failwave%MAXLEV(nd)=failwave%MAXLEV(nd)+1
339 maxlev = failwave%MAXLEV(nd)
340 DO k=1,nddim
341 VALUE = recv_buf(l)
342 failwave%FWAVE_NOD(k,nd,maxlev)=VALUE
343
344 l=l+1
345 ENDDO
346 ENDDO
347 ENDIF
348 ENDIF
349 END DO
350 ENDIF
351 END DO
352
353
354
355
356
357 DO i = 1, nspmd
358 siz = iad_send(i+1)-iad_send(i)
359 IF (siz > 0)THEN
360 CALL mpi_wait(req_s2(i),status,ierror)
361 ENDIF
362 ENDDO
363 DEALLOCATE(send_buf)
364 DEALLOCATE(recv_buf)
365
366 DEALLOCATE(rbufi)
367 DEALLOCATE(sbufi)
368
369#endif
370
371 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)