164
165
166
167 USE spmd_comm_world_mod, ONLY : spmd_comm_world
168#include "implicit_f.inc"
169
170
171
172#include "spmd.inc"
173
174
175
176#include "com01_c.inc"
177#include "com04_c.inc"
178#include "task_c.inc"
179#include "param_c.inc"
180
181
182
183 INTEGER, DIMENSION(*), INTENT(IN) :: ISKWP
184 my_real,
DIMENSION(LSKEW,*),
INTENT(INOUT) :: skew
185
186
187
188
189
190
191
192
193
194
195#ifdef MPI
196 INTEGER :: I,K,N,LOC_PROC,j
197 INTEGER :: IERROR
198 INTEGER :: SENDCOUNT,TOTAL_RECV
199 INTEGER, DIMENSION(NSPMD) :: RECVCOUNT,DIPSPL
200 my_real,
DIMENSION(10*NUMSKW) :: sbuf,rbuf
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231 loc_proc = ispmd + 1
232 recvcount(1:nspmd) = 0
233 dipspl(1:nspmd) = 0
234 k = 0
235
236 DO n = 1, numskw
237 IF(abs(iskwp(n+1))==loc_proc)THEN
238 k = k + 1
239 sbuf(1+(k-1)*10) = skew(1,n+1)
240 sbuf(2+(k-1)*10) = skew(2,n+1)
241 sbuf(3+(k-1)*10) = skew(3,n+1)
242 sbuf(4+(k-1)*10) = skew(4,n+1)
243 sbuf(5+(k-1)*10) = skew(5,n+1)
244 sbuf(6+(k-1)*10) = skew(6,n+1)
245 sbuf(7+(k-1)*10) = skew(7,n+1)
246 sbuf(8+(k-1)*10) = skew(8,n+1)
247 sbuf(9+(k-1)*10) = skew(9,n+1)
248 sbuf(10+(k-1)*10) = n+1
249 END IF
250 IF(iskwp(n+1)/=0) recvcount(abs(iskwp(n+1))) = recvcount(abs(iskwp(n+1))) + 10
251 END DO
252
253
254 sendcount = k*10
255 dipspl(1)=0
256 total_recv = recvcount(1)
257 DO i=2,nspmd
258 dipspl(i)=recvcount(i-1)+dipspl(i-1)
259 total_recv = total_recv + recvcount(i)
260 ENDDO
261 total_recv = total_recv / 10
262
263
264 CALL mpi_gatherv(sbuf,sendcount,real,rbuf,recvcount,dipspl,real,0,spmd_comm_world,ierror)
265
266
267 IF(ispmd==0) THEN
268 DO i=1,total_recv
269 k = nint(rbuf(10+(i-1)*10))
270 skew(1,k) = rbuf(1+(i-1)*10)
271 skew(2,k) = rbuf(2+(i-1)*10)
272 skew(3,k) = rbuf(3+(i-1)*10)
273 skew(4,k) = rbuf(4+(i-1)*10)
274 skew(5,k) = rbuf(5+(i-1)*10)
275 skew(6,k) = rbuf(6+(i-1)*10)
276 skew(7,k) = rbuf(7+(i-1)*10)
277 skew(8,k) = rbuf(8+(i-1)*10)
278 skew(9,k) = rbuf(9+(i-1)*10)
279 ENDDO
280 ENDIF
281
282#endif
283 RETURN
subroutine mpi_gatherv(sendbuf, cnt, datatype, recvbuf, reccnt, displs, rectype, root, comm, ierr)