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'
38 INTEGER msgsou, msgtag, msglen
39 INTEGER lbufr, lbufr_bytes
41 INTEGER keep(500), icntl( 60 )
43 DOUBLE PRECISION dkeep(230)
44 INTEGER(8) :: posfac, iptrlu, lrlu, lrlus, la
45 INTEGER iwpos, iwposcb
48 INTEGER,
intent(in) :: lrgroups(n)
49 DOUBLE PRECISION a( la )
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 DOUBLE PRECISION :: 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 DOUBLE PRECISION 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, dad,
108 & step, pimaster, pamaster,
109 & nstk_s,
comp, fpere, flag, iflag, ierror, comm,
112.LT.
IF ( IFLAG 0 ) GO TO 500
114 CALL DMUMPS_INSERT_POOL_N(N, IPOOL, LPOOL,
115 & PROCNODE_STEPS, SLAVEF, KEEP(199), KEEP(28), KEEP(76),
116 & KEEP(80), KEEP(47), STEP, FPERE )
117.GE.
IF (KEEP(47) 3) THEN
118 CALL DMUMPS_LOAD_POOL_UPD_NEW_POOL(
120 & PROCNODE_STEPS, KEEP,KEEP8, SLAVEF, COMM_LOAD,
121 & MYID, STEP, N, ND, FILS )
123 CALL MUMPS_ESTIM_FLOPS( FPERE, N,
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.NE.
IF (FPEREKEEP(20))
129 & CALL DMUMPS_LOAD_UPDATE(1,.FALSE.,FLOP1,KEEP,KEEP8)
131.EQ.
ELSEIF ( MSGTAG END_NIV2_LDLT ) THEN
133 CALL DMUMPS_INSERT_POOL_N(N, IPOOL, LPOOL,
134 & PROCNODE_STEPS, SLAVEF, KEEP(199),
135 & KEEP(28), KEEP(76), KEEP(80), KEEP(47),
137.GE.
IF (KEEP(47) 3) THEN
138 CALL DMUMPS_LOAD_POOL_UPD_NEW_POOL(
140 & PROCNODE_STEPS, KEEP,KEEP8, SLAVEF, COMM_LOAD,
141 & MYID, STEP, N, ND, FILS )
143.EQ.
ELSEIF ( MSGTAG TERREUR ) THEN
147.EQ.
ELSEIF ( MSGTAG MAITRE_DESC_BANDE ) THEN
148 CALL DMUMPS_PROCESS_DESC_BANDE( MYID,BUFR, LBUFR,
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)
160.LT.
IF ( IFLAG 0 ) GO to 500
161.EQ.
ELSEIF ( MSGTAG MAITRE2 ) THEN
162 CALL DMUMPS_PROCESS_MASTER2(MYID,BUFR, LBUFR, LBUFR_BYTES,
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 )
171.LT.
IF ( IFLAG 0 ) GO to 500
172.EQ..OR.
ELSEIF ( MSGTAG BLOC_FACTO
173.EQ.
& MSGTAG BLOC_FACTO_RELAY ) THEN
174 CALL DMUMPS_PROCESS_BLOCFACTO( COMM_LOAD, ASS_IRECV,
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.EQ.
ELSEIF ( MSGTAG BLOC_FACTO_SYM_SLAVE ) THEN
190 CALL DMUMPS_PROCESS_BLFAC_SLAVE( COMM_LOAD, ASS_IRECV,
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.EQ.
ELSEIF ( MSGTAG BLOC_FACTO_SYM ) THEN
206 CALL DMUMPS_PROCESS_SYM_BLOCFACTO( COMM_LOAD, ASS_IRECV,
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.EQ.
ELSEIF ( MSGTAG CONTRIB_TYPE2 ) THEN
222 CALL DMUMPS_PROCESS_CONTRIB_TYPE2( COMM_LOAD, ASS_IRECV,
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.LT.
IF ( IFLAG 0 ) GO TO 100
237.EQ.
ELSEIF ( MSGTAG MAPLIG ) THEN
241 NSLAVES_PERE = BUFR( 3 )
242 NFRONT_PERE = BUFR( 4 )
243 NASS_PERE = BUFR( 5 )
245 NFS4FATHER = BUFR( 7 )
246.NE.
IF ( NSLAVES_PERE0 ) 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
256 CALL DMUMPS_MAPLIG( COMM_LOAD, ASS_IRECV,
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.LT.
IF ( IFLAG 0 ) GO TO 100
276.EQ.
ELSE IF ( MSGTAG ROOT_CONT_STATIC ) THEN
277 CALL DMUMPS_PROCESS_CONTRIB_TYPE3(
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)
291.LT.
IF ( IFLAG 0 ) GO TO 500
292.EQ.
ELSE IF ( MSGTAG ROOT_NON_ELIM_CB ) THEN
294 MSGSOU = MUMPS_PROCNODE( PROCNODE_STEPS(STEP(IROOT)),
296.EQ.
IF ( PTLUST( STEP(IROOT)) 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 )
301 CALL DMUMPS_PROCESS_ROOT2SLAVE( TMP( 1 ), TMP( 2 ),
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 )
317.LT.
IF ( IFLAG 0 ) GOTO 500
319 CALL DMUMPS_PROCESS_CONTRIB_TYPE3(
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 )
332.LT.
IF ( IFLAG 0 ) GO TO 500
333.EQ.
ELSE IF ( MSGTAG ROOT_2SON ) THEN
336 CALL DMUMPS_PROCESS_ROOT2SON( COMM_LOAD, ASS_IRECV,
338 & BUFR, LBUFR, LBUFR_BYTES, PROCNODE_STEPS, POSFAC,
339 & IWPOS, IWPOSCB, IPTRLU,
340 & LRLU, LRLUS, N, IW, LIW, A, LA, PTRIST,
342 & PTRAST, STEP, PIMASTER, PAMASTER, NSTK_S, COMP,
343 & IFLAG, IERROR, COMM,
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.LT.
IF ( IFLAG 0 ) GO TO 100
354.NE.
IF ( MYIDMUMPS_PROCNODE(PROCNODE_STEPS(STEP(ISON)),
356.EQ.
IF (KEEP(50)0) THEN
361.EQ.
IF (IW(PTRIST(STEP(ISON))+ISHIFT_HDR+KEEP(IXSZ))
362 & S_REC_CONTSTATIC) THEN
363 IW(PTRIST(STEP(ISON))+ISHIFT_HDR+KEEP(IXSZ)) =
366 CALL DMUMPS_FREE_BAND( N, ISON, PTRIST, PTRAST,
367 & IW, LIW, A, LA, LRLU, LRLUS, IWPOSCB,
368 & IPTRLU, STEP, MYID, KEEP, KEEP8,
369 & MUMPS_TYPENODE(PROCNODE_STEPS(STEP(ISON)),KEEP(199))
373.EQ.
ELSE IF ( MSGTAG ROOT_2SLAVE ) THEN
374 TOT_ROOT_SIZE = BUFR( 1 )
375 TOT_CONT_TO_RECV = BUFR( 2 )
376 CALL DMUMPS_PROCESS_ROOT2SLAVE( TOT_ROOT_SIZE,
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.LT.
IF ( IFLAG 0 ) GO TO 100
392.EQ.
ELSE IF ( MSGTAG ROOT_NELIM_INDICES ) THEN
395 NSLAVES_PERE = BUFR( 3 )
396 CALL DMUMPS_PROCESS_RTNELIND( root,
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)
411.LT.
IF ( IFLAG 0 ) GO TO 500
412.EQ.
ELSE IF ( MSGTAG UPDATE_LOAD ) THEN
415.EQ.
ELSE IF ( MSGTAG TAG_DUMMY ) THEN
419 &': Internal error, routine DMUMPS_TRAITER_MESSAGE.',MSGTAG
427.GT..AND..GE.
IF ( ICNTL(1) 0 ICNTL(4)1 ) THEN
429.EQ.
IF (IFLAG-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 DMUMPS_BDC_ERROR( MYID, SLAVEF, COMM, KEEP )
441 END SUBROUTINE DMUMPS_TRAITER_MESSAGE
442 RECURSIVE SUBROUTINE DMUMPS_RECV_AND_TREAT(
443 & COMM_LOAD, ASS_IRECV,
445 & BUFR, LBUFR, LBUFR_BYTES, PROCNODE_STEPS, POSFAC,
446 & IWPOS, IWPOSCB, IPTRLU,
447 & LRLU, LRLUS, N, IW, LIW, A, LA, PTRIST,
449 & PTRAST, STEP, PIMASTER, PAMASTER, NSTK_S, COMP,
450 & IFLAG, IERROR, COMM,
451 & PERM, IPOOL, LPOOL, LEAF, NBFIN, MYID, SLAVEF,
453 & root, OPASSW, OPELIW, ITLOC, RHS_MUMPS,
454 & FILS, DAD, PTRARW, PTRAIW,
455 & INTARR, DBLARR, ICNTL, KEEP,KEEP8,DKEEP, ND, FRERE,
456 & LPTRAR, NELT, FRTPTR, FRTELT ,
458 & ISTEP_TO_INIV2, TAB_POS_IN_PERE
461 USE DMUMPS_STRUC_DEF, ONLY : DMUMPS_ROOT_STRUC
464 INCLUDE 'mumps_tags.h'
465 TYPE (DMUMPS_ROOT_STRUC) :: root
466 INTEGER :: STATUS(MPI_STATUS_SIZE)
467 INTEGER KEEP(500), ICNTL(60)
468 INTEGER(8) KEEP8(150)
469 DOUBLE PRECISION DKEEP(230)
470 INTEGER COMM_LOAD, ASS_IRECV
471 INTEGER LBUFR, LBUFR_BYTES
472 INTEGER BUFR( LBUFR )
473 INTEGER(8) :: POSFAC, LA, IPTRLU, LRLU, LRLUS
474 INTEGER IWPOS, IWPOSCB
477 DOUBLE PRECISION A( LA )
478 INTEGER, intent(in) :: LRGROUPS(N)
479 INTEGER(8) :: PTRFAC(KEEP(28))
480 INTEGER(8) :: PTRAST(KEEP(28))
481 INTEGER(8) :: PAMASTER(KEEP(28))
482 INTEGER PTRIST( KEEP(28) ),
484 INTEGER STEP(N), PIMASTER(KEEP(28))
486 INTEGER NSTK_S(KEEP(28)), PROCNODE_STEPS( KEEP(28) )
488 INTEGER IFLAG, IERROR, COMM
490 INTEGER IPOOL( LPOOL )
491 INTEGER MYID, SLAVEF, NBFIN
492 DOUBLE PRECISION OPASSW, OPELIW
494 INTEGER FRTPTR( N+1 ), FRTELT( NELT )
495 INTEGER ITLOC( N+KEEP(253) ), FILS( N ), DAD( KEEP(28) )
496 DOUBLE PRECISION :: RHS_MUMPS(KEEP(255))
497 INTEGER(8), INTENT(IN) :: PTRARW( LPTRAR ), PTRAIW( LPTRAR )
498 INTEGER ND( KEEP(28) ), FRERE( KEEP(28) )
499 INTEGER ISTEP_TO_INIV2(KEEP(71)),
500 & TAB_POS_IN_PERE(SLAVEF+2,max(1,KEEP(56)))
501 INTEGER INTARR( KEEP8(27) )
502 DOUBLE PRECISION DBLARR( KEEP8(26) )
503 INTEGER MSGSOU, MSGTAG, MSGLEN, IERR
504 MSGSOU = STATUS( MPI_SOURCE )
505 MSGTAG = STATUS( MPI_TAG )
506 CALL MPI_GET_COUNT( STATUS, MPI_PACKED, MSGLEN, IERR )
507.GT.
IF ( MSGLEN LBUFR_BYTES ) THEN
510 WRITE(*,*) ' RECEPTION BUF TOO SMALL, Msgtag/len=',
512 CALL DMUMPS_BDC_ERROR( MYID, SLAVEF, COMM, KEEP )
515 KEEP(266)=KEEP(266)-1
516 CALL MPI_RECV( BUFR, LBUFR_BYTES, MPI_PACKED, MSGSOU,
518 & COMM, STATUS, IERR )
519 CALL DMUMPS_TRAITER_MESSAGE(
520 & COMM_LOAD, ASS_IRECV,
521 & MSGSOU, MSGTAG, MSGLEN, BUFR, LBUFR,
523 & PROCNODE_STEPS, POSFAC,
524 & IWPOS, IWPOSCB, IPTRLU,
525 & LRLU, LRLUS, N, IW, LIW, A, LA, PTRIST,
527 & PTRAST, STEP, PIMASTER, PAMASTER, NSTK_S, COMP, IFLAG,
529 & PERM, IPOOL, LPOOL, LEAF, NBFIN, MYID, SLAVEF,
531 & root, OPASSW, OPELIW, ITLOC, RHS_MUMPS,
532 & FILS, DAD, PTRARW, PTRAIW,
533 & INTARR, DBLARR, ICNTL, KEEP,KEEP8,DKEEP, ND, FRERE,
534 & LPTRAR, NELT, FRTPTR, FRTELT,
536 & ISTEP_TO_INIV2, TAB_POS_IN_PERE
540 END SUBROUTINE DMUMPS_RECV_AND_TREAT
541 RECURSIVE SUBROUTINE DMUMPS_TRY_RECVTREAT(
542 & COMM_LOAD, ASS_IRECV, BLOCKING, SET_IRECV,
543 & MESSAGE_RECEIVED, MSGSOU, MSGTAG,
545 & BUFR, LBUFR, LBUFR_BYTES, PROCNODE_STEPS, POSFAC,
546 & IWPOS, IWPOSCB, IPTRLU,
547 & LRLU, LRLUS, N, IW, LIW, A, LA, PTRIST,
549 & PTRAST, STEP, PIMASTER, PAMASTER, NSTK_S, COMP,
550 & IFLAG, IERROR, COMM, PERM,
551 & IPOOL, LPOOL, LEAF, NBFIN, MYID, SLAVEF,
553 & root, OPASSW, OPELIW, ITLOC, RHS_MUMPS,
554 & FILS, DAD, PTRARW, PTRAIW,
555 & INTARR, DBLARR, ICNTL, KEEP,KEEP8,DKEEP, ND, FRERE,
556 & LPTRAR, NELT, FRTPTR, FRTELT,
558 & ISTEP_TO_INIV2, TAB_POS_IN_PERE,
559 & STACK_RIGHT_AUTHORIZED, LRGROUPS )
561 USE DMUMPS_STRUC_DEF, ONLY : DMUMPS_ROOT_STRUC
564 INCLUDE 'mumps_tags.h'
565 TYPE (DMUMPS_ROOT_STRUC) :: root
566 INTEGER :: STATUS(MPI_STATUS_SIZE)
567 LOGICAL, INTENT (IN) :: BLOCKING
568 LOGICAL, INTENT (IN) :: SET_IRECV
569 LOGICAL, INTENT (INOUT) :: MESSAGE_RECEIVED
570 INTEGER, INTENT (IN) :: MSGSOU, MSGTAG
571 INTEGER KEEP(500), ICNTL(60)
572 INTEGER(8) KEEP8(150)
573 DOUBLE PRECISION DKEEP(230)
574 INTEGER LBUFR, LBUFR_BYTES
575 INTEGER COMM_LOAD, ASS_IRECV
576 INTEGER BUFR( LBUFR )
577 INTEGER(8) :: LA, POSFAC, IPTRLU, LRLU, LRLUS
578 INTEGER IWPOS, IWPOSCB
581 DOUBLE PRECISION A( LA )
582 INTEGER, intent(in) :: LRGROUPS(N)
583 INTEGER(8) :: PTRAST(KEEP(28))
584 INTEGER(8) :: PTRFAC(KEEP(28))
585 INTEGER(8) :: PAMASTER(KEEP(28))
586 INTEGER PTRIST( KEEP(28) ),
591 INTEGER NSTK_S(KEEP(28)), PROCNODE_STEPS( KEEP(28) )
593 INTEGER IFLAG, IERROR, COMM
595 INTEGER IPOOL( LPOOL )
596 INTEGER MYID, SLAVEF, NBFIN
597 DOUBLE PRECISION OPASSW, OPELIW
599 INTEGER FRTPTR( N+1 ), FRTELT( NELT )
600 INTEGER ITLOC( N + KEEP(253) ), FILS( N ), DAD( KEEP(28) )
601 DOUBLE PRECISION :: RHS_MUMPS(KEEP(255))
602 INTEGER(8), INTENT(IN) :: PTRARW( LPTRAR ), PTRAIW( LPTRAR )
603 INTEGER ND( KEEP(28) ), FRERE( KEEP(28) )
604 INTEGER ISTEP_TO_INIV2(KEEP(71)),
605 & TAB_POS_IN_PERE(SLAVEF+2,max(1,KEEP(56)))
606 INTEGER INTARR( KEEP8(27) )
607 DOUBLE PRECISION DBLARR( KEEP8(26) )
608 LOGICAL, intent(in) :: STACK_RIGHT_AUTHORIZED
609 LOGICAL FLAG, RIGHT_MESS, FLAGbis
610 INTEGER LP, MSGSOU_LOC, MSGTAG_LOC, MSGLEN_LOC
612 INTEGER :: STATUS_BIS(MPI_STATUS_SIZE)
613 INTEGER, SAVE :: RECURS = 0
614 CALL DMUMPS_LOAD_RECV_MSGS(COMM_LOAD)
615.NOT.
IF ( STACK_RIGHT_AUTHORIZED ) THEN
620.LT.
IF (ICNTL(4)1) LP=-1
621 IF ( MESSAGE_RECEIVED ) THEN
622 MSGSOU_LOC = MPI_ANY_SOURCE
623 MSGTAG_LOC = MPI_ANY_TAG
626.NE.
IF ( ASS_IRECV MPI_REQUEST_NULL) THEN
627.NE.
IF (KEEP(117)0) THEN
628 WRITE(*,*) "problem of active irecv with keep(117)=
",KEEP(117)
633 CALL MPI_WAIT(ASS_IRECV,
636.NE..OR.
IF ( ( (MSGSOUMPI_ANY_SOURCE)
637.NE.
& (MSGTAGMPI_ANY_TAG) ) ) THEN
638.NE.
IF ( MSGSOUMPI_ANY_SOURCE) THEN
639.EQ.
RIGHT_MESS = MSGSOUSTATUS(MPI_SOURCE)
641.NE.
IF ( MSGTAGMPI_ANY_TAG) THEN
643.EQ..AND.
& ( (MSGTAGSTATUS(MPI_TAG))RIGHT_MESS )
645.NOT.
IF (RIGHT_MESS) THEN
646 CALL MPI_PROBE(MSGSOU,MSGTAG,
647 & COMM, STATUS_BIS, IERR)
651 CALL MPI_TEST(ASS_IRECV,
652 & FLAG, STATUS, IERR)
657 & write(LP,*) ' Error return from MPI_TEST ',
658 & IFLAG, ' in DMUMPS_TRY_RECVTREAT'
659 CALL DMUMPS_BDC_ERROR( MYID, SLAVEF, COMM, KEEP )
663 KEEP(266)=KEEP(266)-1
664 MESSAGE_RECEIVED = .TRUE.
665 MSGSOU_LOC = STATUS( MPI_SOURCE )
666 MSGTAG_LOC = STATUS( MPI_TAG )
667 CALL MPI_GET_COUNT( STATUS, MPI_PACKED, MSGLEN_LOC, IERR )
668.NOT.
IF (RIGHT_MESS) RECURS = RECURS + 10
669 CALL DMUMPS_TRAITER_MESSAGE( COMM_LOAD, ASS_IRECV,
670 & MSGSOU_LOC, MSGTAG_LOC, MSGLEN_LOC, BUFR, LBUFR,
672 & PROCNODE_STEPS, POSFAC,
673 & IWPOS, IWPOSCB, IPTRLU,
674 & LRLU, LRLUS, N, IW, LIW, A, LA,
675 & PTRIST, PTLUST, PTRFAC,
676 & PTRAST, STEP, PIMASTER, PAMASTER, NSTK_S, COMP, IFLAG,
678 & PERM, IPOOL, LPOOL, LEAF, NBFIN, MYID, SLAVEF,
680 & root, OPASSW, OPELIW, ITLOC, RHS_MUMPS, FILS, DAD,
682 & INTARR, DBLARR, ICNTL, KEEP,KEEP8,DKEEP, ND, FRERE,
683 & LPTRAR, NELT, FRTPTR, FRTELT,
684 & ISTEP_TO_INIV2, TAB_POS_IN_PERE
687.NOT.
IF (RIGHT_MESS) RECURS = RECURS - 10
688.LT.
IF ( IFLAG 0 ) RETURN
689.NOT.
IF (RIGHT_MESS) THEN
690.NE.
IF (ASS_IRECV MPI_REQUEST_NULL) THEN
693 CALL MPI_IPROBE(MSGSOU,MSGTAG,
694 & COMM, FLAGbis, STATUS, IERR)
696 MSGSOU_LOC = STATUS( MPI_SOURCE )
697 MSGTAG_LOC = STATUS( MPI_TAG )
698 CALL DMUMPS_RECV_AND_TREAT( COMM_LOAD, ASS_IRECV,
699 & STATUS, BUFR, LBUFR,
701 & PROCNODE_STEPS, POSFAC,
702 & IWPOS, IWPOSCB, IPTRLU,
703 & LRLU, LRLUS, N, IW, LIW, A, LA,
704 & PTRIST, PTLUST, PTRFAC,
705 & PTRAST, STEP, PIMASTER, PAMASTER,
706 & NSTK_S, COMP, IFLAG,
708 & PERM, IPOOL, LPOOL,LEAF,NBFIN,MYID,SLAVEF,
710 & root, OPASSW, OPELIW, ITLOC, RHS_MUMPS,
711 & FILS, DAD, PTRARW, PTRAIW,
712 & INTARR, DBLARR, ICNTL,
713 & KEEP,KEEP8, DKEEP,ND, FRERE,
714 & LPTRAR, NELT, FRTPTR, FRTELT,
715 & ISTEP_TO_INIV2, TAB_POS_IN_PERE
718.LT.
IF ( IFLAG 0 ) RETURN
724 CALL MPI_PROBE(MSGSOU,MSGTAG,
725 & COMM, STATUS, IERR)
728 CALL MPI_IPROBE( MPI_ANY_SOURCE, MPI_ANY_TAG,
729 & COMM, FLAG, STATUS, IERR)
732 MSGSOU_LOC = STATUS( MPI_SOURCE )
733 MSGTAG_LOC = STATUS( MPI_TAG )
734 MESSAGE_RECEIVED = .TRUE.
735 CALL DMUMPS_RECV_AND_TREAT( COMM_LOAD, ASS_IRECV,
736 & STATUS, BUFR, LBUFR,
738 & PROCNODE_STEPS, POSFAC,
739 & IWPOS, IWPOSCB, IPTRLU,
740 & LRLU, LRLUS, N, IW, LIW, A, LA,
741 & PTRIST, PTLUST, PTRFAC,
742 & PTRAST, STEP, PIMASTER, PAMASTER, NSTK_S, COMP, IFLAG,
744 & PERM, IPOOL, LPOOL, LEAF, NBFIN, MYID, SLAVEF,
746 & root, OPASSW, OPELIW, ITLOC, RHS_MUMPS,
747 & FILS, DAD, PTRARW, PTRAIW,
748 & INTARR, DBLARR, ICNTL, KEEP,KEEP8,DKEEP, ND, FRERE,
749 & LPTRAR, NELT, FRTPTR, FRTELT,
750 & ISTEP_TO_INIV2, TAB_POS_IN_PERE
753.LT.
IF ( IFLAG 0 ) RETURN
758.EQ.
IF ( NBFIN 0 ) RETURN
759.GT.
IF ( RECURS 3 ) RETURN
760.EQ..AND..AND.
IF ( KEEP(36)1 SET_IRECV
761.EQ..AND.
& (ASS_IRECVMPI_REQUEST_NULL)
762 & MESSAGE_RECEIVED ) THEN
763 CALL MPI_IRECV ( BUFR(1),
764 & LBUFR_BYTES, MPI_PACKED, MPI_ANY_SOURCE,
769 END SUBROUTINE DMUMPS_TRY_RECVTREAT
770 SUBROUTINE DMUMPS_CANCEL_IRECV( INFO1,
772 & BUFR, LBUFR, LBUFR_BYTES,
778 INCLUDE 'mumps_tags.h'
779 INTEGER LBUFR, LBUFR_BYTES
781 INTEGER BUFR( LBUFR )
783 INTEGER MYID, SLAVEF, INFO1, DEST
784 INTEGER, INTENT(INOUT) :: KEEP(500)
785 INTEGER :: STATUS(MPI_STATUS_SIZE)
786 LOGICAL NO_ACTIVE_IRECV
789.EQ.
IF (SLAVEF 1) RETURN
790.EQ.
IF (ASS_IRECVMPI_REQUEST_NULL) THEN
791 NO_ACTIVE_IRECV=.TRUE.
793 CALL MPI_TEST(ASS_IRECV, NO_ACTIVE_IRECV,
795 IF (NO_ACTIVE_IRECV) THEN
796 KEEP(266) = KEEP(266) - 1
799 CALL MPI_BARRIER(COMM,IERR)
801 DEST = mod(MYID+1, SLAVEF)
802 CALL DMUMPS_BUF_SEND_1INT
803 & (DUMMY, DEST, TAG_DUMMY, COMM, KEEP, IERR)
804 IF (NO_ACTIVE_IRECV) THEN
805 CALL MPI_RECV( BUFR, LBUFR,
806 & MPI_INTEGER, MPI_ANY_SOURCE,
807 & TAG_DUMMY, COMM, STATUS, IERR )
809 CALL MPI_WAIT(ASS_IRECV,
812 KEEP(266)=KEEP(266)-1
814 END SUBROUTINE DMUMPS_CANCEL_IRECV
815 SUBROUTINE DMUMPS_CLEAN_PENDING(
816 & INFO1, KEEP, BUFR, LBUFR, LBUFR_BYTES,
817 & COMM_NODES, COMM_LOAD, SLAVEF,
818 & CLEAN_COMM_NODES, CLEAN_COMM_LOAD )
821 INTEGER, INTENT(IN) :: LBUFR, LBUFR_BYTES
822 INTEGER, INTENT(OUT) :: BUFR( LBUFR )
823 INTEGER, INTENT(IN) :: COMM_NODES, COMM_LOAD, SLAVEF, INFO1
824 INTEGER, INTENT(INOUT) :: KEEP(500)
825 LOGICAL, INTENT(IN) :: CLEAN_COMM_LOAD, CLEAN_COMM_NODES
827 INCLUDE 'mumps_tags.h'
828 INTEGER :: STATUS(MPI_STATUS_SIZE)
829 LOGICAL :: FLAG, BUFFERS_EMPTY, BUFFERS_EMPTY_ON_ALL_PROCS
830 INTEGER :: MSGSOU_LOC, MSGTAG_LOC, MSGLEN_LOC
833 INTEGER :: IBUF_EMPTY, IBUF_EMPTY_ON_ALL_PROCS
834 INTEGER :: TOTAL_SEND_MINUS_RECV266
835 INTEGER :: TOTAL_SEND_MINUS_RECV267
836.EQ.
IF (SLAVEF1) RETURN
837.NOT..AND..NOT.
IF ( CLEAN_COMM_NODES CLEAN_COMM_LOAD) THEN
844 IF (CLEAN_COMM_NODES) THEN
845.NOT.
IF ( FLAG ) THEN
846 COMM_EFF = COMM_NODES
847 CALL MPI_IPROBE(MPI_ANY_SOURCE,MPI_ANY_TAG,
848 & COMM_NODES, FLAG, STATUS, IERR)
851 IF (CLEAN_COMM_LOAD) THEN
852.NOT.
IF ( FLAG ) THEN
854 CALL MPI_IPROBE( MPI_ANY_SOURCE, MPI_ANY_TAG,
855 & COMM_LOAD, FLAG, STATUS, IERR)
859 MSGSOU_LOC = STATUS( MPI_SOURCE )
860 MSGTAG_LOC = STATUS( MPI_TAG )
861.EQ.
IF (COMM_EFF COMM_NODES) THEN
862 KEEP(266) = KEEP(266) - 1
864 KEEP(267) = KEEP(267) - 1
866 CALL MPI_GET_COUNT( STATUS, MPI_PACKED, MSGLEN_LOC, IERR )
867.LE.
IF (MSGLEN_LOC LBUFR_BYTES) THEN
868 CALL MPI_RECV( BUFR, LBUFR_BYTES,
869 & MPI_PACKED, MSGSOU_LOC,
870 & MSGTAG_LOC, COMM_EFF, STATUS, IERR )
874 CALL DMUMPS_BUF_ALL_EMPTY( CLEAN_COMM_NODES,
877 IF ( BUFFERS_EMPTY ) THEN
882 IF (CLEAN_COMM_NODES) THEN
883 COMM_EFF = COMM_NODES
887 CALL MPI_ALLREDUCE(IBUF_EMPTY,
888 & IBUF_EMPTY_ON_ALL_PROCS,
889 & 1, MPI_INTEGER, MPI_MAX,
891 IF ( IBUF_EMPTY_ON_ALL_PROCS == 0) THEN
892 BUFFERS_EMPTY_ON_ALL_PROCS = .TRUE.
894 BUFFERS_EMPTY_ON_ALL_PROCS = .FALSE.
896 IF (BUFFERS_EMPTY_ON_ALL_PROCS) THEN
897 IF (CLEAN_COMM_NODES) THEN
898 CALL MPI_ALLREDUCE(KEEP(266),
899 & TOTAL_SEND_MINUS_RECV266,
900 & 1, MPI_INTEGER, MPI_SUM,
903 TOTAL_SEND_MINUS_RECV266 = 0
905 IF (CLEAN_COMM_LOAD) THEN
906 CALL MPI_ALLREDUCE(KEEP(267),
907 & TOTAL_SEND_MINUS_RECV267,
908 & 1, MPI_INTEGER, MPI_SUM,
911 TOTAL_SEND_MINUS_RECV267 = 0
913.EQ..AND.
IF (TOTAL_SEND_MINUS_RECV266 0
914.EQ.
& TOTAL_SEND_MINUS_RECV267 0) THEN
920 END SUBROUTINE DMUMPS_CLEAN_PENDING
subroutine dmumps_process_desc_bande(myid, bufr, lbufr, lbufr_bytes, iwpos, iwposcb, iptrlu, lrlu, lrlus, n, iw, liw, a, la, slavef, procnode_steps, dad, ptrist, ptrast, step, pimaster, pamaster, comp, keep, keep8, dkeep, itloc, rhs_mumps, istep_to_iniv2, iwhandler_in, iflag, ierror)
subroutine dmumps_process_node(myid, keep, keep8, dkeep, bufr, lbufr, lbufr_bytes, iwpos, iwposcb, iptrlu, lrlu, lrlus, n, iw, liw, a, la, slavef, procnode_steps, dad, ptrist, ptrast, step, pimaster, pamaster, nstk_s, comp, fpere, flag, iflag, ierror, comm, itloc, rhs_mumps)
subroutine dmumps_process_contrib_type3(bufr, lbufr, lbufr_bytes, root, n, iw, liw, a, la, lrlu, iptrlu, iwpos, iwposcb, ptrist, ptlust, ptrfac, ptrast, step, pimaster, pamaster, comp, lrlus, ipool, lpool, leaf, fils, dad, myid, lptrar, nelt, frtptr, frtelt, ptraiw, ptrarw, intarr, dblarr, keep, keep8, dkeep, iflag, ierror, comm, comm_load, itloc, rhs_mumps, nd, procnode_steps, slavef, opassw)
subroutine dmumps_process_master2(myid, bufr, lbufr, lbufr_bytes, procnode_steps, slavef, iwpos, iwposcb, iptrlu, lrlu, lrlus, n, iw, liw, a, la, ptrist, ptrast, step, pimaster, pamaster, nstk_s, comp, iflag, ierror, comm, comm_load, ipool, lpool, leaf, keep, keep8, dkeep, nd, fils, dad, frere, itloc, rhs_mumps, istep_to_iniv2, tab_pos_in_pere)
recursive subroutine dmumps_traiter_message(comm_load, ass_irecv, msgsou, msgtag, msglen, bufr, lbufr, lbufr_bytes, procnode_steps, posfac, iwpos, iwposcb, iptrlu, lrlu, lrlus, n, iw, liw, a, la, ptrist, ptlust, ptrfac, ptrast, step, pimaster, pamaster, nstk_s, comp, iflag, ierror, comm, perm, ipool, lpool, leaf, nbfin, myid, slavef root, opassw, opeliw, itloc, rhs_mumps, fils, dad, ptrarw, ptraiw, intarr, dblarr, icntl, keep, keep8, dkeep, nd, frere, lptrar, nelt, frtptr, frtelt istep_to_iniv2, tab_pos_in_pere, lrgroups)
subroutine dmumps_process_root2slave(tot_root_size, tot_cont_to_recv, root, bufr, lbufr, lbufr_bytes, procnode_steps, posfac, iwpos, iwposcb, iptrlu, lrlu, lrlus, n, iw, liw, a, la, ptrist, ptlust, ptrfac, ptrast, step, pimaster, pamaster, nstk_s, comp, iflag, ierror, comm, comm_load, ipool, lpool, leaf, nbfin, myid, slavef opassw, opeliw, itloc, rhs_mumps, fils, dad, lptrar, nelt, frtptr, frtelt, ptrarw, ptraiw, intarr, dblarr, icntl, keep, keep8, dkeep, nd)
subroutine dmumps_process_rtnelind(root, inode, nelim, nslaves, row_list, col_list, slave_list, procnode_steps, iwpos, iwposcb, iptrlu, lrlu, lrlus, n, iw, liw, a, la, ptrist, ptlust_s, ptrfac, ptrast, step, pimaster, pamaster, nstk_s, itloc, rhs_mumps, comp, iflag, ierror, ipool, lpool, leaf, myid, slavef, keep, keep8, dkeep, comm, comm_load, fils, dad, nd)
subroutine mpi_unpack(inbuf, insize, position, outbuf, outcnt, datatype, comm, ierr)
recursive subroutine, public dmumps_load_recv_msgs(comm)
integer, save, private myid