36
37
38
39 USE spmd_comm_world_mod, ONLY : spmd_comm_world
40#include "implicit_f.inc"
41
42
43
44#include "spmd.inc"
45
46
47
48#include "com01_c.inc"
49#include "com04_c.inc"
50#include "param_c.inc"
51#include "task_c.inc"
52
53 COMMON /ring/irecvf,isendt,iring
54 INTEGER IRECVF,ISENDT,IRING
55
56
57
58
59
60
61
62 INTEGER ISENDTO(NINTER+1,*) ,IRCVFROM(NINTER+1,*),
63 . NEWFRONT(*), NINTC, INTLIST(*), IPARI(NPARI,*)
65 . xslv_l(18,*), xmsr_l(12,*), vslv_l(6,*),
66 . vmsr_l(6,*), tzinf(*), size_t(*),delta_pmax_gap(*),maxdgap(ninter)
67
68
69
70#ifdef MPI
71 INTEGER MSGOFF,MSGTYP,P,SIZ,NIN,I,J,L,LOC_PROC,
72 . IERROR,I_LEN,NBIRECV,KK,
73 . IADS,INDEXI,MSGTYP2,
74 . IRINDEXI(NSPMD),IADR(NSPMD),REQ_R(NSPMD),
75 . STATUS(MPI_STATUS_SIZE)
76 parameter(i_len = 46)
78 . sbuf(nspmd*nintc*i_len)
79 DATA msgoff/116/
80
81
82
83
84
85 IF(iring==0) RETURN
86
87 loc_proc = ispmd+1
88
89
90
91 IF(loc_proc/=iring) THEN
92
93 IF(ircvfrom(ninter+1,loc_proc)>0.OR.
94 + isendto(ninter+1,loc_proc)>0) THEN
95 l = 0
96 DO kk=1,nintc
97 nin = intlist(kk)
98 IF(ircvfrom(nin,loc_proc)/=0.OR.
99 + isendto(nin,loc_proc)/=0)THEN
100
101 DO j=1,18
102 sbuf(l+j) = xslv_l(j,nin)
103 END DO
104 l = l + 18
105
106 DO j=1,12
107 sbuf(l+j) = xmsr_l(j,nin)
108 END DO
109 l = l + 12
110
111 DO j=1,6
112 sbuf(l+j) = vslv_l(j,nin)
113 END DO
114 l = l + 6
115
116 DO j=1,6
117 sbuf(l+j) = vmsr_l(j,nin)
118 END DO
119 l = l + 6
120 IF(ipari(7,nin)/=17)THEN
121
122 sbuf(l+1) = newfront(nin)
123 ELSE
124
125 sbuf(l+1) = size_t(nin)
126 END IF
127 l = l + 1
128
129 sbuf(l+1) = tzinf(kk)
130 l = l + 1
131
132 sbuf(l+1) = delta_pmax_gap(nin)
133 l = l + 1
134
135 sbuf(l+1) = maxdgap(nin)
136 l = l + 1
137 END IF
138 END DO
139 msgtyp = msgoff
141 s sbuf,l,real,it_spmd(iring),msgtyp,
142 g spmd_comm_world,ierror)
143 msgtyp = msgoff
144 l = i_len*nintc
146 s sbuf,l,real,it_spmd(iring),msgtyp,
147 g spmd_comm_world,status,ierror)
148 l = 0
149 DO kk=1,nintc
150 nin = intlist(kk)
151 IF(ircvfrom(nin,loc_proc)/=0.OR.
152 + isendto(nin,loc_proc)/=0)THEN
153 DO j=1,18
154 xslv_l(j,nin) = sbuf(l+j)
155 END DO
156 l = l + 18
157 DO j=1,12
158 xmsr_l(j,nin) = sbuf(l+j)
159 END DO
160 l = l + 12
161 DO j=1,6
162 vslv_l(j,nin) = sbuf(l+j)
163 END DO
164 l = l + 6
165 DO j=1,6
166 vmsr_l(j,nin) = sbuf(l+j)
167 END DO
168 l = l + 6
169 IF(ipari(7,nin)/=17)THEN
170 newfront(nin) = sbuf(l+1)
171 ELSE
172 size_t(nin) = sbuf(l+1)
173 END IF
174 l = l + 1
175 tzinf(kk) = sbuf(l+1)
176 l = l + 1
177
178 delta_pmax_gap(nin) = sbuf(l+1)
179 l = l + 1
180
181 maxdgap(nin) = sbuf(l+1)
182 l = l + 1
183 END IF
184 END DO
185 END IF
186 ELSE
187
188 l = 1
189 nbirecv = 0
190 DO p = 1, nspmd
191 IF(p/=loc_proc) THEN
192 IF(ircvfrom(ninter+1,p)>0.OR.
193 + isendto(ninter+1,p)>0) THEN
194 nbirecv = nbirecv + 1
195 irindexi(nbirecv)=p
196 msgtyp = msgoff
197 siz = i_len*nintc
198 iadr(p)=l
200 s sbuf(l),siz,real,it_spmd(p),msgtyp,
201 g spmd_comm_world,req_r(nbirecv),ierror)
202 l = l + siz
203 END IF
204 END IF
205 ENDDO
206
207
208
209 DO i = 1, nbirecv
210 CALL mpi_waitany(nbirecv,req_r,indexi,status,ierror)
211 p=irindexi(indexi)
212 l = iadr(p)
213 DO kk=1,nintc
214 nin = intlist(kk)
215 IF(ircvfrom(nin,p)/=0.OR.
216 + isendto(nin,p)/=0)THEN
217
218 xslv_l( 1,nin) =
max(xslv_l( 1,nin),sbuf(l))
219 xslv_l( 2,nin) =
max(xslv_l( 2,nin),sbuf(l+1))
220 xslv_l( 3,nin) =
max(xslv_l( 3,nin),sbuf(l+2))
221 xslv_l( 4,nin) =
min(xslv_l( 4,nin),sbuf(l+3))
222 xslv_l( 5,nin) =
min(xslv_l( 5,nin),sbuf(l+4))
223 xslv_l( 6,nin) =
min(xslv_l( 6,nin),sbuf(l+5))
224 xslv_l( 7,nin) =
max(xslv_l( 7,nin),sbuf(l+6))
225 xslv_l( 8,nin) =
max(xslv_l( 8,nin),sbuf(l+7))
226 xslv_l( 9,nin) =
max(xslv_l( 9,nin),sbuf(l+8))
227 xslv_l(10,nin) =
min(xslv_l(10,nin),sbuf(l+9))
228 xslv_l(11,nin) =
min(xslv_l(11,nin),sbuf(l+10))
229 xslv_l(12,nin) =
min(xslv_l(12,nin),sbuf(l+11))
230 xslv_l(13,nin) =
max(xslv_l(13,nin),sbuf(l+12))
231 xslv_l(14,nin) =
max(xslv_l(14,nin),sbuf(l+13))
232 xslv_l(15,nin) =
max(xslv_l(15,nin),sbuf(l+14))
233 xslv_l(16,nin) =
min(xslv_l(16,nin),sbuf(l+15))
234 xslv_l(17,nin) =
min(xslv_l(17,nin),sbuf(l+16))
235 xslv_l(18,nin) =
min(xslv_l(18,nin),sbuf(l+17))
236 l = l + 18
237
238 xmsr_l(1,nin) =
max(xmsr_l(1,nin),sbuf(l))
239 xmsr_l(2,nin) =
max(xmsr_l(2,nin),sbuf(l+1))
240 xmsr_l(3,nin) =
max(xmsr_l(3,nin),sbuf(l+2))
241 xmsr_l(4,nin) =
min(xmsr_l(4,nin),sbuf(l+3))
242 xmsr_l(5,nin) =
min(xmsr_l(5,nin),sbuf(l+4))
243 xmsr_l(6,nin) =
min(xmsr_l(6,nin),sbuf(l+5))
244 xmsr_l(7,nin) =
max(xmsr_l(7,nin),sbuf(l+6))
245 xmsr_l(8,nin) =
max(xmsr_l(8,nin),sbuf(l+7))
246 xmsr_l(9,nin) =
max(xmsr_l(9,nin),sbuf(l+8))
247 xmsr_l(10,nin) =
min(xmsr_l(10,nin),sbuf(l+9))
248 xmsr_l(11,nin) =
min(xmsr_l(11,nin),sbuf(l+10))
249 xmsr_l(12,nin) =
min(xmsr_l(12,nin),sbuf(l+11))
250 l = l + 12
251
252 vslv_l(1,nin) =
max(vslv_l(1,nin),sbuf(l))
253 vslv_l(2,nin) =
max(vslv_l(2,nin),sbuf(l+1))
254 vslv_l(3,nin) =
max(vslv_l(3,nin),sbuf(l+2))
255 vslv_l(4,nin) =
min(vslv_l(4,nin),sbuf(l+3))
256 vslv_l(5,nin) =
min(vslv_l(5,nin),sbuf(l+4))
257 vslv_l(6,nin) =
min(vslv_l(6,nin),sbuf(l+5))
258 l = l + 6
259
260 vmsr_l(1,nin) =
max(vmsr_l(1,nin),sbuf(l))
261 vmsr_l(2,nin) =
max(vmsr_l(2,nin),sbuf(l+1))
262 vmsr_l(3,nin) =
max(vmsr_l(3,nin),sbuf(l+2))
263 vmsr_l(4,nin) =
min(vmsr_l(4,nin),sbuf(l+3))
264 vmsr_l(5,nin) =
min(vmsr_l(5,nin),sbuf(l+4))
265 vmsr_l(6,nin) =
min(vmsr_l(6,nin),sbuf(l+5))
266 l = l + 6
267 IF(ipari(7,nin)/=17)THEN
268
269 newfront(nin) = newfront(nin)+nint(sbuf(l))
270 ELSE
271
272 size_t(nin) = size_t(nin)+sbuf(l)
273 END IF
274 l = l + 1
275
276 tzinf(kk) =
min(tzinf(kk),sbuf(l))
277 l = l + 1
278
279 delta_pmax_gap(nin)=
max(delta_pmax_gap(nin),sbuf(l) )
280 l = l + 1
281
282 maxdgap(nin)=
max(maxdgap(nin),sbuf(l) )
283 l = l + 1
284 END IF
285 END DO
286 END DO
287
288 l = 0
289 DO i = 1, nbirecv
290 p=irindexi(i)
291
292 iadr(p) = l+1
293 DO kk=1,nintc
294 nin = intlist(kk)
295 IF(ircvfrom(nin,p)/=0.OR.
296 + isendto(nin,p)/=0)THEN
297 DO j=1,18
298 sbuf(l+j) = xslv_l(j,nin)
299 END DO
300 l = l + 18
301 DO j=1,12
302 sbuf(l+j) = xmsr_l(j,nin)
303 END DO
304 l = l + 12
305 DO j=1,6
306 sbuf(l+j) = vslv_l(j,nin)
307 END DO
308 l = l + 6
309 DO j=1,6
310 sbuf(l+j) = vmsr_l(j,nin)
311 END DO
312 l = l + 6
313 IF(ipari(7,nin)/=17)THEN
314 sbuf(l+1) = newfront(nin)
315 ELSE
316 sbuf(l+1) = size_t(nin)
317 END IF
318 l = l + 1
319 sbuf(l+1) = tzinf(kk)
320 l = l + 1
321 sbuf(l+1) = delta_pmax_gap(nin)
322 l = l + 1
323
324 sbuf(l+1) = maxdgap(nin)
325 l = l + 1
326 END IF
327 END DO
328
329 msgtyp = msgoff
331 s sbuf(iadr(p)),l-iadr(p)+1,real,it_spmd(p
332 g spmd_comm_world,req_r(i),ierror)
333 ENDDO
334
335 DO i = 1, nbirecv
336 CALL mpi_waitany(nbirecv,req_r,indexi,status,ierror)
337
338 END DO
339
340 END IF
341
342#endif
343 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_send(buf, cnt, datatype, dest, tag, comm, ierr)
subroutine mpi_waitany(cnt, array_of_requests, index, status, ierr)
subroutine mpi_irecv(buf, cnt, datatype, source, tag, comm, ireq, ierr)