1      SUBROUTINE pdlaqr5( WANTT, WANTZ, KACC22, N, KTOP, KBOT, NSHFTS,
 
    2     $                    SR, SI, H, DESCH, ILOZ, IHIZ, Z, DESCZ, WORK,
 
    3     $                    LWORK, IWORK, LIWORK )
 
   15      INTEGER            IHIZ, ILOZ, KACC22, KBOT, KTOP, N, NSHFTS,
 
   20      INTEGER            DESCH( * ), DESCZ( * ), IWORK( * )
 
   21      DOUBLE PRECISION   H( * ), SI( * ), SR( * ), Z( * ), WORK( * )
 
  126      INTEGER            BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
 
  127     $                   LLD_, MB_, M_, NB_, N_, RSRC_
 
  128      parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
 
  129     $                     ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
 
  130     $                     rsrc_ = 7, csrc_ = 8, lld_ = 9 )
 
  131      DOUBLE PRECISION   ZERO, ONE
 
  132      PARAMETER          ( ZERO = 0.0d0, one = 1.0d0 )
 
  134      parameter( ntiny = 11 )
 
  137      DOUBLE PRECISION   ALPHA, BETA, H11, H12, H21, H22, REFSUM,
 
  138     $                   SAFMAX, SAFMIN, SCL, SMLNUM, SWAP, TST1, TST2,
 
  139     $                   ulp, tau, elem, stamp, ddum, orth
 
  140      INTEGER            I, I2, I4, INCOL, J, J2, J4, JBOT, JCOL, JLEN,
 
  141     $                   JROW, JTOP, K, K1, KDU, KMS, KNZ, KRCOL, KZS,
 
  142     $                   m, m22, mbot, mend, mstart, mtop, nbmps, ndcol,
 
  143     $                   ns, nu, lldh, lldz, lldu, lldv, lldw, lldwh,
 
  144     $                   info, ictxt, nprow, npcol, nb, iroffh, itop,
 
  145     $                   nwin, myrow, mycol, lns, numwin, lkacc22,
 
  146     $                   lchain, win, idonejob, ipnext, anmwin, lenrbuf,
 
  147     $                   lencbuf, ichoff, lrsrc, lcsrc, lktop, lkbot,
 
  148     $                   ii, jj, swin, ewin, lnwin, dim, llktop, llkbot,
 
  149     $                   ipv, ipu, iph, ipw, ku, kwh, kwv, nve, lks,
 
  150     $                   idum, nho, dir, winid, indx, iloc, jloc, rsrc1,
 
  151     $                   csrc1, rsrc2, csrc2, rsrc3, csrc3, rsrc4, ipuu,
 
  152     $                   csrc4, lrows, lcols, indxs, ks, jloc1, iloc1,
 
  153     $                   lktop1, lktop2, wchunk, numchunk, oddeven,
 
  154     $                   chunknum, dim1, dim4, ipw3, hrows, zrows,
 
  155     $                   hcols, ipw1, ipw2, rsrc, east, jloc4, iloc4,
 
  156     $                   west, csrc, south, norht, indxe, north,
 
  157     $                   ihh, ipiw, lkbot1, nprocs, liroffh,
 
  158     $                   winfin, rws3, cls3, indx2, hrows2,
 
  159     $                   zrows2, hcols2, mnrbuf,
 
  160     $                   mxrbuf, mncbuf, mxcbuf, lwkopt
 
  161      LOGICAL            BLK22, BMP22, INTRO, DONEJOB, ODDNPROW,
 
  162     $                   ODDNPCOL, LQUERY, BCDONE
 
  163      CHARACTER          JBCMPZ*2, JOB
 
  167      INTEGER            PILAENVX, ICEIL, INDXG2P, INDXG2L, NUMROC
 
  168      DOUBLE PRECISION   DLAMCH, DLANGE
 
  169      EXTERNAL           dlamch, pilaenvx, iceil, indxg2p, indxg2l,
 
  170     $                   numroc, lsame, dlange
 
  173      INTRINSIC          abs, dble, 
max, 
min, mod
 
  176      DOUBLE PRECISION   VT( 3 )
 
  179      EXTERNAL           dgemm, dlabad, dlamov, dlaqr1, dlarfg, dlaset,
 
  185      ictxt = desch( ctxt_ )
 
  186      CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
 
  191      iroffh = mod( ktop - 1, nb )
 
  192      lquery = lwork.EQ.-1 .OR. liwork.EQ.-1
 
  196      IF( .NOT. lquery .AND. nshfts.LT.2 )
 
  202      IF( .NOT. lquery .AND. ktop.GE.kbot )
 
  209      IF( .NOT. lquery ) 
THEN 
  210         DO 10 i = 1, nshfts - 2, 2
 
  211            IF( si( i ).NE.-si( i+1 ) ) 
THEN 
  215               sr( i+1 ) = sr( i+2 )
 
  220               si( i+1 ) = si( i+2 )
 
  231      ns = nshfts - mod( nshfts, 2 )
 
  235      nwin = pilaenvx( ictxt, 19, 
'PDLAQR5', jbcmpz, n, nb, nb, nb )
 
  236      nwin = 
min( nwin, kbot-ktop+1 )
 
  242      ns = 
max( 2, 
min( ns, iceil( kbot-ktop+1, nb )*nwin/3 ) )
 
  243      ns = ns - mod( ns, 2 )
 
  251      lns = 
min( 
max( 2, nwin / 3 ), 
max( 2, ns / 
min(nprow,npcol) ) )
 
  252      lns = lns - mod( lns, 2 )
 
  253      numwin = 
max( 1, 
min( iceil( ns, lns ),
 
  254     $     iceil( kbot-ktop+1, nb ) - 1 ) )
 
  255      IF( nprow.NE.npcol ) 
THEN 
  256         numwin = 
min( numwin, 
min(nprow,npcol) )
 
  257         lns = 
min( lns, 
max( 2, ns / 
min(nprow,npcol) ) )
 
  258         lns = lns - mod( lns, 2 )
 
  263      safmin = dlamch( 
'SAFE MINIMUM' )
 
  264      safmax = one / safmin
 
  265      CALL dlabad( safmin, safmax )
 
  266      ulp = dlamch( 
'PRECISION' )
 
  267      smlnum = safmin*( dble( n ) / ulp )
 
  282      blk22 = ( lns.GT.2 ) .AND. ( kacc22.EQ.2 )
 
  286      IF( .NOT. lquery .AND. ktop+2.LE.kbot )
 
  287     $   
CALL pdelset( h, ktop+2, ktop, desch, zero )
 
  299      lchain = 3 * nbmps + 1
 
  304         hrows = numroc( n, nb, myrow, desch(rsrc_), nprow )
 
  305         hcols = numroc( n, nb, mycol, desch(csrc_), npcol )
 
  306         lwkopt = (5+2*numwin)*nb**2 + 2*hrows*nb + hcols*nb +
 
  307     $        
max( hrows*nb, hcols*nb )
 
  308         work(1)  = dble(lwkopt)
 
  315      IF( ktop.LT.1 .OR. kbot.GT.n ) 
RETURN 
  343      IF( anmwin.GT.0 ) 
THEN 
  344         lktop = iwork( 1+(anmwin-1)*5 )
 
  348      IF( intro .AND. (anmwin.EQ.0 .OR. lktop.GT.iceil(ktop,nb)*nb) )
 
  359         iwork( 1+(anmwin-1)*5 ) = ktop
 
  360         iwork( 2+(anmwin-1)*5 ) = ktop +
 
  361     $                             
min( nwin,nb-iroffh,kbot-ktop+1 ) - 1
 
  362         iwork( 3+(anmwin-1)*5 ) = indxg2p( iwork(1+(anmwin-1)*5), nb,
 
  363     $                             myrow, desch(rsrc_), nprow )
 
  364         iwork( 4+(anmwin-1)*5 ) = indxg2p( iwork(2+(anmwin-1)*5), nb,
 
  365     $                             mycol, desch(csrc_), npcol )
 
  366         iwork( 5+(anmwin-1)*5 ) = 0
 
  367         ipiw = 6+(anmwin-1)*5
 
  368         IF( anmwin.EQ.numwin ) intro = .false.
 
  379      DO 40 win = 1, anmwin
 
  383         lrsrc = iwork( 3+(win-1)*5 )
 
  384         lcsrc = iwork( 4+(win-1)*5 )
 
  385         lktop = iwork( 1+(win-1)*5 )
 
  386         lkbot = iwork( 2+(win-1)*5 )
 
  387         lnwin = lkbot - lktop + 1
 
  392         IF( iwork(5+(win-1)*5).LT.2 .AND. lnwin.GT.1 .AND.
 
  393     $        (lnwin.GT.lchain .OR. lkbot.EQ.kbot ) ) 
THEN 
  394            liroffh = mod(lktop-1,nb)
 
  396            ewin = 
min(kbot,lktop-liroffh+nb-1)
 
  398            IF( dim.LE.ntiny .AND. .NOT.lkbot.EQ.kbot ) 
THEN 
  399               iwork( 5+(win-1)*5 ) = 2
 
  403            IF( iwork(5+(win-1)*5).EQ.0 ) 
THEN 
  404               iwork(5+(win-1)*5) = 1
 
  410            IF( myrow.EQ.lrsrc .AND. mycol.EQ.lcsrc ) 
THEN 
  420               llkbot = llktop + lnwin - 1
 
  421               IF( lktop.EQ.ktop .AND. lkbot.EQ.kbot ) 
THEN 
  424               ELSEIF( lktop.EQ.ktop ) 
THEN 
  425                  job = 
'Introduce and chase' 
  426               ELSEIF( lkbot.EQ.kbot ) 
THEN 
  427                  job = 
'Off-chase bulges' 
  440               ii = indxg2l( swin, nb, myrow, desch(rsrc_), nprow )
 
  441               jj = indxg2l( swin, nb, mycol, desch(csrc_), npcol )
 
  443               llkbot = llktop + lnwin - 1
 
  447               ipuu = iph + 
max(ntiny+1,dim)**2
 
  448               ipv = ipuu + 
max(ntiny+1,dim)**2
 
  451               IF( lsame( job, 
'A' ) .OR. lsame( job, 
'O' ) .AND.
 
  452     $              dim.LT.ntiny+1 ) 
