34
35
36
38
39
40
41#include "implicit_f.inc"
42
43
44
45#include "spmd.inc"
46
47
48
49#include "com01_c.inc"
50
51
52
53 INTEGER , ITABS(*), ITABG(*)
54
55
56
57#ifdef MPI
58 INTEGER II, I, ITAG, MSGOFF, REQ(NSPMD-1), IERR,
59 . STAT(MPI_STATUS_SIZE, NSPMD-1), LEN, IADI(NSPMD-1),
60 . IAD, I1, I2, J1, J2, PMAIN, NNT, J, ITAB(-1)
61 INTEGER, DIMENSION(:), ALLOCATABLE :: IBUF
62 DATA msgoff/205/
63
64 IF (
fvspmd(ifv)%RANK == 0)
THEN
65
66 ii=0
67 DO i=1,
fvspmd(ifv)%NSPMD - 1
68 ii=ii+1
69 itag=msgoff+i
70 CALL mpi_irecv(itab(ii), 1, mpi_integer, i,
71 . itag,
fvspmd(ifv)%MPI_COMM, req(ii), ierr)
72 ENDDO
73
75
76 len=0
77 ii=0
79 ii=ii+1
80 iadi(ii)=len+1
81 len=len+2*itab(ii)
82 ENDDO
83 ALLOCATE(ibuf(len))
84
85 ii=0
87 ii=ii+1
88 itag=msgoff+nspmd+i
89 iad=iadi(ii)
90 len=2*itab(ii)
91 CALL mpi_irecv(ibuf(iad), len, mpi_integer, i,
92 . itag,
fvspmd(ifv)%MPI_COMM, req(ii), ierr)
93 ENDDO
94
98 itabg(i1)=itabs(i2)
99 ENDDO
100
102
103 ii=0
104 DO i=1,
fvspmd(ifv)%NSPMD - 1
105 ii=ii+1
106 iad=iadi(ii)
107 DO j=1,itab(ii)
108 j1=ibuf(iad-1+j)
109 j2=ibuf(iad-1+itab(ii)+j)
110 itabg(j1)=j2
111 ENDDO
112 ENDDO
113 DEALLOCATE(ibuf)
114 ELSE IF(
fvspmd(ifv)%RANK > 0)
THEN
117 itag=msgoff+
fvspmd(ifv)%RANK
119 . itag,
fvspmd(ifv)%MPI_COMM, req(1), ierr)
120
122
123 len=2*nnt
124 ALLOCATE(ibuf(len))
125 DO i=1,nnt
126 ibuf(i)=
fvspmd(ifv)%IBUF_L(1,i)
127 ii=
fvspmd(ifv)%IBUF_L(2,i)
128 ibuf(nnt+i)=itabs(ii)
129 ENDDO
130
131 itag=msgoff+nspmd+
fvspmd(ifv)%RANK
132 CALL mpi_isend(ibuf, len, mpi_integer, 0,
133 . itag,
fvspmd(ifv)%MPI_COMM, req(2), ierr)
134
136 DEALLOCATE(ibuf)
137 ENDIF
138
139#endif
140 RETURN
subroutine mpi_isend(buf, cnt, datatype, dest, tag, comm, ireq, ierr)
subroutine mpi_wait(ireq, status, ierr)
subroutine mpi_waitall(cnt, array_of_requests, status, ierr)
subroutine mpi_irecv(buf, cnt, datatype, source, tag, comm, ireq, ierr)
type(fvbag_spmd), dimension(:), allocatable fvspmd