35
36
37
38
41 USE intbufdef_mod
42
43
44
45 USE spmd_comm_world_mod, ONLY : spmd_comm_world
46#include "implicit_f.inc"
47
48
49
50#include "spmd.inc"
51
52
53
54#include "param_c.inc"
55#include "com04_c.inc"
56#include "task_c.inc"
57#include "com01_c.inc"
58
59
60
61 INTEGER :: NBINTC,FLAG
62 INTEGER IPARI(NPARI,*),INTLIST(*)
63
64 TYPE(INTBUF_STRUCT_) INTBUF_TAB(*)
65
66
67
68
69
70
71
72
73
74
75#ifdef MPI
76 INTEGER :: STATUS(),REQ_S(PARASIZ),(PARASIZ)
77 INTEGER :: P,LENSD,LENRV,IADS(PARASIZ+1),IADR(PARASIZ+1),IERROR,
78 * SIZ,LOC_PROC,MSGTYP,IDEB(NINTER),PROC,MSGOFF
79 INTEGER :: ITIED
80
81 INTEGER :: I,J,L,NB,NL,NN,K,N,NOD,LEN,ND,NIN,NTY,
82 * NSN,SN,NBI,NSI,
83 * I_STOK,IT,LEN_NSNSI,MS,NSNR,
84 * NI,NII,LL,ILEN,RLEN,LI,NUMERO,P2
85 INTEGER, DIMENSION(NINTER) :: LLL
86 INTEGER, DIMENSION(:), ALLOCATABLE :: BBUFS, BBUFR
87 INTEGER:: LEN_CANDF
88
89 DATA msgoff/9000/
90
91 SAVE iads,iadr,bbufs,bbufr,req_s,
92 * req_r,ilen,rlen,len,lensd,lenrv
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144 IF(nspmd==1) RETURN
145
146
147
148 IF(flag==1) THEN
149
150
151 loc_proc = ispmd+1
152 iads(1:nspmd+1) = 0
153 iadr(1:nspmd+1) = 0
154 lensd = 0
155 lenrv = 0
156 DO p=1,nspmd
157 iadr(p)=lenrv+1
158 DO ni=1,nbintc
159 nin = intlist(ni)
160 nty = ipari(7,nin)
161 itied = ipari(85,nin)
162 IF(nty==10 .OR.(nty==7.AND.itied/=0))THEN
163 lensd = lensd +
nsnfi(nin)%P(p)
164 lenrv = lenrv +
nsnsi(nin)%P(p)
165 ENDIF
166 ENDDO
167 ENDDO
168
169 iadr(nspmd+1)=lenrv+1
170
171 IF(lensd>0) THEN
172 ALLOCATE(bbufs(lensd))
173 bbufs(1:lensd) = 0
174 ENDIF
175 IF(lenrv>0) THEN
176 ALLOCATE(bbufr(lenrv))
177 bbufr(1:lenrv) = 0
178 ENDIF
179
180
181 DO p=1, nspmd
182 siz=iadr(p+1)-iadr(p)
183 IF (siz > 0) THEN
184 msgtyp = msgoff
185 CALL mpi_irecv( bbufr(iadr(p)),siz,mpi_integer,it_spmd(p),msgtyp,
186 . spmd_comm_world,req_r(p),ierror )
187
188 ENDIF
189 ENDDO
190
191
192 l=1
193 ideb(1:ninter) = 0
194 DO p=1, nspmd
195 iads(p)=l
196 IF (p/= loc_proc) THEN
197 DO ni=1,nbintc
198 nin = intlist(ni)
199 nty =ipari(7,nin)
200 itied = ipari(85,nin)
201 nsn = ipari(5,nin)
202 len_candf =8
203 IF(nty==10) len_candf=6
204 IF(nty==10 .OR. (nty==7.AND.itied/=0)) THEN
205
206 numero=0
207 DO p2=1,p-1
208 numero=numero+
nsnfi(nin)%P(p2)
209 ENDDO
211 ll = 0
212 DO nn=1,intbuf_tab(nin)%I_STOK(1)
213 nii = intbuf_tab(nin)%CAND_N(nn)
214
215
216 IF( nii>nsn
217 . .AND. ((nii-nsn)>numero)
218 . .AND. ((nii-nsn)<=numero+
nsnfi(nin)%P(p)) )
THEN
219
220 IF(intbuf_tab(nin)%CAND_F(len_candf*(nn-1)+1)/=zero) THEN
221 bbufs(l-1+nii-nsn-numero)= 1
222 ll = ll + 1
223 ENDIF
224 ENDIF
225 ENDDO
226 l = l + nb
227 ENDIF
228 ENDDO
229 siz = l-iads(p)
230 IF(siz>0)THEN
231 msgtyp = msgoff
232
233 CALL mpi_isend(bbufs(iads(p)),siz,mpi_integer,it_spmd(p),msgtyp,
234 . spmd_comm_world,req_s(p),ierror)
235 ENDIF
236 ENDIF
237 ENDDO
238
239
240 ELSEIF(flag==2) THEN
241
242
243
244 l=0
245 ideb(1:ninter) = 0
246
247 lll(1:ninter) = 0
248 DO ni=1,nbintc
249 nin = intlist(ni)
250 nty =ipari(7,nin)
251 itied = ipari(85,nin)
252 nsn = ipari(5,nin)
253 IF(nty==10 .OR. (nty==7.AND.itied/=0)) THEN
255 ENDIF
256 ENDDO
257
258 DO p=1, nspmd
259 l=0
260 siz=iadr(p+1)-iadr(p)
261 IF (siz > 0) THEN
262 msgtyp = msgoff
263 CALL mpi_wait(req_r(p),status,ierror)
264 DO ni=1,nbintc
265 nin = intlist(ni)
266 nty =ipari(7,nin)
267 itied = ipari(85,nin)
268 nsn = ipari(5,nin)
269
270 numero=0
271 DO p2=1,p-1
272 numero=numero+
nsnsi(nin)%P(p2)
273 ENDDO
274 IF(nty==10 .OR. (nty==7.AND.itied/=0)) THEN
276 IF (nb > 0)THEN
277 DO k=1,nb
278 ll = bbufr(iadr(p)+l)
279 IF(ll/=0) THEN
280 sn=
nsvsi(nin)%P(k+ideb(nin))
282 ENDIF
283 l = l + 1
284 ENDDO
285 ENDIF
286 ideb(nin)=ideb(nin)+nb
287 ENDIF
288 ENDDO
289 ENDIF
290 ENDDO
291
292 DO p = 1, nspmd
293 IF (p==nspmd)THEN
294 siz=lensd-iads(p)
295 ELSE
296 siz=iads(p+1)-iads(p)
297 ENDIF
298 IF(siz>0) THEN
299 CALL mpi_wait(req_s(p),status,ierror)
300 ENDIF
301 ENDDO
302
303 IF (ALLOCATED(bbufs)) DEALLOCATE(bbufs)
304 IF (ALLOCATED(bbufr)) DEALLOCATE(bbufr)
305
306
307
308 ENDIF
309
310
311
312
313#endif
314 RETURN
315
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 candf_si
type(int_pointer), dimension(:), allocatable nsvsi
type(int_pointer), dimension(:), allocatable nsnsi
type(int_pointer), dimension(:), allocatable nsnfi