42 USE nodal_arrays_mod
43 use element_mod , only : nixs,nixq,nixc,nixp,nixr,nixt,nixtg
44
45
46
47 USE spmd_comm_world_mod, ONLY : spmd_comm_world
48#include "implicit_f.inc"
49
50
51
52#include "spmd.inc"
53
54
55
56#include "task_c.inc"
57#include "com01_c.inc"
58#include "com04_c.inc"
59#include "param_c.inc"
60
61
62
63 TYPE(nodal_arrays_), INTENT(IN) :: NODES
64 INTEGER IXS(NIXS,*), IXQ(NIXQ,*), IXC(NIXC,*), IXP(NIXP,*),
65 . IXR(NIXR,*), IXT(NIXT,*), TAGEL(*),
66 . IXTG(NIXTG,*), IPARG(NPARG,*),
67 . BUFS(*),ITAGL(*), IRECV(*), CNEL(0:*), ADDCNEL(0:*),
68 . IRSIZE, LBUFS, OFC, OFT, , OFUR, OFR, OFP, LINDEX,
69 . OFQ
70 INTEGER, DIMENSION(2,NSPMD+1), INTENT(in) :: IAD_ELEM
72 . geo(npropg,*)
73
74
75
76#ifdef MPI
77 INTEGER MSGOFF2 ,MSGOFF3, MSGTYP, LOC_PROC,
78 . IERROR,I, IDEB, LEN, N1, N2, N3, N4,
79 . K, IX, II, NN, J, IOFF,
80 . NBEL,
81 .
82 . REQ_S2(NSPMD),REQ_S3(NSPMD),STATUS(MPI_STATUS_SIZE),
83 . REQ_R1(NSPMD)
84 INTEGER, DIMENSION(:), ALLOCATABLE :: BUFR, BUFS2
85 INTEGER :: SIZ
86
87 DATA msgoff2/188/
88 DATA msgoff3/189/
89
90 ALLOCATE(bufr(irsize))
91 loc_proc = ispmd+1
92
93 ideb = 1
94 ioff = 0
95 len = 0
96 req_r1(1:nspmd) = mpi_request_null
97 DO i = 1, nspmd
98 siz = (iad_elem(1,i+1)-iad_elem(1,i))
99 IF(i/=loc_proc.AND.irecv(i)>0.AND.siz>0) THEN
100 msgtyp = msgoff2
102 . bufr(ideb),irecv(i),mpi_integer,it_spmd(i),msgtyp,
103 . spmd_comm_world,req_r1(i),ierror)
104 len = len+irecv(i)
105 ideb = len + 1
106 ENDIF
107 ENDDO
108
109
110
111 DO i = 1, nspmd
112 siz = (iad_elem(1,i+1)-iad_elem(1,i))
113 IF(i/=loc_proc.AND.lbufs>0.AND.siz>0) THEN
114 msgtyp = msgoff2
116 c bufs,lbufs,mpi_integer,it_spmd(i),msgtyp,
117 g spmd_comm_world,req_s2(i),ierror)
118 ENDIF
119 ENDDO
120
121 ideb = 0
122 ioff = 0
123 len = 0
124
125
126 DO i = 1, nspmd
127 siz = (iad_elem(1,i+1)-iad_elem(1,i))
128 IF(i/=loc_proc.AND.irecv(i)>0.AND.siz>0) THEN
129 msgtyp = msgoff2
130 CALL mpi_wait(req_r1(i),status,ierror)
131 len = len+irecv(i)
132 nbel = irecv(i)/4
133 irecv(i)=0
134
135 DO nn = 1, nbel
136 n1 = get_local_node_id(nodes, bufr(ideb+4*(nn-1)+1))
137 bufr(nn+ioff) = 0
138 IF(n1/=0) THEN
139
140 n2 = get_local_node_id(nodes, bufr(ideb+4*(nn-1)+2))
141 IF(n2/=0) THEN
142
143 n3 = get_local_node_id(nodes, bufr(ideb+4*(nn-1)+3))
144 IF(n3/=0) THEN
145
146 n4 = get_local_node_id(nodes, bufr(ideb+4*(nn-1)+4))
147 IF(n4/=0) THEN
148
149 DO j=addcnel(n1),addcnel(n1+1)-1
150 ii = cnel(j)
151 IF(tagel(ii)>0) THEN
152 itagl(n1) = 0
153 itagl(n2) = 0
154 itagl(n3) = 0
155 itagl(n4) = 0
156 IF(ii<=ofc) THEN
157 DO k = 2, 9
158 ix = ixs(k,ii)
159 itagl(ix) = 1
160 END DO
161 ELSEIF(ii>ofq.AND.ii<=ofc) THEN
162 ii = ii - ofq
163 DO k=2,5
164 ix = ixq(k,ii)
165 itagl(ix)=1
166 END DO
167 ELSEIF(ii>ofc.AND.ii<=oft) THEN
168 ii = ii - ofc
169 DO k=2,5
170 ix = ixc(k,ii)
171 itagl(ix)=1
172 END DO
173 ELSEIF(ii>oftg.AND.ii<=ofur)THEN
174 ii = ii - oftg
175 DO k=2,4
176 ix = ixtg(k,ii)
177 itagl(ix) = 1
178 END DO
179 END IF
180
181 IF(itagl(n1)+itagl(n2)+itagl(n3)+itagl(n4)==4)THEN
182 bufr(nn+ioff) = 1
183 GOTO 410
184 ENDIF
185
186 END IF
187
188 ENDDO
189 410 CONTINUE
190
191 ENDIF
192 ENDIF
193 ENDIF
194 ENDIF
195 END DO
196 ideb = ideb + 4*nbel
197
198 ioff = ioff + nbel
199 irecv(i)=irecv(i)+nbel
200
201 ENDIF
202 ENDDO
203
204
205
206 ideb = 1
207 DO i = 1, nspmd
208 siz = (iad_elem(1,i+1)-iad_elem(1,i))
209 IF(i/=loc_proc.AND.irecv(i)>0.AND.siz>0) THEN
210 len = irecv(i)
211 msgtyp = msgoff3
213 c bufr(ideb),len,mpi_integer,it_spmd(i),msgtyp,
214 g spmd_comm_world,req_s3(i),ierror)
215 ideb = ideb + len
216 ENDIF
217 ENDDO
218
219
220
221 DO i = 1, nspmd
222 siz = (iad_elem(1,i+1)-iad_elem(1,i))
223 IF(i/=loc_proc.AND.lbufs>0.AND.siz>0) THEN
224 CALL mpi_wait(req_s2(i),status,ierror)
225 ENDIF
226 ENDDO
227
228
229
230 ALLOCATE(bufs2(lindex))
231 IF(lindex>0) THEN
232 DO i = 1, lindex
233 bufs(i) = 0
234 ENDDO
235 DO i = 1, nspmd
236 siz = (iad_elem(1,i+1)-iad_elem(1,i))
237 IF(i/=loc_proc.AND.lindex>0.AND.siz>0) THEN
238 msgtyp = msgoff3
240 . bufs2,lindex,mpi_integer,it_spmd(i),msgtyp,
241 . spmd_comm_world,status,ierror)
242 DO j = 1, lindex
243 bufs(j) =
max(bufs(j),bufs2(j))
244 ENDDO
245 ENDIF
246 ENDDO
247 ENDIF
248 DEALLOCATE(bufs2)
249
250
251
252
253 DO i = 1, nspmd
254 siz = (iad_elem(1,i+1)-iad_elem(1,i))
255 IF(i/=loc_proc.AND.siz>0.AND.irecv(i)>0) THEN
256 CALL mpi_wait(req_s3(i),status,ierror)
257 ENDIF
258 ENDDO
259
260 DEALLOCATE(bufr)
261#endif
262 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_wait(ireq, status, ierr)
subroutine mpi_irecv(buf, cnt, datatype, source, tag, comm, ireq, ierr)