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 (NRBE3L,*),LRBE3(*),NODGLOB(*),WEIGHT(*),
56 * NERBE3Y,NERBE3T(NRBE3G),ITAB(*),COMPID_RBE3S
57
58
59
60#ifdef MPI
61 INTEGER I,N,P, SZLOCRBE3(NRBE3G),PGLOBRBE3(NRBE3G),ID
62 INTEGER SNRBE3,SIZRBE3,SBUFSIZ,PSNRBE3
63 INTEGER NSN,IADG,IAD,SN,MN,NGRBE
64 INTEGER SECNDNODS(NRBE3G),(NRBE3G)
65 INTEGER, DIMENSION(:),ALLOCATABLE :: SENDBUF,RECBUF,
66 * P0RBE3BUF,IADRBE3
67 INTEGER, DIMENSION(:,:),ALLOCATABLE :: P0RECRBE3, IIN
68
69
70 INTEGER LOC_PROC
71 INTEGER MSGOFF,MSGOFF2,,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 nerbe3t = 0
82 snrbe3 = 0
83 sbufsiz = 0
84 szlocrbe3=0
85 pglobrbe3 = 0
86
87 DO i=1,nrbe3
88 ngrbe = irbe3(10,i)
89 szlocrbe3(ngrbe) = 0
90 nsn = irbe3(5,i)
91 DO n=1,nsn
92 IF (weight(lrbe3(irbe3(1,i)+n))==1)
93 . szlocrbe3(ngrbe) = szlocrbe3(ngrbe) + 1
94 ENDDO
95 sbufsiz = sbufsiz + szlocrbe3(ngrbe)
96
97 ENDDO
98
99
100
101 IF (ispmd == 0) THEN
102
103 ALLOCATE(p0recrbe3(nrbe3g,nspmd))
104 DO i=1,nrbe3g
105 p0recrbe3(i,1) = szlocrbe3(i)
106 ENDDO
107
108 DO p=2,nspmd
109 msgtyp = msgoff
110 CALL mpi_recv(p0recrbe3(1,p),nrbe3g,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(szlocrbe3,nrbe3g,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 snrbe3 = 0
131 DO i=1,nrbe3
132 nsn = irbe3(5,i)
133 iad = irbe3(1,i)
134 DO n=1,nsn
135 sn = lrbe3(iad+n)
136 IF (weight(sn) == 1 )THEN
137 snrbe3 = snrbe3+1
138 sendbuf(snrbe3)=itab(sn)
139 ENDIF
140 ENDDO
141 ENDDO
142 IF (snrbe3 > 0)THEN
143 msgtyp = msgoff2
144 CALL mpi_send(sendbuf,snrbe3,mpi_integer,it_spmd(1),msgtyp,
145 * spmd_comm_world,ierror)
146 ENDIF
147 DEALLOCATE(sendbuf)
148
149
150 secndnods = 0
151 DO i=1,nrbe3
152 mn = irbe3(3,i)
153 IF(mn/=0)THEN
154 IF (weight(mn)==1)THEN
155 ngrbe = irbe3(10,i)
156 secndnods(ngrbe)=itab(mn)
157 ENDIF
158 ENDIF
159 ENDDO
161
162
163 id_rbe3 = 0
164 DO i=1,nrbe3
166 IF(irbe3(3,i)/=0)THEN
167 IF (weight(irbe3(3,i))==1)THEN
168 ngrbe = irbe3(10,i)
170 ENDIF
171 ENDIF
172 ENDDO
174
175
176 ELSE
177
178
179
180
181
182 ALLOCATE(iadrbe3(nrbe3g+1))
183 ALLOCATE(p0rbe3buf(nerbe3y))
184
185
186 iadrbe3(1)=0
187 DO i=1,nrbe3g
188 snrbe3 = p0recrbe3(i,1)
189 DO n=2,nspmd
190 snrbe3 = snrbe3 + p0recrbe3(i,n)
191 ENDDO
192 iadrbe3(i+1)=iadrbe3(i)+snrbe3
193 ENDDO
194
195
196 DO i=1,nrbe3g
197 pglobrbe3(i)=iadrbe3(i)
198 ENDDO
199
200 DO i=1,nrbe3
201 nsn = irbe3(5,i)
202 iad = irbe3(1,i)
203 ngrbe = irbe3(10,i)
204 iadg = iadrbe3(ngrbe)
205 snrbe3 = 0
206 DO n=1,nsn
207 sn = lrbe3( iad+n )
208 IF (weight(sn) == 1 )THEN
209 snrbe3 = snrbe3+1
210 p0rbe3buf(iadg + snrbe3) = itab(sn)
211 ENDIF
212 ENDDO
213 pglobrbe3(ngrbe)=pglobrbe3(ngrbe) + snrbe3
214 ENDDO
215
216
217
218 DO p=2,nspmd
219
220 sizrbe3 = 0
221 DO i=1,nrbe3g
222 sizrbe3 = sizrbe3 + p0recrbe3(i,p)
223 ENDDO
224
225 IF (sizrbe3 > 0) THEN
226 ALLOCATE(recbuf(sizrbe3))
227 msgtyp = msgoff2
228 CALL mpi_recv(recbuf,sizrbe3,mpi_integer,it_spmd(p),msgtyp,
229 * spmd_comm_world,status,ierror)
230
231 psnrbe3=0
232 DO i=1,nrbe3g
233 iadg = pglobrbe3(i)
234 DO n=1,p0recrbe3(i,p)
235 psnrbe3 = psnrbe3 + 1
236 p0rbe3buf(iadg + n) = recbuf(psnrbe3)
237 ENDDO
238 pglobrbe3(i) = pglobrbe3(i) + p0recrbe3(i,p)
239 ENDDO
240 DEALLOCATE(recbuf)
241 ENDIF
242 ENDDO
243
244 secndnods=0
245 DO i=1,nrbe3
246 mn = irbe3(3,i)
247 IF (weight(mn)==1) THEN
248 ngrbe = irbe3(10,i)
249 secndnods(ngrbe)=itab(mn)
250 ENDIF
251 ENDDO
253
254
255 id_rbe3 = 0
256 DO i=1,nrbe3
258 IF(irbe3(3,i)/=0)THEN
259 IF (weight(irbe3(3,i))==1)THEN
260 ngrbe = irbe3(10,i)
262 ENDIF
263 ENDIF
264 ENDDO
266
267
269 . compid_rbe3s)
270
271 ENDIF
272#endif
273 RETURN
void c_h3d_create_rbe3_impi(int *ITAB, int *NRBE3, int *IADRBE3, int *SLAVENODS, int *P0RBE3BUF, int *ID_RBE3, int *COMPID_RBE3S)
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)