THEN 
  453                  CALL dlaset( 
'All', ntiny+1, ntiny+1, zero, one,
 
  454     $                 work(iph), ntiny+1 )
 
  456               CALL dlamov( 
'Upper', dim, dim, h(ii+(jj-1)*lldh), lldh,
 
  457     $              work(iph), 
max(ntiny+1,dim) )
 
  458               CALL dcopy(  dim-1, h(ii+(jj-1)*lldh+1), lldh+1,
 
  459     $              work(iph+1), 
max(ntiny+1,dim)+1 )
 
  460               IF( lsame( job, 
'C' ) .OR. lsame( job, 
'O') ) 
THEN 
  461                  CALL dcopy(  dim-2, h(ii+(jj-1)*lldh+2), lldh+1,
 
  462     $                 work(iph+2), 
max(ntiny+1,dim)+1 )
 
  463                  CALL dcopy(  dim-3, h(ii+(jj-1)*lldh+3), lldh+1,
 
  464     $                 work(iph+3), 
max(ntiny+1,dim)+1 )
 
  465                  CALL dlaset( 
'Lower', dim-4, dim-4, zero,
 
  466     $                 zero, work(iph+4), 
max(ntiny+1,dim) )
 
  468                  CALL dlaset( 
'Lower', dim-2, dim-2, zero,
 
  469     $                 zero, work(iph+2), 
max(ntiny+1,dim) )
 
  472               ku = 
max(ntiny+1,dim) - kdu + 1
 
  474               nho = ( 
max(ntiny+1,dim)-kdu+1-4 ) - ( kdu+1 ) + 1
 
  476               nve = 
