33
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#include "com04_c.inc"
51#include "task_c.inc"
52
53
54
55 INTEGER IFV
57 . x(3,*), xxx(3,*), xxxa(3,*),
58 . v(3,*), vvv(3,*), vvva(3,*)
59
60
61
62
63#ifdef MPI
64 INTEGER II, I, ITAG, LEN, ITAB(3,NSPMD-1),
65 . STAT(MPI_STATUS_SIZE,2*(NSPMD-1)), IERR, LENI, LENR,
66 . IAD, I1, I2, IAD1, IAD2,
67 . J, J1, ITABL(3), PMAIN, MSGOFF
68
69 DATA msgoff/205/
70
71 ALLOCATE(
fvspmd(ifv)%REQ(2*(nspmd-1)))
72 ALLOCATE(
fvspmd(ifv)%IADI(nspmd-1))
73 ALLOCATE(
fvspmd(ifv)%IADR(nspmd-1))
74
75
76
77 IF (
fvspmd(ifv)%RANK == 0)
THEN
79 itab(1,i) =
fvspmd(ifv)%ITAB(1,i)
80 itab(1,i) = itab(1,i)+
fvspmd(ifv)%ITAB(4,i)
81 itab(2,i) =
fvspmd(ifv)%ITAB(2,i)
82 itab(3,i) =
fvspmd(ifv)%ITAB(3,i)
83 ENDDO
84
85 leni=0
86 lenr=0
87 ii=0
89 ii=ii+1
90 fvspmd(ifv)%IADI(ii)=leni+1
91 fvspmd(ifv)%IADR(ii)=lenr+1
92 leni=leni+(itab(1,ii)+itab(2,ii)+itab(3,ii))
93 lenr=lenr+6*(itab(1,ii)+itab(2,ii)+itab(3,ii))
94 ENDDO
96
97 ii=0
99 ii=ii+1
100 itag=msgoff
102 len=(itab(1,ii)+itab(2,ii)+itab(3,ii))
104 . itag,
fvspmd(ifv)%MPI_COMM,
fvspmd(ifv)%REQ(ii), ierr)
105 ENDDO
106
107 ii=0
108 DO i=1,
fvspmd(ifv)%NSPMD-1
109 ii=ii+1
110 itag=msgoff
112 len=6*(itab(1,ii)+itab(2,ii)+itab(3,ii))
115 ENDDO
116
118
119 len = len +
fvspmd(ifv)%NNI_L
120 DO i=1,len
121 i1=
fvspmd(ifv)%IBUF_L(1,i)
122 i2=
fvspmd(ifv)%IBUF_L(2,i)
123 xxx(1,i1)=x(1,i2)
124 xxx(2,i1)=x(2,i2)
125 xxx(3,i1)=x(3,i2)
126 vvv(1,i1)=v(1,i2)
127 vvv(2,i1)=v(2,i2)
128 vvv(3,i1)=v(3,i2)
129
130 ENDDO
132 i1=
fvspmd(ifv)%IBUFA_L(1,i)
133 i2=
fvspmd(ifv)%IBUFA_L(2,i)
134 IF(i2<=numnod) THEN
135 xxxa(1,i1)=x(1,i2)
136 xxxa(2,i1)=x(2,i2)
137 xxxa(3,i1)=x(3,i2)
138 vvva(1,i1)=v(1,i2)
139 vvva(2,i1)=v(2,i2)
140 vvva(3,i1)=v(3,i2)
141 ENDIF
142 ENDDO
143 ELSE IF(
fvspmd(ifv)%RANK > 0)
THEN
145
146 itabl(1)=itabl(1)+
fvspmd(ifv)%NNI_L
147 itabl(2)=
fvspmd(ifv)%NNA_L
148 itabl(3)= 0
150
151 len=itabl(1)+itabl(2)+itabl(3)
152 ALLOCATE(
fvspmd(ifv)%IBUF(len),
fvspmd(ifv)%RBUF(6*len))
153 iad1=1
154 iad2=1
156 len = len +
fvspmd(ifv)%NNI_L
157 DO i=1,len
158 i1=
fvspmd(ifv)%IBUF_L(1,i)
159 i2=
fvspmd(ifv)%IBUF_L(2,i)
160 fvspmd(ifv)%IBUF(iad1-1+i)=i1
161 fvspmd(ifv)%RBUF(iad2-1+6*(i-1)+1)=x(1,i2)
162 fvspmd(ifv)%RBUF(iad2-1+6*(i-1)+2)=x(2,i2)
163 fvspmd(ifv)%RBUF(iad2-1+6*(i-1)+3)=x(3,i2)
164 fvspmd(ifv)%RBUF(iad2-1+6*(i-1)+4)=v(1,i2)
165 fvspmd(ifv)%RBUF(iad2-1+6*(i-1)+5)=v(2,i2)
166 fvspmd(ifv)%RBUF(iad2-1+6*(i-1)+6)=v(3,i2)
167 ENDDO
168 iad1=iad1+len
169 iad2=iad2
171 i1=
fvspmd(ifv)%IBUFA_L(1,i)
172 i2=
fvspmd(ifv)%IBUFA_L(2,i)
173 IF (i2 <= numnod) THEN
174
175 fvspmd(ifv)%RBUF(iad2-1+6*(i-1)+1)=x(1,i2)
176 fvspmd(ifv)%RBUF(iad2-1+6*(i-1)+2)=x(2,i2)
177 fvspmd(ifv)%RBUF(iad2-1+6*(i-1)+3)=x(3,i2)
178 fvspmd(ifv)%RBUF(iad2-1+6*(i-1)+4)=v(1,i2)
179 fvspmd(ifv)%RBUF(iad2-1+6*(i-1)+5)=v(2,i2)
180 fvspmd(ifv)%RBUF(iad2-1+6*(i-1)+6)=v(3,i2)
181 fvspmd(ifv)%IBUF(iad1-1+i)=i1
182 ELSE
183 fvspmd(ifv)%RBUF(iad2-1+6*(i-1)+1)=zero
184 fvspmd(ifv)%RBUF(iad2-1+6*(i-1)+2)=zero
185 fvspmd(ifv)%RBUF(iad2-1+6*(i-1)+3)=zero
186 fvspmd(ifv)%RBUF(iad2-1+6*(i-1)+4)=zero
187 fvspmd(ifv)%RBUF(iad2-1+6*(i-1)+5)=zero
188 fvspmd(ifv)%RBUF(iad2-1+6*(i-1)+6)=zero
189 fvspmd(ifv)%IBUF(iad1-1+i)=-i1
190 ENDIF
191
192 ENDDO
193 iad1=iad1+
fvspmd(ifv)%NNA_L
194 iad2=iad2+3*
fvspmd(ifv)%NNA_L
195
196
197 itag=msgoff
198 len=itabl(1)+itabl(2)+itabl(3)
201
202 itag=msgoff
203 len=6*(itabl(1)+itabl(2)+itabl(3))
206
207 ENDIF
208
209
210#endif
211 RETURN
subroutine mpi_isend(buf, cnt, datatype, dest, tag, comm, ireq, ierr)
subroutine mpi_irecv(buf, cnt, datatype, source, tag, comm, ireq, ierr)
type(fvbag_spmd), dimension(:), allocatable fvspmd