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( * ), ( * )
21 DOUBLE PRECISION H( * ), ( * ), 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
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,
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, , 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 )
185 ictxt = desch( ctxt_ )
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 )
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,
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
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
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
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.NOT..OR..NOT.
IF( BLK22 LSAME(JOB,'c
')
641.OR..LE.
$ LNS2 ) THEN
643.EQ..AND..GT..AND.
IF( DIR2 LENCBUF0
644.EQ.
$ MYCOLLCSRC ) 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.EQ..AND..EQ.
IF( MYROWRSRC1MYCOLCSRC1 ) 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.EQ..AND..EQ.
IF( MYROWRSRC1MYCOLCSRC1 ) 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.EQ..AND..GT..AND.
IF( DIR1 LENRBUF0
687.EQ.
$ MYROWLRSRC ) THEN
689.EQ.
IF( ICEIL(LKBOT,NB)ICEIL(KBOT,NB) ) THEN
690 LCOLS = MIN(ICEIL(KBOT,NB)*NB,N) - KBOT
694.GT.
IF( LCOLS0 ) THEN
696 CALL INFOG2L( LKTOP, INDX, DESCH, NPROW,
697 $ NPCOL, MYROW, MYCOL, ILOC, JLOC,
699.EQ..AND..EQ.
IF( MYROWRSRC1MYCOLCSRC1 ) 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
712 CALL INFOG2L( LKTOP, INDX,
713 $ DESCH, NPROW, NPCOL, MYROW, MYCOL,
714 $ ILOC, JLOC, RSRC1, CSRC1 )
715.EQ..AND..EQ.
IF( MYROWRSRC1MYCOLCSRC1 ) 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.EQ..AND..GT..AND.
IF( DIR2 LENCBUF0
749.EQ.
$ MYCOLLCSRC ) 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.EQ..AND..EQ.
IF( MYROWRSRC1MYCOLCSRC1 ) 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.EQ..AND..EQ.
IF( MYROWRSRC1MYCOLCSRC1 ) 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.EQ..AND..GT..AND.
IF( DIR1 LENRBUF0
850.EQ.
$ MYROWLRSRC ) THEN
852 INDXS = ICEIL(LKBOT,NB)*NB + 1
853 DO 120 INDX = INDXS, N, NB
854 CALL INFOG2L( LKTOP, INDX,
855 $ DESCH, NPROW, NPCOL, MYROW, MYCOL, ILOC,
856 $ JLOC, RSRC1, CSRC1 )
857.EQ..AND..EQ.
IF( MYROWRSRC1MYCOLCSRC1 ) 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.EQ.
IF( LKBOTKBOT ) 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.EQ.
IF( LNWINLCHAIN ) IWORK(5+(WIN-1)*5) = 2
930.GT.
IF( ICHOFF0 ) 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.LT.
IF( ANMWIN1 ) 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.EQ.
IF( IWORK( 5+(WIN-1)*5 )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.EQ..OR.
IF( ICEIL(LKTOP,NB)ICEIL(LKBOT,NB)
1036.GE.
$ LKBOTLKTOP2 ) GO TO 165
1037 LNWIN = LKBOT - LKTOP + 1
1038.LE..AND..NE..AND.
IF( LNWINNTINY LKBOTKBOT
1039.NOT..EQ.
$ MOD(LKBOT,NB)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.EQ..AND..EQ..OR.
IF( ( MYROWRSRC1 MYCOLCSRC1 )
1064.EQ..AND..EQ..OR.
$ ( MYROWRSRC2 MYCOLCSRC2 )
1065.EQ..AND..EQ..OR.
$ ( MYROWRSRC3 MYCOLCSRC3 )
1066.EQ..AND..EQ.
$ ( MYROWRSRC4 MYCOLCSRC4 ) ) 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.LT.
IF( DIMLNWIN ) 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.EQ..AND..EQ.
IF( MYROWRSRC1 MYCOLCSRC1 ) 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.NE..OR..NE.
IF( RSRC1RSRC4 CSRC1CSRC4 ) 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.EQ..AND..EQ.
IF( MYROWRSRC4 MYCOLCSRC4 ) 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.NE..OR..NE.
IF( RSRC4RSRC1 CSRC4CSRC1 ) 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.EQ..AND..EQ.
IF( MYROWRSRC2 MYCOLCSRC2 ) 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.NE..OR..NE.
IF( RSRC2RSRC1 CSRC2CSRC1 ) THEN
1143 CALL DGESD2D( ICTXT, DIM1, DIM4,
1144 $ WORK(IPH+DIM1*LNWIN),
1145 $ LNWIN, RSRC1, CSRC1 )
1148.EQ..AND..EQ.
IF( MYROWRSRC2 MYCOLCSRC2 ) THEN
1149.NE..OR..NE.
IF( RSRC2RSRC4 CSRC2CSRC4 ) THEN
1151 CALL DGESD2D( ICTXT, DIM1, DIM4,
1152 $ WORK(IPH+DIM1*LNWIN),
1153 $ LNWIN, RSRC4, CSRC4 )
1156.EQ..AND..EQ.
IF( MYROWRSRC3 MYCOLCSRC3 ) 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.NE..OR..NE.
IF( RSRC3RSRC1 CSRC3CSRC1 ) THEN
1167 CALL DGESD2D( ICTXT, 1, 1,
1168 $ WORK(IPH+(DIM1-1)*LNWIN+DIM1),
1169 $ LNWIN, RSRC1, CSRC1 )
1172.EQ..AND..EQ.
IF( MYROWRSRC3 MYCOLCSRC3 ) THEN
1173.NE..OR..NE.
IF( RSRC3RSRC4 CSRC3CSRC4 ) THEN
1175 CALL DGESD2D( ICTXT, 1, 1,
1176 $ WORK(IPH+(DIM1-1)*LNWIN+DIM1),
1177 $ LNWIN, RSRC4, CSRC4 )
1180.EQ..AND..EQ.
IF( MYROWRSRC1 MYCOLCSRC1 ) THEN
1181.NE..OR..NE.
IF( RSRC1RSRC2 CSRC1CSRC2 ) THEN
1183 CALL DGERV2D( ICTXT, DIM1, DIM4,
1184 $ WORK(IPH+DIM1*LNWIN),
1185 $ LNWIN, RSRC2, CSRC2 )
1187.NE..OR..NE.
IF( RSRC1RSRC3 CSRC1CSRC3 ) THEN
1189 CALL DGERV2D( ICTXT, 1, 1,
1190 $ WORK(IPH+(DIM1-1)*LNWIN+DIM1),
1191 $ LNWIN, RSRC3, CSRC3 )
1194.EQ..AND..EQ.
IF( MYROWRSRC4 MYCOLCSRC4 ) THEN
1195.NE..OR..NE.
IF( RSRC4RSRC2 CSRC4CSRC2 ) THEN
1197 CALL DGERV2D( ICTXT, DIM1, DIM4,
1198 $ WORK(IPH+DIM1*LNWIN),
1199 $ LNWIN, RSRC2, CSRC2 )
1201.NE..OR..NE.
IF( RSRC4RSRC3 CSRC4CSRC3 ) THEN
1203 CALL DGERV2D( ICTXT, 1, 1,
1204 $ WORK(IPH+(DIM1-1)*LNWIN+DIM1),
1205 $ LNWIN, RSRC3, CSRC3 )
1218.EQ..AND..EQ..OR.
IF( (MYROWRSRC1 MYCOLCSRC1)
1219.EQ..AND..EQ.
$ (MYROWRSRC4 MYCOLCSRC4) ) THEN
1220.EQ..AND..EQ..AND.
IF( LKTOPKTOP LKBOTKBOT
1221.LE..OR..LE.
$ (DIM1LCHAIN DIM1NTINY ) ) THEN
1224.EQ..AND.
ELSEIF( LKTOPKTOP
1225.LE..OR..LE.
$ ( DIM1LCHAIN DIM1NTINY ) ) THEN
1226 JOB = 'introduce and chase
'
1227.EQ.
ELSEIF( LKBOTKBOT ) 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.EQ..AND..EQ.
IF( MYROWRSRC1 MYCOLCSRC1 ) 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.EQ..AND..EQ.
IF( MYROWRSRC4 MYCOLCSRC4 ) 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.EQ..AND..EQ.
IF( MYROWRSRC1 MYCOLCSRC1 ) THEN
1285.NE..OR..NE.
IF( RSRC1RSRC3 CSRC1CSRC3 ) THEN
1287 CALL DGESD2D( ICTXT, RWS3, CLS3,
1288 $ WORK( IPH+(DIM1-CLS3)*LNWIN+DIM1 ),
1289 $ LNWIN, RSRC3, CSRC3 )
1292.EQ..AND..EQ.
IF( MYROWRSRC4 MYCOLCSRC4 ) THEN
1293.NE..OR..NE.
IF( RSRC4RSRC2 CSRC4CSRC2 ) THEN
1295 CALL DGESD2D( ICTXT, DIM1, DIM4,
1296 $ WORK( IPH+DIM1*LNWIN),
1297 $ LNWIN, RSRC2, CSRC2 )
1300.EQ..AND..EQ.
IF( MYROWRSRC2 MYCOLCSRC2 ) THEN
1301 ILOC = INDXG2L( LKTOP, NB, MYROW,
1302 $ DESCH( RSRC_ ), NPROW )
1303 JLOC = INDXG2L( LKTOP+DIM1, NB, MYCOL,
1304 $ DESCH( CSRC_ ), NPCOL )
1305.NE..OR..NE.
IF( RSRC2RSRC4 CSRC2CSRC4 ) 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.EQ..AND..EQ.
IF( MYROWRSRC3 MYCOLCSRC3 ) 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.NE..OR..NE.
IF( RSRC3RSRC1 CSRC3CSRC1 ) 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.GT..AND..GT.
IF( RWS31 CLS31 ) THEN
1331 ELEM = WORK( IPH+(DIM1-CLS3)*LNWIN+DIM1+1 )
1332.NE.
IF( ELEMZERO ) 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.EQ..OR..EQ..OR.
IF( MYROWRSRC1 MYCOLCSRC1
1350.EQ..OR..EQ.
$ MYROWRSRC4 MYCOLCSRC4 ) THEN
1351.EQ..OR..EQ.
IF( MYROWRSRC1 MYROWRSRC4 )
1352 $ LENRBUF = LENRBUF + LNWIN*LNWIN
1353.EQ..OR..EQ.
IF( MYCOLCSRC1 MYCOLCSRC4 )
1354 $ LENCBUF = LENCBUF + LNWIN*LNWIN
1372 DO 180 WIN = ODDEVEN+(CHUNKNUM-1)*WCHUNK,
1373 $ MIN(ANMWIN,MAX(1,ODDEVEN+(CHUNKNUM)*WCHUNK-1)), 2
1374.EQ..AND..EQ..OR.
IF( ( LENRBUF0 LENCBUF0 )
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.EQ..AND..EQ..OR.
IF( ( MYROWRSRC1 MYCOLCSRC1 )
1381.EQ..AND..EQ.
$ ( MYROWRSRC4 MYCOLCSRC4 ) ) THEN
1382.EQ..AND..GT..AND.
IF( DIR1 LENRBUF0
1383.GT..AND..GT.
$ NPCOL1 NPROCS2 ) THEN
1384.EQ..OR..EQ.
IF( MYROWRSRC1 ( MYROWRSRC4
1385.AND..NE.
$ RSRC4RSRC1 ) ) 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.EQ..AND..GT..AND.
ELSEIF( DIR2 LENCBUF0
1394.GT..AND..GT.
$ NPROW1 NPROCS2 ) THEN
1395.EQ..OR..EQ.
IF( MYCOLCSRC1 ( MYCOLCSRC4
1396.AND..NE.
$ CSRC4CSRC1 ) ) 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.GT..AND..EQ..OR.
IF( LENRBUF0 ( MYCOLCSRC1
1406.EQ..AND..NE.
$ ( MYCOLCSRC4 CSRC4CSRC1 ) ) )
1407 $ CALL DLAMOV( 'all
', LENRBUF, 1, WORK, LENRBUF,
1408 $ WORK(1+LENRBUF), LENCBUF )
1410.EQ..AND..EQ.
ELSEIF( MYROWRSRC1 DIR1 ) THEN
1411.GT..AND..GT.
IF( LENRBUF0 NPCOL1 )
1412 $ CALL DGEBR2D( ICTXT, 'row
', '1-tree
', LENRBUF,
1413 $ 1, WORK, LENRBUF, RSRC1, CSRC1 )
1415.EQ..AND..EQ.
ELSEIF( MYCOLCSRC1 DIR2 ) THEN
1416.GT..AND..GT.
IF( LENCBUF0 NPROW1 )
1417 $ CALL DGEBR2D( ICTXT, 'col
', '1-tree
', LENCBUF,
1418 $ 1, WORK(1+LENRBUF), LENCBUF, RSRC1, CSRC1 )
1420.EQ..AND..EQ.
ELSEIF( MYROWRSRC4 DIR1 ) THEN
1421.GT..AND..GT.
IF( LENRBUF0 NPCOL1 )
1422 $ CALL DGEBR2D( ICTXT, 'row
', '1-tree
', LENRBUF,
1423 $ 1, WORK, LENRBUF, RSRC4, CSRC4 )
1425.EQ..AND..EQ.
ELSEIF( MYCOLCSRC4 DIR2 ) THEN
1426.GT..AND..GT.
IF( LENCBUF0 NPROW1 )
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.NE.
IF( IWORK( 5+(WIN-1)*5 )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.EQ..OR..EQ..AND..EQ.
IF(((MYCOLCSRC1MYCOLCSRC4)DIR2)
1464.OR..EQ..OR..EQ..AND.
$ ((MYROWRSRC1MYROWRSRC4)
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.EQ.
IF( MYCOLCSRC4 ) 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.EQ..AND..AND..GT.
IF( DIR2 WANTT LENCBUF0 ) THEN
1514.EQ..OR..EQ.
IF( MYCOLCSRC1 MYCOLCSRC4 ) THEN
1515 DO 210 INDX = 1, NPROW
1516.EQ.
IF( MYCOLCSRC1 ) THEN
1517 CALL INFOG2L( 1+(INDX-1)*NB, LKTOP, DESCH,
1518 $ NPROW, NPCOL, MYROW, MYCOL, ILOC,
1519 $ JLOC1, RSRC, CSRC1 )
1520.EQ.
IF( MYROWRSRC ) THEN
1521 CALL DLAMOV( 'all
', HROWS, DIM1,
1522 $ H((JLOC1-1)*LLDH+ILOC), LLDH,
1523 $ WORK(IPW), HROWS )
1524.GT.
IF( NPCOL1 ) 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.EQ.
IF( MYCOLCSRC4 ) THEN
1535 CALL INFOG2L( 1+(INDX-1)*NB, LKTOP+DIM1,
1536 $ DESCH, NPROW, NPCOL, MYROW, MYCOL,
1537 $ ILOC, JLOC4, RSRC, CSRC4 )
1538.EQ.
IF( MYROWRSRC ) THEN
1539 CALL DLAMOV( 'all
', HROWS, DIM4,
1540 $ H((JLOC4-1)*LLDH+ILOC), LLDH,
1541 $ WORK(IPW+HROWS*DIM1), HROWS )
1542.GT.
IF( NPCOL1 ) 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.EQ..AND..AND..GT.
IF( DIR1 WANTT LENRBUF0 ) THEN
1558.EQ..OR..EQ.
IF( MYROWRSRC1 MYROWRSRC4 ) THEN
1559 DO 220 INDX = 1, NPCOL
1560.EQ.
IF( MYROWRSRC1 ) THEN
1561.EQ.
IF( INDX1 ) THEN
1562.LT.
IF( LKBOTN ) THEN
1563 CALL INFOG2L( LKTOP, LKBOT+1, DESCH,
1564 $ NPROW, NPCOL, MYROW, MYCOL,
1565 $ ILOC1, JLOC, RSRC1, CSRC )
1569.NE.
ELSEIF( MOD(LKBOT,NB)0 ) THEN
1570 CALL INFOG2L( LKTOP,
1571 $ (ICEIL(LKBOT,NB)+(INDX-2))*NB+1,
1572 $ DESCH, NPROW, NPCOL, MYROW, MYCOL,
1573 $ ILOC1, JLOC, RSRC1, CSRC )
1575 CALL INFOG2L( LKTOP,
1576 $ (ICEIL(LKBOT,NB)+(INDX-1))*NB+1,
1577 $ DESCH, NPROW, NPCOL, MYROW, MYCOL,
1578 $ ILOC1, JLOC, RSRC1, CSRC )
1580.EQ.
IF( MYCOLCSRC ) THEN
1581 CALL DLAMOV( 'all
', DIM1, HCOLS,
1582 $ H((JLOC-1)*LLDH+ILOC1), LLDH,
1583 $ WORK(IPW1), LNWIN )
1584.GT.
IF( NPROW1 ) 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.EQ.
IF( MYROWRSRC4 ) THEN
1596.EQ.
IF( INDX1 ) THEN
1597.LT.
IF( LKBOTN ) THEN
1598 CALL INFOG2L( LKTOP+DIM1, LKBOT+1,
1599 $ DESCH, NPROW, NPCOL, MYROW,
1600 $ MYCOL, ILOC4, JLOC, RSRC4,
1605.NE.
ELSEIF( MOD(LKBOT,NB)0 ) THEN
1606 CALL INFOG2L( LKTOP+DIM1,
1607 $ (ICEIL(LKBOT,NB)+(INDX-2))*NB+1,
1608 $ DESCH, NPROW, NPCOL, MYROW, MYCOL,
1609 $ ILOC4, JLOC, RSRC4, CSRC )
1611 CALL INFOG2L( LKTOP+DIM1,
1612 $ (ICEIL(LKBOT,NB)+(INDX-1))*NB+1,
1613 $ DESCH, NPROW, NPCOL, MYROW, MYCOL,
1614 $ ILOC4, JLOC, RSRC4, CSRC )
1616.EQ.
IF( MYCOLCSRC ) THEN
1617 CALL DLAMOV( 'all
', DIM4, HCOLS,
1618 $ H((JLOC-1)*LLDH+ILOC4), LLDH,
1619 $ WORK(IPW1+DIM1), LNWIN )
1620.GT.
IF( NPROW1 ) 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.EQ..AND..AND..GT.
IF( DIR2 WANTZ LENCBUF0) THEN
1637.EQ..OR..EQ.
IF( MYCOLCSRC1 MYCOLCSRC4 ) THEN
1638 DO 230 INDX = 1, NPROW
1639.EQ.
IF( MYCOLCSRC1 ) THEN
1640 CALL INFOG2L( 1+(INDX-1)*NB, LKTOP,
1641 $ DESCZ, NPROW, NPCOL, MYROW, MYCOL,
1642 $ ILOC, JLOC1, RSRC, CSRC1 )
1643.EQ.
IF( MYROWRSRC ) THEN
1644 CALL DLAMOV( 'all
', ZROWS, DIM1,
1645 $ Z((JLOC1-1)*LLDZ+ILOC), LLDZ,
1646 $ WORK(IPW2), ZROWS )
1647.GT.
IF( NPCOL1 ) 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.EQ.
IF( MYCOLCSRC4 ) THEN
1659 CALL INFOG2L( 1+(INDX-1)*NB,
1660 $ LKTOP+DIM1, DESCZ, NPROW, NPCOL,
1661 $ MYROW, MYCOL, ILOC, JLOC4, RSRC,
1663.EQ.
IF( MYROWRSRC ) THEN
1664 CALL DLAMOV( 'all
', ZROWS, DIM4,
1665 $ Z((JLOC4-1)*LLDZ+ILOC), LLDZ,
1666 $ WORK(IPW2+ZROWS*DIM1), ZROWS )
1667.GT.
IF( NPCOL1 ) 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.NE.
IF( IWORK( 5+(WIN-1)*5 )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.EQ..OR..EQ..AND..EQ.
IF(((MYCOLCSRC1MYCOLCSRC4)DIR2)
1720.OR..EQ..OR..EQ..AND.
$ ((MYROWRSRC1MYROWRSRC4)
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.EQ.
IF( MYCOLCSRC4 ) 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.EQ..AND..EQ.
IF( LKTOPKTOP LKBOTKBOT ) THEN
1781.EQ..AND.
ELSEIF( LKTOPKTOP
1782.LT..OR..LE.
$ ( DIM1LCHAIN+1 DIM1NTINY ) )
1784 JOB = 'introduce and chase
'
1785.EQ.
ELSEIF( LKBOTKBOT ) THEN
1786 JOB = 'off-chase bulges
'
1788 JOB = 'chase bulges
'
1795 KS = DIM1+DIM4-LNS/2*3
1796.NOT..OR..NE..OR.
IF( BLK22 DIM1KS
1797.NE..OR.
$ DIM4KS LSAME(JOB,'i.OR.
')
1798 $ LSAME(JOB,'o.OR..LE.
') LNS2 ) THEN
1802.EQ..AND..AND..GT.
IF( DIR2 WANTT LENCBUF0 ) THEN
1803 DO 250 INDX = 1, MIN(LKTOP-1,1+(NPROW-1)*NB), NB
1804.EQ.
IF( MYCOLCSRC1 ) THEN
1805 CALL INFOG2L( INDX, LKTOP, DESCH, NPROW,
1806 $ NPCOL, MYROW, MYCOL, ILOC, JLOC,
1808.EQ.
IF( MYROWRSRC ) 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.EQ.
IF( MYCOLCSRC4 ) THEN
1820 CALL INFOG2L( INDX, LKTOP+DIM1, DESCH,
1821 $ NPROW, NPCOL, MYROW, MYCOL, ILOC,
1822 $ JLOC, RSRC, CSRC4 )
1823.EQ.
IF( MYROWRSRC ) 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.EQ..AND..AND..GT.
IF( DIR2 WANTZ LENCBUF0 ) THEN
1838 DO 260 INDX = 1, MIN(N,1+(NPROW-1)*NB), NB
1839.EQ.
IF( MYCOLCSRC1 ) THEN
1840 CALL INFOG2L( INDX, LKTOP, DESCZ, NPROW,
1841 $ NPCOL, MYROW, MYCOL, ILOC, JLOC,
1843.EQ.
IF( MYROWRSRC ) 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.EQ.
IF( MYCOLCSRC4 ) THEN
1855 CALL INFOG2L( INDX, LKTOP+DIM1, DESCZ,
1856 $ NPROW, NPCOL, MYROW, MYCOL, ILOC,
1857 $ JLOC, RSRC, CSRC4 )
1858.EQ.
IF( MYROWRSRC ) 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.EQ..AND..AND..GT.
IF( DIR1 WANTT LENRBUF0 ) THEN
1876.LT.
IF( LKBOTN ) THEN
1877.EQ..AND..EQ..AND.
IF( MYROWRSRC1MYCOLCSRC4
1878.NE.
$ MOD(LKBOT,NB)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.EQ..AND..EQ..AND.
IF( MYROWRSRC4MYCOLCSRC4
1892.NE.
$ MOD(LKBOT,NB)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.NE.
IF( MOD(LKBOT,NB)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.EQ.
IF( MYROWRSRC1 ) THEN
1914 CALL INFOG2L( LKTOP, INDX, DESCH,
1915 $ NPROW, NPCOL, MYROW, MYCOL, ILOC,
1916 $ JLOC, RSRC1, CSRC )
1917.EQ.
IF( MYCOLCSRC ) 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.EQ.
IF( MYROWRSRC4 ) THEN
1929 CALL INFOG2L( LKTOP+DIM1, INDX, DESCH,
1930 $ NPROW, NPCOL, MYROW, MYCOL, ILOC,
1931 $ JLOC, RSRC4, CSRC )
1932.EQ.
IF( MYCOLCSRC ) 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.EQ..AND..AND..GT.
IF( DIR2 WANTT LENCBUF0 ) THEN
1954 INDXE = MIN(LKTOP-1,1+(NPROW-1)*NB)
1955 DO 280 INDX = 1, INDXE, NB
1956.EQ.
IF( MYCOLCSRC1 ) THEN
1957 CALL INFOG2L( INDX, LKTOP, DESCH, NPROW,
1958 $ NPCOL, MYROW, MYCOL, ILOC, JLOC,
1960.EQ.
IF( MYROWRSRC ) 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.EQ.
IF( MYCOLCSRC4 ) THEN
1984 CALL INFOG2L( INDX, LKTOP+DIM1, DESCH,
1985 $ NPROW, NPCOL, MYROW, MYCOL, ILOC,
1986 $ JLOC, RSRC, CSRC4 )
1987.EQ.
IF( MYROWRSRC ) 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.EQ..AND..AND..GT.
IF( DIR2 WANTZ LENCBUF0 ) THEN
2015 INDXE = MIN(N,1+(NPROW-1)*NB)
2016 DO 290 INDX = 1, INDXE, NB
2017.EQ.
IF( MYCOLCSRC1 ) THEN
2018 CALL INFOG2L( INDX, I, DESCZ, NPROW,
2019 $ NPCOL, MYROW, MYCOL, ILOC, JLOC,
2021.EQ.
IF( MYROWRSRC ) 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.EQ.
IF( MYCOLCSRC4 ) THEN
2045 CALL INFOG2L( INDX, I+DIM1, DESCZ,
2046 $ NPROW, NPCOL, MYROW, MYCOL, ILOC,
2047 $ JLOC, RSRC, CSRC4 )
2048.EQ.
IF( MYROWRSRC ) 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.EQ..AND..AND..GT.
IF( DIR1 WANTT LENRBUF0) THEN
2074.LT.
IF ( LKBOTN ) THEN
2079.EQ..AND..EQ..AND.
IF( MYROWRSRC1MYCOLCSRC4
2080.NE.
$ MOD(LKBOT,NB)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.EQ..AND..EQ..AND.
IF( MYROWRSRC4MYCOLCSRC4
2105.NE.
$ MOD(LKBOT,NB)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
', 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.NE.
IF( MOD(LKBOT,NB)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.EQ.
IF( MYROWRSRC1 ) THEN
2138 CALL INFOG2L( LKTOP, INDX, DESCH,
2139 $ NPROW, NPCOL, MYROW, MYCOL, ILOC,
2140 $ JLOC, RSRC1, CSRC )
2141.EQ.
IF( MYCOLCSRC ) 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.EQ.
IF( MYROWRSRC4 ) THEN
2165 CALL INFOG2L( LKTOP+DIM1, INDX, DESCH,
2166 $ NPROW, NPCOL, MYROW, MYCOL, ILOC,
2167 $ JLOC, RSRC4, CSRC )
2168.EQ.
IF( MYCOLCSRC ) 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