38
39
40
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 "com01_c.inc"
55#include "com04_c.inc"
56#include "task_c.inc"
57
58
59
60 INTEGER, INTENT(IN) :: NADMSR,SOL_EDGE
61 INTEGER NI25, IAD_FREDG(NINTER25,*), FR_EDG(2,*),SIZE,ISHIFT,
62 . REQ_R(NSPMD),REQ_S(NSPMD),IRINDEX(NSPMD),ISINDEX(NSPMD),IAD_RECV(NSPMD+1),
63 . NBIRECV, NBISEND, IAD_FRNOR(NINTER25,*), FR_NOR(*), IFLAG, LBOUND(*),
64 . ADDCSRECT(*), PROCNOR(*)
65 real*4 nod_normal(3,4,*), wnod_normal(3,4,*), vtx_bisector(3,2,nadmsr),fskyn(3,*),
66 . rbuf(*), sbuf(*)
67
68
69
70#ifdef MPI
71 INTEGER MSGTYP,I,NOD,LOC_PROC,IERROR,INDEX, N, M, E, IS,
72 . ,J,K,L0,L,CC,II, MSGOFF,
73 . STATUS(MPI_STATUS_SIZE)
74 real*4 rzero
75 DATA msgoff/6014/
76
77
78
79 rzero = 0.
80
81 loc_proc = ispmd + 1
82
83 IF(iflag==1)THEN
84
85 nbirecv = 0
86 l = 1
87 iad_recv(1) = 1
88 DO i = 1, nspmd
89
90 IF(i/=loc_proc)THEN
91
92 l0 = l
93 l = l+ size*(iad_fredg(ni25,i+1)-iad_fredg(ni25,i))
94 . +2*size*(iad_frnor(ni25,i+1)-iad_frnor(ni25,i))
95 . + (iad_frnor(ni25,i+1)-iad_frnor(ni25,i))
96
97
98 IF(sol_edge/=0)THEN
99 IF(iad_frnor(ni25,i+1)-iad_frnor(ni25,i)>0) THEN
100 DO j=iad_frnor(ni25,i),iad_frnor(ni25,i+1)-1
101 nod = ishift + fr_nor(j)
102 DO cc = addcsrect(nod),addcsrect(nod+1)-1
103 IF(procnor(cc)==i) THEN
104 l = l + SIZE
105 ENDIF
106 END DO
107 END DO
108 ENDIF
109 ENDIF
110
111 siz = l-l0
112
113 IF(siz > 0)THEN
114 msgtyp = msgoff
115 nbirecv = nbirecv + 1
116 irindex(nbirecv) = i
118 s rbuf(l0),siz,mpi_real4,it_spmd(i),msgtyp,
119 g spmd_comm_world,req_r(nbirecv),ierror)
120 ENDIF
121 ENDIF
122 iad_recv(i+1) = l
123 ENDDO
124
125 nbisend = 0
126 l = 1
127 DO i=1,nspmd
128
129 IF(i/=loc_proc)THEN
130 l0 = l
131 IF(iad_fredg(ni25,i+1)-iad_fredg(ni25,i)>0) THEN
132 DO j=iad_fredg(ni25,i),iad_fredg(ni25,i+1)-1
133 m = fr_edg(1,j)
134 e= fr_edg(2,j)
135 sbuf(l) = nod_normal(1,e,m)
136 sbuf(l+1) = nod_normal(2,e,m)
137 sbuf(l+2) = nod_normal(3,e,m)
138 l = l + SIZE
139
140
141
142
143
144
145
146
147 ENDDO
148 ENDIF
149 IF(iad_frnor(ni25,i+1)-iad_frnor(ni25,i)>0) THEN
150 DO j=iad_frnor(ni25,i),iad_frnor(ni25,i+1)-1
151 is = fr_nor(j)
152 sbuf(l) = vtx_bisector(1,1,is)
153 sbuf(l+1) = vtx_bisector(2,1,is)
154 sbuf(l+2) = vtx_bisector(3,1,is)
155 l = l + SIZE
156 sbuf(l) = vtx_bisector(1,2,is)
157 sbuf(l+1) = vtx_bisector(2,2,is)
158 sbuf(l+2) = vtx_bisector(3,2,is)
159 l = l + SIZE
160 sbuf(l) = lbound(is)
161 l = l + 1
162 ENDDO
163 ENDIF
164
165 IF(sol_edge/=0)THEN
166
167 IF(iad_frnor(ni25,i+1)-iad_frnor(ni25,i)>0) THEN
168 DO j=iad_frnor(ni25,i),iad_frnor(ni25,i+1)-1
169 nod = ishift + fr_nor(j)
170 DO cc = addcsrect(nod),addcsrect(nod+1)-1
171 IF(procnor(cc)==loc_proc) THEN
172 sbuf(l) = fskyn(1,cc)
173 sbuf(l+1) = fskyn(2,cc)
174 sbuf(l+2) = fskyn(3,cc)
175 l = l + SIZE
176 ENDIF
177 ENDDO
178 ENDDO
179 ENDIF
180 ENDIF
181
182 siz = l-l0
183
184 IF(siz > 0)THEN
185 msgtyp = msgoff
186 nbisend = nbisend + 1
187 isindex(nbisend)=i
189 s sbuf(l0),siz,mpi_real4,it_spmd(i),msgtyp,
190 g spmd_comm_world,req_s(i),ierror)
191 ENDIF
192 END IF
193 ENDDO
194
195 ELSE
196
197
198
199 DO ii=1,nbirecv
200 CALL mpi_waitany(nbirecv,req_r,index,status,ierror)
201 i = irindex(index)
202 l = iad_recv(i)
203
204 DO j=iad_fredg(ni25,i),iad_fredg(ni25,i+1)-1
205 m= fr_edg(1,j)
206 e= fr_edg(2,j)
207 wnod_normal(1,e,m) = rbuf(l)
208 wnod_normal(2,e,m) = rbuf(l+1)
209 wnod_normal(3,e,m) = rbuf(l+2)
210 l = l + SIZE
211
212 ENDDO
213
214 DO j=iad_frnor(ni25,i),iad_frnor(ni25,i+1)-1
215 is= fr_nor(j)
216 IF(rbuf(l)/=rzero.OR.rbuf(l+1)/=rzero.OR.rbuf(l+2)/=rzero)THEN
217 IF(vtx_bisector(1,1,is)==rzero.AND.
218 . vtx_bisector(2,1,is)==rzero.AND.
219 . vtx_bisector(3,1,is)==rzero)THEN
220 vtx_bisector(1,1,is)=rbuf(l)
221 vtx_bisector(2,1,is)=rbuf(l+1)
222 vtx_bisector(3,1,is)=rbuf(l+2)
223 ELSEIF(vtx_bisector(1,2,is)==rzero.AND.
224 . vtx_bisector(2,2,is)==rzero.AND.
225 . vtx_bisector(3,2,is)==rzero)THEN
226 vtx_bisector(1,2,is)=rbuf(l)
227 vtx_bisector(2,2,is)=rbuf(l+1)
228 vtx_bisector(3,2,is)=rbuf(l+2)
229 ELSE
230 vtx_bisector(1,1,is) = rzero
231 vtx_bisector(2,1,is) = rzero
232 vtx_bisector(3,1,is) = rzero
233 vtx_bisector(1,2,is) = rzero
234 vtx_bisector(2,2,is) = rzero
235 vtx_bisector(3,2,is) = rzero
236 END IF
237 END IF
238 l = l + SIZE
239 IF(rbuf(l)/=rzero.OR.rbuf(l+1)/=rzero.OR.rbuf(l+2)/=rzero)THEN
240 IF(vtx_bisector(1,1,is)==rzero.AND.
241 . vtx_bisector(2,1,is)==rzero.AND.
242 . vtx_bisector(3,1,is)==rzero)THEN
243 vtx_bisector(1,1,is)=rbuf(l)
244 vtx_bisector(2,1,is)=rbuf(l+1)
245 vtx_bisector(3,1,is)=rbuf(l+2)
246 ELSEIF(vtx_bisector(1,2,is)==rzero.AND.
247 . vtx_bisector(2,2,is)==rzero.AND.
248 . vtx_bisector(3,2,is)==rzero)THEN
249 vtx_bisector(1,2,is)=rbuf(l)
250 vtx_bisector(2,2,is)=rbuf(l+1)
251 vtx_bisector(3,2,is)=rbuf(l+2)
252 END IF
253 END IF
254 l = l + SIZE
255
256 lbound(is) = lbound(is)+nint(rbuf(l))
257 IF(lbound(is) > 2) THEN
258 vtx_bisector(1,1,is) = rzero
259 vtx_bisector(2,1,is) = rzero
260 vtx_bisector(3,1,is) = rzero
261 vtx_bisector(1,2,is) = rzero
262 vtx_bisector(2,2,is) = rzero
263 vtx_bisector(3,2,is) = rzero
264 ENDIF
265
266 l = l + 1
267 ENDDO
268
269 IF(sol_edge/=0)THEN
270 DO j=iad_frnor(ni25,i),iad_frnor(ni25,i+1)-1
271 nod = ishift + fr_nor(j)
272 DO cc = addcsrect(nod),addcsrect(nod+1)-1
273 IF(procnor(cc)==i) THEN
274 fskyn(1,cc) = rbuf(l)
275 fskyn(2,cc) = rbuf(l+1)
276 fskyn(3,cc) = rbuf(l+2)
277 l = l + SIZE
278 END IF
279 END DO
280 ENDDO
281 ENDIF
282
283
284 ENDDO
285
286 DO ii=1,nbisend
287 i = isindex(ii)
288 CALL mpi_wait(req_s(i),status,ierror)
289 ENDDO
290
291 END IF
292
293#endif
294 RETURN
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)