43
44
45
49 USE intbufdef_mod
51
52
53
54 USE spmd_comm_world_mod, ONLY : spmd_comm_world
55#include "implicit_f.inc"
56#include "assert.inc"
57
58
59
60#include "spmd.inc"
61
62
63
64#include "com01_c.inc"
65#include "com04_c.inc"
66#include "param_c.inc"
67#include "task_c.inc"
68
69
70
71 INTEGER NBINTC,ISLEN7, IRLEN7,IRLEN7T, ISLEN7T,
72 . IRLEN20, ISLEN20, IRLEN20T, ISLEN20T,
73 . IPARI(NPARI,*), INTLIST(*)
74 INTEGER , INTENT(IN) :: N_SCAL_CSE_EFRIC,N_CSE_FRIC_INTER(NINTER)
76 . fncont(3,*), ftcont(3,*)
77 TYPE(INTBUF_STRUCT_) INTBUF_TAB(*)
78
79
80
81#ifdef MPI
82 INTEGER P, L, ADD, LL, , LEN, , KFI, LOC_PROC, MULTIMP, II,
83 . NIN, IDEB, N, MSGTYP, IERROR, NI, NOD, ,
84 . NTY, IALLOCS, IALLOCR, MSGOFF,INTERFRIC,LF,
85 . STATUS(MPI_STATUS_SIZE),DEBUT(NINTER),
86 . ADDS(NSPMD+1), ADDR(NSPMD+1),
87 . REQ_SI(NSPMD),REQ_RI(NSPMD)
88 DATA msgoff/190/
89 LOGICAL ITEST
90 my_real ,
DIMENSION(:),
ALLOCATABLE :: bbufs, bbufr
91
92
93
94 loc_proc = ispmd + 1
95
96 len = 7
98 IF(n_scal_cse_efric > 0) len = len +1
99
100
101
102 DO ii = 1, nbintc
103 nin = intlist(ii)
104 debut(nin) = 0
105 ENDDO
106 iallocs = len*(irlen7+
irlen25) + len*(irlen7t+
irlen25t) + len*irlen20 + len*irlen20t
107 ierror=0
108 IF(iallocs>0)
109 + ALLOCATE(bbufs(iallocs+nbintc*nspmd),stat=ierror)
110 IF(ierror/=0) THEN
111 CALL ancmsg(msgid=20,anmode=aninfo)
113 END IF
114 iallocr = len*(islen7+
islen25) + len*(islen7t+
islen25t) + len*islen20 + len*islen20t
115 ierror=0
116 IF(iallocr>0)
117 + ALLOCATE(bbufr(iallocr+nbintc*nspmd),stat=ierror)
118 IF(ierror/=0) THEN
119 CALL ancmsg(msgid=20,anmode=aninfo)
121 END IF
123
124
125
126 l = 0
127 DO p = 1, nspmd
128 add = l+1
129 addr(p) = add
130 siz = 0
131 IF(p/=loc_proc)THEN
132
133 DO ii = 1, nbintc
134 nin = intlist(ii)
136 nty = ipari(7,nin)
137 IF(nty==7.OR.nty==10.OR.nty==20.OR.nty==22.OR.
138 . nty==23.OR.nty==24.OR.nty==25) THEN
139 IF(nb>0) THEN
140 l = l + 1 + nb*len
141 ENDIF
142 ENDIF
143 ENDDO
144 siz = l+1-add
145 assert(add + siz -1 <= iallocr+nbintc*nspmd)
146 IF(siz>0)THEN
147 msgtyp = msgoff
149 . bbufr(add),siz,real ,it_spmd(p),msgtyp,
150 . spmd_comm_world,req_ri(p),ierror )
151 ENDIF
152 ENDIF
153 ENDDO
154 addr(nspmd+1) = addr(nspmd)+siz
155
156
157
158 l = 0
159 DO p = 1, nspmd
160 add = l+1
161 adds(p) = add
162 siz = 0
163 IF(p/=loc_proc)THEN
164
165 DO ii = 1, nbintc
166 nin = intlist(ii)
167 ideb = debut(nin)
169 nty = ipari(7,nin)
170 interfric = n_cse_fric_inter(nin)
171 IF(nty==7.OR.nty==10.OR.nty==20.OR.nty==22.OR.
172 . nty==23.OR.nty==24.OR.nty==25) THEN
173 IF(nb>0) THEN
174 ll = l+1
175 l = l + 1
176 DO n = 1, nb
177 IF(
nsvfi(nin)%P(ideb+n)<0)
THEN
178
179 bbufs(l+1) = -
nsvfi(nin)%P(ideb+n)
180 bbufs(l+2) =
fnconti(nin)%P(1,ideb+n)
181 bbufs(l+3) =
fnconti(nin)%P(2,ideb+n)
182 bbufs(l+4) =
fnconti(nin)%P(3,ideb+n)
183 bbufs(l+5) =
ftconti(nin)%P(1,ideb+n)
184 bbufs(l+6) =
ftconti(nin)%P(2,ideb+n)
185 bbufs(l+7) =
ftconti(nin)%P(3,ideb+n)
186 lf = 7
187 IF(interfric>0) THEN
188 bbufs(l+lf+1) =
efricfi(nin)%P(ideb+n)
190 lf=lf+1
192 bbufs(l+lf+1) = zero
193 lf=lf+1
194 ENDIF
195 IF(n_scal_cse_efric>0) THEN
196 bbufs(l+lf+1) =
efricgfi(nin)%P(ideb+n)
198 ENDIF
199 fnconti(nin)%P(1,ideb+n) = zero
200 fnconti(nin)%P(2,ideb+n) = zero
201 fnconti(nin)%P(3,ideb+n) = zero
202 ftconti(nin)%P(1,ideb+n) = zero
203 ftconti(nin)%P(2,ideb+n) = zero
204 ftconti(nin)%P(3,ideb+n) = zero
205 l = l + len
206 ELSEIF(interfric > 0.OR.n_scal_cse_efric>0) THEN
207
208 bbufs(l+1) =
nsvfi(nin)%P(ideb+n)
209 bbufs(l+2) = zero
210 bbufs(l+3) = zero
211 bbufs(l+4) = zero
212 bbufs(l+5) = zero
213 bbufs(l+6) = zero
214 bbufs(l+7) = zero
215 lf = 7
216 IF(interfric>0) THEN
219 lf=lf+1
221 bbufs(l+lf+1) = zero
222 lf=lf+1
223 ENDIF
224 IF(n_scal_cse_efric>0) THEN
225 bbufs(l+lf+1) =
efricgfi(nin)%P(ideb+n)
227 ENDIF
228 l = l + len
229 ENDIF
230 ENDDO
231 bbufs(ll) = (l-ll)/len
232 debut(nin) = debut(nin) + nb
233 END IF
234 END IF
235 ENDDO
236 siz = l+1-add
237 IF(siz>0)THEN
238 msgtyp = msgoff
239 assert(add + siz -1 <= iallocs+nbintc*nspmd)
241 . bbufs(add),siz,real ,it_spmd(p),msgtyp,
242 . spmd_comm_world,req_si(p),ierror )
243 ENDIF
244 ENDIF
245 ENDDO
246 adds(nspmd+1)=adds(nspmd)+siz
247
248
249
250
251
252
253 DO p = 1, nspmd
254 IF(addr(p+1)-addr(p)>0) THEN
255 CALL mpi_wait(req_ri(p),status,ierror)
256 l = addr(p)
257 DO ii = 1, nbintc
258 nin = intlist(ii)
259 IF(
nsnsi(nin)%P(p)>0)
THEN
260 nty =ipari(7,nin)
261 interfric = n_cse_fric_inter(nin)
262 IF(nty==7.OR.nty==10.OR.nty==20.OR.nty==22.OR.
263 . nty==23.OR.nty==24.OR.nty==25)THEN
264 nb = nint(bbufr(l))
265 l = l + 1
266 DO i = 1, nb
267 n = nint(bbufr(l+len*(i-1)))
268 nod = intbuf_tab(nin)%NSV(n)
269
270
271
272 IF(nod<=numnod)THEN
273 fncont(1,nod) = fncont(1,nod) + bbufr(l+len*(i-1)+1)
274 fncont(2,nod) = fncont(2,nod) + bbufr(l+len*(i-1)+2)
275 fncont(3,nod) = fncont(3,nod) + bbufr(l+len*(i-1)+3)
276 ftcont(1,nod) = ftcont(1,nod) + bbufr(l+len*(i-1)+4)
277 ftcont(2,nod) = ftcont(2,nod) + bbufr(l+len*(i-1)+5)
278 ftcont(3,nod) = ftcont(3,nod) + bbufr(l+len*(i-1)+6)
279 lf = 6
280 IF(interfric>0) THEN
281 efric(interfric,nod)= efric(interfric,nod)+ bbufr(l+len*(i-1)+lf+1)
282 lf = lf+1
284 lf=lf+1
285 ENDIF
286 IF(n_scal_cse_efric>0) THEN
287 efricg(nod)= efricg(nod)+ bbufr(l+len*(i-1)+lf+1)
288 ENDIF
289 ENDIF
290 ENDDO
291 l = l + nb*len
292 END IF
293 ENDIF
294 ENDDO
295 ENDIF
296 ENDDO
297
298 IF(iallocr>0) THEN
299 DEALLOCATE(bbufr)
300 END IF
301
302
303
304 DO p = 1, nspmd
305 IF(adds(p+1)-adds(p)>0) THEN
306 CALL mpi_wait(req_si(p),status,ierror)
307 ENDIF
308 ENDDO
309
310 IF(iallocs>0) THEN
311 DEALLOCATE(bbufs)
312 END IF
313
314#endif
315 RETURN
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(real_pointer2), dimension(:), allocatable fnconti
type(real_pointer), dimension(:), allocatable efricgfi
type(int_pointer), dimension(:), allocatable nsnsi
type(int_pointer), dimension(:), allocatable nsvfi
type(real_pointer), dimension(:), allocatable efricfi
type(real_pointer2), dimension(:), allocatable ftconti
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)