15 & COMM_LOAD, ASS_IRECV,
16 & MSGSOU, MSGTAG, MSGLEN,
17 & BUFR, LBUFR, LBUFR_BYTES, PROCNODE_STEPS, POSFAC,
18 & IWPOS, IWPOSCB, IPTRLU,
19 & LRLU, LRLUS, N, IW, LIW, A, LA, PTRIST,
21 & PTRAST, STEP, PIMASTER, PAMASTER, NSTK_S, COMP,
22 & IFLAG, IERROR, COMM,
23 & PERM, IPOOL, LPOOL, LEAF, NBFIN, MYID, SLAVEF,
25 & root, OPASSW, OPELIW, ITLOC, RHS_MUMPS,
26 & FILS, DAD, PTRARW, PTRAIW,
27 & INTARR, DBLARR, ICNTL, KEEP,KEEP8,DKEEP, ND, FRERE,
28 & LPTRAR, NELT, FRTPTR, FRTELT,
30 & ISTEP_TO_INIV2, TAB_POS_IN_PERE
36 include
'mumps_headers.h'
37 TYPE (smumps_root_struc) ::
38 INTEGER msgsou, msgtag, msglen
41 INTEGER keep(500), icntl( 60 )
44 INTEGER(8) :: posfac, iptrlu, lrlu, lrlus, la
45 INTEGER iwpos, iwposcb
48 INTEGER,
intent(in) :: lrgroups(n)
50 INTEGER(8) :: ptrfac(keep(28))
51 INTEGER(8) :: ptrast(keep(28))
52 INTEGER(8) :: pamaster(keep(28))
53 INTEGER ptrist(keep(28)), ptlust(keep(28))
54 INTEGER step(n), pimaster(keep(28))
56 INTEGER nstk_s(keep(28)), procnode_steps( keep(28) )
58 INTEGER iflag, ierror, comm
60 INTEGER ipool( lpool )
61 INTEGER comm_load, ass_irecv
62 INTEGER myid, slavef, nbfin
63 DOUBLE PRECISION opassw, opeliw
65 INTEGER frtptr( n+1), frtelt( nelt )
66 INTEGER itloc( n+keep(253) ), fils( n ), dad(keep(28))
67 REAL :: rhs_mumps(keep(255))
68 INTEGER(8),
INTENT(IN) :: ptrarw( lptrar ), ptraiw( lptrar )
69 INTEGER nd( keep(28) ), frere( keep(28) )
70 INTEGER istep_to_iniv2(keep(71)),
71 & tab_pos_in_pere(slavef+2,
max(1,keep(56)))
72 INTEGER intarr( keep8(27) )
73 REAL dblarr( keep8(26) )
74 INTEGER iniv2, ishift, ibeg
81 INTEGER nbrecu, position, inode, ison, iroot
82 INTEGER nslaves_pere, nfront_pere, nass_pere,
84 & hdmaplig,nfs4father,
85 & tot_root_size, tot_cont_to_recv
86 DOUBLE PRECISION flop1
87 CHARACTER(LEN=35) :: subname
88 include
'mumps_tags.h'
91 INTEGER :: status(mpi_status_size)
96 IF ( msgtag .EQ. racine )
THEN
98 CALL mpi_unpack( bufr, lbufr_bytes, position, nbrecu,
99 & 1, mpi_integer, comm, ierr)
101 nbfin = nbfin - nbrecu
102 ELSEIF ( msgtag .EQ. noeud )
THEN
104 & bufr, lbufr, lbufr_bytes,
105 & iwpos, iwposcb, iptrlu,
106 & lrlu, lrlus, n, iw, liw, a, la, slavef, procnode_steps,
108 & step, pimaster, pamaster,
109 & nstk_s,
comp, fpere, flag, iflag, ierror, comm,
111 subname=
"SMUMPS_PROCESS_NODE"
112 IF ( iflag .LT. 0 )
GO TO 500
115 & procnode_steps, slavef, keep
116 & keep(80), keep(47), step, fpere )
117 IF (keep(47) .GE. 3)
THEN
120 & procnode_steps, keep,keep8, slavef, comm_load,
121 &
myid, step, n, nd, fils )
124 & procnode_steps,keep(199),
125 & nd, fils, frere, step, pimaster,
126 & keep(28), keep(50), keep(253), flop1,
127 & iw, liw, keep(ixsz) )
128 IF (fpere.NE.keep(20))
131 ELSEIF ( msgtag .EQ. end_niv2_ldlt )
THEN
134 & procnode_steps, slavef, keep(199),
135 & keep(28), keep(76), keep(80), keep(47),
137 IF (keep(47) .GE. 3)
THEN
140 & procnode_steps, keep,keep8, slavef
141 &
myid, step, n, nd, fils )
143 ELSEIF ( msgtag .EQ. terreur )
THEN
147 ELSEIF ( msgtag .EQ. maitre_desc_bande )
THEN
149 & lbufr_bytes, iwpos,
151 & iptrlu, lrlu, lrlus,
152 & n, iw, liw, a, la, slavef, procnode_steps, dad,
153 & ptrist, ptrast, step, pimaster, pamaster,
comp,
154 & keep, keep8, dkeep, itloc, rhs_mumps, istep_to_iniv2,
155#if ! defined (NO_FDM_DESCBAND)
159 subname=
"SMUMPS_PROCESS_DESC_BANDE"
160 IF ( iflag .LT. 0 )
GO to 500
161 ELSEIF ( msgtag .EQ. maitre2 )
THEN
163 & procnode_steps, slavef, iwpos, iwposcb,
164 & iptrlu, lrlu, lrlus, n, iw, liw, a, la,
165 & ptrist, ptrast, step, pimaster, pamaster, nstk_s,
comp,
166 & iflag, ierror, comm, comm_load,
167 & ipool, lpool, leaf,
168 & keep, keep8, dkeep, nd, fils, dad, frere, itloc, rhs_mumps,
169 & istep_to_iniv2, tab_pos_in_pere )
170 subname=
"SMUMPS_PROCESS_MASTER2"
171 IF ( iflag .LT. 0 )
GO to 500
172 ELSEIF ( msgtag .EQ. bloc_facto .OR.
173 & msgtag .EQ. bloc_facto_relay )
THEN
175 & bufr, lbufr, lbufr_bytes,
176 & procnode_steps, msgsou,
177 & slavef, iwpos, iwposcb, iptrlu, lrlu, lrlus, n, iw, liw,
178 & a, la, ptrist, ptrast, nstk_s, perm,
179 &
comp, step, pimaster, pamaster, posfac,
180 &
myid, comm , iflag, ierror, nbfin,
182 & ptlust, ptrfac, root, opassw, opeliw, itloc, rhs_mumps,
183 & fils, dad, ptrarw, ptraiw, intarr, dblarr,
184 & icntl, keep,keep8,dkeep, ipool, lpool, leaf, nd, frere,
185 & lptrar, nelt, frtptr, frtelt,
186 & istep_to_iniv2, tab_pos_in_pere
189 ELSEIF ( msgtag .EQ. bloc_facto_sym_slave )
THEN
192 & lbufr_bytes, procnode_steps, msgsou,
193 & slavef, iwpos, iwposcb, iptrlu, lrlu, lrlus, n, iw, liw,
194 & a, la, ptrist, ptrast, nstk_s, perm,
195 &
comp, step, pimaster, pamaster, posfac,
196 &
myid, comm, iflag, ierror, nbfin,
198 & ptlust, ptrfac, root, opassw, opeliw, itloc, rhs_mumps,
199 & fils, dad, ptrarw, ptraiw, intarr, dblarr,
200 & icntl, keep,keep8,dkeep, ipool, lpool, leaf, nd, frere,
201 & lptrar, nelt, frtptr, frtelt,
202 & istep_to_iniv2, tab_pos_in_pere
205 ELSEIF ( msgtag .EQ. bloc_facto_sym )
THEN
208 & lbufr_bytes, procnode_steps, msgsou,
209 & slavef, iwpos, iwposcb, iptrlu, lrlu, lrlus, n, iw, liw,
210 & a, la, ptrist, ptrast, nstk_s, perm,
211 &
comp, step, pimaster, pamaster, posfac,
212 &
myid, comm, iflag, ierror, nbfin,
214 & ptlust, ptrfac, root, opassw, opeliw, itloc, rhs_mumps,
215 & fils, dad, ptrarw, ptraiw, intarr, dblarr,
216 & icntl,keep,keep8,dkeep,ipool, lpool, leaf, nd, frere,
217 & lptrar, nelt, frtptr, frtelt,
218 & istep_to_iniv2, tab_pos_in_pere
221 ELSEIF ( msgtag .EQ. contrib_type2 )
THEN
223 & msglen, bufr, lbufr,
224 & lbufr_bytes, procnode_steps,
225 & slavef, iwpos, iwposcb, iptrlu, lrlu, lrlus, posfac,
226 & n, iw, liw, a, la, ptrist,
227 & ptlust, ptrfac, ptrast,
228 & step, pimaster, pamaster, perm,
comp, root,
229 & opassw, opeliw, itloc, rhs_mumps, nstk_s, fils, dad,
230 & ptrarw, ptraiw, intarr, dblarr, nbfin,
myid, comm,
231 & icntl,keep,keep8,dkeep,iflag, ierror, ipool, lpool, leaf,
232 & nd, frere, lptrar, nelt, frtptr, frtelt,
233 & istep_to_iniv2, tab_pos_in_pere
236 IF ( iflag .LT. 0 )
GO TO 100
237 ELSEIF ( msgtag .EQ. maplig )
THEN
241 nslaves_pere = bufr( 3 )
242 nfront_pere = bufr( 4 )
243 nass_pere = bufr( 5 )
245 nfs4father = bufr( 7 )
246 IF ( nslaves_pere.NE.0 )
THEN
247 iniv2 = istep_to_iniv2( step(inode) )
248 ishift = nslaves_pere+1
249 tab_pos_in_pere(1:nslaves_pere+1, iniv2) =
250 & bufr(hdmaplig+1:hdmaplig+1+nslaves_pere)
251 tab_pos_in_pere(slavef+2, iniv2) = nslaves_pere
255 ibeg = hdmaplig+1+ishift
257 & bufr, lbufr, lbufr_bytes,
258 & inode, ison, nslaves_pere,
260 & nfront_pere, nass_pere, nfs4father,lmap,
261 & bufr(ibeg+nslaves_pere),
262 & procnode_steps, slavef, posfac, iwpos, iwposcb,
263 & iptrlu, lrlu, lrlus, n, iw, liw, a, la,
264 & ptrist, ptlust, ptrfac, ptrast, step, pimaster, pamaster,
266 & iflag, ierror,
myid, comm, perm,
267 & ipool, lpool, leaf, nbfin, icntl, keep,keep8,dkeep, root,
269 & itloc, rhs_mumps, fils, dad, ptrarw, ptraiw, intarr, dblarr,
270 & nd, frere, lptrar, nelt, frtptr, frtelt,
272 & istep_to_iniv2, tab_pos_in_pere
275 IF ( iflag .LT. 0 )
GO TO 100
276 ELSE IF ( msgtag .EQ. root_cont_static )
THEN
278 & bufr, lbufr, lbufr_bytes,
279 & root, n, iw, liw, a, la,
280 & lrlu, iptrlu, iwpos, iwposcb,
281 & ptrist, ptlust, ptrfac, ptrast,
282 & step, pimaster, pamaster,
283 &
comp, lrlus, ipool, lpool, leaf,
285 & lptrar, nelt, frtptr, frtelt,
286 & ptraiw, ptrarw, intarr, dblarr,
287 & keep, keep8, dkeep, iflag, ierror, comm, comm_load,
289 & nd, procnode_steps, slavef, opassw)
290 subname=
"SMUMPS_PROCESS_CONTRIB_TYPE3"
291 IF ( iflag .LT. 0 )
GO TO 500
292 ELSE IF ( msgtag .EQ. root_non_elim_cb )
THEN
296 IF ( ptlust( step(iroot)) .EQ. 0 )
THEN
297 keep(266)=keep(266)-1
298 CALL mpi_recv( tmp, 2 * keep(34), mpi_packed,
299 & msgsou, root_2slave,
300 & comm, status, ierr )
303 & bufr, lbufr, lbufr_bytes, procnode_steps, posfac,
304 & iwpos, iwposcb, iptrlu,
305 & lrlu, lrlus, n, iw, liw, a, la, ptrist,
307 & ptrast, step, pimaster, pamaster, nstk_s,
comp,
308 & iflag, ierror, comm, comm_load,
309 & ipool, lpool, leaf,
310 & nbfin,
myid, slavef,
312 & opassw, opeliw, itloc, rhs_mumps, fils, dad,
313 & lptrar, nelt, frtptr, frtelt,
315 & intarr, dblarr, icntl, keep,keep8, dkeep,nd )
316 subname=
"SMUMPS_PROCESS_ROOT2SLAVE"
317 IF ( iflag .LT. 0 )
GOTO 500
320 & bufr, lbufr, lbufr_bytes,
321 & root, n, iw, liw, a, la,
322 & lrlu, iptrlu, iwpos, iwposcb,
323 & ptrist, ptlust, ptrfac, ptrast, step, pimaster, pamaster,
324 &
comp, lrlus, ipool, lpool, leaf,
326 & lptrar, nelt, frtptr, frtelt,
327 & ptraiw, ptrarw, intarr, dblarr,
328 & keep, keep8, dkeep, iflag, ierror, comm, comm_load,
330 & nd, procnode_steps, slavef, opassw )
331 subname=
"SMUMPS_PROCESS_CONTRIB_TYPE3"
332 IF ( iflag .LT. 0 )
GO TO 500
333 ELSE IF ( msgtag .EQ. root_2son )
THEN
338 & bufr, lbufr, lbufr_bytes, procnode_steps, posfac,
339 & iwpos, iwposcb, iptrlu,
342 & ptrast, step, pimaster, pamaster, nstk_s,
comp,
344 & perm, ipool, lpool, leaf, nbfin,
myid, slavef,
346 & opassw, opeliw, itloc, rhs_mumps,
347 & fils, dad, ptrarw, ptraiw,
348 & intarr,dblarr,icntl,keep,keep8,dkeep,nd, frere,
349 & lptrar, nelt, frtptr, frtelt,
350 & istep_to_iniv2, tab_pos_in_pere
353 IF ( iflag .LT. 0 )
GO TO 100
356 IF (keep(50).EQ.0)
THEN
361 IF (iw(ptrist(step(ison))+ishift_hdr+keep(ixsz)).EQ.
362 & s_rec_contstatic)
THEN
363 iw(ptrist(step(ison))+ishift_hdr+keep(ixsz)) =
367 & iw, liw, a, la, lrlu, lrlus, iwposcb,
368 & iptrlu, step,
myid, keep, keep8,
373 ELSE IF ( msgtag .EQ. root_2slave )
THEN
374 tot_root_size = bufr( 1 )
375 tot_cont_to_recv = bufr( 2 )
377 & tot_cont_to_recv, root,
378 & bufr, lbufr, lbufr_bytes, procnode_steps, posfac,
379 & iwpos, iwposcb, iptrlu,
380 & lrlu, lrlus, n, iw, liw, a, la, ptrist,
382 & ptrast, step, pimaster, pamaster, nstk_s,
comp,
383 & iflag, ierror, comm, comm_load,
384 & ipool, lpool, leaf,
385 & nbfin,
myid, slavef,
387 & opassw, opeliw, itloc, rhs_mumps, fils, dad,
388 & lptrar, nelt, frtptr, frtelt,
390 & intarr, dblarr, icntl, keep,keep8, dkeep, nd )
391 IF ( iflag .LT. 0 )
GO TO 100
392 ELSE IF ( msgtag .EQ. root_nelim_indices )
THEN
395 nslaves_pere = bufr( 3 )
397 & ison, nelim, nslaves_pere, bufr(4), bufr(4+bufr(2)),
401 & iwpos, iwposcb, iptrlu,
402 & lrlu, lrlus, n, iw, liw, a, la, ptrist,
404 & ptrast, step, pimaster, pamaster, nstk_s,
405 & itloc, rhs_mumps,
comp,
407 & ipool, lpool, leaf,
myid, slavef,
408 & keep, keep8, dkeep,
409 & comm, comm_load, fils, dad, nd)
410 subname=
"SMUMPS_PROCESS_RTNELIND"
411 IF ( iflag .LT. 0 )
GO TO 500
412 ELSE IF ( msgtag .EQ. update_load )
THEN
413 WRITE(*,*)
"Internal error 3 in SMUMPS_TRAITER_MESSAGE"
415 ELSE IF ( msgtag .EQ. tag_dummy )
THEN
419 &
': Internal error, routine SMUMPS_TRAITER_MESSAGE.',msgtag
427 IF ( icntl(1) .GT. 0 .AND. icntl(4).GE.1 )
THEN
429 IF (iflag.EQ.-9)
THEN
430 WRITE(lp,*) 'failure, workspace too small during
',SUBNAME
432.EQ.
IF (IFLAG-8) THEN
433 WRITE(LP,*) 'failure in
INTEGER allocation during
',SUBNAME
435.EQ.
IF (IFLAG-13) THEN
436 WRITE(LP,*) 'failure in dynamic allocation during
',SUBNAME
439 CALL SMUMPS_BDC_ERROR( MYID, SLAVEF, COMM, KEEP )