max(ntiny+1,dim) - kdu - kwv + 1
 
  477               CALL dlaset( 
'All', 
max(ntiny+1,dim),
 
  478     $              
max(ntiny+1,dim), zero, one, work(ipuu),
 
  483               lks = 
max( 1, ns - win*lns + 1 )
 
  484               CALL dlaqr6( job, wantt, .true., lkacc22,
 
  485     $              
max(ntiny+1,dim), llktop, llkbot, lns, sr( lks ),
 
  486     $              si( lks ), work(iph), 
max(ntiny+1,dim), llktop,
 
  487     $              llkbot, work(ipuu), 
max(ntiny+1,dim), work(ipu),
 
  488     $              3, work( iph+ku-1 ),
 
  489     $              
max(ntiny+1,dim), nve, work( iph+kwv-1 ),
 
  490     $              
max(ntiny+1,dim), nho, work( iph-1+ku+(kwh-1)*
 
  491     $              
max(ntiny+1,dim) ), 
max(ntiny+1,dim) )
 
  495               CALL dlamov( 
'Upper', dim, dim, work(iph),
 
  496     $              
max(ntiny+1,dim), h(ii+(jj-1)*lldh), lldh )
 
  497               CALL dcopy( dim-1, work(iph+1), 
max(ntiny+1,dim)+1,
 
  498     $              h(ii+(jj-1)*lldh+1), lldh+1 )
 
  499               IF( lsame( job, 
'I' ) .OR. lsame( job, 
'C' ) ) 
THEN 
  500                  CALL dcopy( dim-2, work(iph+2), dim+1,
 
  501     $                 h(ii+(jj-1)*lldh+2), lldh+1 )
 
  502                  CALL dcopy( dim-3, work(iph+3), dim+1,
 
  503     $                 h(ii+(jj-1)*lldh+3), lldh+1 )
 
  505                  CALL dlaset( 
'Lower', dim-2, dim-2, zero,
 
  506     $                 zero, h(ii+(jj-1)*lldh+2), lldh )
 
  512               CALL dlamov( 
'All', lnwin, lnwin,
 
  513     $              work(ipuu+(
max(ntiny+1,dim)*liroffh)+liroffh),
 
  514     $              
max(ntiny+1,dim), work(ipu), lnwin )
 
  522            iwork( 5+(win-1)*5 ) = 2
 
  527         IF( myrow.EQ.lrsrc .OR. mycol.EQ.lcsrc ) 
THEN 
  528            IF( idonejob.EQ.1 .AND. iwork(5+(win-1)*5).LT.2 ) 
THEN 
  529               IF( myrow.EQ.lrsrc ) lenrbuf = lenrbuf + lnwin*lnwin
 
  530               IF( mycol.EQ.lcsrc ) lencbuf = lencbuf + lnwin*lnwin
 
  537      CALL igsum2d( ictxt, 
'All', 
'1-Tree', 1, 1, idonejob, 1, -1, -1 )
 
  538      donejob = idonejob.GT.0
 
  543     $   
CALL igamx2d( ictxt, 
'All', 
'1-Tree', 1, 1, ichoff, 1, -1,
 
  554         IF( lenrbuf.GT.0 .OR. lencbuf.GT.0 ) 
THEN 
  557               DO 60 win = 1, anmwin
 
  558                  IF( ( lenrbuf.EQ.0 .AND. lencbuf.EQ.0 ) .OR.
 
  560                  lrsrc = iwork( 3+(win-1)*5 )
 
  561                  lcsrc = iwork( 4+(win-1)*5 )
 
  562                  IF( myrow.EQ.lrsrc .AND. mycol.EQ.lcsrc ) 
THEN 
  563                     IF( dir.EQ.1 .AND. lenrbuf.GT.0 .AND.
 
  565                        CALL dgebs2d( ictxt, 
'Row', 
'1-Tree', lenrbuf,
 
  567                     ELSEIF( dir.EQ.2 .AND. lencbuf.GT.0 .AND.
 
  569                        CALL dgebs2d( ictxt, 
'Col', 
'1-Tree', lencbuf,
 
  573     $                  
CALL dlamov( 
'All', lenrbuf, 1, work, lenrbuf,
 
  574     $                       work(1+lenrbuf), lencbuf )
 
  576                  ELSEIF( myrow.EQ.lrsrc .AND. dir.EQ.1 ) 
THEN 
  577                     IF( lenrbuf.GT.0 .AND. npcol.GT.1 ) 
THEN 
  578                        CALL dgebr2d( ictxt, 
'Row', 
'1-Tree', lenrbuf,
 
  579     $                       1, work, lenrbuf, lrsrc, lcsrc )
 
  582                  ELSEIF( mycol.EQ.lcsrc .AND. dir.EQ.2 ) 
THEN 
  583                     IF( lencbuf.GT.0 .AND. nprow.GT.1 ) 
THEN 
  584                        CALL dgebr2d( ictxt, 
'Col', 
'1-Tree', lencbuf,
 
  585     $                       1, work(1+lenrbuf), lencbuf, lrsrc, lcsrc )
 
  604            DO 70 win = 1, anmwin
 
  605               IF( iwork( 5+(win-1)*5 ).EQ.2 ) 
GO TO 75
 
  606               lrsrc = iwork( 3+(win-1)*5 )
 
  607               lcsrc = iwork( 4+(win-1)*5 )
 
  608               lktop = iwork( 1+(win-1)*5 )
 
  609               lkbot = iwork( 2+(win-1)*5 )
 
  610               lnwin = lkbot - lktop + 1
 
  611               IF( (myrow.EQ.lrsrc.AND.lenrbuf.GT.0.AND.dir.EQ.1) .OR.
 
  612     $              (mycol.EQ.lcsrc.AND.lencbuf.GT.0.AND.dir.EQ.2 ) )
 
  618                  ipnext = ipu + lnwin*lnwin
 
  619                  ipw = 1 + lenrbuf + lencbuf
 
  620                  liroffh = mod(lktop-1,nb)
 
  626                  IF( lktop.EQ.ktop .AND. lkbot.EQ.kbot ) 
THEN 
  628                  ELSEIF( lktop.EQ.ktop ) 
THEN 
  629                     job = 
'Introduce and chase' 
  630                  ELSEIF( lkbot.EQ.kbot ) 
THEN 
  631                     job = 
'Off-chase bulges' 
  640               IF( .NOT. blk22 .OR. .NOT. lsame(job,
'C')
 
  641     $              .OR. lns.LE.2 ) 
THEN 
  643                  IF( dir.EQ.2 .AND. lencbuf.GT.0 .AND.
 
  644     $                 mycol.EQ.lcsrc ) 
THEN 
  646                        DO 80 indx = 1, lktop-liroffh-1, nb
 
  647                           CALL infog2l( indx, lktop, desch, nprow,
 
  648     $                          npcol, myrow, mycol, iloc, jloc, rsrc1,
 
  650                           IF( myrow.EQ.rsrc1.AND.mycol.EQ.csrc1 ) 
THEN 
  651                              lrows = 
min( nb, lktop-indx )
 
  652                              CALL dgemm(
'No transpose', 
'No transpose',
 
  653     $                             lrows, lnwin, lnwin, one,
 
  654     $                             h((jloc-1)*lldh+iloc), lldh,
 
  655     $                             work( ipu ), lnwin, zero,
 
  658                              CALL dlamov( 
'All', lrows, lnwin,
 
  660     $                             h((jloc-1)*lldh+iloc), lldh )
 
  665                        DO 90 indx = 1, n, nb
 
  666                           CALL infog2l( indx, lktop, descz, nprow,
 
  667     $                          npcol, myrow, mycol, iloc, jloc, rsrc1,
 
  669                           IF( myrow.EQ.rsrc1.AND.mycol.EQ.csrc1 ) 
THEN 
  670                              lrows = 
min(nb,n-indx+1)
 
  671                              CALL dgemm( 
'No transpose',
 
  672     $                             
'No transpose', lrows, lnwin, lnwin,
 
  673     $                             one, z((jloc-1)*lldz+iloc), lldz,
 
  674     $                             work( ipu ), lnwin, zero,
 
  676                              CALL dlamov( 
'All', lrows, lnwin,
 
  678     $                             z((jloc-1)*lldz+iloc), lldz )
 
  686                  IF( dir.EQ.1 .AND. lenrbuf.GT.0 .AND.
 
  687     $                 myrow.EQ.lrsrc ) 
THEN 
  689                        IF( iceil(lkbot,nb).EQ.iceil(kbot,nb) ) 
THEN 
  690                           lcols = 
min(iceil(kbot,nb)*nb,n) - kbot
 
  694                        IF( lcols.GT.0 ) 
THEN 
  696                           CALL infog2l( lktop, indx, desch, nprow,
 
  697     $                          npcol, myrow, mycol, iloc, jloc,
 
  699                           IF( myrow.EQ.rsrc1.AND.mycol.EQ.csrc1 ) 
THEN 
  700                              CALL dgemm( 
'Transpose', 
'No Transpose',
 
  701     $                             lnwin, lcols, lnwin, one, work(ipu),
 
  702     $                             lnwin, h((jloc-1)*lldh+iloc), lldh,
 
  703     $                             zero, work(ipw), lnwin )
 
  704                              CALL dlamov( 
'All', lnwin, lcols,
 
  706     $                             h((jloc-1)*lldh+iloc), lldh )
 
  710                        indxs = iceil(lkbot,nb)*nb + 1
 
  711                        DO 95 indx = indxs, n, nb
 
  713     $                          desch, nprow, npcol, myrow, mycol,
 
  714     $                          iloc, jloc, rsrc1, csrc1 )
 
  715                           IF( myrow.EQ.rsrc1.AND.mycol.EQ.csrc1 ) 
THEN 
  716                              lcols = 
min( nb, n-indx+1 )
 
  717                              CALL dgemm( 
'Transpose', 
'No Transpose',
 
  718     $                             lnwin, lcols, lnwin, one, work(ipu),
 
  719     $                             lnwin, h((jloc-1)*lldh+iloc), lldh,
 
  722                              CALL dlamov( 
'All', lnwin, lcols,
 
  724     $                             h((jloc-1)*lldh+iloc), lldh )
 
  748                  IF( dir.EQ.2 .AND. lencbuf.GT.0 .AND.
 
  749     $                 mycol.EQ.lcsrc ) 
THEN 
  751                        DO 100 indx = 1, lktop-liroffh-1, nb
 
  752                           CALL infog2l( indx, lktop, desch, nprow,
 
  753     $                          npcol, myrow, mycol, iloc, jloc, rsrc1,
 
  755                           IF( myrow.EQ.rsrc1.AND.mycol.EQ.csrc1 ) 
THEN 
  756                              jloc1 = indxg2l( lktop+lnwin-ks, nb,
 
  757     $                             mycol, desch( csrc_ ), npcol )
 
  758                              lrows = 
min( nb, lktop-indx )
 
  759                              CALL dlamov( 
'All', lrows, ks,
 
  760     $                             h((jloc1-1)*lldh+iloc ), lldh,
 
  762                              CALL dtrmm( 
'Right', 
'Upper',
 
  763     $                             
'No transpose',
'Non-unit', lrows,
 
  764     $                             ks, one, work( ipu+lnwin-ks ), lnwin,
 
  766                              CALL dgemm(
'No transpose', 
'No transpose',
 
  767     $                             lrows, ks, lnwin-ks, one,
 
  768     $                             h((jloc-1)*lldh+iloc), lldh,
 
  769     $                             work( ipu ), lnwin, one, work(ipw),
 
  774                              CALL dlamov( 
'All', lrows, lnwin-ks,
 
  775     $                             h((jloc-1)*lldh+iloc), lldh,
 
  776     $                             work( ipw+ks*lrows ), lrows )
 
  777                              CALL dtrmm( 
'Right', 
'Lower',
 
  778     $                             
'No transpose', 
'Non-Unit',
 
  779     $                             lrows, lnwin-ks, one,
 
  780     $                             work( ipu+lnwin*ks ), lnwin,
 
  781     $                             work( ipw+ks*lrows ), lrows )
 
  782                              CALL dgemm(
'No transpose', 
'No transpose',
 
  783     $                             lrows, lnwin-ks, ks, one,
 
  784     $                             h((jloc1-1)*lldh+iloc), lldh,
 
  785     $                             work( ipu+lnwin*ks+lnwin-ks ), lnwin,
 
  786     $                             one, work( ipw+ks*lrows ), lrows )
 
  790                              CALL dlamov( 
'All', lrows, lnwin,
 
  792     $                             h((jloc-1)*lldh+iloc), lldh )
 
  801                        DO 110 indx = 1, n, nb
 
  802                           CALL infog2l( indx, lktop, descz, nprow,
 
  803     $                          npcol, myrow, mycol, iloc, jloc, rsrc1,
 
  805                           IF( myrow.EQ.rsrc1.AND.mycol.EQ.csrc1 ) 
THEN 
  806                              jloc1 = indxg2l( lktop+lnwin-ks, nb,
 
  807     $                             mycol, descz( csrc_ ), npcol )
 
  808                              lrows = 
min(nb,n-indx+1)
 
  809                              CALL dlamov( 
'All', lrows, ks,
 
  810     $                             z((jloc1-1)*lldz+iloc ), lldz,
 
  812                              CALL dtrmm( 
'Right', 
'Upper',
 
  813     $                             
'No transpose', 
'Non-unit',
 
  814     $                             lrows, ks, one, work( ipu+lnwin-ks ),
 
  815     $                             lnwin, work(ipw), lrows )
 
  816                              CALL dgemm( 
'No transpose',
 
  817     $                             
'No transpose', lrows, ks, lnwin-ks,
 
  818     $                             one, z((jloc-1)*lldz+iloc), lldz,
 
  819     $                             work( ipu ), lnwin, one, work(ipw),
 
  824                              CALL dlamov( 
'All', lrows, lnwin-ks,
 
  825     $                             z((jloc-1)*lldz+iloc), lldz,
 
  826     $                             work( ipw+ks*lrows ), lrows)
 
  827                              CALL dtrmm( 
'Right', 
'Lower',
 
  828     $                             
'No transpose', 
'Non-unit',
 
  829     $                             lrows, lnwin-ks, one,
 
  830     $                             work( ipu+lnwin*ks ), lnwin,
 
  831     $                             work( ipw+ks*lrows ), lrows )
 
  832                              CALL dgemm( 
'No transpose',
 
  833     $                             
'No transpose', lrows, lnwin-ks, ks,
 
  834     $                             one, z((jloc1-1)*lldz+iloc), lldz,
 
  835     $                             work( ipu+lnwin*ks+lnwin-ks ), lnwin,
 
  836     $                             one, work( ipw+ks*lrows ),
 
  841                              CALL dlamov( 
'All', lrows, lnwin,
 
  843     $                             z((jloc-1)*lldz+iloc), lldz )
 
  849                  IF( dir.EQ.1 .AND. lenrbuf.GT.0 .AND.
 
  850     $                 myrow.EQ.lrsrc ) 
THEN 
  852                        indxs = iceil(lkbot,nb)*nb + 1
 
  853                        DO 120 indx = indxs, n, nb
 
  855     $                          desch, nprow, npcol, myrow, mycol, iloc,
 
  856     $                          jloc, rsrc1, csrc1 )
 
  857                           IF( myrow.EQ.rsrc1.AND.mycol.EQ.csrc1 ) 
THEN 
  861                              iloc1 = indxg2l( lktop+lnwin-ks, nb,
 
  862     $                             myrow, desch( rsrc_ ), nprow )
 
  863                              lcols = 
min( nb, n-indx+1 )
 
  864                              CALL dlamov( 
'All', ks, lcols,
 
  865     $                             h((jloc-1)*lldh+iloc1), lldh,
 
  867                              CALL dtrmm( 
'Left', 
'Upper', 
'Transpose',
 
  868     $                             
'Non-unit', ks, lcols, one,
 
  869     $                             work( ipu+lnwin-ks ), lnwin,
 
  871                              CALL dgemm( 
'Transpose', 
'No transpose',
 
  872     $                             ks, lcols, lnwin-ks, one, work(ipu),
 
  873     $                             lnwin, h((jloc-1)*lldh+iloc), lldh,
 
  874     $                             one, work(ipw), lnwin )
 
  878                              CALL dlamov( 
'All', lnwin-ks, lcols,
 
  879     $                             h((jloc-1)*lldh+iloc), lldh,
 
  880     $                             work( ipw+ks ), lnwin )
 
  881                              CALL dtrmm( 
'Left', 
'Lower', 
'Transpose',
 
  882     $                             
'Non-unit', lnwin-ks, lcols, one,
 
  883     $                             work( ipu+lnwin*ks ), lnwin,
 
  884     $                             work( ipw+ks ), lnwin )
 
  885                              CALL dgemm( 
'Transpose', 
'No Transpose',
 
  886     $                             lnwin-ks, lcols, ks, one,
 
  887     $                             work( ipu+lnwin*ks+lnwin-ks ), lnwin,
 
  888     $                             h((jloc-1)*lldh+iloc1), lldh,
 
  889     $                             one, work( ipw+ks ), lnwin )
 
  893                              CALL dlamov( 
'All', lnwin, lcols,
 
  895     $                             h((jloc-1)*lldh+iloc), lldh )
 
  905                  IF( lkbot.EQ.kbot ) 
THEN 
  908                     iwork( 1+(win-1)*5 ) = lktop
 
  909                     iwork( 2+(win-1)*5 ) = lkbot
 
  910                     iwork( 5+(win-1)*5 ) = 2
 
  912                     lktop = 
min( lktop + lnwin - lchain,
 
  913     $                    iceil( lktop, nb )*nb - lchain + 1,
 
  915                     iwork( 1+(win-1)*5 ) = lktop
 
  916                     lkbot = 
min( lkbot + lnwin - lchain,
 
  917     $                    iceil( lkbot, nb )*nb, kbot )
 
  918                     iwork( 2+(win-1)*5 ) = lkbot
 
  919                     lnwin = lkbot-lktop+1
 
  920                     IF( lnwin.EQ.lchain ) iwork(5+(win-1)*5) = 2
 
  930         IF( ichoff.GT.0 ) 
THEN 
  931            DO 128 win = 2, anmwin
 
  932               iwork( 1+(win-2)*5 ) = iwork( 1+(win-1)*5 )
 
  933               iwork( 2+(win-2)*5 ) = iwork( 2+(win-1)*5 )
 
  934               iwork( 3+(win-2)*5 ) = iwork( 3+(win-1)*5 )
 
  935               iwork( 4+(win-2)*5 ) = iwork( 4+(win-1)*5 )
 
  936               iwork( 5+(win-2)*5 ) = iwork( 5+(win-1)*5 )
 
  939            ipiw = 6+(anmwin-1)*5
 
  944         IF( anmwin.LT.1 ) 
RETURN 
  960         DO 130 win = 1, anmwin
 
  961            lktop1 = iwork( 1+(win-1)*5 )
 
  962            lkbot = iwork( 2+(win-1)*5 )
 
  963            lnwin = 
max( 6, 
min( lkbot - lktop1 + 1, lchain ) )
 
  964            lkbot1 = 
max( 
min( kbot, iceil(lktop1,nb)*nb+lchain),
 
  965     $           
min( kbot, 
min( lktop1+2*lnwin-1,
 
  966     $           (iceil(lktop1,nb)+1)*nb ) ) )
 
  967            iwork( 2+(win-1)*5 ) = lkbot1
 
  983         DO 135 win = 1, anmwin
 
  984            iwork( 5+(win-1)*5 ) = 0
 
  997         wchunk = 
max( 1, 
min( anmwin, nprow-1, npcol-1 ) )
 
  998         numchunk = iceil( anmwin, wchunk )
 
 1011         DO 140 oddeven = 1, 
min( 2, anmwin )
 
 1012         DO 150 chunknum = 1, numchunk
 
 1014            DO 160 win = oddeven+(chunknum-1)*wchunk,
 
 1015     $           
min(anmwin,
max(1,oddeven+(chunknum)*wchunk-1)), 2
 
 1027               IF( iwork( 5+(win-1)*5 ).EQ.2 ) 
GO TO 165
 
 1028               lktop = iwork( 1+(win-1)*5 )
 
 1029               lkbot = iwork( 2+(win-1)*5 )
 
 1031                  lktop2 = iwork( 1+(win-2)*5 )
 
 1035               IF( iceil(lktop,nb).EQ.iceil(lkbot,nb) .OR.
 
 1036     $              lkbot.GE.lktop2 ) 
GO TO 165
 
 1037               lnwin = lkbot - lktop + 1
 
 1038               IF( lnwin.LE.ntiny .AND. lkbot.NE.kbot .AND.
 
 1039     $              .NOT. mod(lkbot,nb).EQ.0  ) 
GO TO 165
 
 1043               iwork( 5+(win-1)*5 ) = 1
 
 1052               rsrc1 = iwork( 3+(win-1)*5 )
 
 1053               csrc1 = iwork( 4+(win-1)*5 )
 
 1055               csrc2 = mod( csrc1+1, npcol )
 
 1056               rsrc3 = mod( rsrc1+1, nprow )
 
 1058               rsrc4 = mod( rsrc1+1, nprow )
 
 1059               csrc4 = mod( csrc1+1, npcol )
 
 1063               IF( ( myrow.EQ.rsrc1 .AND. mycol.EQ.csrc1 ) .OR.
 
 1064     $              ( myrow.EQ.rsrc2 .AND. mycol.EQ.csrc2 ) .OR.
 
 1065     $              ( myrow.EQ.rsrc3 .AND. mycol.EQ.csrc3 ) .OR.
 
 1066     $              ( myrow.EQ.rsrc4 .AND. mycol.EQ.csrc4 ) ) 
THEN 
 1071                  dim1 = nb - mod(lktop-1,nb)
 
 1079                  lnwin = 
max(ntiny+1,lnwin)
 
 1085                  ipuu = iph + lnwin**2
 
 1086                  ipv = ipuu + lnwin**2
 
 1088                  IF( dim.LT.lnwin ) 
THEN 
 1089                     CALL dlaset( 
'All', lnwin, lnwin, zero,
 
 1090     $                    one, work( iph ), lnwin )
 
 1092                     CALL dlaset( 
'All', dim, dim, zero,
 
 1093     $                    zero, work( iph ), lnwin )
 
 1098                  IF( myrow.EQ.rsrc1 .AND. mycol.EQ.csrc1 ) 
THEN 
 1099                     iloc = indxg2l( lktop, nb, myrow,
 
 1100     $                    desch( rsrc_ ), nprow )
 
 1101                     jloc = indxg2l( lktop, nb, mycol,
 
 1102     $                    desch( csrc_ ), npcol )
 
 1103                     CALL dlamov( 
'All', dim1, dim1,
 
 1104     $                    h((jloc-1)*lldh+iloc), lldh, work(iph),
 
 1106                     IF( rsrc1.NE.rsrc4 .OR. csrc1.NE.csrc4 ) 
THEN 
 1108                        CALL dgesd2d( ictxt, dim1, dim1,
 
 1109     $                       work(iph), lnwin, rsrc4, csrc4 )
 
 1110                        CALL dgerv2d( ictxt, dim4, dim4,
 
 1111     $                       work(iph+dim1*lnwin+dim1),
 
 1112     $                       lnwin, rsrc4, csrc4 )
 
 1115                  IF( myrow.EQ.rsrc4 .AND. mycol.EQ.csrc4 ) 
THEN 
 1116                     iloc = indxg2l( lktop+dim1, nb, myrow,
 
 1117     $                    desch( rsrc_ ), nprow )
 
 1118                     jloc = indxg2l( lktop+dim1, nb, mycol,
 
 1119     $                    desch( csrc_ ), npcol )
 
 1120                     CALL dlamov( 
'All', dim4, dim4,
 
 1121     $                    h((jloc-1)*lldh+iloc), lldh,
 
 1122     $                    work(iph+dim1*lnwin+dim1),
 
 1124                     IF( rsrc4.NE.rsrc1 .OR. csrc4.NE.csrc1 ) 
THEN 
 1126                        CALL dgesd2d( ictxt, dim4, dim4,
 
 1127     $                       work(iph+dim1*lnwin+dim1),
 
 1128     $                       lnwin, rsrc1, csrc1 )
 
 1129                        CALL dgerv2d( ictxt, dim1, dim1,
 
 1130     $                       work(iph), lnwin, rsrc1, csrc1 )
 
 1133                  IF( myrow.EQ.rsrc2 .AND. mycol.EQ.csrc2 ) 
THEN 
 1134                     iloc = indxg2l( lktop, nb, myrow,
 
 1135     $                    desch( rsrc_ ), nprow )
 
 1136                     jloc = indxg2l( lktop+dim1, nb, mycol,
 
 1137     $                    desch( csrc_ ), npcol )
 
 1138                     CALL dlamov( 
'All', dim1, dim4,
 
 1139     $                    h((jloc-1)*lldh+iloc), lldh,
 
 1140     $                    work(iph+dim1*lnwin), lnwin )
 
 1141                     IF( rsrc2.NE.rsrc1 .OR. csrc2.NE.csrc1 ) 
THEN 
 1143                        CALL dgesd2d( ictxt, dim1, dim4,
 
 1144     $                       work(iph+dim1*lnwin),
 
 1145     $                       lnwin, rsrc1, csrc1 )
 
 1148                  IF( myrow.EQ.rsrc2 .AND. mycol.EQ.csrc2 ) 
THEN 
 1149                     IF( rsrc2.NE.rsrc4 .OR. csrc2.NE.csrc4 ) 
THEN 
 1151                        CALL dgesd2d( ictxt, dim1, dim4,
 
 1152     $                       work(iph+dim1*lnwin),
 
 1153     $                       lnwin, rsrc4, csrc4 )
 
 1156                  IF( myrow.EQ.rsrc3 .AND. mycol.EQ.csrc3 ) 
THEN 
 1157                     iloc = indxg2l( lktop+dim1, nb, myrow,
 
 1158     $                    desch( rsrc_ ), nprow )
 
 1159                     jloc = indxg2l( lktop+dim1-1, nb, mycol,
 
 1160     $                    desch( csrc_ ), npcol )
 
 1161                     CALL dlamov( 
'All', 1, 1,
 
 1162     $                    h((jloc-1)*lldh+iloc), lldh,
 
 1163     $                    work(iph+(dim1-1)*lnwin+dim1),
 
 1165                     IF( rsrc3.NE.rsrc1 .OR. csrc3.NE.csrc1 ) 
THEN 
 1167                        CALL dgesd2d( ictxt, 1, 1,
 
 1168     $                       work(iph+(dim1-1)*lnwin+dim1),
 
 1169     $                       lnwin, rsrc1, csrc1 )
 
 1172                  IF( myrow.EQ.rsrc3 .AND. mycol.EQ.csrc3 ) 
THEN 
 1173                     IF( rsrc3.NE.rsrc4 .OR. csrc3.NE.csrc4 ) 
THEN 
 1175                        CALL dgesd2d( ictxt, 1, 1,
 
 1176     $                       work(iph+(dim1-1)*lnwin+dim1),
 
 1177     $                       lnwin, rsrc4, csrc4 )
 
 1180                  IF( myrow.EQ.rsrc1 .AND. mycol.EQ.csrc1 ) 
THEN 
 1181                     IF( rsrc1.NE.rsrc2 .OR. csrc1.NE.csrc2 ) 
THEN 
 1183                        CALL dgerv2d( ictxt, dim1, dim4,
 
 1184     $                       work(iph+dim1*lnwin),
 
 1185     $                       lnwin, rsrc2, csrc2 )
 
 1187                     IF( rsrc1.NE.rsrc3 .OR. csrc1.NE.csrc3 ) 
THEN 
 1189                        CALL dgerv2d( ictxt, 1, 1,
 
 1190     $                       work(iph+(dim1-1)*lnwin+dim1),
 
 1191     $                       lnwin, rsrc3, csrc3 )
 
 1194                  IF( myrow.EQ.rsrc4 .AND. mycol.EQ.csrc4 ) 
THEN 
 1195                     IF( rsrc4.NE.rsrc2 .OR. csrc4.NE.csrc2 ) 
THEN 
 1197                        CALL dgerv2d( ictxt, dim1, dim4,
 
 1198     $                       work(iph+dim1*lnwin),
 
 1199     $                       lnwin, rsrc2, csrc2 )
 
 1201                     IF( rsrc4.NE.rsrc3 .OR. csrc4.NE.csrc3 ) 
THEN 
 1203                        CALL dgerv2d( ictxt, 1, 1,
 
 1204     $                       work(iph+(dim1-1)*lnwin+dim1),
 
 1205     $                       lnwin, rsrc3, csrc3 )
 
 1218                  IF( (myrow.EQ.rsrc1 .AND. mycol.EQ.csrc1) .OR.
 
 1219     $                 (myrow.EQ.rsrc4 .AND. mycol.EQ.csrc4) ) 
THEN 
 1220                     IF( lktop.EQ.ktop .AND. lkbot.EQ.kbot .AND.
 
 1221     $                    (dim1.LE.lchain .OR. dim1.LE.ntiny ) ) 
THEN 
 1224                     ELSEIF( lktop.EQ.ktop .AND.
 
 1225     $                    ( dim1.LE.lchain .OR. dim1.LE.ntiny ) ) 
THEN 
 1226                        job = 
'Introduce and chase' 
 1227                     ELSEIF( lkbot.EQ.kbot ) 
THEN 
 1228                        job = 
'Off-chase bulges' 
 1231                        job = 
'Chase bulges' 
 1233                     ku = lnwin - kdu + 1
 
 1235                     nho = ( lnwin-kdu+1-4 ) - ( kdu+1 ) + 1
 
 1237                     nve = lnwin - kdu - kwv + 1
 
 1238                     CALL dlaset( 
'All', lnwin, lnwin,
 
 1239     $                    zero, one, work(ipuu), lnwin )
 
 1243                     lks = 
max(1, ns - win*lns + 1)
 
 1244                     CALL dlaqr6( job, wantt, .true., lkacc22, lnwin,
 
 1245     $                    1, dim, lns, sr( lks ), si( lks ),
 
 1246     $                    work(iph), lnwin, 1, dim,
 
 1247     $                    work(ipuu), lnwin, work(ipu), 3,
 
 1248     $                    work( iph+ku-1 ), lnwin, nve,
 
 1249     $                    work( iph+kwv-1 ), lnwin, nho,
 
 1250     $                    work( iph-1+ku+(kwh-1)*lnwin ), lnwin )
 
 1254                     IF( myrow.EQ.rsrc1 .AND. mycol.EQ.csrc1 ) 
THEN 
 1255                        iloc = indxg2l( lktop, nb, myrow,
 
 1256     $                       desch( rsrc_ ), nprow )
 
 1257                        jloc = indxg2l( lktop, nb, mycol,
 
 1258     $                       desch( csrc_ ), npcol )
 
 1259                        CALL dlamov( 
'All', dim1, dim1, work(iph),
 
 1260     $                       lnwin, h((jloc-1)*lldh+iloc),
 
 1263                     IF( myrow.EQ.rsrc4 .AND. mycol.EQ.csrc4 ) 
THEN 
 1264                        iloc = indxg2l( lktop+dim1, nb, myrow,
 
 1265     $                       desch( rsrc_ ), nprow )
 
 1266                        jloc = indxg2l( lktop+dim1, nb, mycol,
 
 1267     $                       desch( csrc_ ), npcol )
 
 1268                        CALL dlamov( 
'All', dim4, dim4,
 
 1269     $                       work(iph+dim1*lnwin+dim1),
 
 1270     $                       lnwin, h((jloc-1)*lldh+iloc), lldh )
 
 1276                     CALL dlamov( 
'All', dim, dim,
 
 1277     $                    work(ipuu), lnwin, work(ipu), dim )
 
 1284                  IF( myrow.EQ.rsrc1 .AND. mycol.EQ.csrc1 ) 
THEN 
 1285                     IF( rsrc1.NE.rsrc3 .OR. csrc1.NE.csrc3 ) 
THEN 
 1287                        CALL dgesd2d( ictxt, rws3, cls3,
 
 1288     $                       work( iph+(dim1-cls3)*lnwin+dim1 ),
 
 1289     $                       lnwin, rsrc3, csrc3 )
 
 1292                  IF( myrow.EQ.rsrc4 .AND. mycol.EQ.csrc4 ) 
THEN 
 1293                     IF( rsrc4.NE.rsrc2 .OR. csrc4.NE.csrc2 ) 
THEN 
 1295                        CALL dgesd2d( ictxt, dim1, dim4,
 
 1296     $                       work( iph+dim1*lnwin),
 
 1297     $                       lnwin, rsrc2, csrc2 )
 
 1300                  IF( myrow.EQ.rsrc2 .AND. mycol.EQ.csrc2 ) 
THEN 
 1301                     iloc = indxg2l( lktop, nb, myrow,
 
 1302     $                    desch( rsrc_ ), nprow )
 
 1303                     jloc = indxg2l( lktop+dim1, nb, mycol,
 
 1304     $                    desch( csrc_ ), npcol )
 
 1305                     IF( rsrc2.NE.rsrc4 .OR. csrc2.NE.csrc4 ) 
THEN 
 1307                        CALL dgerv2d( ictxt, dim1, dim4,
 
 1308     $                       work(iph+dim1*lnwin),
 
 1309     $                       lnwin, rsrc4, csrc4 )
 
 1311                     CALL dlamov( 
'All', dim1, dim4,
 
 1312     $                    work( iph+dim1*lnwin ), lnwin,
 
 1313     $                    h((jloc-1)*lldh+iloc), lldh )
 
 1315                  IF( myrow.EQ.rsrc3 .AND. mycol.EQ.csrc3 ) 
THEN 
 1316                     iloc = indxg2l( lktop+dim1, nb, myrow,
 
 1317     $                    desch( rsrc_ ), nprow )
 
 1318                     jloc = indxg2l( lktop+dim1-cls3, nb, mycol,
 
 1319     $                    desch( csrc_ ), npcol )
 
 1320                     IF( rsrc3.NE.rsrc1 .OR. csrc3.NE.csrc1 ) 
THEN 
 1322                        CALL dgerv2d( ictxt, rws3, cls3,
 
 1323     $                       work( iph+(dim1-cls3)*lnwin+dim1 ),
 
 1324     $                       lnwin, rsrc1, csrc1 )
 
 1326                     CALL dlamov( 
'Upper', rws3, cls3,
 
 1327     $                    work( iph+(dim1-cls3)*lnwin+dim1 ),
 
 1328     $                    lnwin, h((jloc-1)*lldh+iloc),
 
 1330                     IF( rws3.GT.1 .AND. cls3.GT.1 ) 
THEN 
 1331                        elem = work( iph+(dim1-cls3)*lnwin+dim1+1 )
 
 1332                        IF( elem.NE.zero ) 
THEN 
 1333                           CALL dlamov( 
'Lower', rws3-1, cls3-1,
 
 1334     $                          work( iph+(dim1-cls3)*lnwin+dim1+1 ),
 
 1335     $                          lnwin, h((jloc-1)*lldh+iloc+1), lldh )
 
 1349               IF( myrow.EQ.rsrc1 .OR. mycol.EQ.csrc1 .OR.
 
 1350     $              myrow.EQ.rsrc4 .OR. mycol.EQ.csrc4 ) 
THEN 
 1351                  IF( myrow.EQ.rsrc1 .OR. myrow.EQ.rsrc4 )
 
 1352     $               lenrbuf = lenrbuf + lnwin*lnwin
 
 1353                  IF( mycol.EQ.csrc1 .OR. mycol.EQ.csrc4 )
 
 1354     $               lencbuf = lencbuf + lnwin*lnwin
 
 1372               DO 180 win = oddeven+(chunknum-1)*wchunk,
 
 1373     $              
min(anmwin,
max(1,oddeven+(chunknum)*wchunk-1)), 2
 
 1374                  IF( ( lenrbuf.EQ.0 .AND. lencbuf.EQ.0 ) .OR.
 
 1375     $                 bcdone ) 
GO TO 185
 
 1376                  rsrc1 = iwork( 3+(win-1)*5 )
 
 1377                  csrc1 = iwork( 4+(win-1)*5 )
 
 1378                  rsrc4 = mod( rsrc1+1, nprow )
 
 1379                  csrc4 = mod( csrc1+1, npcol )
 
 1380                  IF( ( myrow.EQ.rsrc1 .AND. mycol.EQ.csrc1 ) .OR.
 
 1381     $                 ( myrow.EQ.rsrc4 .AND. mycol.EQ.csrc4 ) ) 
THEN 
 1382                     IF( dir.EQ.1 .AND. lenrbuf.GT.0 .AND.
 
 1383     $                    npcol.GT.1 .AND. nprocs.GT.2 ) 
THEN 
 1384                        IF( myrow.EQ.rsrc1 .OR. ( myrow.EQ.rsrc4
 
 1385     $                       .AND. rsrc4.NE.rsrc1 ) ) 
THEN 
 1386                           CALL dgebs2d( ictxt, 
'Row', 
'1-Tree',
 
 1387     $                          lenrbuf, 1, work, lenrbuf )
 
 1389                           CALL dgebr2d( ictxt, 
'Row', 
'1-Tree',
 
 1390     $                          lenrbuf, 1, work, lenrbuf, rsrc1,
 
 1393                     ELSEIF( dir.EQ.2 .AND. lencbuf.GT.0 .AND.
 
 1394     $                       nprow.GT.1 .AND. nprocs.GT.2 ) 
THEN 
 1395                        IF( mycol.EQ.csrc1 .OR. ( mycol.EQ.csrc4
 
 1396     $                       .AND. csrc4.NE.csrc1 ) ) 
THEN 
 1397                           CALL dgebs2d( ictxt, 
'Col', 
'1-Tree',
 
 1398     $                          lencbuf, 1, work, lencbuf )
 
 1400                           CALL dgebr2d( ictxt, 
'Col', 
'1-Tree',
 
 1401     $                          lencbuf, 1, work(1+lenrbuf), lencbuf,
 
 1405                     IF( lenrbuf.GT.0 .AND. ( mycol.EQ.csrc1 .OR.
 
 1406     $                    ( mycol.EQ.csrc4 .AND. csrc4.NE.csrc1 ) ) )
 
 1407     $                  
CALL dlamov( 
'All', lenrbuf, 1, work, lenrbuf,
 
 1408     $                       work(1+lenrbuf), lencbuf )
 
 1410                  ELSEIF( myrow.EQ.rsrc1 .AND. dir.EQ.1 ) 
THEN 
 1411                     IF( lenrbuf.GT.0 .AND. npcol.GT.1 )
 
 1412     $                  
CALL dgebr2d( ictxt, 
'Row', 
'1-Tree', lenrbuf,
 
 1413     $                       1, work, lenrbuf, rsrc1, csrc1 )
 
 1415                  ELSEIF( mycol.EQ.csrc1 .AND. dir.EQ.2 ) 
THEN 
 1416                     IF( lencbuf.GT.0 .AND. nprow.GT.1 )
 
 1417     $                  
CALL dgebr2d( ictxt, 
'Col', 
'1-Tree', lencbuf,
 
 1418     $                       1, work(1+lenrbuf), lencbuf, rsrc1, csrc1 )
 
 1420                  ELSEIF( myrow.EQ.rsrc4 .AND. dir.EQ.1 ) 
THEN 
 1421                     IF( lenrbuf.GT.0 .AND. npcol.GT.1 )
 
 1422     $                  
CALL dgebr2d( ictxt, 
'Row', 
'1-Tree', lenrbuf,
 
 1423     $                       1, work, lenrbuf, rsrc4, csrc4 )
 
 1425                  ELSEIF( mycol.EQ.csrc4 .AND. dir.EQ.2 ) 
THEN 
 1426                     IF( lencbuf.GT.0 .AND. nprow.GT.1 )
 
 1427     $                  
CALL dgebr2d( ictxt, 
'Col', 
'1-Tree', lencbuf,
 
 1428     $                       1, work(1+lenrbuf), lencbuf, rsrc4, csrc4 )
 
 1441               DO 200 win = oddeven+(chunknum-1)*wchunk,
 
 1442     $              
min(anmwin,
max(1,oddeven+(chunknum)*wchunk-1)), 2
 
 1443                  IF( iwork( 5+(win-1)*5 ).NE.1 ) 
GO TO 205
 
 1449                  lktop = iwork( 1+(win-1)*5 )
 
 1450                  lkbot = iwork( 2+(win-1)*5 )
 
 1455                  rsrc1 = iwork( 3+(win-1)*5 )
 
 1456                  csrc1 = iwork( 4+(win-1)*5 )
 
 1457                  rsrc4 = mod( rsrc1+1, nprow )
 
 1458                  csrc4 = mod( csrc1+1, npcol )
 
 1463                  IF(((mycol.EQ.csrc1.OR.mycol.EQ.csrc4).AND.dir.EQ.2)
 
 1464     $                 .OR.((myrow.EQ.rsrc1.OR.myrow.EQ.rsrc4).AND.
 
 1467                     lnwin = lkbot - lktop + 1
 
 1469                     dim1 = nb - mod(lktop-1,nb)
 
 1471                     ipnext = ipu + lnwin*lnwin
 
 1474                           zrows = numroc( n, nb, myrow, descz( rsrc_ ),
 
 1480                           hrows = numroc( lktop-1, nb, myrow,
 
 1481     $                          desch( rsrc_ ), nprow )
 
 1491                           hcols = numroc( n - (lktop+dim1-1), nb,
 
 1492     $                          mycol, csrc4, npcol )
 
 1493                           IF( mycol.EQ.csrc4 ) hcols = hcols - dim4
 
 1500                     ipw = 
max( 1 + lenrbuf + lencbuf, ipw3 )
 
 1501                     ipw1 = ipw + hrows * lnwin
 
 1503                        ipw2 = ipw1 + lnwin * hcols
 
 1504                        ipw3 = ipw2 + zrows * lnwin
 
 1506                        ipw3 = ipw1 + lnwin * hcols
 
 1513                  IF( dir.EQ.2 .AND. wantt .AND. lencbuf.GT.0 ) 
THEN 
 1514                     IF( mycol.EQ.csrc1 .OR. mycol.EQ.csrc4 ) 
THEN 
 1515                        DO 210 indx = 1, nprow
 
 1516                           IF( mycol.EQ.csrc1 ) 
THEN 
 1517                              CALL infog2l( 1+(indx-1)*nb, lktop, desch,
 
 1518     $                             nprow, npcol, myrow, mycol, iloc,
 
 1519     $                             jloc1, rsrc, csrc1 )
 
 1520                              IF( myrow.EQ.rsrc ) 
THEN 
 1521                                 CALL dlamov( 
'All', hrows, dim1,
 
 1522     $                                h((jloc1-1)*lldh+iloc), lldh,
 
 1523     $                                work(ipw), hrows )
 
 1524                                 IF( npcol.GT.1 ) 
THEN 
 1525                                    east = mod( mycol + 1, npcol )
 
 1526                                    CALL dgesd2d( ictxt, hrows, dim1,
 
 1527     $                                   work(ipw), hrows, rsrc, east )
 
 1528                                    CALL dgerv2d( ictxt, hrows, dim4,
 
 1529     $                                   work(ipw+hrows*dim1), hrows,
 
 1534                           IF( mycol.EQ.csrc4 ) 
THEN 
 1535                              CALL infog2l( 1+(indx-1)*nb, lktop+dim1,
 
 1536     $                             desch, nprow, npcol, myrow, mycol,
 
 1537     $                             iloc, jloc4, rsrc, csrc4 )
 
 1538                              IF( myrow.EQ.rsrc ) 
THEN 
 1539                                 CALL dlamov( 
'All', hrows, dim4,
 
 1540     $                                h((jloc4-1)*lldh+iloc), lldh,
 
 1541     $                                work(ipw+hrows*dim1), hrows )
 
 1542                                 IF( npcol.GT.1 ) 
THEN 
 1543                                    west = mod( mycol - 1 + npcol,
 
 1545                                    CALL dgesd2d( ictxt, hrows, dim4,
 
 1546     $                                   work(ipw+hrows*dim1), hrows,
 
 1548                                    CALL dgerv2d( ictxt, hrows, dim1,
 
 1549     $                                   work(ipw), hrows, rsrc, west )
 
 1557                  IF( dir.EQ.1 .AND. wantt .AND. lenrbuf.GT.0 ) 
THEN 
 1558                     IF( myrow.EQ.rsrc1 .OR. myrow.EQ.rsrc4 ) 
THEN 
 1559                        DO 220 indx = 1, npcol
 
 1560                           IF( myrow.EQ.rsrc1 ) 
THEN 
 1561                              IF( indx.EQ.1 ) 
THEN 
 1562                                 IF( lkbot.LT.n ) 
THEN 
 1563                                    CALL infog2l( lktop, lkbot+1, desch,
 
 1564     $                                   nprow, npcol, myrow, mycol,
 
 1565     $                                   iloc1, jloc, rsrc1, csrc )
 
 1569                              ELSEIF( mod(lkbot,nb).NE.0 ) 
THEN 
 1571     $                                (iceil(lkbot,nb)+(indx-2))*nb+1,
 
 1572     $                                desch, nprow, npcol, myrow, mycol,
 
 1573     $                                iloc1, jloc, rsrc1, csrc )
 
 1576     $                                (iceil(lkbot,nb)+(indx-1))*nb+1,
 
 1577     $                                desch, nprow, npcol, myrow, mycol,
 
 1578     $                                iloc1, jloc, rsrc1, csrc )
 
 1580                              IF( mycol.EQ.csrc ) 
THEN 
 1581                                 CALL dlamov( 
'All', dim1, hcols,
 
 1582     $                                h((jloc-1)*lldh+iloc1), lldh,
 
 1583     $                                work(ipw1), lnwin )
 
 1584                                 IF( nprow.GT.1 ) 
THEN 
 1585                                    south = mod( myrow + 1, nprow )
 
 1586                                    CALL dgesd2d( ictxt, dim1, hcols,
 
 1587     $                                   work(ipw1), lnwin, south,
 
 1589                                    CALL dgerv2d( ictxt, dim4, hcols,
 
 1590     $                                   work(ipw1+dim1), lnwin, south,
 
 1595                           IF( myrow.EQ.rsrc4 ) 
THEN 
 1596                              IF( indx.EQ.1 ) 
THEN 
 1597                                 IF( lkbot.LT.n ) 
THEN 
 1598                                    CALL infog2l( lktop+dim1, lkbot+1,
 
 1599     $                                   desch, nprow, npcol, myrow,
 
 1600     $                                   mycol, iloc4, jloc, rsrc4,
 
 1605                              ELSEIF( mod(lkbot,nb).NE.0 ) 
THEN 
 1607     $                                (iceil(lkbot,nb)+(indx-2))*nb+1,
 
 1608     $                                desch, nprow, npcol, myrow, mycol,
 
 1609     $                                iloc4, jloc, rsrc4, csrc )
 
 1612     $                                (iceil(lkbot,nb)+(indx-1))*nb+1,
 
 1613     $                                desch, nprow, npcol, myrow, mycol,
 
 1614     $                                iloc4, jloc, rsrc4, csrc )
 
 1616                              IF( mycol.EQ.csrc ) 
THEN 
 1617                                 CALL dlamov( 
'All', dim4, hcols,
 
 1618     $                                h((jloc-1)*lldh+iloc4), lldh,
 
 1619     $                                work(ipw1+dim1), lnwin )
 
 1620                                 IF( nprow.GT.1 ) 
THEN 
 1621                                    north = mod( myrow - 1 + nprow,
 
 1623                                    CALL dgesd2d( ictxt, dim4, hcols,
 
 1624     $                                   work(ipw1+dim1), lnwin, north,
 
 1626                                    CALL dgerv2d( ictxt, dim1, hcols,
 
 1627     $                                   work(ipw1), lnwin, north,
 
 1636                  IF( dir.EQ.2 .AND. wantz .AND. lencbuf.GT.0) 
THEN 
 1637                     IF( mycol.EQ.csrc1 .OR. mycol.EQ.csrc4 ) 
THEN 
 1638                        DO 230 indx = 1, nprow
 
 1639                           IF( mycol.EQ.csrc1 ) 
THEN 
 1640                              CALL infog2l( 1+(indx-1)*nb, lktop,
 
 1641     $                             descz, nprow, npcol, myrow, mycol,
 
 1642     $                             iloc, jloc1, rsrc, csrc1 )
 
 1643                              IF( myrow.EQ.rsrc ) 
THEN 
 1644                                 CALL dlamov( 
'All', zrows, dim1,
 
 1645     $                                z((jloc1-1)*lldz+iloc), lldz,
 
 1646     $                                work(ipw2), zrows )
 
 1647                                 IF( npcol.GT.1 ) 
THEN 
 1648                                    east = mod( mycol + 1, npcol )
 
 1649                                    CALL dgesd2d( ictxt, zrows, dim1,
 
 1650     $                                   work(ipw2), zrows, rsrc,
 
 1652                                    CALL dgerv2d( ictxt, zrows, dim4,
 
 1653     $                                   work(ipw2+zrows*dim1),
 
 1654     $                                   zrows, rsrc, east )
 
 1658                           IF( mycol.EQ.csrc4 ) 
THEN 
 1660     $                             lktop+dim1, descz, nprow, npcol,
 
 1661     $                             myrow, mycol, iloc, jloc4, rsrc,
 
 1663                              IF( myrow.EQ.rsrc ) 
THEN 
 1664                                 CALL dlamov( 
'All', zrows, dim4,
 
 1665     $                                z((jloc4-1)*lldz+iloc), lldz,
 
 1666     $                                work(ipw2+zrows*dim1), zrows )
 
 1667                                 IF( npcol.GT.1 ) 
THEN 
 1668                                    west = mod( mycol - 1 + npcol,
 
 1670                                    CALL dgesd2d( ictxt, zrows, dim4,
 
 1671     $                                   work(ipw2+zrows*dim1),
 
 1672     $                                   zrows, rsrc, west )
 
 1673                                    CALL dgerv2d( ictxt, zrows, dim1,
 
 1674     $                                   work(ipw2), zrows, rsrc,
 
 1697                  ipnext = 1 + lenrbuf
 
 1700               DO 240 win = oddeven+(chunknum-1)*wchunk,
 
 1701     $              
min(anmwin,
max(1,oddeven+(chunknum)*wchunk-1)), 2
 
 1702                  IF( iwork( 5+(win-1)*5 ).NE.1 ) 
GO TO 245
 
 1707                  lktop = iwork( 1+(win-1)*5 )
 
 1708                  lkbot = iwork( 2+(win-1)*5 )
 
 1709                  lnwin = lkbot - lktop + 1
 
 1714                  rsrc1 = iwork( 3+(win-1)*5 )
 
 1715                  csrc1 = iwork( 4+(win-1)*5 )
 
 1716                  rsrc4 = mod( rsrc1+1, nprow )
 
 1717                  csrc4 = mod( csrc1+1, npcol )
 
 1719                  IF(((mycol.EQ.csrc1.OR.mycol.EQ.csrc4).AND.dir.EQ.2)
 
 1720     $                 .OR.((myrow.EQ.rsrc1.OR.myrow.EQ.rsrc4).AND.
 
 1726                     lktop = iwork( 1+(win-1)*5 )
 
 1727                     lkbot = iwork( 2+(win-1)*5 )
 
 1728                     lnwin = lkbot - lktop + 1
 
 1729                     dim1 = nb - mod(lktop-1,nb)
 
 1731                     ipu = ipnext + (winid-1)*lnwin*lnwin
 
 1734                           zrows = numroc( n, nb, myrow, descz( rsrc_ ),
 
 1740                           hrows = numroc( lktop-1, nb, myrow,
 
 1741     $                          desch( rsrc_ ), nprow )
 
 1751                           hcols = numroc( n - (lktop+dim1-1), nb,
 
 1752     $                          mycol, csrc4, npcol )
 
 1753                           IF( mycol.EQ.csrc4 ) hcols = hcols - dim4
 
 1767                     ipw = 
max( 1 + lenrbuf + lencbuf, ipw3 )
 
 1768                     ipw1 = ipw + hrows * lnwin
 
 1770                        ipw2 = ipw1 + lnwin * hcols
 
 1771                        ipw3 = ipw2 + zrows * lnwin
 
 1773                        ipw3 = ipw1 + lnwin * hcols
 
 1779                     IF( lktop.EQ.ktop .AND. lkbot.EQ.kbot ) 
THEN 
 1781                     ELSEIF( lktop.EQ.ktop .AND.
 
 1782     $                    ( dim1.LT.lchain+1 .OR. dim1.LE.ntiny ) )
 
 1784                        job = 
'Introduce and chase' 
 1785                     ELSEIF( lkbot.EQ.kbot ) 
THEN 
 1786                        job = 
'Off-chase bulges' 
 1788                        job = 
'Chase bulges' 
 1795                  ks = dim1+dim4-lns/2*3
 
 1796                  IF( .NOT. blk22 .OR. dim1.NE.ks .OR.
 
 1797     $                 dim4.NE.ks .OR. lsame(job,
'I') .OR.
 
 1798     $                 lsame(job,
'O') .OR. lns.LE.2 ) 
THEN 
 1802                     IF( dir.EQ.2 .AND. wantt .AND. lencbuf.GT.0 ) 
THEN 
 1803                        DO 250 indx = 1, 
min(lktop-1,1+(nprow-1)*nb), nb
 
 1804                           IF( mycol.EQ.csrc1 ) 
THEN 
 1805                              CALL infog2l( indx, lktop, desch, nprow,
 
 1806     $                             npcol, myrow, mycol, iloc, jloc,
 
 1808                              IF( myrow.EQ.rsrc ) 
THEN 
 1809                                 CALL dgemm( 
'No transpose',
 
 1810     $                                
'No transpose', hrows, dim1,
 
 1811     $                                lnwin, one, work( ipw ), hrows,
 
 1812     $                                work( ipu ), lnwin, zero,
 
 1813     $                                work(ipw3), hrows )
 
 1814                                 CALL dlamov( 
'All', hrows, dim1,
 
 1815     $                                work(ipw3), hrows,
 
 1816     $                                h((jloc-1)*lldh+iloc), lldh )
 
 1819                           IF( mycol.EQ.csrc4 ) 
THEN 
 1820                              CALL infog2l( indx, lktop+dim1, desch,
 
 1821     $                             nprow, npcol, myrow, mycol, iloc,
 
 1822     $                             jloc, rsrc, csrc4 )
 
 1823                              IF( myrow.EQ.rsrc ) 
THEN 
 1824                                 CALL dgemm( 
'No transpose',
 
 1825     $                                
'No transpose', hrows, dim4,
 
 1826     $                                lnwin, one, work( ipw ), hrows,
 
 1827     $                                work( ipu+lnwin*dim1 ), lnwin,
 
 1828     $                                zero, work(ipw3), hrows )
 
 1829                                 CALL dlamov( 
'All', hrows, dim4,
 
 1830     $                                work(ipw3), hrows,
 
 1831     $                                h((jloc-1)*lldh+iloc), lldh )
 
 1837                     IF( dir.EQ.2 .AND. wantz .AND. lencbuf.GT.0 ) 
THEN 
 1838                        DO 260 indx = 1, 
min(n,1+(nprow-1)*nb), nb
 
 1839                           IF( mycol.EQ.csrc1 ) 
THEN 
 1840                              CALL infog2l( indx, lktop, descz, nprow,
 
 1841     $                             npcol, myrow, mycol, iloc, jloc,
 
 1843                              IF( myrow.EQ.rsrc ) 
THEN 
 1844                                 CALL dgemm( 
'No transpose',
 
 1845     $                                
'No transpose', zrows, dim1,
 
 1846     $                                lnwin, one, work( ipw2 ),
 
 1847     $                                zrows, work( ipu ), lnwin,
 
 1848     $                                zero, work(ipw3), zrows )
 
 1849                                 CALL dlamov( 
'All', zrows, dim1,
 
 1850     $                                work(ipw3), zrows,
 
 1851     $                                z((jloc-1)*lldz+iloc), lldz )
 
 1854                           IF( mycol.EQ.csrc4 ) 
THEN 
 1855                              CALL infog2l( indx, lktop+dim1, descz,
 
 1856     $                             nprow, npcol, myrow, mycol, iloc,
 
 1857     $                             jloc, rsrc, csrc4 )
 
 1858                              IF( myrow.EQ.rsrc ) 
THEN 
 1859                                 CALL dgemm( 
'No transpose',
 
 1860     $                                
'No transpose', zrows, dim4,
 
 1861     $                                lnwin, one, work( ipw2 ),
 
 1863     $                                work( ipu+lnwin*dim1 ), lnwin,
 
 1864     $                                zero, work(ipw3), zrows )
 
 1865                                 CALL dlamov( 
'All', zrows, dim4,
 
 1866     $                                work(ipw3), zrows,
 
 1867     $                                z((jloc-1)*lldz+iloc), lldz )
 
 1875                     IF( dir.EQ.1 .AND. wantt .AND. lenrbuf.GT.0 ) 
THEN 
 1876                        IF( lkbot.LT.n ) 
THEN 
 1877                           IF( myrow.EQ.rsrc1.AND.mycol.EQ.csrc4 .AND.
 
 1878     $                          mod(lkbot,nb).NE.0 ) 
THEN 
 1880                              CALL infog2l( lktop, indx, desch, nprow,
 
 1881     $                             npcol, myrow, mycol, iloc, jloc,
 
 1883                              CALL dgemm( 
'Transpose', 
'No Transpose',
 
 1884     $                             dim1, hcols, lnwin, one, work(ipu),
 
 1885     $                             lnwin, work( ipw1 ), lnwin, zero,
 
 1886     $                             work(ipw3), dim1 )
 
 1887                              CALL dlamov( 
'All', dim1, hcols,
 
 1889     $                             h((jloc-1)*lldh+iloc), lldh )
 
 1891                           IF( myrow.EQ.rsrc4.AND.mycol.EQ.csrc4 .AND.
 
 1892     $                          mod(lkbot,nb).NE.0 ) 
THEN 
 1894                              CALL infog2l( lktop+dim1, indx, desch,
 
 1895     $                             nprow, npcol, myrow, mycol, iloc,
 
 1896     $                             jloc, rsrc4, csrc4 )
 
 1897                              CALL dgemm( 
'Transpose', 
'No Transpose',
 
 1898     $                             dim4, hcols, lnwin, one,
 
 1899     $                             work( ipu+dim1*lnwin ), lnwin,
 
 1900     $                             work( ipw1), lnwin, zero,
 
 1901     $                             work(ipw3), dim4 )
 
 1902                              CALL dlamov( 
'All', dim4, hcols,
 
 1904     $                             h((jloc-1)*lldh+iloc), lldh )
 
 1906                           indxs = iceil(lkbot,nb)*nb + 1
 
 1907                           IF( mod(lkbot,nb).NE.0 ) 
THEN 
 1908                              indxe = 
min(n,indxs+(npcol-2)*nb)
 
 1910                              indxe = 
min(n,indxs+(npcol-1)*nb)
 
 1912                           DO 270 indx = indxs, indxe, nb
 
 1913                              IF( myrow.EQ.rsrc1 ) 
THEN 
 1914                                 CALL infog2l( lktop, indx, desch,
 
 1915     $                                nprow, npcol, myrow, mycol, iloc,
 
 1916     $                                jloc, rsrc1, csrc )
 
 1917                                 IF( mycol.EQ.csrc ) 
THEN 
 1918                                    CALL dgemm( 
'Transpose',
 
 1919     $                                   
'No Transpose', dim1, hcols,
 
 1920     $                                   lnwin, one, work( ipu ), lnwin,
 
 1921     $                                   work( ipw1 ), lnwin, zero,
 
 1922     $                                   work(ipw3), dim1 )
 
 1923                                    CALL dlamov( 
'All', dim1, hcols,
 
 1925     $                                   h((jloc-1)*lldh+iloc), lldh )
 
 1928                              IF( myrow.EQ.rsrc4 ) 
THEN 
 1929                                 CALL infog2l( lktop+dim1, indx, desch,
 
 1930     $                                nprow, npcol, myrow, mycol, iloc,
 
 1931     $                                jloc, rsrc4, csrc )
 
 1932                                 IF( mycol.EQ.csrc ) 
THEN 
 1933                                    CALL dgemm( 
'Transpose',
 
 1934     $                                   
'No Transpose', dim4, hcols,
 
 1936     $                                   work( ipu+lnwin*dim1 ), lnwin,
 
 1937     $                                   work( ipw1 ), lnwin,
 
 1938     $                                   zero, work(ipw3), dim4 )
 
 1939                                    CALL dlamov( 
'All', dim4, hcols,
 
 1941     $                                   h((jloc-1)*lldh+iloc), lldh )
 
 1953                     IF( dir.EQ.2 .AND. wantt .AND. lencbuf.GT.0 ) 
THEN 
 1954                        indxe = 
min(lktop-1,1+(nprow-1)*nb)
 
 1955                        DO 280 indx = 1, indxe, nb
 
 1956                           IF( mycol.EQ.csrc1 ) 
THEN 
 1957                              CALL infog2l( indx, lktop, desch, nprow,
 
 1958     $                             npcol, myrow, mycol, iloc, jloc,
 
 1960                              IF( myrow.EQ.rsrc ) 
THEN 
 1961                                 CALL dlamov( 
'All', hrows, ks,
 
 1962     $                                work( ipw+hrows*dim4), hrows,
 
 1963     $                                work(ipw3), hrows )
 
 1964                                 CALL dtrmm( 
'Right', 
'Upper',
 
 1966     $                                
'Non-unit', hrows, ks, one,
 
 1967     $                                work( ipu+dim4 ), lnwin,
 
 1968     $                                work(ipw3), hrows )
 
 1969                                 CALL dgemm( 
'No transpose',
 
 1970     $                                
'No transpose', hrows, ks, dim4,
 
 1971     $                                one, work( ipw ), hrows,
 
 1972     $                                work( ipu ), lnwin, one,
 
 1973     $                                work(ipw3), hrows )
 
 1974                                 CALL dlamov( 
'All', hrows, ks,
 
 1975     $                                work(ipw3), hrows,
 
 1976     $                                h((jloc-1)*lldh+iloc), lldh )
 
 1983                           IF( mycol.EQ.csrc4 ) 
THEN 
 1984                              CALL infog2l( indx, lktop+dim1, desch,
 
 1985     $                             nprow, npcol, myrow, mycol, iloc,
 
 1986     $                             jloc, rsrc, csrc4 )
 
 1987                              IF( myrow.EQ.rsrc ) 
THEN 
 1988                                 CALL dlamov( 
'All', hrows, dim4,
 
 1989     $                                work(ipw), hrows, work( ipw3 ),
 
 1991                                 CALL dtrmm( 
'Right', 
'Lower',
 
 1993     $                                
'Non-unit', hrows, dim4, one,
 
 1994     $                                work( ipu+lnwin*ks ), lnwin,
 
 1995     $                                work( ipw3 ), hrows )
 
 1996                                 CALL dgemm( 
'No transpose',
 
 1997     $                                
'No transpose', hrows, dim4, ks,
 
 1998     $                                one, work( ipw+hrows*dim4),
 
 2000     $                                work( ipu+lnwin*ks+dim4 ), lnwin,
 
 2001     $                                one, work( ipw3 ), hrows )
 
 2002                                 CALL dlamov( 
'All', hrows, dim4,
 
 2003     $                                work(ipw3), hrows,
 
 2004     $                                h((jloc-1)*lldh+iloc), lldh )
 
 2010                     IF( dir.EQ.2 .AND. wantz .AND. lencbuf.GT.0 ) 
THEN 
 2015                        indxe = 
min(n,1+(nprow-1)*nb)
 
 2016                        DO 290 indx = 1, indxe, nb
 
 2017                           IF( mycol.EQ.csrc1 ) 
THEN 
 2018                              CALL infog2l( indx, i, descz, nprow,
 
 2019     $                             npcol, myrow, mycol, iloc, jloc,
 
 2021                              IF( myrow.EQ.rsrc ) 
THEN 
 2022                                 CALL dlamov( 
'All', zrows, ks,
 
 2023     $                                work( ipw2+zrows*dim4),
 
 2024     $                                zrows, work(ipw3), zrows )
 
 2025                                 CALL dtrmm( 
'Right', 
'Upper',
 
 2027     $                                
'Non-unit', zrows, ks, one,
 
 2028     $                                work( ipu+dim4 ), lnwin,
 
 2029     $                                work(ipw3), zrows )
 
 2030                                 CALL dgemm( 
'No transpose',
 
 2031     $                                
'No transpose', zrows, ks,
 
 2032     $                                dim4, one, work( ipw2 ),
 
 2033     $                                zrows, work( ipu ), lnwin,
 
 2034     $                                one, work(ipw3), zrows )
 
 2035                                 CALL dlamov( 
'All', zrows, ks,
 
 2036     $                                work(ipw3), zrows,
 
 2037     $                                z((jloc-1)*lldz+iloc), lldz )
 
 2044                           IF( mycol.EQ.csrc4 ) 
THEN 
 2045                              CALL infog2l( indx, i+dim1, descz,
 
 2046     $                             nprow, npcol, myrow, mycol, iloc,
 
 2047     $                             jloc, rsrc, csrc4 )
 
 2048                              IF( myrow.EQ.rsrc ) 
THEN 
 2049                                 CALL dlamov( 
'All', zrows, dim4,
 
 2050     $                                work(ipw2), zrows,
 
 2051     $                                work( ipw3 ), zrows )
 
 2052                                 CALL dtrmm( 
'Right', 
'Lower',
 
 2054     $                                
'Non-unit', zrows, dim4,
 
 2055     $                                one, work( ipu+lnwin*ks ),
 
 2056     $                                lnwin, work( ipw3 ), zrows )
 
 2057                                 CALL dgemm( 
'No transpose',
 
 2058     $                                
'No transpose', zrows, dim4,
 
 2060     $                                work( ipw2+zrows*(dim4)),
 
 2062     $                                work( ipu+lnwin*ks+dim4 ),
 
 2063     $                                lnwin, one, work( ipw3 ),
 
 2065                                 CALL dlamov( 
'All', zrows, dim4,
 
 2066     $                                work(ipw3), zrows,
 
 2067     $                                z((jloc-1)*lldz+iloc), lldz )
 
 2073                     IF( dir.EQ.1 .AND. wantt .AND. lenrbuf.GT.0) 
THEN 
 2074                        IF ( lkbot.LT.n ) 
THEN 
 2079                           IF( myrow.EQ.rsrc1.AND.mycol.EQ.csrc4.AND.
 
 2080     $                          mod(lkbot,nb).NE.0 ) 
THEN 
 2082                              CALL infog2l( lktop, indx, desch, nprow,
 
 2083     $                             npcol, myrow, mycol, iloc, jloc,
 
 2085                              CALL dlamov( 
'All', ks, hcols,
 
 2086     $                             work( ipw1+dim4 ), lnwin,
 
 2088                              CALL dtrmm( 
'Left', 
'Upper', 
'Transpose',
 
 2089     $                             
'Non-unit', ks, hcols, one,
 
 2090     $                             work( ipu+dim4 ), lnwin,
 
 2092                              CALL dgemm( 
'Transpose', 
'No transpose',
 
 2093     $                             ks, hcols, dim4, one, work(ipu),
 
 2094     $                             lnwin, work(ipw1), lnwin,
 
 2095     $                             one, work(ipw3), ks )
 
 2096                              CALL dlamov( 
'All', ks, hcols,
 
 2098     $                             h((jloc-1)*lldh+iloc), lldh )
 
 2104                           IF( myrow.EQ.rsrc4.AND.mycol.EQ.csrc4.AND.
 
 2105     $                          mod(lkbot,nb).NE.0 ) 
THEN 
 2107                              CALL infog2l( lktop+dim1, indx, desch,
 
 2108     $                             nprow, npcol, myrow, mycol, iloc,
 
 2109     $                             jloc, rsrc4, csrc4 )
 
 2110                              CALL dlamov( 
'All', dim4, hcols,
 
 2111     $                             work( ipw1 ), lnwin,
 
 2112     $                             work( ipw3 ), dim4 )
 
 2113                              CALL dtrmm( 
'Left', 
'Lower', 
'Transpose',
 
 2114     $                             
'Non-unit', dim4, hcols, one,
 
 2115     $                             work( ipu+lnwin*ks ), lnwin,
 
 2116     $                             work( ipw3 ), dim4 )
 
 2117                              CALL dgemm( 
'Transpose', 
'No Transpose',
 
 2118     $                             dim4, hcols, ks, one,
 
 2119     $                             work( ipu+lnwin*ks+dim4 ), lnwin,
 
 2120     $                             work( ipw1+dim1 ), lnwin,
 
 2121     $                             one, work( ipw3), dim4 )
 
 2122                              CALL dlamov( 
'All', dim4, hcols,
 
 2124     $                             h((jloc-1)*lldh+iloc), lldh )
 
 2130                           indxs = iceil(lkbot,nb)*nb+1
 
 2131                           IF( mod(lkbot,nb).NE.0 ) 
THEN 
 2132                              indxe = 
min(n,indxs+(npcol-2)*nb)
 
 2134                              indxe = 
min(n,indxs+(npcol-1)*nb)
 
 2136                           DO 300 indx = indxs, indxe, nb
 
 2137                              IF( myrow.EQ.rsrc1 ) 
THEN 
 2138                                 CALL infog2l( lktop, indx, desch,
 
 2139     $                                nprow, npcol, myrow, mycol, iloc,
 
 2140     $                                jloc, rsrc1, csrc )
 
 2141                                 IF( mycol.EQ.csrc ) 
THEN 
 2142                                    CALL dlamov( 
'All', ks, hcols,
 
 2143     $                                   work( ipw1+dim4 ), lnwin,
 
 2145                                    CALL dtrmm( 
'Left', 
'Upper',
 
 2146     $                                   
'Transpose', 
'Non-unit',
 
 2148     $                                   work( ipu+dim4 ), lnwin,
 
 2150                                    CALL dgemm( 
'Transpose',
 
 2151     $                                   
'No transpose', ks, hcols,
 
 2152     $                                   dim4, one, work(ipu), lnwin,
 
 2153     $                                   work(ipw1), lnwin, one,
 
 2155                                    CALL dlamov( 
'All', ks, hcols,
 
 2157     $                                   h((jloc-1)*lldh+iloc), lldh )
 
 2164                              IF( myrow.EQ.rsrc4 ) 
THEN 
 2165                                 CALL infog2l( lktop+dim1, indx, desch,
 
 2166     $                                nprow, npcol, myrow, mycol, iloc,
 
 2167     $                                jloc, rsrc4, csrc )
 
 2168                                 IF( mycol.EQ.csrc ) 
THEN 
 2169                                    CALL dlamov( 
'All', dim4, hcols,
 
 2170     $                                   work( ipw1 ), lnwin,
 
 2171     $                                   work( ipw3 ), dim4 )
 
 2172                                    CALL dtrmm( 
'Left', 
'Lower',
 
 2173     $                                   
'Transpose',
'Non-unit',
 
 2175     $                                   work( ipu+lnwin*ks ), lnwin,
 
 2176     $                                   work( ipw3 ), dim4 )
 
 2177                                    CALL dgemm( 
'Transpose',
 
 2178     $                                   
'No Transpose', dim4, hcols,
 
 2180     $                                   work( ipu+lnwin*ks+dim4 ),
 
 2181     $                                   lnwin, work( ipw1+dim1 ),
 
 2182     $                                   lnwin, one, work( ipw3),
 
 2184                                    CALL dlamov( 
'All', dim4, hcols,
 
 2186     $                                   h((jloc-1)*lldh+iloc), lldh )
 
 2198                     IF( lkbot.EQ.kbot ) 
THEN 
 2201                        iwork( 1+(win-1)*5 ) = lktop
 
 2202                        iwork( 2+(win-1)*5 ) = lkbot
 
 2204                        lktop = 
min( lktop + lnwin - lchain,
 
 2205     $                       
min( kbot, iceil( lkbot, nb )*nb ) -
 
 2207                        iwork( 1+(win-1)*5 ) = lktop
 
 2208                        lkbot = 
min( 
max( lkbot + lnwin - lchain,
 
 2209     $                       lktop + nwin - 1), 
min( kbot,
 
 2210     $                       iceil( lkbot, nb )*nb ) )
 
 2211                        iwork( 2+(win-1)*5 ) = lkbot
 
 2213                     IF( iwork( 5+(win-1)*5 ).EQ.1 )
 
 2214     $                    iwork( 5+(win-1)*5 ) = 2
 
 2215                     iwork( 3+(win-1)*5 ) = rsrc4
 
 2216                     iwork( 4+(win-1)*5 ) = csrc4
 
 2232     $      
CALL igamx2d( ictxt, 
'All', 
'1-Tree', 1, 1, ichoff, 1,
 
 2233     $           -1, -1, -1, -1, -1 )
 
 2237         IF( ichoff.GT.0 ) 
THEN 
 2238            DO 198 win = 2, anmwin
 
 2239               iwork( 1+(win-2)*5 ) = iwork( 1+(win-1)*5 )
 
 2240               iwork( 2+(win-2)*5 ) = iwork( 2+(win-1)*5 )
 
 2241               iwork( 3+(win-2)*5 ) = iwork( 3+(win-1)*5 )
 
 2242               iwork( 4+(win-2)*5 ) = iwork( 4+(win-1)*5 )
 
 2245            ipiw = 6+(anmwin-1)*5
 
 2250         IF( anmwin.LT.1 ) 
RETURN 
 2255         DO 199 win = 1, anmwin
 
 2256            winfin = winfin+iwork( 5+(win-1)*5 )
 
 2258         IF( winfin.LT.2*anmwin ) 
GO TO 137
 
 2263         DO 201 win = 1, anmwin
 
 2264            iwork( 5+(win-1)*5 ) = 0