59#include "implicit_f.inc"
75 . x(3,*), xxx(3,*), xxxa(3,*), xxxsa(3,*)
80 INTEGER II, I, ITAG, LEN, ITAB(3,NSPMD-1),REQ(2*(NSPMD-1)),
81 . stat(mpi_status_size,2*(nspmd-1)), ierr, leni, lenr,
82 . iadi(nspmd-1), iadr(nspmd-1), iad, i1, i2, iad1, iad2,
83 . j, j1, itabl(3), pmain, msgoff, ido1, ido2
84 INTEGER,
DIMENSION(:),
ALLOCATABLE :: IBUF
86 . ,
DIMENSION(:),
ALLOCATABLE :: rbuf
95 ELSEIF (ido == 3)
THEN
99 IF (
fvspmd(ifv)%RANK == 0)
THEN
100 DO i=1,
fvspmd(ifv)%NSPMD-1
101 itab(1,i) =
fvspmd(ifv)%ITAB(1,i)
102 IF( ido2 == 1) itab(1,i)=itab(1,i)+
fvspmd(ifv)%ITAB(4,i)
104 itab(2,i)=
fvspmd(ifv)%ITAB(2,i)
105 itab(3,i)=
fvspmd(ifv)%ITAB(3,i)
115 DO i=1,
fvspmd(ifv)%NSPMD-1
119 leni=leni+itab(1,ii)+itab(2,ii)+itab(3,ii)
120 lenr=lenr+3*(itab(1,ii)+itab(2,ii)+itab(3,ii))
122 ALLOCATE(ibuf(leni), rbuf(lenr))
127 DO i=1,
fvspmd(ifv)%NSPMD-1
131 len=itab(1,ii)+itab(2,ii)+itab(3,ii)
132 req(ii) = mpi_request_null
133 IF(len > 0)
CALL mpi_irecv(ibuf(iad), len, mpi_integer, i,
134 . itag,
fvspmd(ifv)%MPI_COMM, req(ii), ierr)
138 DO i=1,
fvspmd(ifv)%NSPMD-1
142 len=3*(itab(1,ii)+itab(2,ii)+itab(3,ii))
143 req(
fvspmd(ifv)%NSPMD-1+ii) = mpi_request_null
144 IF(len >0 )
CALL mpi_irecv(rbuf(iad), len, real, i, itag,
145 .
fvspmd(ifv)%MPI_COMM, req(
fvspmd(ifv)%NSPMD-1+ii), ierr)
150 IF(ido2 == 1)len = len +
fvspmd(ifv)%NNI_L
152 i1=
fvspmd(ifv)%IBUF_L(1,i)
153 i2=
fvspmd(ifv)%IBUF_L(2,i)
160 i1=
fvspmd(ifv)%IBUFA_L(1,i)
161 i2=
fvspmd(ifv)%IBUFA_L(2,i)
162 IF (i2 <= numnod)
THEN
170 i1=
fvspmd(ifv)%IBUFSA_L(1,i)
171 i2=
fvspmd(ifv)%IBUFSA_L(2,i)
172 IF (i2 <= numnod)
THEN
182 DO i=1,
fvspmd(ifv)%NSPMD-1
190 xxx(1,j1)=rbuf(iad2-1+3*(j-1)+1)
191 xxx(2,j1)=rbuf(iad2-1+3*(j-1)+2)
192 xxx(3,j1)=rbuf(iad2-1+3*(j-1)
195 iad2=iad2+3*itab(1,ii)
198 xxxa(1,j1)=rbuf(iad2-1+3*(j-1)+1)
199 xxxa(2,j1)=rbuf(iad2-1+3*(j-1)+2)
200 xxxa(3,j1)=rbuf(iad2-1+3*(j-1)+3)
203 iad2=iad2+3*itab(2,ii)
206 xxxsa(1,j1)=rbuf(iad2-1+3*(j-1)+1)
207 xxxsa(2,j1)=rbuf(iad2-1+3*(j-1)+2)
208 xxxsa(3,j1)=rbuf(iad2-1+3*(j-1)+3)
211 DEALLOCATE(ibuf, rbuf)
212 ELSE IF(
fvspmd(ifv)%RANK > 0)
THEN
215 IF(ido2== 1 ) itabl(1)=itabl(1)+
fvspmd(ifv)%NNI_L
217 itabl(2)=
fvspmd(ifv)%NNA_L
218 itabl(3)=
fvspmd(ifv)%NNSA_L
225 len=itabl(1)+itabl(2)+itabl(3)
226 ALLOCATE(ibuf(len), rbuf(3*len))
230 IF(ido2 == 1) len = len +
fvspmd(ifv)%NNI_L
232 i1=
fvspmd(ifv)%IBUF_L(1,i)
233 i2=
fvspmd(ifv)%IBUF_L(2,i)
235 rbuf(iad2-1+3*(i-1)+1)=x(1,i2)
236 rbuf(iad2-1+3*(i-1)+2)=x(2,i2)
237 rbuf(iad2-1+3*(i-1)+3)=x(3,i2)
243 i1=
fvspmd(ifv)%IBUFA_L(1,i)
244 i2=
fvspmd(ifv)%IBUFA_L(2,i)
246 IF (i2 <= numnod)
THEN
248 rbuf(iad2-1+3*(i-1)+1)=x(1,i2)
249 rbuf(iad2-1+3*(i-1)+2)=x(2,i2)
250 rbuf(iad2-1+3*(i-1)+3)=x(3,i2)
253 iad1=iad1+
fvspmd(ifv)%NNA_L
254 iad2=iad2+3*
fvspmd(ifv)%NNA_L
256 i1=
fvspmd(ifv)%IBUFSA_L(1,i)
257 i2=
fvspmd(ifv)%IBUFSA_L(2,i)
259 IF (i2 <= numnod)
THEN
261 rbuf(iad2-1+3*(i-1)+1)=x(1,i2)
262 rbuf(iad2-1+3*(i-1)+2)=x(2,i2)
263 rbuf(iad2-1+3*(i-1)+3)=x(3,i2)
269 len=itabl(1)+itabl(2)+itabl(3)
270 req(1) = mpi_request_null
271 req(2) = mpi_request_null
272 IF(len > 0)
CALL mpi_isend(ibuf, len, mpi_integer, 0,
273 . itag,
fvspmd(ifv)%MPI_COMM, req(1), ierr)
276 len=3*(itabl(1)+itabl(2)+itabl(3))
277 IF(len > 0 )
CALL mpi_isend(rbuf, len, real, 0,
278 . itag,
fvspmd(ifv)%MPI_COMM, req(2), ierr)
281 DEALLOCATE(ibuf, rbuf)