251
252
253
255
256
257
258 USE spmd_comm_world_mod, ONLY : spmd_comm_world
259#include "implicit_f.inc"
260
261
262
263#include "spmd.inc"
264
265
266
267#include "com01_c.inc"
268#include "com04_c.inc"
269#include "task_c.inc"
270
271
272
273 INTEGER, INTENT(IN) :: IAD_STSH(*),FR_STSH(*),IAD_RTSH(*),FR_RTSH(*)
274 my_real ,
INTENT(INOUT) :: a(3,numnod)
275
276
277
278#ifdef MPI
279 INTEGER LENCOM,MSGOFF ,MSGTYP
280 my_real,
dimension(:),
ALLOCATABLE :: send_buf,rec_buf
281 INTEGER STATUS(MPI_STATUS_SIZE),REQ_R(NSPMD),REQ_S(NSPMD)
282 INTEGER IERROR
283 INTEGER P,J,NOD,SIZ,L,IAD
284
285 DATA msgoff/420/
286 msgtyp=msgoff
287
288 lencom = iad_stsh(nspmd+1) - iad_stsh(1)
289
290
291 ALLOCATE(send_buf(3*lencom),stat=ierror)
292 IF(ierror/=0) THEN
293 CALL ancmsg(msgid=20,anmode=aninfo)
295 ENDIF
296 lencom = iad_rtsh(nspmd+1) - iad_rtsh(1)
297
298 ALLOCATE(rec_buf(3*lencom),stat=ierror)
299 IF(ierror/=0) THEN
300 CALL ancmsg(msgid=20,anmode=aninfo)
302 ENDIF
303
304
305
306
307 l=1
308 DO p=1,nspmd
309 siz = 3*(iad_rtsh(p+1)-iad_rtsh(p))
310 IF(siz > 0) THEN
312 s rec_buf(l),siz,real,it_spmd(p),msgtyp,
313 g spmd_comm_world,req_r(p),ierror)
314 l=l+siz
315 ENDIF
316 ENDDO
317
318
319
320
321 l=1
322 DO p=1,nspmd
323 siz = 3*(iad_stsh(p+1)-iad_stsh(p))
324 IF(siz > 0)THEN
325 iad = l
326 DO j=iad_stsh(p),iad_stsh(p+1)-1
327 nod = fr_stsh(j)
328 send_buf(l) =a(1,nod)
329 send_buf(l+1)=a(2,nod)
330 send_buf(l+2)=a(3,nod)
331 l=l+3
332 ENDDO
333
335 s send_buf(iad),siz,real,it_spmd(p),msgtyp,
336 g spmd_comm_world,req_s(p),ierror)
337
338 ENDIF
339 ENDDO
340
341
342
343
344 l=1
345 DO p=1,nspmd
346 siz = 3*(iad_rtsh(p+1)-iad_rtsh(p))
347 IF(siz > 0)THEN
348 CALL mpi_wait(req_r(p),status,ierror)
349
350 DO j=iad_rtsh(p),iad_rtsh(p+1)-1
351 nod = fr_rtsh(j)
352 a(1,nod) = rec_buf(l)
353 a(2,nod) = rec_buf(l+1)
354 a(3,nod) = rec_buf(l+2)
355 l = l+3
356 ENDDO
357 ENDIF
358 ENDDO
359
360
361
362
363 DO p = 1, nspmd
364 IF(iad_stsh(p+1)-iad_stsh(p)>0)THEN
365 CALL mpi_wait(req_s(p),status,ierror)
366 ENDIF
367 ENDDO
368 IF (ALLOCATED(send_buf)) DEALLOCATE(send_buf)
369 IF (ALLOCATED(rec_buf)) DEALLOCATE(rec_buf)
370
371#endif
372
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)
subroutine ancmsg(msgid, msgtype, anmode, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, r1, r2, r3, r4, r5, r6, r7, r8, r9, c1, c2, c3, c4, c5, c6, c7, c8, c9, prmode)