15 & N, IPOOL, LPOOL, IIPOOL, NBFINF,
16 & A, LA, IW, LIW, W, LWC, NRHS,
17 & POSWCB, PLEFTW, POSIWCB,
18 & RHSCOMP, LRHSCOMP, POSINRHSCOMP_BWD,
19 & PTRICB, PTRACB, IWCB, LIWW, W2,
21 & FRERE, FILS, PTRIST, PTRFAC,
23 & PROCNODE_STEPS, DEJA_SEND,
24 & SLAVEF, COMM, MYID, BUFR, LBUFR, LBUFR_BYTES,
25 & KEEP,KEEP8, DKEEP, RHS_ROOT, LRHS_ROOT, MTYPE,
26 & ISTEP_TO_INIV2, TAB_POS_IN_PERE, PANEL_POS, LPANEL_POS,
27 & PRUN_BELOW, TO_PROCESS, SIZE_TO_PROCESS
28 & , RHS_BOUNDS, LRHS_BOUNDS, DO_NBSPARSE, FROM_PP
29 & , ERROR_WAS_BROADCASTED
36 INTEGER :: KEEP( 500 )
37 INTEGER(8) :: KEEP8(150)
38 DOUBLE PRECISION,
INTENT(INOUT) :: DKEEP(230)
40 INTEGER,
INTENT( IN ) :: INODE, N, NRHS, MTYPE, LIW, LIWW
41 INTEGER,
INTENT( IN ) :: SLAVEF, COMM, MYID
42 INTEGER,
INTENT (IN ) :: PROCNODE_STEPS(KEEP(
43INTEGER,
INTENT( IN ) :: (KEEP(28))
44 INTEGER(8),
INTENT( IN ) :: LA, LWC
45 INTEGER(8),
INTENT( INOUT ) :: POSWCB, PLEFTW
46 INTEGER,
INTENT( INOUT ) :: POSIWCB
47 INTEGER,
INTENT( IN ) ::
48 INTEGER :: PANEL_POS(LPANEL_POS)
49 LOGICAL,
INTENT(INOUT) :: DEJA_SEND(0:SLAVEF-1)
50 INTEGER,
INTENT(IN) :: LPOOL
51 INTEGER,
INTENT(INOUT) :: IPOOL(LPOOL), IIPOOL
52 INTEGER,
INTENT(INOUT) :: NBFINF, MYLEAF_LEFT
53 INTEGER :: (KEEP(28)), PTRICB(KEEP(28))
54 INTEGER(8) :: (KEEP(28))
55 INTEGER(8) :: PTRFAC((28))
56 DOUBLE PRECISION :: A( LA )
57 DOUBLE PRECISION :: W(LWC)
58 DOUBLE PRECISION :: W2(KEEP(133))
59 INTEGER :: IW(LIW),IWCB(LIWW)
60 INTEGER STEP(N), FRERE(KEEP(28)),FILS(N)
61 INTEGER LBUFR, LBUFR_BYTES
63 INTEGER ISTEP_TO_INIV2(KEEP(71)),
64 & tab_pos_in_pere(slavef+2,
max(1,keep(56)))
65 INTEGER LRHSCOMP, POSINRHSCOMP_BWD(N)
66 DOUBLE PRECISION RHSCOMP(LRHSCOMP,NRHS)
67 INTEGER(8),
intent(in) :: LRHS_ROOT
68 DOUBLE PRECISION RHS_ROOT( LRHS_ROOT )
69 LOGICAL,
INTENT( IN ) :: PRUN_BELOW
70 INTEGER,
INTENT(IN) :: SIZE_TO_PROCESS
71 LOGICAL,
INTENT(IN) :: TO_PROCESS(SIZE_TO_PROCESS)
72 LOGICAL,
INTENT(IN) :: DO_NBSPARSE
73 INTEGER,
INTENT(IN) :: LRHS_BOUNDS
74 INTEGER,
INTENT(IN) :: RHS_BOUNDS(LRHS_BOUNDS)
75 LOGICAL,
INTENT(IN) :: FROM_PP
76 LOGICAL,
INTENT( OUT ) :: ERROR_WAS_BROADCASTED
77 LOGICAL,
INTENT( OUT ) :: DO_MCAST2_TERMBWD
79 include
'mumps_tags.h'
82 include
'mumps_headers.h'
83 LOGICAL COMPRESS_PANEL, LR_ACTIVATED
84 LOGICAL OOCWRITE_COMPATIBLE_WITH_BLR
85 LOGICAL LTLEVEL2, IN_SUBTREE
87 INTEGER TMP_NBPANELS, I_PIVRPTR, I_PIVR
88 LOGICAL MUST_BE_PERMUTED
91 INTEGER :: K, JBDEB, JBFIN, NRHS_B
94 INTEGER IPOS,LIELL,NELIM,JJ,I
97 INTEGER IN,IF,LONG,POOL_FIRST_POS,TMP
99 INTEGER :: PROCDEST, DEST
100 INTEGER(8) :: PTWCB, PPIV_COURANT
101 INTEGER :: Offset, EffectiveSize, ISLAVE, FirstIndex
102 INTEGER :: POSINDICES, IPOSINRHSCOMP, IPOSINRHSCOMP_PANEL
103 INTEGER(8) :: APOS, IST
105 INTEGER(8) :: APOSDEB, NBENTRIES_ALLPANELS
106 INTEGER(8) :: PTWCB_PANEL
107 INTEGER LDAJ, NBJ, LIWFAC,
108 & nbjlast, npiv_last, panel_size,
113 DOUBLE PRECISION ALPHA,ONE,ZERO
114 parameter(zero=0.0d0, one = 1.0d0, alpha=-1.0d0)
115 LOGICAL,
EXTERNAL :: MUMPS_IN_OR_ROOT_SSARBR
116 INTEGER,
EXTERNAL :: MUMPS_TYPENODE
117 INTEGER,
EXTERNAL :: MUMPS_PROCNODE
118 error_was_broadcasted = .false.
119 do_mcast2_termbwd = .false.
120 no_children = .false.
121 IF (do_nbsparse)
THEN
122 jbdeb= rhs_bounds(2*step(inode)-1)
123 jbfin= rhs_bounds(2*step(inode))
124 nrhs_b = jbfin-jbdeb+1
130 IF ( inode .EQ. keep( 38 ) .OR. inode .EQ. keep( 20 ) )
THEN
131 ipos = ptrist(step(inode))+keep(ixsz)
133 liell = iw(ipos) + npiv
134 ipos = ptrist(step(inode)) + 5 + keep(ixsz)
135 IF ( mtype .EQ. 1 .AND. keep(50) .EQ. 0)
THEN
136 j1 = ipos + liell + 1
137 j2 = ipos + liell + npiv
143 iposinrhscomp = posinrhscomp_bwd(iw(j1))
145 & keep, rhscomp, nrhs, lrhscomp, iposinrhscomp,
146 & rhs_root(1+npiv*(jbdeb-1)), npiv, 1)
149 IF (in .GT. 0)
GOTO 270
151 myleaf_left = myleaf_left - 1
152 allow_others_to_leave = ( myleaf_left .EQ. 0 .AND.
154 IF (keep(31) .NE. 0)
THEN
155 IF ( .NOT. mumps_in_or_root_ssarbr(
156 & procnode_steps(step(inode)), keep(199) ) )
THEN
157 keep(31) = keep(31) - 1
158 IF (keep(31) .EQ. 1)
THEN
159 allow_others_to_leave = .true.
163 IF (allow_others_to_leave)
THEN
164 do_mcast2_termbwd = .true.
171 nbfils = ne_steps(step(inode))
172 IF ( prun_below )
THEN
176 IF ( to_process(step(if)) ) nbfils = nbfils+1
180 IF (nbfils.EQ.0)
THEN
183 no_children = .false.
188 deja_send( i ) = .false.
190 pool_first_pos=iipool
192 IF ( prun_below )
THEN
193 1030
IF ( .NOT.to_process
THEN
197 no_children = .false.
199 IF (mumps_procnode(procnode_steps(step(if)),keep(199))
204 procdest = mumps_procnode(procnode_steps(step(if)),
206 IF (.NOT. deja_send( procdest ))
THEN
209 & long, long, iw( j1 ),
210 & rhs_root( 1+npiv*(jbdeb-1) ),
212 & rhscomp(1, 1), nrhs, lrhscomp,
213 & iposinrhscomp, npiv,
215 & noeud, comm, ierr )
216 IF ( ierr .EQ. -1 )
THEN
219 & bufr, lbufr, lbufr_bytes,
220 & myid, slavef, comm,
221 & n, iwcb, liww, posiwcb,
223 & iipool, nbfinf, ptricb, ptracb, info,
224 & ipool, lpool, panel_pos, lpanel_pos,
225 & step, frere, fils, procnode_steps,
226 & pleftw, keep,keep8, dkeep,
227 & ptrist, ptrfac, iw, liw, a, la, w2,
230 & rhscomp, lrhscomp, posinrhscomp_bwd,
231 & prun_below, to_process, size_to_process
234 IF ( info( 1 ) .LT. 0 )
THEN
235 error_was_broadcasted = .true.
239 ELSE IF ( ierr .EQ. -2 )
THEN
241 info( 2 ) = nrhs_b * long * keep(35) +
242 & ( long + 4 ) * keep(34)
243 error_was_broadcasted = .false.
245 ELSE IF ( ierr .EQ. -3 )
THEN
247 info( 2 ) = nrhs_b * long * keep(35) +
248 & ( long + 4 ) * keep(34)
249 error_was_broadcasted = .false.
251 ELSE IF ( ierr .NE. 0 )
THEN
252 WRITE(*,*)
"Internal error 2 DMUMPS_SOLVE_NODE_BWD",
256 deja_send( procdest ) = .true.
261 allow_others_to_leave = .false.
262 IF ( prun_below .AND. no_children )
THEN
263 myleaf_left = myleaf_left - 1
264 allow_others_to_leave = ( myleaf_left .EQ. 0 .AND.
267 IF ( keep(31). ne. 0)
THEN
268 IF ( .NOT. mumps_in_or_root_ssarbr(
269 & procnode_steps(step(inode)), keep(199) ) )
THEN
270 keep(31) = keep(31) - 1
271 IF (keep(31) .EQ. 1)
THEN
272 allow_others_to_leave = .true.
276 IF ( allow_others_to_leave )
THEN
277 do_mcast2_termbwd = .true.
280 IF (iipool.NE.pool_first_pos)
THEN
281 DO i=1,(iipool-pool_first_pos)/2
282 tmp = ipool(pool_first_pos+i-1)
283 ipool(pool_first_pos+i-1) = ipool(iipool-i)
284 ipool(iipool-i) = tmp
289 in_subtree = mumps_in_or_root_ssarbr(
290 & procnode_steps(step(inode)), keep(199) )
291 typenode = mumps_typenode(procnode_steps(step(inode)),
294 & (typenode .eq.2 ) .AND.
296 npiv = iw(ptrist(step(inode))+2+keep(ixsz)+1)
297 IF ((npiv.NE.0).AND.(ltlevel2))
THEN
298 ipos = ptrist(step(inode)) + 2 + keep(ixsz)
299 liell = iw(ipos-2)+iw(ipos+1)
303 ncb = liell - npiv - nelim
307 ipos = ipos + nslaves
308 iw(ptrist(step(inode))+xxs)= c_fini+nslaves
309 IF ( posiwcb - 2 .LT. 0 .or.
310 & poswcb-int(ncb,8)*int(nrhs_b,8) .LT. pleftw-1_8 )
THEN
312 & poswcb, posiwcb, ptricb, ptracb)
313 IF ( poswcb-int(ncb,8)*int(nrhs_b,8) .LT. pleftw-1_8 )
THEN
317 error_was_broadcasted = .false.
320 IF ( posiwcb - 2 .LT. 0 )
THEN
322 info( 2 ) = 2 - posiwcb
323 error_was_broadcasted = .false.
327 posiwcb = posiwcb - 2
328 poswcb = poswcb - int(ncb,8)*int(nrhs_b,8)
329 ptricb(step( inode )) = posiwcb + 1
330 ptracb(step( inode )) = poswcb + 1_8
331 iwcb( ptricb(step( inode )) ) = ncb*nrhs_b
332 iwcb( ptricb(step( inode )) + 1 ) = 1
333 IF ( mtype.EQ.1 .AND. keep(50).EQ.0 )
THEN
334 posindices = ipos + liell + 1
336 posindices = ipos + 1
339 write(6,*)
' Internal Error type 2 node with no CB '
342 IF ( mtype .EQ. 1 .AND. keep(50).EQ.0 )
THEN
343 j1 = ipos + liell + npiv + nelim +1
344 j2 = ipos + 2 * liell
346 j1 = ipos + npiv + nelim +1
349 ifr8 = ptracb(step( inode )) - 1_8
351 & rhscomp, nrhs, lrhscomp,
352 & w(ptracb(step(inode))), ncb, 1,
353 & iw, liw, keep, n, posinrhscomp_bwd )
354 ifr8 = ifr8 + int(j2-keep(253)-j1+1,8)
355 IF (keep(252).NE.0)
THEN
356 DO jj = j2-keep(253)+1, j2
359 IF (k.EQ.jj-j2+keep(253
THEN
360 w(ifr8+int(k-jbdeb,8)*int(ncb,8)) = alpha
362 w(ifr8+int(k-jbdeb,8)*int(ncb,8)) = zero
367 DO islave = 1, nslaves
369 & keep,keep8, inode, step, n, slavef,
370 & istep_to_iniv2, tab_pos_in_pere,
376 dest = iw( ptrist(step(inode))+5+islave+keep(ixsz))
378 & w(offset+ptracb(step(inode))),
381 & backslv_master2slave, jbdeb, jbfin,
383 IF ( ierr .EQ. -1 )
THEN
386 & bufr, lbufr, lbufr_bytes,
387 & myid, slavef, comm,
388 & n, iwcb, liww, posiwcb,
390 & iipool, nbfinf, ptricb, ptracb, info,
391 & ipool, lpool, panel_pos, lpanel_pos,
393 & procnode_steps, pleftw, keep,keep8, dkeep,
394 & ptrist, ptrfac, iw, liw, a, la, w2, myleaf_left,
396 & rhscomp, lrhscomp, posinrhscomp_bwd,
397 & prun_below , to_process, size_to_process
400 IF ( info( 1 ) .LT. 0 )
THEN
401 error_was_broadcasted = .true.
405 ELSE IF ( ierr .EQ. -2 )
THEN
407 info( 2 ) = nrhs_b * effectivesize * keep(35) +
409 error_was_broadcasted = .false.
411 ELSE IF ( ierr .EQ. -3 )
THEN
413 info( 2 ) = nrhs_b * effectivesize * keep(35) +
415 error_was_broadcasted = .false.
418 offset = offset + effectivesize
420 iwcb( ptricb(step( inode )) + 1 ) = 0
422 & poswcb,posiwcb,ptricb,ptracb)
425 lr_activated = (iw(ptrist(step(inode))+xxlr).GT.0)
426 compress_panel = (iw(ptrist(step(inode))+xxlr).GE.2)
427 oocwrite_compatible_with_blr =
428 & (.NOT.lr_activated.OR.(.NOT.compress_panel).OR.
431 ipos = ptrist(step(inode)) + 2 + keep(ixsz)
432 liell = iw(ipos-2)+iw(ipos+1)
438 IF (keep(201).GT.0.AND.oocwrite_compatible_with_blr)
THEN
440 & inode,ptrfac,keep,a,la,step,
441 & keep8,n,must_be_permuted,ierr)
445 error_was_broadcasted = .false.
449 apos = ptrfac( step(inode))
450 nslaves = iw( ptrist(step(inode)) + 5 + keep(ixsz) )
451 ipos = ipos + 1 + nslaves
452 IF (keep(201).EQ.1.AND.oocwrite_compatible_with_blr)
THEN
453 liwfac = iw(ptrist(step(inode))+xxi)
460 IF (keep(50).NE.1)
THEN
462 & iw(ipos+1+2*liell),
467 IF ( mtype .EQ. 1 .AND. keep(50).EQ.0 )
THEN
468 j1 = ipos + liell + 1
469 j2 = ipos + npiv + liell
476 IF ( poswcb .LT. int(liell,8)*int(nrhs_b,8) )
THEN
478 & poswcb, posiwcb, ptricb, ptracb)
479 IF ( poswcb .LT. int(liell,8)*int(nrhs_b,8) )
THEN
483 error_was_broadcasted = .false.
488 IF ( posiwcb - 2 .LT. 0 .or.
489 & poswcb-int(liell,8)*int(nrhs_b,8) .LT. pleftw-1_8 )
THEN
491 & poswcb, posiwcb, ptricb, ptracb )
492 IF ( poswcb-int(liell,8)*int(nrhs_b,8) .LT. pleftw-1_8 )
THEN
497 error_was_broadcasted = .false.
500 IF ( posiwcb - 2 .LT. 0 )
THEN
502 info( 2 ) = 2 - posiwcb
503 error_was_broadcasted = .false.
507 posiwcb = posiwcb - 2
508 poswcb = poswcb - int(liell,8)*int(nrhs_b,8)
509 ptricb(step( inode )) = posiwcb + 1
510 ptracb(step( inode )) = poswcb + 1_8
511 iwcb( ptricb(step( inode )) ) = liell*nrhs_b
512 iwcb( ptricb(step( inode )) + 1 ) = 1
513 IF ( mtype.EQ.1 .AND. keep(50).EQ.0 )
THEN
514 posindices = ipos + liell + 1
516 posindices = ipos + 1
518 ptwcb = ptracb(step( inode ))
521 iposinrhscomp = posinrhscomp_bwd(iw(j1))
523 iposinrhscomp = -99999
527 IF (keep(252).NE.0)
THEN
529 rhscomp(iposinrhscomp+jj-j1,k) = zero
534 ifr8 = ptwcb + int(npiv - 1,8)
535 IF ( liell .GT. npiv )
THEN
536 IF ( mtype .EQ. 1 .AND. keep(50).EQ.0 )
THEN
537 j1 = ipos + liell + npiv + 1
538 j2 = ipos + 2 * liell
544 & rhscomp, nrhs, lrhscomp,
545 & w(ptwcb), liell, npiv+1,
546 & iw, liw, keep, n, posinrhscomp_bwd )
547 ifr8 = ifr8 + int(j2-keep(253)-j1+1,8)
548 IF (keep(252).NE.0)
THEN
549 DO jj = j2-keep(253)+1, j2
552 IF (k.EQ.jj-j2+keep(253))
THEN
553 w(ifr8+int(k-jbdeb,8)*int(liell,8)) = alpha
555 w(ifr8+int(k-jbdeb,8)*int(liell,8)) = zero
561 IF (npiv .EQ. 0)
GOTO 160
563 IF (keep(201).EQ.1.AND.oocwrite_compatible_with_blr)
THEN
564 j = npiv / panel_size
565 twobytwo = keep(50).EQ.2 .AND.
566 & ((typenode.EQ.1.AND.keep(103).GT.0) .OR.
567 & (typenode.EQ.2.AND.keep(105).GT.0))
570 & iw(ipos+1+liell), npiv, npanels, liell,
571 & nbentries_allpanels)
573 IF (npiv.EQ.j*panel_size)
THEN
578 npiv_last = (j+1)* panel_size
579 nbjlast = npiv-j*panel_size
582 nbentries_allpanels =
583 & int(liell,8) * int(npiv,8)
584 & - int( ( j * ( j - 1 ) ) /2,8 )
585 & * int(panel_size,8) * int(panel_size,8)
587 & * int(mod(npiv, panel_size),8)
588 & * int(panel_size,8)
591 aposdeb = apos + nbentries_allpanels
592 DO ipanel = npanels, 1, -1
594 nbj = panel_pos(ipanel+1)-panel_pos(ipanel)
595 beg_panel = panel_pos(ipanel)
597 IF (jj.EQ.npiv_last)
THEN
602 beg_panel = jj- panel_size+1
604 ldaj = liell-beg_panel+1
605 aposdeb = aposdeb - int(nbj,8)*int(ldaj,8)
606 ptwcb_panel = ptwcb + int(beg_panel - 1,8)
607 iposinrhscomp_panel = iposinrhscomp + beg_panel - 1
608 ncb_panel = ldaj - nbj
609 IF (keep(50).NE.1.AND.must_be_permuted)
THEN
611 & i_pivrptr, i_pivr, ipos + 1 + 2 * liell, iw, liw)
612 IF (npiv.EQ.(iw(i_pivrptr)-1))
THEN
613 must_be_permuted=.false.
616 & iw(i_pivr + iw(i_pivrptr+ipanel-1)-iw(i_pivrptr)),
617 & npiv-iw(i_pivrptr+ipanel-1)+1,
618 & iw(i_pivrptr+ipanel-1)-1,
620 & ldaj, nbj, beg_panel-1)
623#if defined(MUMPS_USE_BLAS2)
624 IF ( nrhs_b == 1 )
THEN
625 IF (ncb_panel.NE.0)
THEN
626 IF (ncb_panel - ncb.NE. 0)
THEN
627 CALL dgemv(
'T', ncb_panel-ncb, nbj, alpha,
628 & a( aposdeb + int(nbj,8) ), ldaj,
629 & rhscomp(iposinrhscomp_panel+nbj,jbdeb),
631 & rhscomp(iposinrhscomp_panel,jbdeb), 1 )
634 CALL dgemv(
'T', ncb, nbj, alpha,
635 & a( aposdeb + int(ldaj-ncb,8) ), ldaj,
636 & w( ptwcb + int(npiv,8) ),
638 & rhscomp(iposinrhscomp_panel,jbdeb), 1 )
642 CALL dtrsv(
'L',
'T',
'U', nbj, a(aposdeb), ldaj,
643 & rhscomp(iposinrhscomp_panel,jbdeb), 1)
645 CALL dtrsv(
'L',
'T',
'N', nbj, a(aposdeb), ldaj,
646 & rhscomp(iposinrhscomp_panel,jbdeb), 1)
650 IF (ncb_panel.NE.0)
THEN
651 IF (ncb_panel - ncb .NE. 0)
THEN
652 CALL dgemm(
'T',
'N', nbj, nrhs_b,
653 & ncb_panel-ncb, alpha,
654 & a(aposdeb +int(nbj,8)), ldaj,
655 & rhscomp(iposinrhscomp_panel+nbj,jbdeb), lrhscomp,
656 & one, rhscomp(iposinrhscomp_panel,jbdeb), lrhscomp)
659 CALL dgemm(
'T',
'N', nbj, nrhs_b, ncb, alpha,
660 & a(aposdeb +int(ldaj-ncb,8)), ldaj,
661 & w( ptwcb+int(npiv,8) ), liell,
662 & one, rhscomp(iposinrhscomp_panel,jbdeb),lrhscomp)
666 CALL dtrsm(
'L',
'L',
'T',
'U',nbj, nrhs_b, one,
668 & ldaj, rhscomp(iposinrhscomp_panel,jbdeb), lrhscomp)
670 CALL dtrsm(
'L',
'L',
'T',
'N',nbj, nrhs_b, one,
672 & ldaj, rhscomp(iposinrhscomp_panel,jbdeb), lrhscomp)
674#if defined(MUMPS_USE_BLAS2)
677 IF (.NOT. twobytwo) jj=beg_panel-1
680 IF ( iw(ptrist(step(inode))+xxlr) .GE. 2
681 & .AND. keep(485) .EQ. 1 )
THEN
682 iwhdlr = iw(ptrist(step(inode))+xxf)
684 & inode, iwhdlr, npiv, nslaves,
685 & liell, w, lwc, nrhs_b, ptwcb,
686 & rhscomp, lrhscomp, nrhs,
687 & iposinrhscomp, jbdeb,
688 & mtype, keep, keep8,
690 IF (info(1).LT.0)
THEN
691 error_was_broadcasted = .false.
695 IF ( liell .GT. npiv )
THEN
696#if defined(LDLTPANEL_DEBUG)
697 WRITE(*,*)
'before gemm LIELL, NPIV, PTWCB=',liell,npiv,ptwcb
698 WRITE(*,*)
'before gemm RHSCOMP=',
699 & rhscomp(iposinrhscomp:iposinrhscomp+npiv-1,1)
700 WRITE(*,*)
'before gemm W',
701 & w(ptwcb+npiv:ptwcb+liell-1)
703 WRITE(*,*)
"FACTORS=",a(apos:apos+ist-1)
705 IF ( mtype .eq. 1 )
THEN
706 ist = apos + int(npiv,8)
707#if defined(MUMPS_USE_BLAS2)
708 IF (nrhs_b == 1)
THEN
709 CALL dgemv(
'T', ncb, npiv, alpha, a(ist), liell,
710 & w(ptwcb+int(npiv,8)), 1,
712 & rhscomp(iposinrhscomp,jbdeb), 1 )
715 CALL dgemm(
'T',
'N', npiv, nrhs_b, ncb, alpha,
717 & liell, w(ptwcb+int(npiv,8)), liell, one,
718 & rhscomp(iposinrhscomp,jbdeb), lrhscomp)
719#if defined(MUMPS_USE_BLAS2)
723 IF ( keep(50) .eq. 0 )
THEN
724 ist = apos + int(npiv,8) * int(liell,8)
726 IF( keep(459) .GT. 1)
THEN
728 ist = apos + ist - int(npiv,8) * int(liell-npiv,8)
730 ist = apos + int(npiv,8) * int(npiv,8)
733#if defined(MUMPS_USE_BLAS2)
734 IF ( nrhs_b == 1 )
THEN
735 CALL dgemv(
'N', npiv, ncb, alpha, a( ist ), npiv,
736 & w( ptwcb + int(npiv,8) ),
738 & rhscomp(iposinrhscomp,jbdeb), 1 )
741 CALL dgemm(
'N',
'N', npiv, nrhs_b, ncb, alpha,
743 & npiv, w(ptwcb+int(npiv,8)), liell,
744 & one, rhscomp(iposinrhscomp,jbdeb), lrhscomp)
745#if defined(MUMPS_USE_BLAS2)
750 IF ( mtype .eq. 1 )
THEN
753 IF ( keep(50) .EQ. 0 )
THEN
756 IF (keep(459).GT.1)
THEN
763 ppiv_courant = int(jbdeb-1,8)*int(lrhscomp,8)
764 & + int(iposinrhscomp,8)
765 IF (keep(459).GT.1 .AND. keep(50).NE.0)
THEN
767 & npiv, iw(ipos+1+liell),
768 & nrhs_b, rhscomp(1,1), keep8(25), lrhscomp, ppiv_courant,
773 & nrhs_b, rhscomp(1,1), keep8(25), lrhscomp, ppiv_courant,
778 IF ( mtype .EQ. 1 .AND. keep(50).EQ.0)
THEN
779 j1 = ipos + liell + 1
783 iposinrhscomp = posinrhscomp_bwd(iw(j1))
785 IF (keep(201).GT.0.AND.oocwrite_compatible_with_blr)
THEN
791 error_was_broadcasted = .false.
797 IF (in .GT. 0)
GOTO 170
799 myleaf_left = myleaf_left - 1
800 IF (.NOT. in_subtree )
THEN
801 iwcb(ptricb(step(inode))+1) = iwcb(ptricb(step(inode))+1)-1
804 & poswcb,posiwcb,ptricb,ptracb)
806 allow_others_to_leave = ( myleaf_left .EQ. 0 .AND.
808 IF ( keep(31) .NE. 0 .AND.
809 & .NOT. in_subtree )
THEN
810 keep(31) = keep(31) - 1
811 IF (keep(31).EQ. 1)
THEN
812 allow_others_to_leave = .true.
815 IF (allow_others_to_leave)
THEN
816 do_mcast2_termbwd = .true.
822 nbfils = ne_steps(step(inode))
823 IF ( prun_below )
THEN
827 IF ( to_process(step(if)) ) nbfils = nbfils+1
831 IF (nbfils.EQ.0)
THEN
834 no_children = .false.
840 IF ( prun_below )
THEN
842 IF ( .NOT.to_process(step(if)) )
THEN
846 no_children = .false.
848 ipool((iipool-i+1)+nbfils-i) =
IF
852 IF (prun_below .AND. no_children)
THEN
853 myleaf_left = myleaf_left - 1
854 allow_others_to_leave = ( myleaf_left .EQ. 0 .AND.
856 IF (allow_others_to_leave )
THEN
857 do_mcast2_termbwd = .true.
864 deja_send( i ) = .false.
866 pool_first_pos=iipool
868 IF ( prun_below )
THEN
8691020
IF ( .NOT.to_process(step(if)) )
THEN
873 no_children = .false.
875 IF (mumps_procnode(procnode_steps(step(if)),
876 & keep(199)) .EQ. myid)
THEN
881 procdest = mumps_procnode(procnode_steps(step(if)),
883 IF (.not. deja_send( procdest ))
THEN
886 & liell, liell - keep(253),
888 & w( ptracb(step(inode)) ), jbdeb, jbfin,
889 & rhscomp(1, 1), nrhs, lrhscomp,
890 & iposinrhscomp, npiv,
891 & keep, procdest, noeud, comm, ierr )
892 IF ( ierr .EQ. -1 )
THEN
895 & bufr, lbufr, lbufr_bytes,
896 & myid, slavef, comm,
897 & n, iwcb, liww, posiwcb,
899 & iipool, nbfinf, ptricb, ptracb, info,
900 & ipool, lpool, panel_pos, lpanel_pos,
901 & step, frere, fils, procnode_steps,
902 & pleftw, keep, keep8, dkeep,
903 & ptrist, ptrfac, iw, liw, a, la, w2, myleaf_left,
905 & rhscomp, lrhscomp, posinrhscomp_bwd,
906 & prun_below, to_process, size_to_process
909 IF ( info( 1 ) .LT. 0 )
THEN
910 error_was_broadcasted = .true.
914 ELSE IF ( ierr .EQ. -2 )
THEN
916 info( 2 ) = nrhs_b * liell * keep(35) + 4 * keep(34)
917 error_was_broadcasted = .false.
919 ELSE IF ( ierr .EQ. -3 )
THEN
921 info( 2 ) = nrhs_b * liell * keep(35) + 4 * keep(34)
922 error_was_broadcasted = .false.
925 deja_send( procdest ) = .true.
930 IF ( prun_below .AND. no_children )
THEN
931 myleaf_left = myleaf_left - 1
932 allow_others_to_leave = ( myleaf_left .EQ. 0 .AND.
934 IF ( allow_others_to_leave )
THEN
935 do_mcast2_termbwd = .true.
940 DO i=1,(iipool-pool_first_pos)/2
941 tmp=ipool(pool_first_pos+i-1)
942 ipool(pool_first_pos+i-1)=ipool(iipool-i)
945 IF ( keep(31) .NE. 0 )
947 keep(31) = keep(31) - 1
948 allow_others_to_leave = (keep(31) .EQ. 1)
949 IF (allow_others_to_leave)
THEN
950 do_mcast2_termbwd = .true.
954 iwcb(ptricb(step(inode))+1) = iwcb(ptricb(step(inode))+1)-1
957 & poswcb,posiwcb,ptricb,ptracb)
1060 & BUFR, LBUFR, LBUFR_BYTES,
1061 & MYID, SLAVEF, COMM,
1062 & N, IWCB, LIWW, POSIWCB,
1064 & IIPOOL, NBFINF, PTRICB, PTRACB, INFO,
1065 & IPOOL, LPOOL, PANEL_POS, LPANEL_POS, STEP,
1066 & FRERE, FILS, PROCNODE_STEPS, PLEFTW,
1067 & KEEP, KEEP8, DKEEP,
1068 & PTRIST, PTRFAC, IW, LIW, A, LA, W2, MYLEAF_LEFT,
1070 & RHSCOMP, LRHSCOMP, POSINRHSCOMP_BWD,
1071 & PRUN_BELOW, TO_PROCESS, SIZE_TO_PROCESS
1079 INTEGER msgtag, msgsou
1080 INTEGER lbufr, lbufr_bytes
1081 INTEGER bufr( lbufr )
1082 INTEGER myid, slavef, comm
1084 INTEGER iwcb( liww )
1085 INTEGER(8),
intent(in) :: lwc
1088 INTEGER iipool, lpool, lpanel_pos
1089 INTEGER ipool( lpool )
1090 INTEGER panel_pos( lpanel_pos )
1091 INTEGER nbfinf, info(80), keep(500)
1092 INTEGER(8) :: poswcb, pleftw
1093 INTEGER(8) keep8(150)
1094 DOUBLE PRECISION,
INTENT(INOUT) :: dkeep(230)
1095 INTEGER ptricb(keep(28)), step( n ), fils( n )
1096 INTEGER(8) :: ptracb(keep(28))
1097 INTEGER frere(keep(28))
1098 INTEGER procnode_steps(keep(28))
1101 INTEGER iw( liw ), ptrist( keep(28) )
1102 INTEGER(8) :: ptrfac(keep(28))
1103 DOUBLE PRECISION a( la ), w2( keep(133) )
1105 INTEGER myleaf_left,
1106 INTEGER lrhscomp, posinrhscomp_bwd(n)
1107 DOUBLE PRECISION rhscomp(lrhscomp,)
1108 LOGICAL,
INTENT(IN) :: prun_below
1109 INTEGER size_to_process
1110 LOGICAL to_process(size_to_process), no_children
1111 LOGICAL,
intent(in) :: from_pp
1113 include
'mumps_tags.h'
1114 INTEGER position,
if, inode, ierr, long, dummy(1)
1116 INTEGER(8) :: apos, ist
1117 INTEGER , nrow_l, ipos, nrow_recu
1119 INTEGER , jj, in, procdest, j1, , lda
1120 INTEGER nslaves, nelim, j, posindices, inodepos,
1121 & iposinrhscomp, iposinrhscomp_panel
1122 INTEGER jbdeb, jbfin, nrhs_b, allocok
1123 INTEGER(8) :: p_update, p_sol_mas
1124INTEGER :: iwhdlr, mtype_slave,
1126 DOUBLE PRECISION zero,
alpha, one
1127 parameter(zero=0.0d0, one = 1.0d0,
alpha=-1.0d0)
1128 include
'mumps_headers.h'
1129 INTEGER pool_first_pos
1130LOGICAL,
DIMENSION(:),
ALLOCATABLE :: deja_send
1132 INTEGER(8) :: , nbentries_allpanels
1133 INTEGER(8) :: ptwcb_panel
1134 INTEGER(8) :: ptwcb, ppiv_courant
1135 INTEGER ldaj, nbj, liwfac,
1136 & nbjlast, npiv_last, panel_size,
1140 INTEGER ipanel, npanels
1141 INTEGER , i_pivrptr, i_pivr
1142 LOGICAL must_be_permuted
1143 LOGICAL compress_panel, lr_activated
1144 LOGICAL oocwrite_compatible_with_blr
1145 LOGICAL :: allow_others_to_leave
1146 LOGICAL,
EXTERNAL ::
1148 ALLOCATE(deja_send( 0:slavef-1 ), stat=allocok)
1149 if(allocok.ne.0)
then
1152 WRITE(6,*) myid,
' Allocation error of DEJA_SEND '
1153 & //
'in bwd solve COMPSO'
1157 IF (msgtag .EQ. termbwd)
THEN
1159 ELSE IF (msgtag .EQ. noeud)
THEN
1162 & inode, 1, mpi_integer,
1164 CALL mpi_unpack( bufr, lbufr_bytes, position,
1165 & jbdeb, 1, mpi_integer, comm, ierr )
1166 CALL mpi_unpack( bufr, lbufr_bytes, position,
1167 & jbfin, 1, mpi_integer, comm, ierr )
1169 & long, 1, mpi_integer,
1171 nrhs_b = jbfin-jbdeb+1
1172 IF ( posiwcb - long .LT. 0
1173 & .OR. poswcb - pleftw + 1_8 .LT. long )
THEN
1176 & poswcb, posiwcb, ptricb, ptracb)
1177 IF (posiwcb - long .LT. 0)
THEN
1179 info(2)=-posiwcb + long
1180 WRITE(6,*) myid,
' Internal error 1 in bwd solve COMPSO'
1183 IF ( poswcb - pleftw + 1_8 .LT. long )
THEN
1187 WRITE(6,*) myid,
' Internal error 2 in bwd solve COMPSO'
1191 posiwcb = posiwcb - long
1192 poswcb = poswcb - long
1193 IF (long .GT. 0)
THEN
1195 & iwcb(posiwcb + 1),
1196 & long, mpi_integer, comm, ierr)
1199 & w(poswcb + 1), long,
1200 & mpi_double_precision, comm, ierr)
1202 iposinrhscomp = abs( posinrhscomp_bwd( iwcb(
1203 & posiwcb+1+jj ) ) )
1204 IF ( (iposinrhscomp.EQ.0) .OR.
1205 & ( iposinrhscomp.GT.n ) ) cycle
1206 rhscomp(iposinrhscomp,k) = w(poswcb+1+jj)
1209 posiwcb = posiwcb + long
1210 poswcb = poswcb + long
1212 pool_first_pos = iipool
1213 IF ( prun_below )
THEN
1214 IF (.NOT.to_process(step(inode)))
1217 ipool( iipool ) = inode
1220 IF = frere( step(inode) )
1221 DO WHILE (
IF .GT. 0 )
1223 & keep(199)) .eq. myid )
THEN
1224 IF ( prun_below )
THEN
1225 IF (.NOT.to_process(step(
if)))
THEN
1226 IF = frere(step(
if))
1230 ipool( iipool ) =
IF
1233 IF = frere( step(
IF ) )
1235 DO i=1,(iipool-pool_first_pos)/2
1236 tmp=ipool(pool_first_pos+i-1)
1237 ipool(pool_first_pos+i-1)=ipool(iipool-i)
1240 ELSE IF ( msgtag .EQ. backslv_master2slave )
THEN
1242 CALL mpi_unpack( bufr, lbufr_bytes, position,
1243 & inode, 1, mpi_integer, comm, ierr )
1244 CALL mpi_unpack( bufr, lbufr_bytes, position,
1245 & nrow_recu, 1, mpi_integer, comm, ierr )
1246 CALL mpi_unpack( bufr, lbufr_bytes, position,
1247 & jbdeb, 1, mpi_integer, comm, ierr )
1248 CALL mpi_unpack( bufr, lbufr_bytes, position,
1249 & jbfin, 1, mpi_integer, comm, ierr )
1250 nrhs_b = jbfin-jbdeb+1
1251 lr_activated = (iw(ptrist(step(inode))+xxlr).GT.0)
1252 compress_panel = (iw(ptrist(step(inode))+xxlr).GE.2)
1253 oocwrite_compatible_with_blr =
1254 & ( .NOT.lr_activated.OR.(.NOT.compress_panel).OR.
1257 ipos = ptrist( step(inode) ) + keep(ixsz)
1259 nrow_l = iw( ipos + 1 )
1260 IF ( nrow_l .NE. nrow_recu )
THEN
1261 WRITE(*,*)
'Error1 : NROW L/RECU=',nrow_l, nrow_recu
1264 long = nrow_l + npiv
1265 IF ( poswcb - int(long,8)*int(nrhs_b,8) .LT. pleftw - 1_8 )
THEN
1268 & poswcb, posiwcb, ptricb, ptracb)
1269 IF ( poswcb - long*nrhs_b .LT. pleftw - 1_8 )
THEN
1272 WRITE(6,*) myid,
' Internal error 3 in bwd solve COMPSO'
1277 p_sol_mas = pleftw + int(npiv,8) * int(nrhs_b,8)
1278 pleftw = p_sol_mas + int(nrow_l,8) * int(nrhs_b,8)
1280 CALL mpi_unpack( bufr, lbufr_bytes, position,
1281 & w( p_sol_mas+(k-jbdeb)*nrow_l),nrow_l,
1282 & mpi_double_precision,
1285 IF (keep(201).GT.0.AND.oocwrite_compatible_with_blr)
THEN
1287 & inode,ptrfac,keep,a,la,step,
1288 & keep8,n,must_be_permuted,ierr)
1295 apos = ptrfac( step(inode))
1296 IF ( iw(ptrist(step(inode))+xxlr) .GE. 2 .AND.
1297 & keep(485) .EQ. 1 )
THEN
1298 iwhdlr = iw(ptrist(step(inode))+xxf)
1300 w(p_update:p_update+npiv*nrhs_b-1)=zero
1304 & p_sol_mas, p_update,
1306 & mtype_slave, keep, keep8,
1307 & info(1), info(2) )
1309 IF (keep(201) .EQ. 1.AND.oocwrite_compatible_with_blr)
1318 & a, la, apos, nrow_l,
1322 & p_sol_mas, nrow_l,
1324 & mtype_slave, keep, zero)
1326 IF (keep(201) .EQ. 1.AND.oocwrite_compatible_with_blr)
1336 pleftw = pleftw - int(nrow_l,8) * int(nrhs_b,8)
1342 & backslv_updaterhs,
1344 & keep, comm, ierr )
1345 IF ( ierr .EQ. -1 )
THEN
1348 & bufr, lbufr, lbufr_bytes,
1349 & myid, slavef, comm,
1350 & n, iwcb, liww, posiwcb,
1352 & iipool, nbfinf, ptricb, ptracb, info,
1353 & ipool, lpool, panel_pos, lpanel_pos, step,
1354 & frere, fils, procnode_steps, pleftw,
1355 & keep, keep8, dkeep,
1356 & ptrist, ptrfac, iw, liw, a, la, w2, myleaf_left,
1358 & rhscomp, lrhscomp, posinrhscomp_bwd,
1359 & prun_below, to_process, size_to_process
1362 IF ( info( 1 ) .LT. 0 )
GOTO 270
1364 ELSE IF ( ierr .EQ. -2 )
THEN
1366 info( 2 ) = nrhs_b * npiv * keep(35) + 4 * keep(34)
1368 ELSE IF ( ierr .EQ. -3 )
THEN
1370 info( 2 ) = nrhs_b * npiv * keep(35) + 4 * keep(34)
1373 pleftw = pleftw - npiv * nrhs_b
1374 ELSE IF ( msgtag .EQ. backslv_updaterhs )
THEN
1376 CALL mpi_unpack( bufr, lbufr_bytes, position,
1377 & inode, 1, mpi_integer, comm, ierr )
1378 lr_activated = (iw(ptrist(step(inode))+xxlr).GT.0)
1379 compress_panel = (iw(ptrist(step(inode))+xxlr).GE.2)
1380 oocwrite_compatible_with_blr =
1381 & (.NOT.lr_activated.OR.(.NOT.compress_panel).OR.
1384 ipos = ptrist(step(inode)) + 2 + keep(ixsz)
1385 liell = iw(ipos-2)+iw(ipos+1)
1386 CALL mpi_unpack( bufr, lbufr_bytes, position,
1387 & npiv, 1, mpi_integer, comm, ierr )
1388 CALL mpi_unpack( bufr, lbufr_bytes, position,
1389 & jbdeb, 1, mpi_integer, comm, ierr )
1390 CALL mpi_unpack( bufr, lbufr_bytes, position,
1391 & jbfin, 1, mpi_integer, comm, ierr )
1392 nrhs_b = jbfin-jbdeb+1
1397 nslaves = iw( ipos + 1 )
1398 ipos = ipos + 1 + nslaves
1399 inodepos = ptrist(step(inode)) + keep(ixsz) + 4
1400 IF ( keep(50) .eq. 0 )
THEN
1405 IF ( mtype .EQ. 1 .AND. keep(50).EQ.0 )
THEN
1406 j1 = ipos + liell + 1
1407 j2 = ipos + npiv + liell
1412 iposinrhscomp = posinrhscomp_bwd(iw(j1))
1414 CALL mpi_unpack( bufr, lbufr_bytes, position,
1415 & w2, npiv, mpi_double_precision,
1418 IF ( (keep(253).NE.0) .AND.
1419 & (iw(ptrist(step(inode))+xxs).EQ.c_fini+nslaves)
1422 rhscomp(iposinrhscomp+jj-j1,k) = w2(i)
1427 rhscomp(iposinrhscomp+jj-j1,k) =
1428 & rhscomp(iposinrhscomp+jj-j1,k) + w2(i)
1433 iw(ptrist(step(inode))+xxs) =
1434 & iw(ptrist(step(inode))+xxs) - 1
1435 IF ( iw(ptrist(step(inode))+xxs).EQ.c_fini )
THEN
1436 IF (keep(201).GT.0.AND.oocwrite_compatible_with_blr)
1439 & inode,ptrfac,keep,a,la,step,
1440 & keep8,n,must_be_permuted,ierr)
1446 IF (keep(201).EQ.1 .AND. keep(50).NE.1)
THEN
1448 & iw(ipos+1+2*liell),
1449 & must_be_permuted )
1452 apos = ptrfac(iw(inodepos))
1453 IF (keep(201).EQ.1.AND.oocwrite_compatible_with_blr)
1455 liwfac = iw(ptrist(step(inode))+xxi)
1459 IF (panel_size.LT.0)
THEN
1460 WRITE(6,*)
' Internal error in bwd solve PANEL_SIZE=',
1465 IF ( posiwcb - 2 .LT. 0 .or.
1466 & poswcb-int(liell,8)*int(nrhs_b,8) .LT. pleftw-1_8 )
THEN
1468 & poswcb, posiwcb, ptricb, ptracb )
1469 IF ( poswcb-int(liell,8)*int(nrhs_b,8) .LT. pleftw-1_8 )
THEN
1472 & poswcb-pleftw+1_8,
1476 IF ( posiwcb - 2 .LT. 0 )
THEN
1478 info( 2 ) = 2 - posiwcb
1482 posiwcb = posiwcb - 2
1483 poswcb = poswcb - int(liell,8)*int(nrhs_b,8)
1484 ptricb(step( inode )) = posiwcb + 1
1485 ptracb(step( inode )) = poswcb + 1_8
1486 iwcb( ptricb(step( inode )) ) = liell*nrhs_b
1487 iwcb( ptricb(step( inode )) + 1 ) = 1
1488 ipos = ptrist(step(inode)) + keep(ixsz) + 5 + nslaves
1489 IF ( mtype.EQ.1 .AND. keep(50).EQ.0 )
THEN
1490 posindices = ipos + liell + 1
1492 posindices = ipos + 1
1494 ptwcb = ptracb(step( inode ))
1495 iposinrhscomp = posinrhscomp_bwd(iw(j1))
1496 ifr8 = ptracb(step( inode ))
1497 ifr8 = ptwcb + int(npiv - 1,8)
1498 IF ( mtype .EQ. 1 .AND. keep(50).EQ.0 )
THEN
1499 j1 = ipos + liell + npiv + 1
1500 j2 = ipos + 2 * liell
1502 j1 = ipos + npiv + 1
1506 & rhscomp, nrhs, lrhscomp,
1507 & w(ptwcb), liell, npiv+1,
1508 & iw, liw, keep, n, posinrhscomp_bwd )
1509 ifr8 = ifr8 + int(j2-keep(253)-j1+1,8)
1510 IF ( keep(201).EQ.1 .AND. oocwrite_compatible_with_blr .AND.
1511 & (( nelim .GT. 0 ).OR. (mtype.NE.1 )))
THEN
1512 j = npiv / panel_size
1513 twobytwo = keep(50).EQ.2 .AND. keep(105).GT.0
1516 & iw(ipos+1+liell), npiv, npanels, nrow_l,
1517 & nbentries_allpanels)
1519 IF (npiv.EQ.j*panel_size)
THEN
1521 nbjlast = panel_size
1524 npiv_last = (j+1)* panel_size
1525 nbjlast = npiv-j*panel_size
1528 nbentries_allpanels =
1529 & int(nrow_l,8) * int(npiv,8)
1530 & - int( ( j * ( j - 1 ) ) /2,8 )
1531 & * int(panel_size,8) * int(panel_size,8)
1533 & * int(mod(npiv, panel_size),8)
1534 & * int(panel_size,8)
1537 aposdeb = apos + nbentries_allpanels
1538 DO ipanel = npanels, 1, -1
1540 nbj = panel_pos(ipanel+1)-panel_pos(ipanel)
1541 beg_panel = panel_pos(ipanel)
1543 IF (jj.EQ.npiv_last)
THEN
1548 beg_panel = jj- panel_size+1
1550 ldaj = nrow_l-beg_panel+1
1551 aposdeb = aposdeb - int(nbj,8)*int(ldaj,8)
1552 ptwcb = ptracb(step(inode))
1553 ptwcb_panel = ptracb(step(inode)) + int(beg_panel - 1,8)
1554 iposinrhscomp_panel = iposinrhscomp + beg_panel - 1
1555 ncb_panel = ldaj - nbj
1557 IF (keep(50).NE.1 .AND.must_be_permuted)
THEN
1559 & i_pivrptr, i_pivr, ipos + 1 + 2 * liell, iw, liw)
1561 & iw(i_pivr + iw(i_pivrptr+ipanel-1)-iw(i_pivrptr)),
1562 & npiv-iw(i_pivrptr+ipanel-1)+1,
1563 & iw(i_pivrptr+ipanel-1)-1,
1565 & ldaj, nbj, beg_panel-1)
1567#if defined(MUMPS_USE_BLAS2)
1568 IF ( nrhs_b == 1 )
THEN
1569 IF (ncb_panel.NE.0)
THEN
1570 IF (ncb_panel - ncb.NE. 0)
THEN
1572 & a( aposdeb + int(nbj,8) ), ldaj,
1573 & rhscomp(iposinrhscomp_panel+nbj,jbdeb),
1575 & rhscomp(iposinrhscomp_panel,jbdeb), 1 )
1577 IF (ncb .NE. 0)
THEN
1579 & a( aposdeb + int(ldaj-ncb,8) ), ldaj,
1580 & w( ptwcb + int(npiv,8) ),
1582 & rhscomp(iposinrhscomp_panel,jbdeb), 1 )
1585 IF (mtype.NE.1)
THEN
1586 CALL dtrsv(
'L',
'T',
'U', nbj, a(aposdeb), ldaj,
1587 & rhscomp(iposinrhscomp_panel,jbdeb), 1)
1589 CALL dtrsv(
'L',
'T',
'N', nbj, a(aposdeb), ldaj,
1590 & rhscomp(iposinrhscomp_panel,jbdeb), 1)
1594 IF (ncb_panel.NE.0)
THEN
1595 IF (ncb_panel - ncb .NE. 0)
THEN
1597 & ncb_panel-ncb,
alpha,
1598 & a(aposdeb +int(nbj,8)), ldaj,
1599 & rhscomp(iposinrhscomp_panel+nbj,jbdeb), lrhscomp,
1600 & one, rhscomp(iposinrhscomp_panel,jbdeb), lrhscomp)
1602 IF (ncb .NE. 0)
THEN
1603 CALL dgemm(
'T',
'N', nbj, nrhs_b, ncb,
alpha,
1604 & a(aposdeb +int(ldaj-ncb,8)), ldaj,
1605 & w( ptwcb+int(npiv,8) ), liell,
1606 & one, rhscomp(iposinrhscomp_panel,jbdeb),lrhscomp)
1609 IF (mtype.NE.1)
THEN
1610 CALL dtrsm(
'L',
'L',
'T',
'U',nbj, nrhs_b, one,
1612 & ldaj, rhscomp(iposinrhscomp_panel,jbdeb), lrhscomp)
1614 CALL dtrsm(
'L',
'L',
'T',
'N',nbj, nrhs_b, one,
1616 & ldaj, rhscomp(iposinrhscomp_panel,jbdeb), lrhscomp)
1618#if defined(MUMPS_USE_BLAS2)
1621 IF (.NOT. twobytwo) jj=beg_panel-1
1625 IF ( iw(ptrist(step(inode))+xxlr) .GE. 2
1626 & .AND. keep(485) .EQ. 1 )
THEN
1627 iwhdlr = iw(ptrist(step(inode))+xxf)
1629 & inode, iwhdlr, npiv, nslaves,
1630 & liell, w, lwc, nrhs_b, ptracb(step(inode)),
1631 & rhscomp, lrhscomp, nrhs,
1632 & iposinrhscomp, jbdeb,
1633 & mtype, keep, keep8,
1634 & info(1), info(2) )
1636 IF (nelim .GT.0)
THEN
1637 IF ( keep(50) .eq. 0 )
THEN
1638 ist = apos + int(npiv,8) * int(liell,8)
1640 IF( keep(459) .GT. 1)
THEN
1641 CALL mumps_geti8(ist, iw(ptrist(step(inode))+xxr))
1642 ist = apos + ist - int(npiv,8) * int(nelim,8)
1644 ist = apos + int(npiv,8) * int(npiv,8)
1647#if defined(MUMPS_USE_BLAS2)
1648 IF ( nrhs_b == 1 )
THEN
1649 CALL dgemv(
'N', npiv, nelim,
alpha, a( ist ), npiv,
1650 & w( npiv + ptracb(step(inode)) ),
1652 & rhscomp(iposinrhscomp,jbdeb), 1 )
1655 CALL dgemm(
'N',
'N', npiv
1656 & a(ist), npiv, w(npiv+ptracb(step(inode))), liell,
1657 & one, rhscomp(iposinrhscomp,jbdeb), lrhscomp)
1658#if defined(MUMPS_USE_BLAS2)
1662 ppiv_courant = int(jbdeb-1,8)*int(lrhscomp,8)
1663 & + int(iposinrhscomp,8)
1664 IF (keep(459).GT.1 .AND. keep(50).NE.0)
THEN
1666 & npiv, iw(ipos+1+liell),
1667 & nrhs_b, rhscomp(1,1), keep8(25), lrhscomp, ppiv_courant,
1672 & nrhs_b, rhscomp(1,1), keep8(25), lrhscomp, ppiv_courant,
1677 IF (keep(201).GT.0.AND.oocwrite_compatible_with_blr)
THEN
1686 ipos = ptrist(step(inode)) + keep(ixsz) + 6 + nslaves
1687 iposinrhscomp = posinrhscomp_bwd(iw(ipos))
1690 IF (in .GT. 0)
GOTO 170
1692 myleaf_left = myleaf_left - 1
1695 IF (keep(31) .NE. 0)
THEN
1697 & procnode_steps(step(inode)),
1698 & keep(199) ) )
THEN
1699 keep(31) = keep(31) - 1
1700 IF (keep(31) .EQ. 1)
THEN
1701 allow_others_to_leave = .true.
1705 IF ( allow_others_to_leave )
THEN
1707 & termbwd, slavef, keep )
1710 iwcb( ptricb(step(inode)) + 1 ) = 0
1712 & iwcb, liww, w, lwc,
1713 & poswcb, posiwcb, ptricb, ptracb)
1716 DO i = 0, slavef - 1
1717 deja_send( i ) = .false.
1720 IF ( prun_below )
THEN
1721 no_children = .true.
1723 no_children = .false.
1726 IF ( prun_below )
THEN
1727 IF ( .NOT.to_process(step(in)) )
THEN
1728 in = frere(step(in))
1731 no_children = .false.
1734 pool_first_pos = iipool
1736 & keep(199)) .EQ. myid)
THEN
1742 IF ( .NOT. deja_send( procdest ) )
THEN
1745 & liell, liell - keep(253),
1747 & w( ptracb(step(inode)) ), jbdeb, jbfin,
1748 & rhscomp(1, 1), nrhs, lrhscomp,
1749 & iposinrhscomp, npiv,
1750 & keep, procdest, noeud, comm, ierr )
1751 IF ( ierr .EQ. -1 )
THEN
1754 & bufr, lbufr, lbufr_bytes,
1755 & myid, slavef, comm,
1756 & n, iwcb, liww, posiwcb,
1758 & iipool, nbfinf, ptricb, ptracb, info,
1759 & ipool, lpool, panel_pos, lpanel_pos,
1760 & step, frere, fils, procnode_steps,
1761 & pleftw, keep, keep8, dkeep,
1762 & ptrist, ptrfac, iw, liw, a, la
1764 & rhscomp, lrhscomp, posinrhscomp_bwd,
1765 & prun_below, to_process, size_to_process
1768 IF ( info( 1 ) .LT. 0 )
THEN
1772 ELSE IF ( ierr .EQ. -2 )
THEN
1774 info( 2 ) = nrhs_b * liell * keep(35) + 4 * keep(34)
1776 ELSE IF ( ierr .EQ. -3 )
THEN
1778 info( 2 ) = nrhs_b * liell * keep(35) + 4 * keep(34)
1781 deja_send( procdest ) = .true.
1784 in = frere( step( in ) )
1786 allow_others_to_leave = .false.
1787 IF (no_children)
THEN
1788 myleaf_left = myleaf_left - 1
1789 allow_others_to_leave = ( myleaf_left .EQ. 0 .AND.
1792 IF (keep(31) .NE. 0)
THEN
1794 & procnode_steps(step(inode)),
1795 & keep(199) ) )
THEN
1796 keep(31) = keep(31) - 1
1797 IF (keep(31) .EQ. 1)
THEN
1798 allow_others_to_leave
1802 IF ( allow_others_to_leave )
THEN
1807 IF ( .NOT. no_children )
THEN
1808 DO i=1,(iipool-pool_first_pos)/2
1809 tmp=ipool(pool_first_pos+i-1)
1810 ipool(pool_first_pos+i-1)=ipool(iipool-i)
1814 iwcb( ptricb(step( inode )) + 1 ) = 0
1816 & iwcb, liww, w, lwc,
1817 & poswcb, posiwcb, ptricb, ptracb)
1819 ELSE IF (msgtag.EQ.terreur)
THEN
1823 ELSE IF ( (msgtag.EQ.update_load).OR.
1824 & (msgtag.EQ.tag_dummy) )
THEN
1833 IF (nbfinf .NE. 0)
THEN
1837 IF (
allocated(deja_send))
DEALLOCATE(deja_send)