43
44
45
48 USE intbufdef_mod
50 USE output_mod
51
52
53
54 USE spmd_comm_world_mod, ONLY : spmd_comm_world
55#include "implicit_f.inc"
56
57
58
59#include "spmd.inc"
60
61
62
63#include "param_c.inc"
64#include "com04_c.inc"
65#include "task_c.inc"
66#include "com01_c.inc"
67#include "com06_c.inc"
68#include "com08_c.inc"
69#include "scr07_c.inc"
70#include "scr14_c.inc"
71#include "scr16_c.inc"
72#include "impl1_c.inc"
73
74
75
76 TYPE(OUTPUT_), intent(inout) :: OUTPUT
77 INTEGER IPARI(NPARI,*),IAD_ELEM(2,*),FR_ELEM(*),
78 * SLVNDTAG(*),TAGPENE(*),ITAB(*),MODE
79
81 . mtf(14,*),a(3,*),fcont(3,*)
82
83 TYPE(INTBUF_STRUCT_) INTBUF_TAB(*)
84 TYPE(H3D_DATABASE) :: H3D_DATA
85
86
87
88#ifdef MPI
89 INTEGER STATUS(MPI_STATUS_SIZE),
90 * REQ_SI(NSPMD),REQ_RI(NSPMD)
91 INTEGER P,LENSD,LENRV,IADS(NSPMD+1),IADR(NSPMD+1),IERROR,
92 * SIZ,LOC_PROC,MSGTYP,IDEB(NINTER), , MSGOFF2
93 INTEGER NIN,NTY,INACTI
94 INTEGER J,L,NB,NN,K,NOD,LEN,ALEN,ND,FLG
96 * DIMENSION(:), ALLOCATABLE :: bbufs, bbufr
97 DATA msgoff/148/
98 DATA msgoff2/149/
99
100
101
102
103
104
105
106
107
108 loc_proc = ispmd+1
109 iads = 0
110 iadr = 0
111 lensd = 0
112 lenrv = 0
113
114 IF(mode==1)THEN
115 alen=5
116 ELSEIF(mode==2)THEN
117 alen=3
118 ELSEIF(mode==3)THEN
119 alen=7
120 ENDIF
121
122 DO p=1,nspmd
123 iadr(p)=lenrv+1
124 DO nin=1,ninter
125 nty=ipari(7,nin)
126 inacti =ipari(22,nin)
127 IF((nty==7.and.ipari(34,nin)==-2.and.inacti==7).OR.
128 . (nty==22.and.ipari(34,nin)==-2.and.inacti==7))THEN
129 lensd = lensd +
nsnfi(nin)%P(p)*alen
130 lenrv = lenrv +
nsnsi(nin)%P(p)*alen
131 ENDIF
132 ENDDO
133 ENDDO
134 iadr(nspmd+1)=lenrv+1
135
136 IF(lensd>0)THEN
137 ALLOCATE(bbufs(lensd),stat=ierror)
138 IF(ierror/=0) THEN
139 CALL ancmsg(msgid=20,anmode=aninfo)
141 ENDIF
142 ENDIF
143
144
145 IF(lenrv>0)THEN
146 ALLOCATE(bbufr(lenrv),stat=ierror)
147 IF(ierror/=0) THEN
148 CALL ancmsg(msgid=20,anmode=aninfo)
150 ENDIF
151 ENDIF
152
153 l=1
154 ideb=0
155 DO p=1, nspmd
156 iads(p)=l
157 IF (p/= loc_proc) THEN
158 DO nin=1,ninter
159 nty =ipari(7,nin)
160 inacti =ipari(22,nin)
161 IF((nty==7.and.ipari(34,nin)==-2.and.inacti==7).OR.
162 . (nty==22.and.ipari(34,nin)==-2.and.inacti==7)) THEN
163
165 IF (mode==1)THEN
166 DO nn=1,nb
169 bbufs(l+2)=
mtfi_n(nin)%P(1,nn+ideb(nin))
170 bbufs(l+3)=
mtfi_n(nin)%P(2,nn+ideb(nin))
171 bbufs(l+4)=
mtfi_n(nin)%P(3,nn+ideb(nin))
172 l=l+5
173 ENDDO
174 ideb(nin)=ideb(nin)+nb
175
176 ELSEIF (mode==2)THEN
177 DO nn=1,nb
178 bbufs(l )=
mtfi_v(nin)%P(1,nn+ideb(nin))
179 bbufs(l+1)=
mtfi_v(nin)%P(2,nn+ideb(nin))
180 bbufs(l+2)=
mtfi_v(nin)%P(3,nn+ideb(nin))
181
182
183
184 l=l+3
185 ENDDO
186 ideb(nin)=ideb(nin)+nb
187 ELSEIF (mode==3)THEN
188 DO nn=1,nb
189 bbufs(l )=
mtfi_a(nin)%P(1,nn+ideb(nin))
190 bbufs(l+1)=
mtfi_a(nin)%P(2,nn+ideb(nin))
191 bbufs(l+2)=
mtfi_a(nin)%P(3,nn+ideb(nin))
192 bbufs(l+3)=
mtfi_a(nin)%P(4,nn+ideb(nin))
193 bbufs(l+4)=
mtfi_a(nin)%P(5,nn+ideb(nin))
194 bbufs(l+5)=
mtfi_a(nin)%P(6,nn+ideb(nin))
195 bbufs(l+6)=
mtfi_a(nin)%P(7,nn+ideb(nin))
196 l=l+7
197 ENDDO
198 ideb(nin)=ideb(nin)+nb
199 ENDIF
200 ENDIF
201 ENDDO
202 siz = l-iads(p)
203 IF(siz>0)THEN
204 msgtyp = msgoff
205
207 . bbufs(iads(p)),siz,real ,it_spmd(p),msgtyp,
208 . spmd_comm_world,req_si(p),ierror )
209 ENDIF
210 ENDIF
211 ENDDO
212
213 l=0
214 ideb = 0
215 DO p=1, nspmd
216 l=0
217 siz=iadr(p+1)-iadr(p)
218 IF (siz > 0) THEN
219 msgtyp = msgoff
220
221
222 CALL mpi_recv( bbufr(iadr(p)),siz,real,it_spmd(p),msgtyp,
223 * spmd_comm_world,status,ierror )
224 DO nin=1,ninter
225 nty =ipari(7,nin)
226 inacti =ipari(22,nin)
227
228 IF((nty==7.and.ipari(34,nin)==-2.and.inacti==7).OR.
229 . (nty==22.and.ipari(34,nin)==-2.and.inacti==7))THEN
231 IF (nb > 0)THEN
232
233 IF(nty==7.OR.nty==10.OR.nty==22)THEN
234 IF(mode==1)THEN
235 DO k=1,nb
236 nd =
nsvsi(nin)%P(ideb(nin)+k)
237 nod=intbuf_tab(nin)%NSV(nd)
238 mtf(10,nod) = mtf(10,nod)+ bbufr(iadr(p)+l)
239 IF(bbufr(iadr(p)+l+1) > mtf(11,nod))THEN
240 mtf(11,nod) = bbufr(iadr(p)+l+1)
241 tagpene(nod) = p
242 ENDIF
243
244 mtf(12,nod) = mtf(12,nod)+bbufr(iadr(p)+l+2)
245 mtf(13,nod) = mtf(13,nod)+bbufr(iadr(p)+l+3)
246 mtf(14,nod) = mtf(14,nod)+bbufr(iadr(p)+l+4)
247 l=l+5
248 ENDDO
249 ELSEIF(mode==2)THEN
250 DO k=1,nb
251 nd =
nsvsi(nin)%P(ideb(nin)+k)
252 nod=intbuf_tab(nin)%NSV(nd)
253
254 mtf(1,nod) = mtf(1,nod)+bbufr(iadr(p)+l)
255 mtf(2,nod) = mtf(2,nod)+bbufr(iadr(p)+l+1)
256 mtf(3,nod) = mtf(3,nod)+bbufr(iadr(p)+l+2)
257
258
259
260
261 l=l+3
262 ENDDO
263 ELSEIF(mode==3)THEN
264 DO k=1,nb
265 nd =
nsvsi(nin)%P(ideb(nin)+k)
266 nod=intbuf_tab(nin)%NSV(nd)
267 IF(bbufr(iadr(p)+l+6) /= 0)THEN
268 a(1,nod) = bbufr(iadr(p)+l)
269 a(2,nod) = bbufr(iadr(p)+l+1)
270 a(3,nod) = bbufr(iadr(p)+l+2)
271 IF(anim_v(4)+outp_v(4)+h3d_data%N_VECT_CONT>0.AND.
272 . ((tt>=output%TANIM .AND. tt<=output%TANIM_STOP).OR.tt>=toutp.OR.
273 . (tt>=h3d_data%TH3D.AND.tt<=h3d_data%TH3D_STOP).OR.
274 . (manim>=4.AND.manim<=15)))THEN
275 IF(inconv == 1) THEN
276 fcont(1,nod) = fcont(1,nod)+bbufr(iadr(p)+l+3)
277 fcont(2,nod) = fcont(2,nod)+bbufr(iadr(p)+l+4)
278 fcont(3,nod) = fcont(3,nod)+bbufr(iadr(p)+l+5)
279 ENDIF
280 ENDIF
281 slvndtag(nod)=1
282 ENDIF
283 l=l+7
284 ENDDO
285 ENDIF
286 ENDIF
287 ENDIF
288 ENDIF
289 ideb(nin)=ideb(nin)+nb
290 ENDDO
291 ENDIF
292 l=l+siz
293 ENDDO
294
295
296 DO p = 1, nspmd
297 IF (p==nspmd)THEN
298 siz=lensd-iads(p)
299 ELSE
300 siz=iads(p+1)-iads(p)
301 ENDIF
302 IF(siz>0) THEN
303 CALL mpi_wait(req_si(p),status,ierror)
304 ENDIF
305 ENDDO
306
307 IF (ALLOCATED(bbufs)) DEALLOCATE(bbufs)
308 IF (ALLOCATED(bbufr)) DEALLOCATE(bbufr)
309
310
311
312
313 IF(mode==1)THEN
314 len=5
315 ELSEIF(mode==2)THEN
316 len=6
317 ELSEIF(mode==3)THEN
318 len=4
319 ELSE
320 len=0
321 ENDIF
322 lenrv = (iad_elem(1,nspmd+1)-iad_elem(1,1))*len
323
324 ALLOCATE(bbufs(lenrv))
325 ALLOCATE(bbufr(lenrv))
326
327 iadr(1) = 1
328 l=1
329 DO p=1,nspmd
330 siz = (iad_elem(1,p+1)-iad_elem(1,p))*len
331 IF(siz/=0)THEN
332 msgtyp = msgoff2
334 s bbufr(l),siz,real,it_spmd(p),msgtyp,
335 g spmd_comm_world,req_ri(p),ierror)
336 l = l + siz
337 ENDIF
338 iadr(p+1) = l
339 END DO
340
341
342
343 l=1
344 DO p=1,nspmd
345 iads(p)=l
346 DO j=iad_elem(1,p),iad_elem(1,p+1)-1
347 nod = fr_elem(j)
348 IF(mode==1)THEN
349 bbufs(l)=mtf(10,nod)
350 bbufs(l+1)=mtf(11,nod)
351 bbufs(l+2)=mtf(12,nod)
352 bbufs(l+3)=mtf(13,nod)
353 bbufs(l+4)=mtf(14,nod)
354 l=l+5
355 ELSEIF(mode==2)THEN
356 bbufs(l) =mtf(1,nod)
357 bbufs(l+1)=mtf(2,nod)
358 bbufs(l+2)=mtf(3,nod)
359
360
361
362
363
364 l=l+3
365 ELSEIF(mode==3)THEN
366 bbufs(l)=a(1,nod)
367 bbufs(l+1)=a(2,nod)
368 bbufs(l+2)=a(3,nod)
369 bbufs(l+3)=slvndtag(nod)
370 l=l+4
371 ENDIF
372 ENDDO
373 ENDDO
374 iads(nspmd+1)=l
375
376
377
378
379
380 DO p=1,nspmd
381 IF(iad_elem(1,p+1)-iad_elem(1,p)>0)THEN
382 msgtyp = msgoff2
383 siz = iads(1+p)-iads(p)
384 l = iads(p)
386 s bbufs(l),siz,real,it_spmd(p),msgtyp,
387 g spmd_comm_world,req_si(p),ierror)
388 ENDIF
389 ENDDO
390
391
392 DO p = 1, nspmd
393 nb = iad_elem(1,p+1)-iad_elem(1,p)
394 IF(nb>0)THEN
395 CALL mpi_wait(req_ri(p),status,ierror)
396 l = iadr(p)
397 DO j=iad_elem(1,p),iad_elem(1,p+1)-1
398 nod = fr_elem(j)
399 IF(mode==1)THEN
400 mtf(10,nod) = mtf(10,nod)+bbufr(l)
401 IF(bbufr(l+1) > abs(mtf(11,nod)))THEN
402 mtf(11,nod) = bbufr(l+1)
403 tagpene(nod) = p
404 ELSEIF(bbufr(l+1) == abs(mtf(11,nod)) .and.
405 . ispmd+1 > p)THEN
406 ELSE
407 mtf(11,nod) = abs(bbufr(l+1)*(1-em6))
408 ENDIF
409 mtf(12,nod) = mtf(12,nod)+bbufr(l+2)
410 mtf(13,nod) = mtf(13,nod)+bbufr(l+3)
411 mtf(14,nod) = mtf(14,nod)+bbufr(l+4)
412 l=l+5
413 ELSEIF(mode==2)THEN
414 mtf(1,nod)=mtf(1,nod)+bbufr(l)
415 mtf(2,nod)=mtf(2,nod)+bbufr(l+1)
416 mtf(3,nod)=mtf(3,nod)+bbufr(l+2)
417
418
419
420
421
422 l=l+3
423 ELSEIF(mode==3)THEN
424 flg=nint(bbufr(l+3))
425 IF(flg==1)THEN
426 a(1,nod)=bbufr(l)
427 a(2,nod)=bbufr(l+1)
428 a(3,nod)=bbufr(l+2)
429 ENDIF
430 l=l+4
431 ENDIF
432 ENDDO
433 ENDIF
434 ENDDO
435
436
437 DO p = 1, nspmd
438 siz=iads(p+1)-iads(p)
439 IF(siz>0) THEN
440 CALL mpi_wait(req_si(p),status,ierror)
441 ENDIF
442 ENDDO
443
444#endif
445 RETURN
446
subroutine mpi_recv(buf, cnt, datatype, source, tag, comm, status, ierr)
subroutine mpi_isend(buf, cnt, datatype, dest, tag, comm, ireq, ierr)
subroutine mpi_wait(ireq, status, ierr)
subroutine mpi_irecv(buf, cnt, datatype, source, tag, comm, ireq, ierr)
type(int_pointer), dimension(:), allocatable nsvsi
type(real_pointer2), dimension(:), allocatable mtfi_a
type(real_pointer), dimension(:), allocatable mtfi_pene
type(int_pointer), dimension(:), allocatable nsnsi
type(real_pointer2), dimension(:), allocatable mtfi_n
type(real_pointer), dimension(:), allocatable mtfi_penemin
type(real_pointer2), dimension(:), allocatable mtfi_v
type(int_pointer), dimension(:), allocatable nsnfi
subroutine ancmsg(msgid, msgtype, anmode, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, r1, r2, r3, r4, r5, r6, r7, r8, r9, c1, c2, c3, c4, c5, c6, c7, c8, c9, prmode)