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, 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)
76
77
78
79#ifdef MPI
80 INTEGER MSGTYP, I, LOC_PROC, P, IDEB,
81 . MSGOFF, MSGOFF2, MSGOFF3, MSGOFF4,
82 . J, L, LEN, NB_, 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,
89 . IX1,IY1,IZ1,IX2,IY2,IZ2
91 . bminma(6,nspmd),
92 . xmaxb,ymaxb,zmaxb,xminb,yminb,zminb
93 TYPE(r8_pointer), DIMENSION(NSPMD) :: BUF
95 . dx, dy, dz
96 LOGICAL ::
97 . TEST
98 DATA msgoff/138/
99 DATA msgoff2/139/
100 DATA msgoff3/140/
101 DATA msgoff4/141/
102
103
104
105
106
107
108
109
110 loc_proc = ispmd + 1
114
115
116
117 IF(ircvfrom(nin,loc_proc)==0.AND.
118 . isendto(nin,loc_proc)==0) RETURN
119 bminma(1,loc_proc) = bminmal(1)
120 bminma(2,loc_proc) = bminmal(2)
121 bminma(3,loc_proc) = bminmal(3)
122 bminma(4,loc_proc) = bminmal(4)
123 bminma(5,loc_proc) = bminmal(5)
124 bminma(6,loc_proc) = bminmal(6)
125
126
127
128
129 IF(ircvfrom(nin,loc_proc)/=0) THEN
130 DO p = 1, nspmd
131 IF(isendto(nin,p)/=0) THEN
132 IF(p/=loc_proc) THEN
133 msgtyp = msgoff
137 . mpi_integer,
138 . it_spmd(p),msgtyp,spmd_comm_world,req_sc(p),ierror)
139 msgtyp = msgoff2
141 . bminma(1,loc_proc),6 ,real ,it_spmd(p),msgtyp,
142 . spmd_comm_world ,req_sb(p),ierror)
143 ENDIF
144 ENDIF
145 ENDDO
146 ENDIF
147
148
149
150
151 IF(isendto(nin,loc_proc)/=0) THEN
152 nbirecv=0
153 DO p = 1, nspmd
154 IF(ircvfrom(nin,p)/=0) THEN
155 IF(loc_proc/=p) THEN
156 nbirecv=nbirecv+1
157 irindexi(nbirecv)=p
158 msgtyp = msgoff + nspmd*ispmd + p +nin
162 . mpi_integer,
163 . it_spmd(p),msgtyp,spmd_comm_world,req_rc(nbirecv),ierror)
164 msgtyp = msgoff2
166 . bminma(1,p) ,6 ,real ,it_spmd(p),msgtyp,
167 . spmd_comm_world,req_rb(nbirecv),ierror)
168 ENDIF
169 ENDIF
170 ENDDO
171 ENDIF
172
173
174
175
176 ideb = 1
177 IF(isendto(nin,loc_proc)/=0) THEN
178 DO kk = 1, nbirecv
180 p=irindexi(indexi)
181 CALL mpi_wait(req_rc(indexi),status,ierror)
182 l = ideb
183 nbox(p) = 0
184 nb_ = 0
185 xmaxb = bminma(1,p)
186 ymaxb = bminma(2,p)
187 zmaxb = bminma(3,p)
188 xminb = bminma(4,p)
189 yminb = bminma(5,p)
190 zminb = bminma(6,p)
191 dx = xmaxb-xminb
192 dy = ymaxb-yminb
193 dz = zmaxb-zminb
194
195
196
197
198 DO i=1,nrtm
199 IF(stife(i)==zero) cycle
200 ix1=int(nbx*(xmine(i)-xminb)/dx)
201 ix2=int(nbx*(xmaxe(i)-xminb)/dx)
204 IF(ix2 < 0.OR.ix1 > nbx) cycle
205 iy1=int(nby*(ymine(i)-yminb)/dy)
206 iy2=int(nby*(ymaxe(i)-yminb)/dy)
209 IF(iy2 < 0.OR.iy1 > nby) cycle
210 iz1=int(nbz*(zmine(i)-zminb)/dz)
211 iz2=int(nbz*(zmaxe(i)-zminb)/dz)
214 IF(iz2 < 0.OR.iz1 > nbz) cycle
215 DO iy=iy1,iy2
216 DO iz=iz1,iz2
217 DO ix=ix1,ix2
218 test = btest(
crvoxel(iy,iz,p),ix)
219 IF(test) THEN
220 nb_ = nb_ + 1
221 index(nb_) = i
222 GOTO 111
223 END IF
224 END DO
225 END DO
226 END DO
227 111 CONTINUE
228 ENDDO
229 nbox(p) = nb_
230
231
232
233
234 msgtyp = msgoff3
235 CALL mpi_isend(nbox(p),1,mpi_integer,it_spmd(p),msgtyp,
236 . spmd_comm_world,req_sd(p),ierror)
237
238
239
240 IF (nb_>0) THEN
241 ALLOCATE(buf(p)%P(
siz_xrem*nb_),stat=ierror)
242 IF(ierror/=0) THEN
243 CALL ancmsg(msgid=20,anmode=aninfo)
245 ENDIF
246 l = 0
247
248
249
250 DO j = 1, nb_
251 i = index(j)
252 buf(p)%p(l+1:l+4) = itab(irectm(1:4,i))
253 buf(p)%p(l+5:l+8) = x(1,irectm(1:4,i))
254 buf(p)%p(l+9:l+12) = x(2,irectm(1:4,i))
255 buf(p)%p(l+13:l+16)= x(3,irectm(1:4,i))
256 buf(p)%p(l+17:l+19)= (/xmine(i),ymine(i),zmine(i)/)
257 buf(p)%p(l+20:l+22)= (/xmaxe(i),ymaxe(i),zmaxe(i)/)
258 buf(p)%p(l+23) = stife(i)
259 buf(p)%p(l+24) = sum(v(1,irectm(1:4,i)))/four
260 buf(p)%p(l+25) = sum(v(2,irectm(1:4,i)))/four
261 buf(p)%p(l+26) = sum(v(3,irectm(1:4,i)))/four
263 END DO
264 msgtyp = msgoff4
266 1 buf(p)%P(1),l,mpi_double_precision,it_spmd(p),msgtyp,
267 2 spmd_comm_world,req_sd2(p),ierror)
268 ENDIF
269 ENDDO
270 ENDIF
271
272
273
274 IF(ircvfrom(nin,loc_proc)/=0) THEN
275 nshelr = 0
276 l=0
277 DO p = 1, nspmd
279 IF(isendto(nin,p)/=0) THEN
280 IF(loc_proc/=p) THEN
281 msgtyp = msgoff3
283 . msgtyp,spmd_comm_world,status,ierror)
284 IF(
nsnfi(nin)%P(p)>0)
THEN
285 l=l+1
286 isindexi(l)=p
287 nshelr = nshelr +
nsnfi(nin)%P(p)
288 ENDIF
289 ENDIF
290 ENDIF
291 ENDDO
292 nbirecv=l
293
294
295
296 IF(nshelr>0) THEN
297 IF (ir4r8 == 2) THEN
298 ALLOCATE(xrem(
siz_xrem,nshelr),stat=ierror)
299 ELSE
300 ALLOCATE(xrem(
siz_xrem,2*nshelr),stat=ierror)
301 ALLOCATE(
irem(2,nshelr),stat=ierror1)
302 ierror=ierror+ierror1
303 END IF
304 IF(ierror/=0) THEN
305 CALL ancmsg(msgid=20,anmode=aninfo)
307 ENDIF
308 ideb = 1
309 DO l = 1, nbirecv
310 p = isindexi(l)
312 msgtyp = msgoff4
313 iad = ideb
314
315 IF(ir4r8 == 1) iad = 2*ideb-1
317 1 xrem(1,iad),len,mpi_double_precision,it_spmd(p),
318 2 msgtyp,spmd_comm_world,req_rd(l),ierror)
319 ideb = ideb +
nsnfi(nin)%P(p)
320 ENDDO
321 DO l = 1, nbirecv
322 CALL mpi_waitany(nbirecv,req_rd,indexi,status,ierror)
323 ENDDO
324 IF(ir4r8 == 1)THEN
326 END IF
327 ENDIF
328 ENDIF
329
330 IF(ircvfrom(nin,loc_proc)/=0) THEN
331 DO p = 1, nspmd
332 IF(isendto(nin,p)/=0) THEN
333 IF(p/=loc_proc) THEN
334 CALL mpi_wait(req_sc(p),status,ierror)
335 CALL mpi_wait(req_sb(p),status,ierror)
336 ENDIF
337 ENDIF
338 ENDDO
339 ENDIF
340
341 IF(isendto(nin,loc_proc)/=0) THEN
342 DO p = 1, nspmd
343 IF(ircvfrom(nin,p)/=0) THEN
344 IF(p/=loc_proc) THEN
345 CALL mpi_wait(req_sd(p),status,ierror)
346 IF(nbox(p)/=0) THEN
347 CALL mpi_wait(req_sd2(p),status,ierror)
348 DEALLOCATE(buf(p)%p)
349 END IF
350 ENDIF
351 ENDIF
352 ENDDO
353 ENDIF
354#endif
355 RETURN
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)