35
36
37
38 USE spmd_comm_world_mod, ONLY : spmd_comm_world
39#include "implicit_f.inc"
40
41
42
43#include "spmd.inc"
44
45
46
47#include "com01_c.inc"
48#include "com04_c.inc"
49#include "task_c.inc"
50#include "param_c.inc"
51#include "spmd_c.inc"
52
53
54
55 INTEGER IRBE2(,*),LRBE2(*),NODGLOB(*),WEIGHT(*),
56 * NERBE2Y,NERBE2T(NRBE2G),ITAB(*),COMPID_RBE2S
57
58
59
60#ifdef MPI
61 INTEGER I,N,P, SZLOCRBE2(NRBE2G),PGLOBRBE2(NRBE2G),ID
62 INTEGER SNRBE2,SIZRBE2,SBUFSIZ,PSNRBE2
63 INTEGER NSN,IADG,IAD,SN,MN,NGRBE
64 INTEGER MAINNODS(NRBE2G),(NRBE2G)
65 INTEGER, DIMENSION(:),ALLOCATABLE :: SENDBUF,RECBUF,
66 * P0RBE2BUF,IADRBE2
67 INTEGER, DIMENSION(:,:),ALLOCATABLE :: P0RECRBE2, IIN
68
69
70 INTEGER LOC_PROC
71 INTEGER MSGOFF,MSGOFF2,MSGTYP,INFO,ATID,ATAG,ALEN
72 INTEGER STATUS(MPI_STATUS_SIZE),IERROR,ISD(NSPMD)
73
74 DATA msgoff/7020/
75 DATA msgoff2/7021/
76
77
78
79
80
81 nerbe2t = 0
82 snrbe2 = 0
83 sbufsiz = 0
84 szlocrbe2=0
85 pglobrbe2 = 0
86
87 DO i=1,nrbe2
88 ngrbe = irbe2(10,i)
89 szlocrbe2(ngrbe) = 0
90 nsn = irbe2(5,i)
91 DO n=1,nsn
92 IF (weight(lrbe2(irbe2(1,i)+n))==1)
93 . szlocrbe2(ngrbe) = szlocrbe2(ngrbe) + 1
94 ENDDO
95 sbufsiz = sbufsiz + szlocrbe2(ngrbe)
96
97 ENDDO
98
99
100
101 IF (ispmd == 0) THEN
102
103 ALLOCATE(p0recrbe2(nrbe2g,nspmd))
104 DO i=1,nrbe2g
105 p0recrbe2(i,1) = szlocrbe2(i)
106 ENDDO
107
108 DO p=2,nspmd
109 msgtyp = msgoff
110 CALL mpi_recv(p0recrbe2(1,p),nrbe2g,mpi_integer,it_spmd(p),
111 * msgtyp,spmd_comm_world,status,ierror)
112 ENDDO
113
114 ELSE
115
116 msgtyp = msgoff
117 CALL mpi_send(szlocrbe2,nrbe2g,mpi_integer,it_spmd(1),
118 . msgtyp,spmd_comm_world,ierror)
119
120 ENDIF
121
122
123
124
125 IF (ispmd /= 0) THEN
126
127
128
129 ALLOCATE(sendbuf(sbufsiz))
130 snrbe2 = 0
131 DO i=1,nrbe2
132 nsn = irbe2(5,i)
133 iad = irbe2(1,i)
134 DO n=1,nsn
135 sn = lrbe2(iad+n)
136 IF (weight(sn) == 1 )THEN
137 snrbe2 = snrbe2+1
138 sendbuf(snrbe2)=itab(sn)
139 ENDIF
140 ENDDO
141 ENDDO
142 IF (snrbe2 > 0)THEN
143 msgtyp = msgoff2
144 CALL mpi_send(sendbuf,snrbe2,mpi_integer,it_spmd(1),msgtyp,
145 * spmd_comm_world,ierror)
146 ENDIF
147 DEALLOCATE(sendbuf)
148
149
150 mainnods = 0
151 DO i=1,nrbe2
152 mn = irbe2(3,i)
153 IF(mn/=0)THEN
154 IF (weight(mn)==1)THEN
155 ngrbe = irbe2(10,i)
156 mainnods(ngrbe)=itab(mn)
157 ENDIF
158 ENDIF
159 ENDDO
161
162
163 id_rbe2 = 0
164 DO i=1,nrbe2
166 IF(irbe2(3,i)/=0)THEN
167 IF (weight(irbe2(3,i))==1)THEN
168 ngrbe = irbe2(10,i)
170 ENDIF
171 ENDIF
172 ENDDO
174
175
176 ELSE
177
178
179
180
181
182 ALLOCATE(iadrbe2(nrbe2g+1))
183 ALLOCATE(p0rbe2buf(nerbe2y))
184
185
186 iadrbe2(1)=0
187 DO i=1,nrbe2g
188 snrbe2 = p0recrbe2(i,1)
189 DO n=2,nspmd
190 snrbe2 = snrbe2 + p0recrbe2(i,n)
191 ENDDO
192 iadrbe2(i+1)=iadrbe2(i)+snrbe2
193 ENDDO
194
195
196 DO i=1,nrbe2g
197 pglobrbe2(i)=iadrbe2(i)
198 ENDDO
199
200 DO i=1,nrbe2
201 nsn = irbe2(5,i)
202 iad = irbe2(1,i)
203 ngrbe = irbe2(10,i)
204 iadg = iadrbe2(ngrbe)
205 snrbe2 = 0
206 DO n=1,nsn
207 sn = lrbe2( iad+n )
208 IF (weight(sn) == 1 )THEN
209 snrbe2 = snrbe2+1
210 p0rbe2buf(iadg + snrbe2) = itab(sn)
211 ENDIF
212 ENDDO
213 pglobrbe2(ngrbe)=pglobrbe2(ngrbe) + snrbe2
214 ENDDO
215
216
217
218 DO p=2,nspmd
219
220 sizrbe2 = 0
221 DO i=1,nrbe2g
222 sizrbe2 = sizrbe2 + p0recrbe2(i,p)
223 ENDDO
224
225 IF (sizrbe2 > 0) THEN
226 ALLOCATE(recbuf(sizrbe2))
227 msgtyp = msgoff2
228 CALL mpi_recv(recbuf,sizrbe2,mpi_integer,it_spmd(p),msgtyp,
229 * spmd_comm_world,status,ierror)
230
231 psnrbe2=0
232 DO i=1,nrbe2g
233 iadg = pglobrbe2(i)
234 DO n=1,p0recrbe2(i,p)
235 psnrbe2 = psnrbe2 + 1
236 p0rbe2buf(iadg + n) = recbuf(psnrbe2)
237 ENDDO
238 pglobrbe2(i) = pglobrbe2(i) + p0recrbe2(i,p)
239 ENDDO
240 DEALLOCATE(recbuf)
241 ENDIF
242 ENDDO
243
244 mainnods=0
245 DO i=1,nrbe2
246 mn = irbe2(3,i)
247 IF (weight(mn)==1) THEN
248 ngrbe = irbe2(10,i)
249 mainnods(ngrbe)=itab(mn)
250 ENDIF
251 ENDDO
253
254
255 id_rbe2 = 0
256 DO i=1,nrbe2
258 IF(irbe2(3,i)/=0)THEN
259 IF (weight(irbe2(3,i))==1)THEN
260 ngrbe = irbe2(10,i)
262 ENDIF
263 ENDIF
264 ENDDO
266
267
269 . compid_rbe2s
270
271 ENDIF
272#endif
273 RETURN
void c_h3d_create_rbe2_impi(int *ITAB, int *NRBE2, int *IADRBE2, int *MASTERNODS, int *P0RBE2BUF, int *ID_RBE2, int *COMPID_RBE2S)
subroutine mpi_recv(buf, cnt, datatype, source, tag, comm, status, ierr)
subroutine mpi_send(buf, cnt, datatype, dest, tag, comm, ierr)
subroutine spmd_glob_isum9(v, len)