43
44
45
49 USE intbufdef_mod
52
53
54
55 USE spmd_comm_world_mod, ONLY : spmd_comm_world
56#include "implicit_f.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 , INTENT(IN) ::
72 . NBINTC,ISLEN7, IRLEN7,IRLEN7T, ISLEN7T,
73 . IRLEN20, ISLEN20, IRLEN20T, ISLEN20T,
74 . IPARI(NPARI,NINTER), INTLIST(NBINTC)
75
76 TYPE(INTBUF_STRUCT_),INTENT(IN) :: INTBUF_TAB(NINTER)
77 TYPE(H3D_DATABASE), INTENT(IN) :: H3D_DATA
78
79
80
81#ifdef MPI
82 INTEGER P, L, ADD, LL, NB, LEN, , LOC_PROC, II,
83 . NIN, , N, MSGTYP, IERROR, NI, NOD, I,
84 . NTY, IALLOCS, IALLOCR, MSGOFF,INTERFRIC,
85 . NBEFRIC,
86 . STATUS(MPI_STATUS_SIZE),DEBUT(NINTER),
87 . ADDS(NSPMD+1), ADDR(NSPMD+1),
88 . REQ_SI(NSPMD),REQ_RI(NSPMD),INTSORT(NBINTC)
89 DATA msgoff/190/
90 LOGICAL ITEST
92 my_real ,
DIMENSION(:),
ALLOCATABLE :: bbufs, bbufr
93 LOGICAL :: IS_EFRIC_COM_NEEDED
94
95
96
97 loc_proc = ispmd + 1
98
99 len = 3
100
101
102
103 intsort(1:nbintc) = 0
104 nbefric = 0
105 is_efric_com_needed = .false.
106 DO ii = 1, nbintc
107 nin = intlist(ii)
108 nty = ipari(7,nin)
109 dist = intbuf_tab(nin)%VARIABLES(5)
110 IF(nty==7.OR.nty==24) THEN
111 IF (dist<=zero) THEN
112 interfric = h3d_data%N_CSE_FRIC_INTER(nin)
113 IF(h3d_data%N_SCAL_CSE_FRIC > 0) THEN
114 nbefric = nbefric +1
115 intsort(ii) = 1
116 is_efric_com_needed = .true.
117 ELSEIF(interfric > 0)THEN
118 nbefric = nbefric +1
119 intsort(ii) = 1
120 is_efric_com_needed = .true.
121 ENDIF
122 ENDIF
123 ENDIF
124 debut(nin) = 0
125 ENDDO
126
127 IF(is_efric_com_needed) THEN
128
129 iallocs = len*irlen7 + len*irlen7t
130 ierror=0
131 IF(iallocs>0)
132 + ALLOCATE(bbufs(iallocs+nbintc*nspmd),stat=ierror)
133 IF(ierror/=0) THEN
134 CALL ancmsg(msgid=20,anmode=aninfo)
136 END IF
137 iallocr = len*islen7 + len*islen7t
138 ierror=0
139 IF(iallocr>0)
140 + ALLOCATE(bbufr(iallocr+nbintc*nspmd),stat=ierror)
141 IF(ierror/=0) THEN
142 CALL ancmsg(msgid=20,anmode=aninfo)
144 END IF
145
146
147
148 l = 0
149 DO p = 1, nspmd
150 add = l+1
151 addr(p) = add
152 siz = 0
153 IF(p/=loc_proc)THEN
154 DO ii = 1, nbintc
155 nin = intlist(ii)
157 IF(intsort(ii) > 0 ) THEN
158 IF(nb>0) THEN
159 l = l + 1 + nb*len
160 ENDIF
161 ENDIF
162 ENDDO
163 siz = l+1-add
164 IF(siz>0)THEN
165 msgtyp = msgoff
167 . bbufr(add),siz,real ,it_spmd(p),msgtyp,
168 . spmd_comm_world,req_ri(p),ierror )
169 ENDIF
170 ENDIF
171 ENDDO
172 addr(nspmd+1) = addr(nspmd)+siz
173
174
175
176 l = 0
177 DO p = 1, nspmd
178 add = l+1
179 adds(p) = add
180 siz = 0
181 IF(p/=loc_proc)THEN
182 DO ii = 1, nbintc
183 nin = intlist(ii)
184 ideb = debut(nin)
186 interfric = h3d_data%N_CSE_FRIC_INTER(nin)
187 IF(intsort(ii) > 0) THEN
188 IF(nb>0) THEN
189 ll = l+1
190 l = l + 1
191 DO n = 1, nb
192
193 bbufs(l+1) =
nsvfi(nin)%P(ideb+n)
194 IF(interfric>0)THEN
197 ELSE
198 bbufs(l+2) = zero
199 ENDIF
200 IF(h3d_data%N_SCAL_CSE_FRIC>0) THEN
201 bbufs(l+3) =
efricgfi(nin)%P(ideb+n)
203 ELSE
204 bbufs(l+3) = zero
205 ENDIF
206 l = l + len
207
208 ENDDO
209 bbufs(ll) = (l-ll)/len
210 debut(nin) = debut(nin) + nb
211 END IF
212 END IF
213 ENDDO
214 siz = l+1-add
215 IF(siz>0)THEN
216 msgtyp = msgoff
218 . bbufs(add),siz,real ,it_spmd(p),msgtyp,
219 . spmd_comm_world,req_si(p),ierror )
220 ENDIF
221 ENDIF
222 ENDDO
223 adds(nspmd+1)=adds(nspmd)+siz
224
225
226
227 DO p = 1, nspmd
228 IF(addr(p+1)-addr(p)>0) THEN
229 CALL mpi_wait(req_ri(p),status,ierror)
230 l = addr(p)
231 DO ii = 1, nbintc
232 nin = intlist(ii)
233 IF(
nsnsi(nin)%P(p)>0)
THEN
234 interfric = h3d_data%N_CSE_FRIC_INTER(nin)
235 IF(intsort(ii) > 0) THEN
236 nb = nint(bbufr(l))
237 l = l + 1
238 DO i = 1, nb
239 n = nint(bbufr(l+len*(i-1)))
240 nod = intbuf_tab(nin)%NSV(n)
241 IF(nod<=numnod)THEN
242 IF(interfric>0) efric(interfric,nod)= efric(interfric,nod)+ bbufr(l+len*(i-1)+1)
243 IF(h3d_data%N_SCAL_CSE_FRIC>0) efricg
244 ENDIF
245
246 ENDDO
247 l = l + nb*len
248 END IF
249 ENDIF
250 ENDDO
251 ENDIF
252 ENDDO
253
254 IF(iallocr>0) THEN
255 DEALLOCATE(bbufr)
256 END IF
257
258
259
260 DO p = 1, nspmd
261 IF(adds(p+1)-adds(p)>0) THEN
262 CALL mpi_wait(req_si(p),status,ierror)
263 ENDIF
264 ENDDO
265
266 IF(iallocs>0) THEN
267 DEALLOCATE(bbufs)
268 END IF
269
270 ENDIF
271
272#endif
273 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_pointer), dimension(:), allocatable efricgfi
type(int_pointer), dimension(:), allocatable nsnsi
type(int_pointer), dimension(:), allocatable nsvfi
type(real_pointer), dimension(:), allocatable efricfi
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)