170
171
172
173
174
176
177
178
179 USE spmd_comm_world_mod, ONLY : spmd_comm_world
180#include "implicit_f.inc"
181
182
183
184#include "spmd.inc"
185
186
187
188#include "com01_c.inc"
189#include "com04_c.inc"
190#include "task_c.inc"
191
192
193
194 INTEGER NRBDIM,ICSIZE, IAD_RBY(*),FR_RBY6(*),SIZE_RBY6_C
195 double precision
196 . rby6(8,6,nrbykin),rby6_c(2,6,size_rby6_c)
197
198
199
200#ifdef MPI
201 INTEGER MSGTYP,LOC_PROC,A_AR,NOD,L,I,J,K,IAD,,
202 . MSGOFF,SIZ,IDEB, LEN,INDEX,NBINDEX,
203 . INDEXI(NSPMD),REQ_R(),REQ_S(NSPMD)
204 INTEGER STATUS(MPI_STATUS_SIZE),IERROR
205 DATA msgoff/165/
206 double precision
207 . rbuf(icsize*6*nrbdim), sbuf(icsize*6*nrbdim)
208
209
210
211 a_ar=6*nrbdim
212
213 loc_proc = ispmd + 1
214 ideb = 1
215 l = 0
216 DO i = 1, nspmd
217 len = iad_rby(i+1)-iad_rby(i)
218 IF(len>0) THEN
219 siz = len*a_ar
220 l=l+1
221 indexi(l)=i
222 msgtyp = msgoff
224 s rbuf(ideb),siz,mpi_double_precision,it_spmd(i),msgtyp,
225 g spmd_comm_world,req_r(l),ierror)
226 ideb = ideb + siz
227 ENDIF
228 ENDDO
229 nbindex = l
230
231 ideb = 1
232 DO l = 1, nbindex
233 i = indexi(l)
234 len = iad_rby(i+1)-iad_rby(i)
235 iad = iad_rby(i)-1
236#include "vectorize.inc"
237 DO j = 1, len
238 irb = fr_rby6(iad+j)
239 DO k = 1, nrbdim-2
240 sbuf(ideb) = rby6(k,1,irb)
241 sbuf(ideb+1) = rby6(k,2,irb)
242 sbuf(ideb+2) = rby6(k,3,irb)
243 sbuf(ideb+3) = rby6(k,4,irb)
244 sbuf(ideb+4) = rby6(k,5,irb)
245 sbuf(ideb+5) = rby6(k,6,irb)
246 ideb=ideb+6
247 ENDDO
248 DO k = 1, 2
249 sbuf(ideb) = rby6_c(k,1,irb)
250 sbuf(ideb+1) = rby6_c(k,2,irb)
251 sbuf(ideb+2) = rby6_c(k,3,irb)
252 sbuf(ideb+3) = rby6_c(k,4,irb)
253 sbuf(ideb+4) = rby6_c(k,5,irb)
254 sbuf(ideb+5) = rby6_c(k,6,irb)
255 ideb=ideb+6
256 ENDDO
257 ENDDO
258 ENDDO
259
260 ideb = 1
261 DO l=1,nbindex
262 i = indexi(l)
263 len = iad_rby(i+1)-iad_rby(i)
264 siz = len*a_ar
265 msgtyp = msgoff
267 s sbuf(ideb),siz,mpi_double_precision,it_spmd(i),msgtyp,
268 g spmd_comm_world,req_s(l),ierror)
269 ideb = ideb + siz
270 ENDDO
271
272 DO l=1,nbindex
273 CALL mpi_waitany(nbindex,req_r,index,status,ierror)
274 i = indexi(index)
275 ideb = 1+(iad_rby(i)-1)*a_ar
276 len = iad_rby(i+1)-iad_rby(i)
277 iad = iad_rby(i)-1
278#include "vectorize.inc"
279 DO j = 1, len
280 irb = fr_rby6(iad+j)
281 DO k = 1, nrbdim-2
282 rby6(k,1,irb)= rby6(k,1,irb) + rbuf(ideb)
283 rby6(k,2,irb)= rby6(k,2,irb) + rbuf(ideb+1)
284 rby6(k,3,irb)= rby6(k,3,irb) + rbuf(ideb+2)
285 rby6(k,4,irb)= rby6(k,4,irb) + rbuf(ideb+3)
286 rby6(k,5,irb)= rby6(k,5,irb) + rbuf(ideb+4)
287 rby6(k,6,irb)= rby6(k,6,irb) + rbuf(ideb+5)
288 ideb = ideb + 6
289 ENDDO
290 DO k = 1, 2
291 rby6_c(k,1,irb)= rby6_c(k,1,irb) + rbuf(ideb)
292 rby6_c(k,2,irb)= rby6_c(k,2,irb) + rbuf(ideb+1)
293 rby6_c(k,3,irb)= rby6_c(k,3,irb) + rbuf(ideb+2)
294 rby6_c(k,4,irb)= rby6_c(k,4,irb) + rbuf(ideb+3)
295 rby6_c(k,5,irb)= rby6_c(k,5,irb) + rbuf(ideb+4)
296 rby6_c(k,6,irb)= rby6_c(k,6,irb) + rbuf(ideb+5)
297 ideb = ideb + 6
298 ENDDO
299 ENDDO
300 ENDDO
301
302 DO l=1,nbindex
303 CALL mpi_waitany(nbindex,req_s,index,status,ierror)
304 ENDDO
305
306#endif
307 RETURN