15 & N, INODE, TYPE, TYPEF,
17 & IFLAG, IERROR, OPELIW, NELVAW, NMAXNPIV,
20 & STEP, PIMASTER, PAMASTER, NE,
21 & POSFAC, LRLU, LRLUS, LRLUSM, IPTRLU, ICNTL, KEEP,KEEP8,DKEEP,
22 & COMP, IWPOS, IWPOSCB, PROCNODE_STEPS, SLAVEF,
23 & FPERE, COMM, MYID, IPOOL, LPOOL, LEAF, NSTK_S,
24 & PERM, BUFR, LBUFR, LBUFR_BYTES, NBFIN, root,
25 & OPASSW, ITLOC, RHS_MUMPS,
26 & FILS, DAD, PTRARW, PTRAIW, INTARR, DBLARR,
27 & ND, FRERE, LPTRAR, NELT, FRTPTR, FRTELT,
28 & ISTEP_TO_INIV2, TAB_POS_IN_PERE
36 TYPE (DMUMPS_ROOT_STRUC) :: root
37 INTEGER COMM_LOAD, ASS_IRECV
38 INTEGER COMM, MYID,
TYPE, TYPEF
39 INTEGER N, LIW, INODE,IFLAG,IERROR
40 INTEGER ICNTL(60), KEEP(500)
41 DOUBLE PRECISION DKEEP(230)
43 INTEGER(8) :: LA, POSFAC, LRLU, LRLUS, LRLUSM, IPTRLU
44 INTEGER IWPOSCB, IWPOS,
45 & FPERE, SLAVEF, NELVAW, NMAXNPIV
46 INTEGER IW(LIW),PROCNODE_STEPS(KEEP(28))
47 INTEGER(8) :: PTRAST (KEEP(28))
48 INTEGER(8) :: PTRFAC (KEEP(28))
49 INTEGER(8) :: PAMASTER(KEEP(28))
50 INTEGER PTRIST(KEEP(28)), PTLUST_S(KEEP(28))
51 INTEGER STEP(), (KEEP(28)), NE(KEEP(28))
52 DOUBLE PRECISION A(LA)
53 INTEGER,
intent(in) :: LRGROUPS(N)
54 DOUBLE PRECISION OPASSW, OPELIW
55 DOUBLE PRECISION DBLARR(KEEP8(26))
57 INTEGER ITLOC( N + KEEP(253) ), FILS( N ), DAD( KEEP(28) ),
58 & nd( keep(28) ), frere( keep(28) )
59 DOUBLE PRECISION :: RHS_MUMPS(KEEP(255))
60 INTEGER ISTEP_TO_INIV2(KEEP(71)),
61 & tab_pos_in_pere(slavef+2,
max(1,keep(56)))
63 INTEGER FRTPTR( N+1 ), FRTELT( NELT )
64 INTEGER(8),
INTENT(IN) :: PTRAIW( LPTRAR ), PTRARW( LPTRAR )
65 INTEGER LPOOL, LEAF, COMP
66 INTEGER IPOOL( LPOOL )
67 INTEGER NSTK_S( KEEP(28) )
69 INTEGER LBUFR, LBUFR_BYTES
72 INTEGER NFRONT_ESTIM,NELIM_ESTIM
73 DOUBLE PRECISION FLOP_ESTIM_ACC
74 INTEGER MUMPS_PROCNODE
75 EXTERNAL MUMPS_PROCNODE
77 include
'mumps_tags.h'
78 INTEGER :: STATUS(MPI_STATUS_SIZE)
80 INTEGER NBROWS_ALREADY_SENT
81 INTEGER(8) :: POSELT, OPSFAC
82 INTEGER(8) :: IOLD, INEW, FACTOR_POS
84 & h_inode, ierr, nbcol, nbrow, nbrow_send,
86 INTEGER NBROW_STACK, NBROW_INDICES, NBCOL_STACK
87 INTEGER NCBROW_ALREADY_MOVED, NCBROW_PREVIOUSLY_MOVED,
89 INTEGER(8) :: LAST_ALLOWED_POS
90 INTEGER(8) :: LREQCB, MIN_SPACE_IN_PLACE
91 INTEGER(8) :: SHIFT_VAL_SON
92 INTEGER SHIFT_LIST_ROW_SON,
94 & list_row_son, list_col_son, list_slaves
95 INTEGER IOLDPS,NFRONT,NPIV,,IOLDP1,PTROWEND,
98 INTEGER MSGDEST, MSGTAG, CHK_LOAD
99 include
'mumps_headers.h'
100 LOGICAL MUST_COMPACT_FACTORS
101 LOGICAL , COMPRESS_PANEL, COMPRESS_CB, LR_SOLVE
103 INTEGER(8) :: SIZE_INPLACE, FAC_ENTRIES, COUNT_EXTRA_IP_COPIES
105 DOUBLE PRECISION FLOP1, FLOP1_EFFECTIVE
106 LOGICAL BLOCKING, SET_IRECV, MESSAGE_RECEIVED
107 LOGICAL SSARBR, SSARBR_ROOT, MUMPS_INSSARBR,
112 IF (icntl(4) .LE. 0) lp = -1
114 min_space_in_place = 0_8
115 ioldps = ptlust_s(step(inode))
116 intsiz = iw(ioldps+xxi)
117 nfront = iw(ioldps+keep(ixsz))
118 npiv = iw(ioldps + 1+keep(ixsz))
119 nmaxnpiv =
max(npiv, nmaxnpiv)
120 nass = iabs(iw(ioldps + 2+keep(ixsz)))
121 nslaves= iw(ioldps+5+keep(ixsz))
122 h_inode= 6 + nslaves + keep(ixsz)
123 lcont = nfront - npiv
125 ssarbr = mumps_inssarbr(procnode_steps(step(inode)),keep(199))
127 & (procnode_steps(step(inode)),keep(199))
130 packed_cb = ((keep(215).EQ.0)
131 & .AND.(keep(50).NE.0)
136 compress_panel = (iw(ioldps+xxlr).GE.2)
137 compress_cb = (iw(ioldps+xxlr).EQ.1.OR.iw(ioldps+xxlr).EQ.3)
138 lr_solve = (keep(486).EQ.2)
139 must_compact_factors = .true.
140 IF (keep(201).EQ.1 .OR. keep(201).EQ.-1
141 & .OR. (compress_panel.AND.lr_solve)
143 must_compact_factors = .false.
145 IF ((fpere.EQ.0).AND.(nass.NE.npiv))
THEN
150 IF (type.EQ.2) nbrow = nass - npiv
151 IF ((keep(50).NE.0).AND.(type.EQ.2))
THEN
158 IF (typef.EQ.2) nbrow_send = nelim
159 poselt = ptrast(step(inode))
160 IF (poselt .ne. ptrfac(step(inode)))
THEN
161 WRITE(*,*) myid,
":Error 1 in DMUMPS_FAC_STACK:"
162 WRITE(*,*)
"INODE, PTRAST, PTRFAC =",
163 & inode, ptrast(step(inode)), ptrfac(step(inode))
164 WRITE(*,*)
"PACKED_CB, NFRONT, NPIV, NASS, NSLAVES",
165 & packed_cb, nfront, npiv, nass, nslaves
166 WRITE(*,*)
"TYPE, TYPEF, FPERE ",
170 nelvaw = nelvaw + nass - npiv
171 IF (keep(50) .eq. 0)
THEN
172 fac_entries = int(npiv,8) * int(nfront,8)
174 fac_entries = ( int(npiv,8)*int(npiv+1,8) )/ 2_8
176 fac_entries = fac_entries + int(nbrow,8) * int(npiv
177 IF ( keep(405) .EQ. 0 )
THEN
178 keep8(10) = keep8(10) + fac_entries
179 keep(429) = keep(429) - 1
182 keep8(10) = keep8(10) + fac_entries
186 & keep(50),
TYPE,flop1 )
187 IF ( (.NOT. ssarbr_root) .and.
TYPE == 1) then
188 IF (ne(step(inode))==0)
THEN
196 flop1_effective = flop1
197 opeliw = opeliw + flop1
198 IF ( npiv .NE. nass )
THEN
201 IF (.NOT. ssarbr_root )
THEN
202 IF (ne(step(inode))==0)
THEN
208 & flop1_effective-flop1,
212 IF ( ssarbr_root )
THEN
213 nfront_estim=nd(step(inode)) + keep(253)
214 nelim_estim=nass-(nfront-nfront_estim)
219 IF (keep(400).GT.0)
THEN
220 flop_estim_acc = flop_estim_acc + flop1
222 IF (ssarbr_root)
THEN
227 IF ( fpere .EQ. 0 )
THEN
228 IF ( keep(253) .NE. 0 .AND. keep(201).NE.-1
229 & .AND. keep(201).NE.1
230 & .AND. (.NOT.compress_panel.OR..NOT.lr_solve)
232 must_compact_factors = .true.
234 ELSE IF ( keep(50) .NE. 0 .AND. keep(459).GT.1)
THEN
235 must_compact_factors = .true.
238 must_compact_factors = .false.
242 IF ( fpere.EQ.keep(38) )
THEN
244 shift_list_row_son = h_inode + nass
245 shift_list_col_son = h_inode + nfront + nass
246 shift_val_son = int(nass,8)*int(nfront+1,8)
249 & comm_load, ass_irecv,
252 & root, ncb, ncb, shift_list_row_son,
253 & shift_list_col_son , shift_val_son, nfront,
254 & root_cont_static, myid, comm,
256 & bufr, lbufr, lbufr_bytes, procnode_steps, posfac,
257 & iwpos, iwposcb, iptrlu, lrlu, lrlus, iw, liw, a, la,
258 & ptrist, ptlust_s, ptrfac,
259 & ptrast, step, pimaster, pamaster,
260 & nstk_s, comp, iflag, ierror, perm,
261 & ipool, lpool, leaf, nbfin, slavef,
262 & opassw, opeliw, itloc, rhs_mumps, fils, dad, ptrarw, ptraiw,
263 & intarr,dblarr,icntl,keep,keep8,dkeep,.false., nd, frere,
264 & lptrar, nelt, frtptr, frtelt,
265 & istep_to_iniv2, tab_pos_in_pere
268 IF (iflag < 0 )
GOTO 500
270 msgdest= mumps_procnode(procnode_steps(step(fpere)),keep(199))
271 ioldps = ptlust_s(step(inode))
272 list_row_son = ioldps + h_inode + npiv
273 list_col_son = ioldps + h_inode + nfront + npiv
274 list_slaves = ioldps + 6 + keep(ixsz)
275 IF (msgdest.EQ.myid)
THEN
277 & inode, nelim, nslaves, iw(list_row_son),
278 & iw(list_col_son), iw(list_slaves),
280 & procnode_steps, iwpos, iwposcb, iptrlu,
281 & lrlu, lrlus, n, iw, liw, a, la, ptrist,
283 & ptrast, step, pimaster, pamaster, nstk_s,
284 & itloc, rhs_mumps, comp,
286 & ipool, lpool, leaf, myid, slavef,
287 & keep, keep8, dkeep,
288 & comm, comm_load, fils, dad, nd)
289 IF (iflag.LT.0)
GOTO 600
292 DO WHILE (ierr.EQ.-1)
294 & iw(list_row_son), iw(list_col_son), nslaves,
295 & iw(list_slaves), msgdest, comm, keep, ierr)
296 IF ( ierr .EQ. -1 )
THEN
299 message_received = .false.
301 & blocking, set_irecv, message_received,
302 & mpi_any_source, mpi_any_tag, status,
303 & bufr, lbufr, lbufr_bytes, procnode_steps, posfac,
304 & iwpos, iwposcb, iptrlu,
305 & lrlu, lrlus, n, iw, liw, a, la, ptrist, ptlust_s, ptrfac,
306 & ptrast, step, pimaster, pamaster, nstk_s, comp,
307 & iflag, ierror, comm, perm,
308 & ipool, lpool, leaf, nbfin, myid, slavef,
309 & root, opassw, opeliw, itloc, rhs_mumps,
310 & fils, dad, ptrarw, ptraiw,
311 & intarr, dblarr, icntl, keep,keep8,dkeep,
312 & nd, frere, lptrar, nelt,
314 & istep_to_iniv2, tab_pos_in_pere,
317 IF ( iflag .LT. 0 )
GOTO 500
318 ioldps = ptlust_s(step(inode))
319 list_row_son = ioldps + h_inode + npiv
320 list_col_son = ioldps + h_inode + nfront + npiv
321 list_slaves = ioldps + 6 + keep(ixsz)
324 IF ( ierr .EQ. -2 )
THEN
325 ierror = ( 3 + nslaves + 2 * nelim ) * keep( 34 )
328 ELSE IF ( ierr .EQ. -3 )
THEN
329 ierror = ( 3 + nslaves + 2 * nelim ) * keep( 34 )
335 poselt = ptrast(step(inode))
336 opsfac = poselt + int(npiv,8) * int(nfront,8) + int(npiv,8)
342 opsfac = poselt + int(npiv,8) * int(lda,8) + int(npiv,8)
343 IF ( mumps_procnode(procnode_steps(step(fpere)),
344 & keep(199)) .NE. myid )
THEN
346 msgdest=mumps_procnode( procnode_steps(step(fpere)), keep(199) )
348 nbrows_already_sent = 0
349 DO WHILE (ierr.EQ.-1)
350 IF ( (type.EQ.1) .AND. (typef.EQ.1) )
THEN
352 & inode, fpere, nfront,
353 & lcont, nass, npiv, iw( ioldps + h_inode + npiv ),
354 & iw( ioldps + h_inode + npiv + nfront ),
355 & a( opsfac ), packed_cb,
356 & msgdest, msgtag, comm, keep, ierr )
358 IF ( type.EQ.2 )
THEN
359 iniv2 = istep_to_iniv2( step(inode) )
365 & nbrow_send, iw(ioldps + h_inode + npiv ),
366 & nbcol, iw(ioldps + h_inode + npiv + nfront ),
367 & a(opsfac), lda, nelim,
TYPE,
371 & slavef, keep,keep8, iniv2, tab_pos_in_pere )
373 IF ( ierr .EQ. -1 )
THEN
376 message_received = .false.
378 & blocking, set_irecv, message_received,
379 & mpi_any_source, mpi_any_tag,
381 & bufr, lbufr, lbufr_bytes, procnode_steps, posfac,
382 & iwpos, iwposcb, iptrlu,
383 & lrlu, lrlus, n, iw, liw, a, la,
384 & ptrist, ptlust_s, ptrfac,
385 & ptrast, step, pimaster, pamaster, nstk_s, comp,
386 & iflag, ierror, comm,
387 & perm, ipool, lpool, leaf,
388 & nbfin, myid, slavef,
390 & root, opassw, opeliw, itloc, rhs_mumps,
391 & fils, dad, ptrarw, ptraiw,
392 & intarr, dblarr, icntl, keep,keep8,dkeep, nd, frere,
393 & lptrar, nelt, frtptr, frtelt,
394 & istep_to_iniv2, tab_pos_in_pere, .true.
396 IF ( iflag .LT. 0 )
GOTO 500
398 ioldps = ptlust_s(step( inode ))
399 opsfac = poselt + int(npiv,8) * int(lda,8) + int(npiv,8)
401 IF ( ierr .EQ. -2 .OR. ierr .EQ. -3 )
THEN
402 IF ( (type.EQ.1) .AND. (typef.EQ.1) )
THEN
403 ierror = ( 2*lcont + 9 ) * keep( 34
404 & lcont*lcont * keep( 35 )
405 ELSE IF (keep(50).ne.0 .AND.
TYPE .eq. 2 ) then
406 ierror = ( nbrow_send + nbcol+ 5 + nslaves)
408 & nbrow_send*nbrow_send*keep( 35 )
410 ierror = ( nbrow_send + nbcol
411 & nbrow_send*nbcol*keep( 35 )
413 IF (ierr .EQ. -2)
THEN
417 &
": FAILURE, SEND BUFFER TOO SMALL DURING
418 & DMUMPS_FAC_STACK",
TYPE, typef
421 IF (ierr .EQ. -3)
THEN
425 &
": FAILURE, RECV BUFFER TOO SMALL DURING
426 & DMUMPS_FAC_STACK",
TYPE,
432 IF ( mumps_procnode(procnode_steps(step(fpere)),
433 & keep(199)) .EQ. myid )
THEN
435 lreqi = 2 + keep(ixsz)
437 nbrow_indices = nbrow
438 IF ((keep(50).NE.0).AND.(type.EQ.2))
THEN
443 IF (compress_cb)
THEN
445 IF (keep(50).NE.0) nbcol_stack
448 nbrow_stack = nbrow-nbrow_send
449 nbrow_indices = nbrow-nbrow_send
451 IF (compress_cb)
THEN
455 lreqi = 6 + nbrow_indices + nbcol + keep(ixsz)
456 IF (.NOT. (type.EQ.1 .AND. typef.EQ.2 ) )
GOTO 190
457 IF (fpere.EQ.0)
GOTO 190
460 IF (nbrow_stack.EQ.0.OR.nbcol_stack.EQ.0)
THEN
463 lreqcb = ( int(nbcol_stack,8) * int( nbcol_stack + 1, 8) ) / 2_8
464 & - ( int(nbrow_send ,8) * int( nbrow_send + 1, 8) ) / 2_8
467 lreqcb = int(nbrow_stack,8) * int(nbcol_stack,8)
469 inplace = ( keep(234).NE.0 )
470 IF (keep(50).NE.0 .AND.
TYPE .EQ. 2) inplace = .false.
471 inplace = inplace .OR. .NOT. must_compact_factors
472 inplace = inplace .AND.
473 & ( ptlust_s(step(inode)) + intsiz .EQ. iwpos )
474 min_space_in_place = 0_8
475 IF ( inplace .AND. keep(50).eq. 0 .AND.
476 & must_compact_factors)
THEN
477 min_space_in_place = int(nbcol_stack,8)
479 IF ( min_space_in_place .GT. lreqcb )
THEN
484 & myid,n,keep,keep8,dkeep,iw, liw, a, la,
485 & lrlu, iptrlu,iwpos,iwposcb, slavef, procnode_steps, dad,
486 & ptrist,ptrast,step, pimaster,pamaster,
487 & lreqi, lreqcb, inode, s_notfree, .true.,
488 & comp, lrlus, lrlusm, iflag, ierror )
489 IF (iflag.LT.0)
GOTO 600
490 iw(iwposcb+1+xxf) = iw(ioldps+xxf)
491 iw(iwposcb+1+xxlr) = iw(ioldps+xxlr)
492 ptrist(step(inode)) = iwposcb+1
493 IF ( mumps_procnode(procnode_steps(step(fpere)),
494 & keep(199)) .EQ. myid )
THEN
495 pimaster(step(inode)) = ptlust_s(step(inode))
496 pamaster(step(inode)) = iptrlu + 1_8
497 ptrast(step(inode)) = -99999999_8
498 iw(iwposcb+1+keep(ixsz)) =
min(-nbcol_stack,-1)
499 iw(iwposcb+2+keep(ixsz)) = nbrow_stack
500 IF (packed_cb) iw(iwposcb+1+xxs) = s_cb1comp
502 ptrast(step(inode)) = iptrlu+1_8
503 IF (packed_cb) iw(iwposcb+1+xxs)=s_cb1comp
504 iw(iwposcb+1+keep(ixsz)) = nbcol
505 iw(iwposcb+2+keep(ixsz)) = 0
506 iw(iwposcb+3+keep(ixsz)) = nbrow_stack
507 iw(iwposcb+4+keep(ixsz)) = 0
508 iw(iwposcb+5+keep(ixsz)) = 1
509 iw(iwposcb+6+keep(ixsz)) = 0
510 ioldp1 = ptlust_s(step(inode))+h_inode
511 ptrowend = iwposcb+6+nbrow_stack+keep(ixsz)
512 DO i = 1, nbrow_stack
513 iw(iwposcb+7+keep(ixsz)+i-1) =
514 & iw(ioldp1+nfront-nbrow_stack+i-1)
517 iw(ptrowend+i)=iw(ioldp1+nfront+npiv+i-1)
520 IF ( keep(50).NE.0 .AND.
TYPE .EQ. 1
521 & .AND. must_compact_factors )
THEN
522 poselt = ptrfac(step(inode))
525 & int(lda,8)*int(nbrow+npiv,8),
526 & iw( ptlust_s(step(inode)) + h_inode + nfront ) )
527 must_compact_factors = .false.
529 IF (compress_cb.AND.(lreqcb.EQ.0))
GOTO 190
530 IF ( keep(50).EQ.0 .AND. must_compact_factors )
532 last_allowed_pos = poselt + int(lda,8)*int(npiv+nbrow-1,8)
535 last_allowed_pos = -1_8
537 ncbrow_already_moved = 0
538 count_extra_ip_copies = 0_8
540 ncbrow_previously_moved = ncbrow_already_moved
541 IF (iptrlu .LT. posfac )
THEN
543 & poselt, iptrlu, npiv, nbcol_stack, nbrow_stack,
544 & nbrow_send, lreqcb, keep, packed_cb,
545 & last_allowed_pos, ncbrow_already_moved )
548 & poselt, iptrlu, npiv, nbcol_stack, nbrow_stack,
549 & nbrow_send, lreqcb, keep, packed_cb )
550 ncbrow_already_moved = nbrow_stack
552 IF (last_allowed_pos .NE. -1_8)
THEN
553 must_compact_factors =.false.
554 IF ( ncbrow_already_moved .EQ. nbrow_stack )
THEN
555 IF (compress_cb)
THEN
556 ncbrow_already_moved = nbrow
558 ncbrow_already_moved = ncbrow_already_moved + nbrow_send
561 ncbrow_newly_moved = ncbrow_already_moved
562 & - ncbrow_previously_moved
563 factor_pos = poselt +
564 & int(lda,8)*int(npiv+nbrow-ncbrow_already_moved,8)
566 & ncbrow_newly_moved,
567 & int(ncbrow_newly_moved,8) * int(lda,8) )
568 inew = factor_pos + int(npiv,8) * int(ncbrow_newly_moved,8)
569 iold = inew + int(ncbrow_newly_moved,8) * int(nbcol_stack,8)
570 DO i = 1, ncbrow_previously_moved*npiv
575 count_extra_ip_copies = count_extra_ip_copies +
576 & int(ncbrow_previously_moved,8)
578 last_allowed_pos = inew
579 IF (ncbrow_already_moved.LT.nbrow_stack)
THEN
583 IF ( count_extra_ip_copies .GT. 0_8 )
THEN
585 keep8(8) = keep8(8) + count_extra_ip_copies
587 count_extra_ip_copies = 0_8
590 IF (must_compact_factors)
THEN
591 poselt = ptrfac(step(inode))
594 & int(lda,8)*int(nbrow+npiv,8),
595 & iw( ptlust_s(step(inode)) + h_inode + nfront ) )
596 must_compact_factors = .false.
598 ioldps = ptlust_s(step(inode))
599 iw(ioldps+keep(ixsz)) = nbcol
600 iw(ioldps + 1+keep(ixsz)) = nass - npiv
602 iw(ioldps + 2+keep(ixsz)) = nass
604 iw(ioldps + 2+keep(ixsz)) = nfront
606 iw(ioldps + 3+keep(ixsz)) = npiv
608 size_inplace = lreqcb - min_space_in_place
613 & a, la, posfac, lrlu, lrlus,
614 & iwpos, ptrast, ptrfac, step, keep,keep8, ssarbr,inode,ierr
625 IF (iflag .NE. -1 .AND. keep(405) .EQ. 0)
THEN