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(28))
43 INTEGER,
INTENT( IN ) :: NE_STEPS(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 ) :: LPANEL_POS
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 :: PTRIST(KEEP(28)), PTRICB(KEEP(28))
54 INTEGER(8) :: PTRACB(KEEP(28))
55 INTEGER(8) :: PTRFAC(KEEP(28))
56 COMPLEX(kind=8) :: A( LA )
57 COMPLEX(kind=8) :: W(LWC)
58 COMPLEX(kind=8) :: W2(KEEP(133))
59 INTEGER :: IW(),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 COMPLEX(kind=8) RHSCOMP(LRHSCOMP,NRHS)
67 INTEGER(8),
intent(in) :: LRHS_ROOT
68 COMPLEX(kind=8) RHS_ROOT( LRHS_ROOT )
69 LOGICAL,
INTENT( IN ) :: PRUN_BELOW
70 INTEGER,
INTENT(IN) :: SIZE_TO_PROCESS
71 LOGICAL,
INTENT(IN) :: (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
90 LOGICAL :: ALLOW_OTHERS_TO_LEAVE
91 INTEGER :: K, JBDEB, JBFIN, NRHS_B
94 INTEGER IPOS,LIELL,,JJ,I
97 INTEGER IN,,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,
112 INTEGER NPANELS, IPANEL
113 COMPLEX(kind=8) ALPHA,ONE,ZERO
114 parameter(zero=(0.0d0,0.0d0),
116 & alpha=(-1.0d0,0.0d0))
117 LOGICAL,
EXTERNAL :: MUMPS_IN_OR_ROOT_SSARBR
118 INTEGER,
EXTERNAL :: MUMPS_TYPENODE
119 INTEGER,
EXTERNAL :: MUMPS_PROCNODE
120 error_was_broadcasted = .false.
121 do_mcast2_termbwd = .false.
122 no_children = .false.
123 IF (do_nbsparse)
THEN
124 jbdeb= rhs_bounds(2*step(inode)-1)
125 jbfin= rhs_bounds(2*step(inode))
126 nrhs_b = jbfin-jbdeb+1
132 IF ( inode .EQ. keep( 38 ) .OR. inode .EQ. keep( 20 ) )
THEN
133 ipos = ptrist(step(inode))+keep(ixsz)
135 liell = iw(ipos) + npiv
136 ipos = ptrist(step(inode)) + 5 + keep(ixsz)
137 IF ( mtype .EQ. 1 .AND. keep(50) .EQ. 0)
THEN
138 j1 = ipos + liell + 1
139 j2 = ipos + liell + npiv
145 iposinrhscomp = posinrhscomp_bwd(iw(j1))
147 & keep, rhscomp, nrhs, lrhscomp, iposinrhscomp,
148 & rhs_root(1+npiv*(jbdeb-1)), npiv, 1)
151 IF (in .GT. 0)
GOTO 270
153 myleaf_left = myleaf_left - 1
154 allow_others_to_leave = ( myleaf_left .EQ. 0 .AND.
156 IF (keep(31) .NE. 0)
THEN
157 IF ( .NOT. mumps_in_or_root_ssarbr(
158 & procnode_steps(step(inode)), keep(199) ) )
THEN
160 IF (keep(31) .EQ. 1)
THEN
161 allow_others_to_leave = .true.
165 IF (allow_others_to_leave)
THEN
166 do_mcast2_termbwd = .true.
173 nbfils = ne_steps(step(inode))
174 IF ( prun_below )
THEN
178 IF ( to_process(step(
if)) ) nbfils = nbfils+1
182 IF (nbfils.EQ.0)
THEN
185 no_children = .false.
190 deja_send( i ) = .false.
192 pool_first_pos=iipool
194 IF ( prun_below )
THEN
195 1030
IF ( .NOT.to_process(step(
if)) )
THEN
199 no_children = .false.
201 IF (mumps_procnode(procnode_steps(step(
if)),keep(199))
206 procdest = mumps_procnode(procnode_steps(step(
if)),
208 IF (.NOT. deja_send( procdest ))
THEN
211 & long, long, iw( j1 ),
212 & rhs_root( 1+npiv*(jbdeb-1) ),
214 & rhscomp(1, 1), nrhs, lrhscomp,
215 & iposinrhscomp, npiv,
217 & noeud, comm, ierr )
218 IF ( ierr .EQ. -1 )
THEN
221 & bufr, lbufr, lbufr_bytes,
222 & myid, slavef, comm,
223 & n, iwcb, liww, posiwcb,
225 & iipool, nbfinf, ptricb, ptracb, info,
226 & ipool, lpool, panel_pos, lpanel_pos,
227 & step, frere, fils, procnode_steps,
228 & pleftw, keep,keep8, dkeep,
229 & ptrist, ptrfac, iw, liw, a, la, w2,
232 & rhscomp, lrhscomp, posinrhscomp_bwd,
233 & prun_below, to_process, size_to_process
236 IF ( info( 1 ) .LT. 0 )
THEN
237 error_was_broadcasted = .true.
241 ELSE IF ( ierr .EQ. -2 )
THEN
243 info( 2 ) = nrhs_b * long * keep(35) +
244 & ( long + 4 ) * keep(34)
245 error_was_broadcasted = .false.
247 ELSE IF ( ierr .EQ. -3 )
THEN
249 info( 2 ) = nrhs_b * long * keep(35) +
250 & ( long + 4 ) * keep(34)
251 error_was_broadcasted = .false.
253 ELSE IF ( ierr .NE. 0 )
THEN
254 WRITE(*,*)
"Internal error 2 ZMUMPS_SOLVE_NODE_BWD",
258 deja_send( procdest ) = .true.
263 allow_others_to_leave = .false.
264 IF ( prun_below .AND. no_children )
THEN
265 myleaf_left = myleaf_left - 1
266 allow_others_to_leave = ( myleaf_left .EQ. 0 .AND.
269 IF ( keep(31). ne. 0)
THEN
270 IF ( .NOT. mumps_in_or_root_ssarbr(
271 & procnode_steps(step(inode)), keep(199) ) )
THEN
272 keep(31) = keep(31) - 1
273 IF (keep(31) .EQ. 1)
THEN
274 allow_others_to_leave = .true.
278 IF ( allow_others_to_leave )
THEN
279 do_mcast2_termbwd = .true.
282 IF (iipool.NE.pool_first_pos)
THEN
283 DO i=1,(iipool-pool_first_pos)/2
284 tmp = ipool(pool_first_pos
285 ipool(pool_first_pos+i-1) = ipool(iipool-i)
286 ipool(iipool-i) = tmp
291 in_subtree = mumps_in_or_root_ssarbr(
292 & procnode_steps(step(inode)), keep(199) )
293 typenode = mumps_typenode(procnode_steps(step(inode)),
296 & (typenode .eq.2 ) .AND.
298 npiv = iw(ptrist(step(inode))+2+keep(ixsz)+1)
299 IF ((npiv.NE.0).AND.(ltlevel2))
THEN
300 ipos = ptrist(step(inode)) + 2 + keep(ixsz)
301 liell = iw(ipos-2)+iw(ipos+1)
305 ncb = liell - npiv - nelim
309 ipos = ipos + nslaves
310 iw(ptrist(step(inode))+xxs)= c_fini+nslaves
311 IF ( posiwcb - 2 .LT. 0 .or.
312 & poswcb-int(ncb,8)*int(nrhs_b,8) .LT. pleftw-1_8 )
THEN
314 & poswcb, posiwcb, ptricb, ptracb)
315 IF ( poswcb-int(ncb,8)*int(nrhs_b,8) .LT. pleftw-1_8 )
THEN
319 error_was_broadcasted = .false.
322 IF ( posiwcb - 2 .LT. 0 )
THEN
324 info( 2 ) = 2 - posiwcb
325 error_was_broadcasted = .false.
329 posiwcb = posiwcb - 2
330 poswcb = poswcb - int(ncb,8)*int(nrhs_b,8)
331 ptricb(step( inode )) = posiwcb + 1
332 ptracb(step( inode )) = poswcb + 1_8
333 iwcb( ptricb(step( inode )) ) = ncb*nrhs_b
334 iwcb( ptricb(step( inode )) + 1 ) = 1
335 IF ( mtype.EQ.1 .AND. keep(50).EQ.0 )
THEN
336 posindices = ipos + liell + 1
338 posindices = ipos + 1
341 write(6,*)
' Internal Error type 2 node with no CB '
344 IF ( mtype .EQ. 1 .AND. keep(50).EQ.0 )
THEN
345 j1 = ipos + liell + npiv + nelim +1
346 j2 = ipos + 2 * liell
348 j1 = ipos + npiv + nelim +1
351 ifr8 = ptracb(step( inode )) - 1_8
353 & rhscomp, nrhs, lrhscomp,
354 & w(ptracb(step(inode))), ncb, 1,
355 & iw, liw, keep, n, posinrhscomp_bwd )
356 ifr8 = ifr8 + int(j2-keep(253)-j1+1,8)
357 IF (keep(252).NE.0)
THEN
358 DO jj = j2-keep(253)+1, j2
361 IF (k.EQ.jj-j2+keep(253))
THEN
362 w(ifr8+int(k-jbdeb,8)*int(ncb,8)) = alpha
364 w(ifr8+int(k-jbdeb,8)*int(ncb,8)) = zero
369 DO islave = 1, nslaves
371 & keep,keep8, inode, step, n, slavef,
372 & istep_to_iniv2, tab_pos_in_pere,
378 dest = iw( ptrist(step(inode))+5+islave+keep(ixsz))
380 & w(offset+ptracb(step(inode))),
383 & backslv_master2slave, jbdeb, jbfin,
385 IF ( ierr .EQ. -1 )
THEN
388 & bufr, lbufr, lbufr_bytes,
389 & myid, slavef, comm,
390 & n, iwcb, liww, posiwcb,
392 & iipool, nbfinf, ptricb, ptracb, info,
393 & ipool, lpool, panel_pos, lpanel_pos,
395 & procnode_steps, pleftw, keep,keep8, dkeep,
396 & ptrist, ptrfac, iw, liw, a, la, w2, myleaf_left,
398 & rhscomp, lrhscomp, posinrhscomp_bwd,
399 & prun_below , to_process, size_to_process
402 IF ( info( 1 ) .LT. 0 )
THEN
403 error_was_broadcasted = .true.
407 ELSE IF ( ierr .EQ. -2 )
THEN
409 info( 2 ) = nrhs_b * effectivesize * keep(35) +
411 error_was_broadcasted = .false.
413 ELSE IF ( ierr .EQ. -3 )
THEN
415 info( 2 ) = nrhs_b * effectivesize * keep(35) +
417 error_was_broadcasted = .false.
420 offset = offset + effectivesize
422 iwcb( ptricb(step( inode )) + 1 ) = 0
424 & poswcb,posiwcb,ptricb,ptracb)
427 lr_activated = (iw(ptrist(step(inode))+xxlr).GT.0)
428 compress_panel = (iw(ptrist(step(inode))+xxlr).GE.2)
429 oocwrite_compatible_with_blr =
430 & (.NOT.lr_activated.OR.(.NOT.compress_panel).OR.
433 ipos = ptrist(step(inode)) + 2 + keep(ixsz)
434 liell = iw(ipos-2)+iw(ipos+1)
440 IF (keep(201).GT.0.AND.oocwrite_compatible_with_blr)
THEN
442 & inode,ptrfac,keep,a,la,step,
443 & keep8,n,must_be_permuted,ierr)
447 error_was_broadcasted = .false.
451 apos = ptrfac( step(inode))
452 nslaves = iw( ptrist(step(inode)) + 5 + keep(ixsz) )
453 ipos = ipos + 1 + nslaves
454 IF (keep(201).EQ.1.AND.oocwrite_compatible_with_blr)
THEN
455 liwfac = iw(ptrist(step(inode))+xxi)
462 IF (keep(50).NE.1)
THEN
464 & iw(ipos+1+2*liell),
469 IF ( mtype .EQ. 1 .AND. keep(50).EQ.0 )
THEN
470 j1 = ipos + liell + 1
471 j2 = ipos + npiv + liell
478 IF ( poswcb .LT. int(liell,8)*int(nrhs_b,8) )
THEN
480 & poswcb, posiwcb, ptricb, ptracb)
481 IF ( poswcb .LT. int(liell,8)*int(nrhs_b,8) )
THEN
485 error_was_broadcasted = .false.
490 IF ( posiwcb - 2 .LT. 0 .or.
491 & poswcb-int(liell,8)*int(nrhs_b,8) .LT. pleftw-1_8 )
THEN
493 & poswcb, posiwcb, ptricb, ptracb )
494 IF ( poswcb-int(liell,8)*int(nrhs_b,8) .LT. pleftw-1_8 )
THEN
499 error_was_broadcasted = .false.
502 IF ( posiwcb - 2 .LT. 0 )
THEN
504 info( 2 ) = 2 - posiwcb
505 error_was_broadcasted = .false.
509 posiwcb = posiwcb - 2
510 poswcb = poswcb - int(liell,8)*int(nrhs_b,8)
511 ptricb(step( inode )) = posiwcb + 1
512 ptracb(step( inode )) = poswcb + 1_8
513 iwcb( ptricb(step( inode )) ) = liell*nrhs_b
514 iwcb( ptricb(step( inode )) + 1 ) = 1
515 IF ( mtype.EQ.1 .AND. keep(50).EQ.0 )
THEN
516 posindices = ipos + liell + 1
518 posindices = ipos + 1
520 ptwcb = ptracb(step( inode ))
523 iposinrhscomp = posinrhscomp_bwd(iw(j1))
525 iposinrhscomp = -99999
529 IF (keep(252).NE.0)
THEN
531 rhscomp(iposinrhscomp+jj-j1,k) = zero
536 ifr8 = ptwcb + int(npiv - 1,8)
537 IF ( liell .GT. npiv )
THEN
538 IF ( mtype .EQ. 1 .AND. keep(50).EQ.0 )
THEN
539 j1 = ipos + liell + npiv + 1
540 j2 = ipos + 2 * liell
546 & rhscomp, nrhs, lrhscomp,
547 & w(ptwcb), liell, npiv+1,
548 & iw, liw, keep, n, posinrhscomp_bwd )
549 ifr8 = ifr8 + int(j2-keep(253)-j1+1,8)
550 IF (keep(252).NE.0)
THEN
551 DO jj = j2-keep(253)+1, j2
554 IF (k.EQ.jj-j2+keep(253))
THEN
555 w(ifr8+int(k-jbdeb,8)*int(liell,8)) = alpha
557 w(ifr8+int(k-jbdeb,8)*int(liell,8)) = zero
563 IF (npiv .EQ. 0)
GOTO 160
565 IF (keep(201).EQ.1.AND.oocwrite_compatible_with_blr)
THEN
566 j = npiv / panel_size
567 twobytwo = keep(50).EQ.2 .AND.
568 & ((typenode.EQ.1.AND.keep(103).GT.0) .OR.
569 & (typenode.EQ.2.AND.keep(105).GT.0))
572 & iw(ipos+1+liell), npiv, npanels, liell,
573 & nbentries_allpanels)
575 IF (npiv.EQ.j*panel_size)
THEN
580 npiv_last = (j+1)* panel_size
581 nbjlast = npiv-j*panel_size
584 nbentries_allpanels =
585 & int(liell,8) * int(npiv,8)
586 & - int( ( j * ( j - 1 ) ) /2,8 )
587 & * int(panel_size,8) * int(panel_size,8)
589 & * int(mod(npiv, panel_size),8)
590 & * int(panel_size,8)
593 aposdeb = apos + nbentries_allpanels
594 DO ipanel = npanels, 1, -1
596 nbj = panel_pos(ipanel+1)-panel_pos(ipanel)
597 beg_panel = panel_pos(ipanel)
599 IF (jj.EQ.npiv_last)
THEN
604 beg_panel = jj- panel_size+1
606 ldaj = liell-beg_panel+1
607 aposdeb = aposdeb - int(nbj,8)*int(ldaj,8)
608 ptwcb_panel = ptwcb + int(beg_panel - 1,8)
609 iposinrhscomp_panel = iposinrhscomp + beg_panel - 1
610 ncb_panel = ldaj - nbj
611 IF (keep(50).NE.1.AND.must_be_permuted)
THEN
613 & i_pivrptr, i_pivr, ipos + 1 + 2 * liell, iw, liw)
614 IF (npiv.EQ.(iw(i_pivrptr)-1))
THEN
615 must_be_permuted=.false.
618 & iw(i_pivr + iw(i_pivrptr+ipanel-1)-iw(i_pivrptr)),
619 & npiv-iw(i_pivrptr+ipanel-1)+1,
620 & iw(i_pivrptr+ipanel-1)-1,
622 & ldaj, nbj, beg_panel-1)
625#if defined(MUMPS_USE_BLAS2)
626 IF ( nrhs_b == 1 )
THEN
627 IF (ncb_panel.NE.0)
THEN
628 IF (ncb_panel - ncb.NE. 0)
THEN
629 CALL zgemv(
'T', ncb_panel-ncb, nbj, alpha,
630 & a( aposdeb + int(nbj,8) ), ldaj,
631 & rhscomp(iposinrhscomp_panel+nbj,jbdeb),
633 & rhscomp(iposinrhscomp_panel,jbdeb), 1 )
636 CALL zgemv(
'T', ncb, nbj, alpha,
637 & a( aposdeb + int(ldaj-ncb,8) ), ldaj,
638 & w( ptwcb + int(npiv,8) ),
640 & rhscomp(iposinrhscomp_panel,jbdeb), 1 )
644 CALL ztrsv(
'L',
'T',
'U', nbj, a(aposdeb), ldaj,
645 & rhscomp(iposinrhscomp_panel,jbdeb), 1)
647 CALL ztrsv(
'L',
'T',
'N', nbj, a(aposdeb), ldaj,
648 & rhscomp(iposinrhscomp_panel,jbdeb), 1)
652 IF (ncb_panel.NE.0)
THEN
653 IF (ncb_panel - ncb .NE. 0)
THEN
654 CALL zgemm(
'T',
'N', nbj, nrhs_b,
655 & ncb_panel-ncb, alpha,
656 & a(aposdeb +int(nbj,8)), ldaj,
657 & rhscomp(iposinrhscomp_panel+nbj,jbdeb), lrhscomp,
658 & one, rhscomp(iposinrhscomp_panel,jbdeb), lrhscomp)
661 CALL zgemm(
'T',
'N', nbj, nrhs_b, ncb, alpha,
662 & a(aposdeb +int(ldaj-ncb,8)), ldaj,
663 & w( ptwcb+int(npiv,8) ), liell,
664 & one, rhscomp(iposinrhscomp_panel,jbdeb),lrhscomp)
668 CALL ztrsm(
'L',
'L',
'T',
'U',nbj, nrhs_b, one,
670 & ldaj, rhscomp(iposinrhscomp_panel,jbdeb), lrhscomp)
672 CALL ztrsm(
'L','l
','t
','n
',NBJ, NRHS_B, ONE,
674 & LDAJ, RHSCOMP(IPOSINRHSCOMP_PANEL,JBDEB), LRHSCOMP)
676#if defined(MUMPS_USE_BLAS2)
679.NOT.
IF ( TWOBYTWO) JJ=BEG_PANEL-1
682.GE.
IF ( IW(PTRIST(STEP(INODE))+XXLR) 2
683.AND..EQ.
& KEEP(485) 1 ) THEN
684 IWHDLR = IW(PTRIST(STEP(INODE))+XXF)
685 CALL ZMUMPS_SOL_BWD_LR_SU (
686 & INODE, IWHDLR, NPIV, NSLAVES,
687 & LIELL, W, LWC, NRHS_B, PTWCB,
688 & RHSCOMP, LRHSCOMP, NRHS,
689 & IPOSINRHSCOMP, JBDEB,
690 & MTYPE, KEEP, KEEP8,
692.LT.
IF (INFO(1)0) THEN
693 ERROR_WAS_BROADCASTED = .FALSE.
697.GT.
IF ( LIELL NPIV ) THEN
698#if defined(LDLTPANEL_DEBUG)
699 WRITE(*,*) 'before gemm liell, npiv, ptwcb=
',LIELL,NPIV,PTWCB
700 WRITE(*,*) 'before gemm rhscomp=
',
701 & RHSCOMP(IPOSINRHSCOMP:IPOSINRHSCOMP+NPIV-1,1)
702 WRITE(*,*) 'before gemm w
',
703 & W(PTWCB+NPIV:PTWCB+LIELL-1)
704 CALL MUMPS_GETI8(IST, IW(PTRIST(STEP(INODE))+XXR))
705 WRITE(*,*) "FACTORS=",A(APOS:APOS+IST-1)
707.eq.
IF ( MTYPE 1 ) THEN
708 IST = APOS + int(NPIV,8)
709#if defined(MUMPS_USE_BLAS2)
710 IF (NRHS_B == 1) THEN
711 CALL zgemv( 't
', NCB, NPIV, ALPHA, A(IST), LIELL,
712 & W(PTWCB+int(NPIV,8)), 1,
714 & RHSCOMP(IPOSINRHSCOMP,JBDEB), 1 )
717 CALL zgemm('t
','n
', NPIV, NRHS_B, NCB, ALPHA,
719 & LIELL, W(PTWCB+int(NPIV,8)), LIELL, ONE,
720 & RHSCOMP(IPOSINRHSCOMP,JBDEB), LRHSCOMP)
721#if defined(MUMPS_USE_BLAS2)
725.eq.
IF ( KEEP(50) 0 ) THEN
726 IST = APOS + int(NPIV,8) * int(LIELL,8)
728.GT.
IF( KEEP(459) 1) THEN
729 CALL MUMPS_GETI8(IST, IW(PTRIST(STEP(INODE))+XXR))
730 IST = APOS + IST - int(NPIV,8) * int(LIELL-NPIV,8)
732 IST = APOS + int(NPIV,8) * int(NPIV,8)
735#if defined(MUMPS_USE_BLAS2)
736 IF ( NRHS_B == 1 ) THEN
737 CALL zgemv( 'n
', NPIV, NCB, ALPHA, A( IST ), NPIV,
738 & W( PTWCB + int(NPIV,8) ),
740 & RHSCOMP(IPOSINRHSCOMP,JBDEB), 1 )
743 CALL zgemm( 'n
', 'n
', NPIV, NRHS_B, NCB, ALPHA,
745 & NPIV, W(PTWCB+int(NPIV,8)), LIELL,
746 & ONE, RHSCOMP(IPOSINRHSCOMP,JBDEB), LRHSCOMP)
747#if defined(MUMPS_USE_BLAS2)
752.eq.
IF ( MTYPE 1 ) THEN
755.EQ.
IF ( KEEP(50) 0 ) THEN
758.GT.
IF (KEEP(459)1) THEN
765 PPIV_COURANT = int(JBDEB-1,8)*int(LRHSCOMP,8)
766 & + int(IPOSINRHSCOMP,8)
767.GT..AND..NE.
IF (KEEP(459)1 KEEP(50)0) THEN
768 CALL ZMUMPS_SOLVE_BWD_PANELS( A, LA, APOS,
769 & NPIV, IW(IPOS+1+LIELL),
770 & NRHS_B, RHSCOMP(1,1), KEEP8(25), LRHSCOMP, PPIV_COURANT,
773 CALL ZMUMPS_SOLVE_BWD_TRSOLVE( A, LA, APOS,
775 & NRHS_B, RHSCOMP(1,1), KEEP8(25), LRHSCOMP, PPIV_COURANT,
780.EQ..AND..EQ.
IF ( MTYPE 1 KEEP(50)0) THEN
781 J1 = IPOS + LIELL + 1
785 IPOSINRHSCOMP = POSINRHSCOMP_BWD(IW(J1))
787.GT..AND.
IF (KEEP(201)0OOCWRITE_COMPATIBLE_WITH_BLR) THEN
788 CALL ZMUMPS_FREE_FACTORS_FOR_SOLVE(INODE,PTRFAC,KEEP(28),
793 ERROR_WAS_BROADCASTED = .FALSE.
799.GT.
IF (IN 0) GOTO 170
801 MYLEAF_LEFT = MYLEAF_LEFT - 1
802.NOT.
IF ( IN_SUBTREE ) THEN
803 IWCB(PTRICB(STEP(INODE))+1) = IWCB(PTRICB(STEP(INODE))+1)-1
804 CALL ZMUMPS_FREETOPSO(N, KEEP(28), IWCB, LIWW,
806 & POSWCB,POSIWCB,PTRICB,PTRACB)
808.EQ..AND.
ALLOW_OTHERS_TO_LEAVE = ( MYLEAF_LEFT 0
810.NE..AND.
IF ( KEEP(31) 0
811.NOT.
& IN_SUBTREE ) THEN
812 KEEP(31) = KEEP(31) - 1
813.EQ.
IF (KEEP(31) 1) THEN
814 ALLOW_OTHERS_TO_LEAVE = .TRUE.
817 IF (ALLOW_OTHERS_TO_LEAVE) THEN
818 DO_MCAST2_TERMBWD = .TRUE.
824 NBFILS = NE_STEPS(STEP(INODE))
825 IF ( PRUN_BELOW ) THEN
829 IF ( TO_PROCESS(STEP(IF)) ) NBFILS = NBFILS+1
833.EQ.
IF (NBFILS0) THEN
836 NO_CHILDREN = .FALSE.
842 IF ( PRUN_BELOW ) THEN
844.NOT.
IF ( TO_PROCESS(STEP(IF)) ) THEN
848 NO_CHILDREN = .FALSE.
850 IPOOL((IIPOOL-I+1)+NBFILS-I) = IF
854.AND.
IF (PRUN_BELOW NO_CHILDREN) THEN
855 MYLEAF_LEFT = MYLEAF_LEFT - 1
856.EQ..AND.
ALLOW_OTHERS_TO_LEAVE = ( MYLEAF_LEFT 0
858 IF (ALLOW_OTHERS_TO_LEAVE ) THEN
859 DO_MCAST2_TERMBWD = .TRUE.
866 DEJA_SEND( I ) = .FALSE.
868 POOL_FIRST_POS=IIPOOL
870 IF ( PRUN_BELOW ) THEN
871.NOT.
1020 IF ( TO_PROCESS(STEP(IF)) ) THEN
875 NO_CHILDREN = .FALSE.
877 IF (MUMPS_PROCNODE(PROCNODE_STEPS(STEP(IF)),
878.EQ.
& KEEP(199)) MYID) THEN
883 PROCDEST = MUMPS_PROCNODE(PROCNODE_STEPS(STEP(IF)),
885.not.
IF ( DEJA_SEND( PROCDEST )) THEN
887 CALL ZMUMPS_BUF_SEND_VCB( NRHS_B, IF, 0, 0,
888 & LIELL, LIELL - KEEP(253),
890 & W( PTRACB(STEP(INODE)) ), JBDEB, JBFIN,
891 & RHSCOMP(1, 1), NRHS, LRHSCOMP,
892 & IPOSINRHSCOMP, NPIV,
893 & KEEP, PROCDEST, NOEUD, COMM, IERR )
894.EQ.
IF ( IERR -1 ) THEN
895 CALL ZMUMPS_BACKSLV_RECV_AND_TREAT(
897 & BUFR, LBUFR, LBUFR_BYTES,
898 & MYID, SLAVEF, COMM,
899 & N, IWCB, LIWW, POSIWCB,
901 & IIPOOL, NBFINF, PTRICB, PTRACB, INFO,
902 & IPOOL, LPOOL, PANEL_POS, LPANEL_POS,
903 & STEP, FRERE, FILS, PROCNODE_STEPS,
904 & PLEFTW, KEEP, KEEP8, DKEEP,
905 & PTRIST, PTRFAC, IW, LIW, A, LA, W2, MYLEAF_LEFT,
907 & RHSCOMP, LRHSCOMP, POSINRHSCOMP_BWD,
908 & PRUN_BELOW, TO_PROCESS, SIZE_TO_PROCESS
911.LT.
IF ( INFO( 1 ) 0 ) THEN
912 ERROR_WAS_BROADCASTED = .TRUE.
916.EQ.
ELSE IF ( IERR -2 ) THEN
918 INFO( 2 ) = NRHS_B * LIELL * KEEP(35) + 4 * KEEP(34)
919 ERROR_WAS_BROADCASTED = .FALSE.
921.EQ.
ELSE IF ( IERR -3 ) THEN
923 INFO( 2 ) = NRHS_B * LIELL * KEEP(35) + 4 * KEEP(34)
924 ERROR_WAS_BROADCASTED = .FALSE.
927 DEJA_SEND( PROCDEST ) = .TRUE.
932.AND.
IF ( PRUN_BELOW NO_CHILDREN ) THEN
933 MYLEAF_LEFT = MYLEAF_LEFT - 1
934.EQ..AND.
ALLOW_OTHERS_TO_LEAVE = ( MYLEAF_LEFT 0
936 IF ( ALLOW_OTHERS_TO_LEAVE ) THEN
937 DO_MCAST2_TERMBWD = .TRUE.
942 DO I=1,(IIPOOL-POOL_FIRST_POS)/2
943 TMP=IPOOL(POOL_FIRST_POS+I-1)
944 IPOOL(POOL_FIRST_POS+I-1)=IPOOL(IIPOOL-I)
947.NE.
IF ( KEEP(31) 0 )
949 KEEP(31) = KEEP(31) - 1
950.EQ.
ALLOW_OTHERS_TO_LEAVE = (KEEP(31) 1)
951 IF (ALLOW_OTHERS_TO_LEAVE) THEN
952 DO_MCAST2_TERMBWD = .TRUE.
956 IWCB(PTRICB(STEP(INODE))+1) = IWCB(PTRICB(STEP(INODE))+1)-1
957 CALL ZMUMPS_FREETOPSO(N, KEEP(28), IWCB, LIWW,
959 & POSWCB,POSIWCB,PTRICB,PTRACB)
1062 & BUFR, LBUFR, LBUFR_BYTES,
1063 & MYID, SLAVEF, COMM,
1064 & N, IWCB, LIWW, POSIWCB,
1066 & IIPOOL, NBFINF, PTRICB, PTRACB, INFO,
1067 & IPOOL, LPOOL, PANEL_POS, LPANEL_POS, STEP,
1068 & FRERE, FILS, PROCNODE_STEPS, PLEFTW,
1069 & KEEP, KEEP8, DKEEP,
1070 & PTRIST, PTRFAC, IW, LIW, A, LA, W2, MYLEAF_LEFT,
1072 & RHSCOMP, LRHSCOMP, POSINRHSCOMP_BWD,
1073 & PRUN_BELOW, TO_PROCESS, SIZE_TO_PROCESS
1081 INTEGER msgtag, msgsou
1082 INTEGER lbufr, lbufr_bytes
1083 INTEGER bufr( lbufr )
1084 INTEGER myid, slavef, comm
1086 INTEGER iwcb( liww )
1087 INTEGER(8),
intent(in) :: lwc
1088 COMPLEX(kind=8) w( lwc )
1090 INTEGER iipool, lpool, lpanel_pos
1091 INTEGER ipool( lpool )
1092 INTEGER panel_pos( lpanel_pos )
1093 INTEGER , info(80), keep(500)
1094 INTEGER(8) :: poswcb, pleftw
1095 INTEGER(8) keep8(150)
1096 DOUBLE PRECISIONINTENT(INOUT) :: dkeep(230)
1097 INTEGER ptricb(keep(28)), step( n ), fils( n )
1098 INTEGER(8) :: ptracb(keep(28))
1099 INTEGER frere(keep(28))
1103 INTEGER iw( liw ), ptrist( keep(28) )
1104 INTEGER(8) :: ptrfac(keep(28))
1105 COMPLEX(kind=8) a( la ), w2( keep(133) )
1107 INTEGER myleaf_left, mtype
1108 INTEGER lrhscomp, posinrhscomp_bwd(n)
1109 COMPLEX(kind=8) rhscomp(lrhscomp,nrhs)
1110 LOGICAL,
INTENT(IN) :: prun_below
1111 INTEGER size_to_process
1112 LOGICAL to_process(size_to_process),
1113 LOGICAL,
intent(in) :: from_pp
1115 include
'mumps_tags.h'
1116 INTEGER position,
if, inode, ierr, long, dummy(1)
1118 INTEGER(8) :: apos, ist
1119 INTEGER npiv, nrow_l, ipos, nrow_recu
1121 INTEGER i, jj, in, procdest, j1, j2, lda
1122 INTEGER nslaves, nelim, j, posindices, inodepos,
1123 & iposinrhscomp, iposinrhscomp_panel
1124 INTEGER jbdeb, jbfin, nrhs_b, allocok
1125 INTEGER(8) :: p_update, p_sol_mas
1126 INTEGER :: iwhdlr, mtype_slave, lda_slave
1128 COMPLEX(kind=8) zero,
alpha, one
1129 parameter(zero=(0.0d0,0.0d0),
1130 & one=(1.0d0,0.0d0),
1131 &
alpha=(-1.0d0,0.0d0))
1132 include
'mumps_headers.h'
1133 INTEGER pool_first_pos, tmp
1134 LOGICAL,
DIMENSION(:),
ALLOCATABLE :: deja_send
1136 INTEGER(8) :: aposdeb, nbentries_allpanels
1137 INTEGER(8) :: ptwcb_panel
1138 INTEGER(8) :: ptwcb, ppiv_courant
1139 INTEGER ldaj, nbj, liwfac,
1140 & nbjlast, npiv_last, panel_size,
1144 INTEGER ipanel, npanels
1145 INTEGER , i_pivrptr, i_pivr
1146 LOGICAL must_be_permuted
1147 LOGICAL compress_panel, lr_activated
1148 LOGICAL oocwrite_compatible_with_blr
1149 LOGICAL :: allow_others_to_leave
1152 ALLOCATE(deja_send( 0:slavef-1 ), stat=allocok)
1153 if(allocok.ne.0)
then
1156 WRITE(6,*) myid,
' Allocation error of DEJA_SEND '
1157 & //
'in bwd solve COMPSO'
1161 IF (msgtag .EQ. termbwd)
THEN
1163 ELSE IF (msgtag .EQ. noeud)
THEN
1166 & inode, 1, mpi_integer,
1168 CALL mpi_unpack( bufr, lbufr_bytes, position,
1169 & jbdeb, 1, mpi_integer, comm, ierr )
1170 CALL mpi_unpack( bufr, lbufr_bytes, position,
1171 & jbfin, 1, mpi_integer, comm, ierr )
1173 & long, 1, mpi_integer,
1175 nrhs_b = jbfin-jbdeb+1
1176 IF ( posiwcb - long .LT. 0
1177 & .OR. poswcb - pleftw + 1_8 .LT. long )
THEN
1180 & poswcb, posiwcb, ptricb, ptracb)
1181 IF (posiwcb - long .LT. 0)
THEN
1183 info(2)=-posiwcb + long
1184 WRITE(6,*) myid,
' Internal error 1 in bwd solve COMPSO'
1187 IF ( poswcb - pleftw + 1_8 .LT. long )
THEN
1191 WRITE(6,*) myid,
' Internal error 2 in bwd solve COMPSO'
1195 posiwcb = posiwcb - long
1196 poswcb = poswcb - long
1197 IF (long .GT. 0)
THEN
1199 & iwcb(posiwcb + 1),
1200 & long, mpi_integer, comm, ierr)
1204 & mpi_double_complex, comm, ierr)
1206 iposinrhscomp = abs( posinrhscomp_bwd( iwcb(
1207 & posiwcb+1+jj ) ) )
1208 IF ( (iposinrhscomp.EQ.0) .OR.
1209 & ( iposinrhscomp.GT.n ) ) cycle
1210 rhscomp(iposinrhscomp,k) = w(poswcb+1+jj)
1213 posiwcb = posiwcb + long
1214 poswcb = poswcb + long
1216 pool_first_pos = iipool
1217 IF ( prun_below )
THEN
1218 IF (.NOT.to_process(step(inode
1221 ipool( iipool ) = inode
1224 IF = frere( step(inode) )
1225 DO WHILE (
IF .GT. 0 )
1227 & keep(199)) .eq. myid )
THEN
1228 IF ( prun_below )
THEN
1229 IF (.NOT.to_process(step(
if)))
THEN
1230 IF = frere(step(
if))
1234 ipool( iipool ) =
IF
1237 IF = frere( step(
IF ) )
1239 DO i=1,(iipool-pool_first_pos)/2
1240 tmp=ipool(pool_first_pos+i-1)
1241 ipool(pool_first_pos+i-1)=ipool(iipool-i)
1244 ELSE IF ( msgtag .EQ. backslv_master2slave )
THEN
1246 CALL mpi_unpack( bufr, lbufr_bytes, position,
1247 & inode, 1, mpi_integer, comm, ierr )
1248 CALL mpi_unpack( bufr, lbufr_bytes, position,
1249 & nrow_recu, 1, mpi_integer, comm, ierr )
1250 CALL mpi_unpack( bufr, lbufr_bytes, position,
1251 & jbdeb, 1, mpi_integer, comm, ierr )
1252 CALL mpi_unpack( bufr, lbufr_bytes, position,
1253 & jbfin, 1, mpi_integer, comm, ierr )
1254 nrhs_b = jbfin-jbdeb+1
1255 lr_activated = (iw(ptrist(step(inode))+xxlr).GT.0)
1256 compress_panel = (iw(ptrist(step(inode))+xxlr).GE.2)
1257 oocwrite_compatible_with_blr =
1258 & ( .NOT.lr_activated.OR.(.NOT.compress_panel).OR.
1261 ipos = ptrist( step(inode) ) + keep(ixsz)
1263 nrow_l = iw( ipos + 1 )
1264 IF ( nrow_l .NE. nrow_recu )
THEN
1265 WRITE(*,*)
'Error1 : NROW L/RECU=',nrow_l, nrow_recu
1268 long = nrow_l + npiv
1269 IF ( poswcb - int(long,8)*int(nrhs_b,8) .LT. pleftw - 1_8 )
THEN
1272 & poswcb, posiwcb, ptricb, ptracb)
1273 IF ( poswcb - long*nrhs_b .LT. pleftw - 1_8 )
THEN
1276 WRITE(6,*) myid,
' Internal error 3 in bwd solve COMPSO'
1281 p_sol_mas = pleftw + int(npiv,8) * int(nrhs_b,8)
1282 pleftw = p_sol_mas + int(nrow_l,8) * int(nrhs_b,8)
1284 CALL mpi_unpack( bufr, lbufr_bytes, position,
1285 & w( p_sol_mas+(k-jbdeb)*nrow_l),nrow_l,
1286 & mpi_double_complex,
1289 IF (keep(201).GT.0.AND.oocwrite_compatible_with_blr)
THEN
1291 & inode,ptrfac,keep,a,la,step,
1292 & keep8,n,must_be_permuted,ierr)
1299 apos = ptrfac( step(inode))
1300 IF ( iw(ptrist(step(inode))+xxlr) .GE. 2 .AND.
1301 & keep(485) .EQ. 1 )
THEN
1302 iwhdlr = iw(ptrist(step(inode))+xxf)
1304 w(p_update:p_update+npiv*nrhs_b-1)=zero
1308 & p_sol_mas, p_update,
1310 & mtype_slave, keep, keep8,
1311 & info(1), info(2) )
1313 IF (keep(201) .EQ. 1.AND.oocwrite_compatible_with_blr)
1322 & a, la, apos, nrow_l,
1326 & p_sol_mas, nrow_l,
1328 & mtype_slave, keep, zero)
1330 IF (keep(201) .EQ. 1.AND.oocwrite_compatible_with_blr)
1340 pleftw = pleftw - int(nrow_l,8) * int(nrhs_b,8)
1346 & backslv_updaterhs,
1348 & keep, comm, ierr )
1349 IF ( ierr .EQ. -1 )
THEN
1352 & bufr, lbufr, lbufr_bytes,
1353 & myid, slavef, comm,
1354 & n, iwcb, liww, posiwcb,
1356 & iipool, nbfinf, ptricb, ptracb, info,
1357 & ipool, lpool, panel_pos, lpanel_pos, step,
1358 & frere, fils, procnode_steps, pleftw,
1359 & keep, keep8, dkeep,
1360 & ptrist, ptrfac, iw, liw, a, la, w2, myleaf_left,
1362 & rhscomp, lrhscomp, posinrhscomp_bwd,
1363 & prun_below, to_process, size_to_process
1366 IF ( info( 1 ) .LT. 0 )
GOTO 270
1368 ELSE IF ( ierr .EQ. -2 )
THEN
1370 info( 2 ) = nrhs_b * npiv * keep(35) + 4 * keep(34)
1372 ELSE IF ( ierr .EQ. -3 )
THEN
1374 info( 2 ) = nrhs_b * npiv * keep(35) + 4 * keep(34)
1377 pleftw = pleftw - npiv * nrhs_b
1378 ELSE IF ( msgtag .EQ. backslv_updaterhs )
THEN
1380 CALL mpi_unpack( bufr, lbufr_bytes, position,
1381 & inode, 1, mpi_integer, comm, ierr )
1382 lr_activated = (iw(ptrist(step(inode))+xxlr).GT.0)
1383 compress_panel = (iw(ptrist(step(inode))+xxlr).GE.2)
1384 oocwrite_compatible_with_blr =
1385 & (.NOT.lr_activated.OR.(.NOT.compress_panel).OR.
1388 ipos = ptrist(step(inode)) + 2 + keep(ixsz)
1389 liell = iw(ipos-2)+iw(ipos+1)
1390 CALL mpi_unpack( bufr, lbufr_bytes, position,
1391 & npiv, 1, mpi_integer, comm, ierr )
1392 CALL mpi_unpack( bufr, lbufr_bytes, position,
1393 & jbdeb, 1, mpi_integer, comm, ierr )
1394 CALL mpi_unpack( bufr, lbufr_bytes, position,
1395 & jbfin, 1, mpi_integer, comm, ierr )
1396 nrhs_b = jbfin-jbdeb+1
1401 nslaves = iw( ipos + 1 )
1402 ipos = ipos + 1 + nslaves
1403 inodepos = ptrist(step(inode)) + keep(ixsz) + 4
1404 IF ( keep(50) .eq. 0 )
THEN
1409 IF ( mtype .EQ. 1 .AND. keep(50).EQ.0 )
THEN
1410 j1 = ipos + liell + 1
1411 j2 = ipos + npiv + liell
1416 iposinrhscomp = posinrhscomp_bwd(iw(j1))
1418 CALL mpi_unpack( bufr, lbufr_bytes, position,
1419 & w2, npiv, mpi_double_complex,
1422 IF ( (keep(253).NE.0) .AND.
1423 & (iw(ptrist(step(inode))+xxs).EQ.c_fini+nslaves)
1426 rhscomp(iposinrhscomp+jj-j1,k) = w2(i)
1431 rhscomp(iposinrhscomp+jj-j1,k) =
1432 & rhscomp(iposinrhscomp+jj-j1,k) + w2(i)
1437 iw(ptrist(step(inode))+xxs) =
1438 & iw(ptrist(step(inode))+xxs) - 1
1439 IF ( iw(ptrist(step(inode))+xxs).EQ.c_fini )
THEN
1440 IF (keep(201).GT.0.AND.oocwrite_compatible_with_blr)
1443 & inode,ptrfac,keep,a,la,step,
1444 & keep8,n,must_be_permuted,ierr)
1450 IF (keep(201).EQ.1 .AND. keep(50).NE.1)
THEN
1452 & iw(ipos+1+2*liell),
1453 & must_be_permuted )
1456 apos = ptrfac(iw(inodepos))
1457 IF (keep(201).EQ.1.AND.oocwrite_compatible_with_blr)
1459 liwfac = iw(ptrist(step(inode))+xxi)
1463 IF (panel_size.LT.0)
THEN
1464 WRITE(6,*)
' Internal error in bwd solve PANEL_SIZE=',
1469 IF ( posiwcb - 2 .LT. 0 .or.
1470 & poswcb-int(liell,8)*int(nrhs_b,8) .LT. pleftw-1_8 )
THEN
1472 & poswcb, posiwcb, ptricb
1473 IF ( poswcb-int(liell,8)*int(nrhs_b,8) .LT. pleftw-1_8 )
THEN
1476 & poswcb-pleftw+1_8,
1480 IF ( posiwcb - 2 .LT. 0 )
THEN
1482 info( 2 ) = 2 - posiwcb
1486 posiwcb = posiwcb - 2
1487 poswcb = poswcb - int(liell,8)*int(nrhs_b,8)
1488 ptricb(step( inode )) = posiwcb + 1
1489 ptracb(step( inode )) = poswcb + 1_8
1490 iwcb( ptricb(step( inode )) ) = liell*nrhs_b
1491 iwcb( ptricb(step( inode )) + 1 ) = 1
1492 ipos = ptrist(step(inode)) + keep(ixsz) + 5 + nslaves
1493 IF ( mtype.EQ.1 .AND. keep(50).EQ.0 )
THEN
1494 posindices = ipos + liell + 1
1496 posindices = ipos + 1
1498 ptwcb = ptracb(step( inode ))
1499 iposinrhscomp = posinrhscomp_bwd(iw(j1))
1500 ifr8 = ptracb(step( inode ))
1501 ifr8 = ptwcb + int(npiv - 1,8)
1502 IF ( mtype .EQ. 1 .AND. keep(50).EQ.0 )
THEN
1503 j1 = ipos + liell + npiv + 1
1504 j2 = ipos + 2 * liell
1506 j1 = ipos + npiv + 1
1510 & rhscomp, nrhs, lrhscomp,
1511 & w(ptwcb), liell, npiv+1,
1512 & iw, liw, keep, n, posinrhscomp_bwd )
1513 ifr8 = ifr8 + int(j2-keep(253)-j1+1,8)
1514 IF ( keep(201).EQ.1 .AND. oocwrite_compatible_with_blr .AND.
1515 & (( nelim .GT. 0 ).OR. (mtype.NE.1 )))
THEN
1516 j = npiv / panel_size
1517 twobytwo = keep(50).EQ.2 .AND. keep(105).GT.0
1520 & iw(ipos+1+liell), npiv, npanels, nrow_l,
1521 & nbentries_allpanels)
1523 IF (npiv.EQ.j*panel_size)
THEN
1525 nbjlast = panel_size
1528 npiv_last = (j+1)* panel_size
1529 nbjlast = npiv-j*panel_size
1532 nbentries_allpanels =
1533 & int(nrow_l,8) * int(npiv,8)
1534 & - int( ( j * ( j - 1 ) ) /2,8 )
1535 & * int(panel_size,8) * int(panel_size,8)
1537 & * int(mod(npiv, panel_size),8)
1538 & * int(panel_size,8)
1541 aposdeb = apos + nbentries_allpanels
1542 DO ipanel = npanels, 1, -1
1544 nbj = panel_pos(ipanel+1)-panel_pos(ipanel)
1545 beg_panel = panel_pos(ipanel)
1547 IF (jj.EQ.npiv_last)
THEN
1552 beg_panel = jj- panel_size+1
1554 ldaj = nrow_l-beg_panel+1
1555 aposdeb = aposdeb - int(nbj,8)*int(ldaj,8)
1556 ptwcb = ptracb(step(inode))
1557 ptwcb_panel = ptracb(step(inode)) + int(beg_panel - 1,8)
1558 iposinrhscomp_panel = iposinrhscomp + beg_panel - 1
1559 ncb_panel = ldaj - nbj
1561 IF (keep(50).NE.1 .AND.must_be_permuted)
THEN
1563 & i_pivrptr, i_pivr, ipos + 1 + 2 * liell, iw, liw)
1565 & iw(i_pivr + iw(i_pivrptr+ipanel-1)-iw(i_pivrptr)),
1566 & npiv-iw(i_pivrptr+ipanel-1)+1,
1567 & iw(i_pivrptr+ipanel-1)-1,
1569 & ldaj, nbj, beg_panel-1)
1571#if defined(MUMPS_USE_BLAS2)
1572 IF ( nrhs_b == 1 )
THEN
1573 IF (ncb_panel.NE.0)
THEN
1574 IF (ncb_panel - ncb.NE. 0)
THEN
1576 & a( aposdeb + int(nbj,8) ), ldaj,
1577 & rhscomp(iposinrhscomp_panel+nbj,jbdeb),
1579 & rhscomp(iposinrhscomp_panel,jbdeb), 1 )
1581 IF (ncb .NE. 0)
THEN
1583 & a( aposdeb + int(ldaj-ncb,8) ), ldaj,
1584 & w( ptwcb + int(npiv,8) ),
1586 & rhscomp(iposinrhscomp_panel,jbdeb), 1 )
1589 IF (mtype.NE.1)
THEN
1590 CALL ztrsv(
'L',
'T',
'U', nbj, a(aposdeb), ldaj,
1591 & rhscomp(iposinrhscomp_panel,jbdeb), 1)
1593 CALL ztrsv(
'L',
'T',
'N', nbj, a(aposdeb), ldaj,
1594 & rhscomp(iposinrhscomp_panel,jbdeb), 1)
1598 IF (ncb_panel.NE.0)
THEN
1599 IF (ncb_panel - ncb .NE. 0)
THEN
1600 CALL zgemm(
'T',
'N', nbj, nrhs_b,
1601 & ncb_panel-ncb,
alpha
1602 & a(aposdeb +int(nbj,8)), ldaj,
1603 & rhscomp(iposinrhscomp_panel+nbj,jbdeb), lrhscomp,
1604 & one, rhscomp(iposinrhscomp_panel,jbdeb), lrhscomp)
1606 IF (ncb .NE. 0)
THEN
1607 CALL zgemm(
'T',
'N', nbj, nrhs_b, ncb,
alpha,
1608 & a(aposdeb +int(ldaj-ncb,8)), ldaj,
1609 & w( ptwcb+int(npiv,8) ), liell,
1610 & one, rhscomp(iposinrhscomp_panel,jbdeb),lrhscomp)
1613 IF (mtype.NE.1)
THEN
1614 CALL ztrsm(
'L',
'L',
'T',
'U',nbj, nrhs_b, one,
1616 & ldaj, rhscomp(iposinrhscomp_panel,jbdeb), lrhscomp)
1618 CALL ztrsm(
'L',
'L',
'T',
'N',nbj, nrhs_b, one,
1620 & ldaj, rhscomp(iposinrhscomp_panel,jbdeb), lrhscomp)
1622#if defined(MUMPS_USE_BLAS2)
1625 IF (.NOT. twobytwo) jj=beg_panel-1
1629 IF ( iw(ptrist(step(inode))+xxlr) .GE. 2
1630 & .AND. keep(485) .EQ. 1 )
THEN
1631 iwhdlr = iw(ptrist(step(inode))+xxf)
1633 & inode, iwhdlr, npiv, nslaves,
1634 & liell, w, lwc, nrhs_b, ptracb(step(inode)),
1635 & rhscomp, lrhscomp, nrhs,
1636 & iposinrhscomp, jbdeb,
1637 & mtype, keep, keep8,
1638 & info(1), info(2) )
1640 IF (nelim .GT.0)
THEN
1641 IF ( keep(50) .eq. 0 )
THEN
1642 ist = apos + int(npiv,8) * int(liell,8)
1644 IF( keep(459) .GT. 1)
THEN
1645 CALL mumps_geti8(ist, iw(ptrist(step(inode))+xxr))
1646 ist = apos + ist - int(npiv,8) * int(nelim,8)
1648 ist = apos + int(npiv,8) * int(npiv,8)
1651#if defined(MUMPS_USE_BLAS2)
1652 IF ( nrhs_b == 1 )
THEN
1653 CALL zgemv(
'N', npiv, nelim,
alpha, a( ist ), npiv,
1654 & w( npiv + ptracb(step(inode)) ),
1656 & rhscomp(iposinrhscomp,jbdeb), 1 )
1659 CALL zgemm(
'N',
'N', npiv, nrhs_b, nelim,
alpha,
1660 & a(ist), npiv, w(npiv+ptracb(step(inode))), liell,
1661 & one, rhscomp(iposinrhscomp,jbdeb), lrhscomp)
1662#if defined(MUMPS_USE_BLAS2)
1666 ppiv_courant = int(jbdeb-1,8)*int(lrhscomp,8)
1667 & + int(iposinrhscomp,8)
1668 IF (keep(459).GT.1 .AND. keep(50).NE.0)
THEN
1670 & npiv, iw(ipos+1+liell),
1671 & nrhs_b, rhscomp(1,1), keep8(25), lrhscomp, ppiv_courant,
1676 & nrhs_b, rhscomp(1,1), keep8(25), lrhscomp, ppiv_courant,
1681 IF (keep(201).GT.0.AND.oocwrite_compatible_with_blr)
THEN
1690 ipos = ptrist(step(inode)) + keep(ixsz) + 6 + nslaves
1691 iposinrhscomp = posinrhscomp_bwd(iw(ipos))
1694 IF (in .GT. 0)
GOTO 170
1696 myleaf_left = myleaf_left - 1
1697 allow_others_to_leave = ( myleaf_left .EQ. 0 .AND.
1699 IF (keep(31) .NE. 0)
THEN
1701 & procnode_steps(step(inode)),
1702 & keep(199) ) )
THEN
1703 keep(31) = keep(31) - 1
1704 IF (keep(31) .EQ. 1)
THEN
1705 allow_others_to_leave = .true.
1709 IF ( allow_others_to_leave )
THEN
1711 & termbwd, slavef, keep )
1714 iwcb( ptricb(step(inode)) + 1 ) = 0
1716 & iwcb, liww, w, lwc,
1717 & poswcb, posiwcb, ptricb, ptracb)
1720 DO i = 0, slavef - 1
1721 deja_send( i ) = .false.
1724 IF ( prun_below )
THEN
1725 no_children = .true.
1727 no_children = .false.
1730 IF ( prun_below )
THEN
1731 IF ( .NOT.to_process(step(in)) )
THEN
1732 in = frere(step(in))
1735 no_children = .false.
1738 pool_first_pos = iipool
1740 & keep(199)) .EQ. myid)
THEN
1746 IF ( .NOT. deja_send( procdest ) )
THEN
1749 & liell, liell - keep(253),
1751 & w( ptracb(step(inode)) ), jbdeb
1752 & rhscomp(1, 1), nrhs, lrhscomp,
1753 & iposinrhscomp, npiv,
1754 & keep, procdest, noeud, comm, ierr )
1755 IF ( ierr .EQ. -1 )
THEN
1758 & bufr, lbufr, lbufr_bytes,
1759 & myid, slavef, comm,
1760 & n, iwcb, liww, posiwcb,
1762 & iipool, nbfinf, ptricb, ptracb, info,
1763 & ipool, lpool, panel_pos, lpanel_pos,
1764 & step, frere, fils, procnode_steps,
1765 & pleftw, keep, keep8, dkeep,
1766 & ptrist, ptrfac, iw, liw, a, la, w2, myleaf_left,
1768 & rhscomp, lrhscomp, posinrhscomp_bwd,
1769 & prun_below, to_process, size_to_process
1772 IF ( info( 1 ) .LT. 0 )
THEN
1776 ELSE IF ( ierr .EQ. -2 )
THEN
1778 info( 2 ) = nrhs_b * liell * keep(35) + 4 * keep(34)
1780 ELSE IF ( ierr .EQ. -3 )
THEN
1782 info( 2 ) = nrhs_b * liell * keep(35) + 4 * keep(34)
1785 deja_send( procdest ) = .true.
1788 in = frere( step( in ) )
1790 allow_others_to_leave = .false.
1791 IF (no_children)
THEN
1792 myleaf_left = myleaf_left - 1
1793 allow_others_to_leave = ( myleaf_left .EQ. 0 .AND.
1796 IF (keep(31) .NE. 0)
THEN
1798 & procnode_steps(step(inode)),
1799 & keep(199) ) )
THEN
1800 keep(31) = keep(31) - 1
1801 IF (keep(31) .EQ. 1)
THEN
1802 allow_others_to_leave = .true.
1806 IF ( allow_others_to_leave )
THEN
1808 & comm, termbwd, slavef, keep )
1811 IF ( .NOT. no_children )
THEN
1812 DO i=1,(iipool-pool_first_pos)/2
1813 tmp=ipool(pool_first_pos+i-1)
1814 ipool(pool_first_pos+i-1)=ipool(iipool-i)
1818 iwcb( ptricb(step( inode )) + 1 ) = 0
1820 & iwcb, liww, w, lwc,
1821 & poswcb, posiwcb, ptricb, ptracb)
1823 ELSE IF (msgtag.EQ.terreur)
THEN
1827 ELSE IF ( (msgtag.EQ.update_load).OR.
1828 & (msgtag.EQ.tag_dummy) )
THEN
1837 IF (nbfinf .NE. 0)
THEN
1841 IF (
allocated(deja_send))
DEALLOCATE(deja_send)