42
43
44
48
49
50
51 USE spmd_comm_world_mod, ONLY : spmd_comm_world
52#include "implicit_f.inc"
53#include "r4r8_p.inc"
54
55
56
57#include "spmd.inc"
58
59
60
61#include "com01_c.inc"
62#include "com04_c.inc"
63#include "task_c.inc"
64#include "timeri_c.inc"
65
66
67
68 INTEGER NIN, INACTI, IGAP, NRTM,
69 . IRECTM(4,NRTM), NSHELR,
70 . ISENDTO(NINTER+1,*), IRCVFROM(NINTER+1,*),
71 . IAD_ELEM(2,*), FR_ELEM(*), ITAB(*) , ITASK
72
74 . x(3,*), v(3,*), bminmal(6),
75 . stife(nrtm), tzinf
76
77
78
79#ifdef MPI
80 INTEGER MSGTYP,,I, LOC_PROC,P,IDEB,
81 . MSGOFF, MSGOFF2, MSGOFF3, MSGOFF4,
82 . , L, LEN, NB_, NRTMR, IERROR1, IAD,
83 . STATUS(MPI_STATUS_SIZE),IERROR,REQ_SB(NSPMD),
84 . REQ_RB(NSPMD),KK,NBIRECV,IRINDEXI(NSPMD),
85 . REQ_RD(NSPMD),REQ_SD(NSPMD),REQ_SD2(NSPMD),
86 . REQ_RC(NSPMD),REQ_SC(NSPMD),
87 . INDEXI,ISINDEXI(NSPMD),INDEX(NRTM),NBOX(NSPMD),
88 . NBX,NBY,NBZ,IX,IY,IZ, N1, N2, N3, N4,
89 . IX1,IY1,IZ1,IX2,IY2,IZ2, NOD
91 . bminma(6,nspmd),
92 . xmaxb,ymaxb,zmaxb,xminb,yminb,zminb
93 TYPE(r8_pointer), DIMENSION(NSPMD) :: BUF
95 . dx, dy, dz,
96 . xmin,ymin,zmin,xmax,
ymax,zmax
97 LOGICAL ::
98 . TEST
99 DATA msgoff/138/
100 DATA msgoff2/139/
101 DATA msgoff3/140/
102 DATA msgoff4/141/
103
104
105
106
107
108
109
110
111 loc_proc = ispmd + 1
115
116
117
118 IF(ircvfrom(nin,loc_proc)==0.AND.
119 . isendto(nin,loc_proc)==0) RETURN
120 bminma(1,loc_proc) = bminmal(1)
121 bminma(2,loc_proc) = bminmal(2)
122 bminma(3,loc_proc) = bminmal(3)
123 bminma(4,loc_proc) = bminmal(4)
124 bminma(5,loc_proc) = bminmal(5)
125 bminma(6,loc_proc) = bminmal(6)
126
127
128
129
130 IF(ircvfrom(nin,loc_proc)/=0) THEN
131 DO p = 1, nspmd
132 IF(isendto(nin,p)/=0) THEN
133 IF(p/=loc_proc) THEN
134 msgtyp = msgoff
138 . mpi_integer,
139 . it_spmd(p),msgtyp,spmd_comm_world,req_sc(p),ierror)
140 msgtyp = msgoff2
142 . bminma(1,loc_proc),6 ,real ,it_spmd(p),msgtyp,
143 . spmd_comm_world ,req_sb(p),ierror)
144 ENDIF
145 ENDIF
146 ENDDO
147 ENDIF
148
149
150
151
152 IF(isendto(nin,loc_proc)/=0) THEN
153 nbirecv=0
154 DO p = 1, nspmd
155 IF(ircvfrom(nin,p)/=0) THEN
156 IF(loc_proc/=p) THEN
157 nbirecv=nbirecv+1
158 irindexi(nbirecv)=p
159 msgtyp = msgoff + nspmd*ispmd + p +nin
163 . mpi_integer,
164 . it_spmd(p),msgtyp,spmd_comm_world,req_rc(nbirecv),ierror)
165 msgtyp = msgoff2
167 . bminma(1,p) ,6 ,real ,it_spmd(p),msgtyp,
168 . spmd_comm_world,req_rb(nbirecv),ierror)
169 ENDIF
170 ENDIF
171 ENDDO
172 ENDIF
173
174
175
176
177 ideb = 1
178 IF(isendto(nin,loc_proc)/=0) THEN
179 DO kk = 1, nbirecv
180 CALL mpi_waitany(nbirecv,req_rb,indexi,status,ierror)
181 p=irindexi(indexi)
182 CALL mpi_wait(req_rc(indexi),status,ierror)
183 l = ideb
184 nbox(p) = 0
185 nb_ = 0
186 xmaxb = bminma(1,p)
187 ymaxb = bminma(2,p)
188 zmaxb = bminma(3,p)
189 xminb = bminma(4,p)
190 yminb = bminma(5,p)
191 zminb = bminma(6,p)
192 dx = xmaxb-xminb
193 dy = ymaxb-yminb
194 dz = zmaxb-zminb
195
196
197
198
199 DO i=1,nrtm
200 IF(stife(i)==zero) cycle
201 ix1=int(nbx*(xmine(i)-xminb)/dx)
202 ix2=int(nbx*(xmaxe(i)-xminb)/dx)
205 IF(ix2 < 0.OR.ix1 > nbx) cycle
206 iy1=int(nby*(ymine(i)-yminb)/dy)
207 iy2=int(nby*(ymaxe(i)-yminb)/dy)
210 IF(iy2 < 0.OR.iy1 > nby) cycle
211 iz1=int(nbz*(zmine(i)-zminb)/dz)
212 iz2=int(nbz*(zmaxe(i)-zminb)/dz)
215 IF(iz2 < 0.OR.iz1 > nbz) cycle
216 DO iy=iy1,iy2
217 DO iz=iz1,iz2
218 DO ix=ix1,ix2
219 test = btest(
crvoxel(iy,iz,p),ix)
220 IF(test) THEN
221 nb_ = nb_ + 1
222 index(nb_) = i
223 GOTO 111
224 END IF
225 END DO
226 END DO
227 END DO
228 111 CONTINUE
229 ENDDO
230 nbox(p) = nb_
231
232
233
234
235 msgtyp = msgoff3
236 CALL mpi_isend(nbox(p),1,mpi_integer,it_spmd(p),msgtyp,
237 . spmd_comm_world,req_sd(p),ierror)
238
239
240
241 IF (nb_>0) THEN
242 ALLOCATE(buf(p)%P(
siz_xrem*nb_),stat=ierror)
243 IF(ierror/=0) THEN
244 CALL ancmsg(msgid=20,anmode=aninfo)
246 ENDIF
247 l = 0
248
249
250
251 DO j = 1, nb_
252 i = index(j)
253 buf(p)%p(l+1:l+4) = itab(irectm(1:4,i))
254 buf(p)%p(l+5:l+8) = x(1,irectm(1:4,i))
255 buf(p)%p(l+9:l+12) = x(2,irectm(1:4,i))
256 buf(p)%p(l+13:l+16)= x(3,irectm(1:4,i))
257 buf(p)%p(l+17:l+19)= (/xmine(i),ymine(i),zmine(i)/)
258 buf(p)%p(l+20:l+22)= (/xmaxe(i),ymaxe(i),zmaxe(i)/)
259 buf(p)%p(l+23) = stife(i)
260 buf(p)%p(l+24) = sum(v(1,irectm(1:4,i)))/four
261 buf(p)%p(l+25) = sum(v(2,irectm(1:4,i)))/four
262 buf(p)%p(l+26) = sum(v(3,irectm(1:4,i)))/four
264 END DO
265 msgtyp = msgoff4
267 1 buf(p)%P(1),l,mpi_double_precision,it_spmd(p),msgtyp,
268 2 spmd_comm_world,req_sd2(p),ierror)
269 ENDIF
270 ENDDO
271 ENDIF
272
273
274
275 IF(ircvfrom(nin,loc_proc)/=0) THEN
276 nshelr = 0
277 l=0
278 DO p = 1, nspmd
280 IF(isendto(nin,p)/=0) THEN
281 IF(loc_proc/=p) THEN
282 msgtyp = msgoff3
284 . msgtyp,spmd_comm_world,status,ierror)
285 IF(
nsnfi(nin)%P(p)>0)
THEN
286 l=l+1
287 isindexi(l)=p
288 nshelr = nshelr +
nsnfi(nin)%P(p)
289 ENDIF
290 ENDIF
291 ENDIF
292 ENDDO
293 nbirecv=l
294
295
296
297 IF(nshelr>0) THEN
298 IF (ir4r8 == 2) THEN
299 ALLOCATE(xrem(
siz_xrem,nshelr),stat=ierror)
300 ELSE
301 ALLOCATE
302 ALLOCATE(
irem(2,nshelr),stat=ierror1)
303 ierror=ierror+ierror1
304 END IF
305 IF(ierror/=0) THEN
306 CALL ancmsg(msgid=20,anmode=aninfo)
308 ENDIF
309 ideb = 1
310 DO l = 1, nbirecv
311 p = isindexi(l)
313 msgtyp = msgoff4
314 iad = ideb
315
316 IF(ir4r8 == 1) iad = 2*ideb-1
318 1 xrem(1,iad),len,mpi_double_precision,it_spmd(p),
319 2 msgtyp,spmd_comm_world,req_rd(l),ierror)
320 ideb = ideb +
nsnfi(nin)%P(p)
321 ENDDO
322 DO l = 1, nbirecv
323 CALL mpi_waitany(nbirecv,req_rd,indexi,status,ierror)
324 ENDDO
325 IF(ir4r8 == 1)THEN
327 END IF
328 ENDIF
329 ENDIF
330
331 IF(ircvfrom(nin,loc_proc)/=0) THEN
332 DO p = 1, nspmd
333 IF(isendto(nin,p)/=0) THEN
334 IF(p/=loc_proc) THEN
335 CALL mpi_wait(req_sc(p),status,ierror)
336 CALL mpi_wait(req_sb(p),status,ierror)
337 ENDIF
338 ENDIF
339 ENDDO
340 ENDIF
341
342 IF(isendto(nin,loc_proc)/=0) THEN
343 DO p = 1, nspmd
344 IF(ircvfrom(nin,p)/=0) THEN
345 IF(p/=loc_proc) THEN
346 CALL mpi_wait(req_sd(p),status,ierror)
347 IF(nbox(p)/=0) THEN
348 CALL mpi_wait(req_sd2(p),status,ierror)
349 DEALLOCATE(buf(p)%p)
350 END IF
351 ENDIF
352 ENDIF
353 ENDDO
354 ENDIF
355#endif
356 RETURN
subroutine ymax(idn, fac, npc, pld, stiffmin, stiffmax, stiffini, stiffavg)
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_waitany(cnt, array_of_requests, index, status, ierr)
subroutine mpi_irecv(buf, cnt, datatype, source, tag, comm, ireq, ierr)
integer, dimension(0:lrvoxel, 0:lrvoxel) crvoxel
type(int_pointer), dimension(:), allocatable nsnfi
integer, dimension(:,:), allocatable irem
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)