254 SUBROUTINE zlaqr5( WANTT, WANTZ, KACC22, N, KTOP, KBOT, NSHFTS, S,
255 $ H, LDH, ILOZ, IHIZ, Z, LDZ, V, LDV, U, LDU, NV,
256 $ WV, LDWV, NH, WH, LDWH )
264 INTEGER IHIZ, ILOZ, KACC22, KBOT, KTOP, LDH, LDU, LDV,
265 $ ldwh, ldwv, ldz, n, nh, nshfts, nv
269 COMPLEX*16 H( ldh, * ), S( * ), U( ldu, * ), V( ldv, * ),
270 $ wh( ldwh, * ), wv( ldwv, * ), z( ldz, * )
276 parameter( zero = ( 0.0d0, 0.0d0 ),
277 $ one = ( 1.0d0, 0.0d0 ) )
278 DOUBLE PRECISION RZERO, RONE
279 parameter( rzero = 0.0d0, rone = 1.0d0 )
282 COMPLEX*16 ALPHA, BETA, CDUM, REFSUM, T1, T2, T3
283 DOUBLE PRECISION H11, H12, H21, H22, SAFMAX, SAFMIN, SCL,
284 $ smlnum, tst1, tst2, ulp
285 INTEGER I2, I4, INCOL, J, JBOT, JCOL, JLEN,
286 $ jrow, jtop, k, k1, kdu, kms, krcol,
287 $ m, m22, mbot, mtop, nbmps, ndcol,
292 DOUBLE PRECISION DLAMCH
297 INTRINSIC abs, dble, dconjg, dimag, max, min, mod
307 DOUBLE PRECISION CABS1
310 cabs1( cdum ) = abs( dble( cdum ) ) + abs( dimag( cdum ) )
328 ns = nshfts - mod( nshfts, 2 )
332 safmin = dlamch(
'SAFE MINIMUM' )
333 safmax = rone / safmin
334 CALL dlabad( safmin, safmax )
335 ulp = dlamch(
'PRECISION' )
336 smlnum = safmin*( dble( n ) / ulp )
341 accum = ( kacc22.EQ.1 ) .OR. ( kacc22.EQ.2 )
346 $ h( ktop+2, ktop ) = zero
358 DO 180 incol = ktop - 2*nbmps + 1, kbot - 2, 2*nbmps
363 jtop = max( ktop, incol )
364 ELSE IF( wantt )
THEN 372 $
CALL zlaset(
'ALL', kdu, kdu, zero, one, u, ldu )
386 DO 145 krcol = incol, min( incol+2*nbmps-1, kbot-2 )
395 mtop = max( 1, ( ktop-krcol ) / 2+1 )
396 mbot = min( nbmps, ( kbot-krcol-1 ) / 2 )
398 bmp22 = ( mbot.LT.nbmps ) .AND. ( krcol+2*( m22-1 ) ).EQ.
409 k = krcol + 2*( m22-1 )
410 IF( k.EQ.ktop-1 )
THEN 411 CALL zlaqr1( 2, h( k+1, k+1 ), ldh, s( 2*m22-1 ),
412 $ s( 2*m22 ), v( 1, m22 ) )
414 CALL zlarfg( 2, beta, v( 2, m22 ), 1, v( 1, m22 ) )
417 v( 2, m22 ) = h( k+2, k )
418 CALL zlarfg( 2, beta, v( 2, m22 ), 1, v( 1, m22 ) )
428 t2 = t1*dconjg( v( 2, m22 ) )
429 DO 30 j = jtop, min( kbot, k+3 )
430 refsum = h( j, k+1 ) + v( 2, m22 )*h( j, k+2 )
431 h( j, k+1 ) = h( j, k+1 ) - refsum*t1
432 h( j, k+2 ) = h( j, k+2 ) - refsum*t2
439 jbot = min( ndcol, kbot )
440 ELSE IF( wantt )
THEN 445 t1 = dconjg( v( 1, m22 ) )
448 refsum = h( k+1, j ) +
449 $ dconjg( v( 2, m22 ) )*h( k+2, j )
450 h( k+1, j ) = h( k+1, j ) - refsum*t1
451 h( k+2, j ) = h( k+2, j ) - refsum*t2
464 IF( h( k+1, k ).NE.zero )
THEN 465 tst1 = cabs1( h( k, k ) ) + cabs1( h( k+1, k+1 ) )
466 IF( tst1.EQ.rzero )
THEN 468 $ tst1 = tst1 + cabs1( h( k, k-1 ) )
470 $ tst1 = tst1 + cabs1( h( k, k-2 ) )
472 $ tst1 = tst1 + cabs1( h( k, k-3 ) )
474 $ tst1 = tst1 + cabs1( h( k+2, k+1 ) )
476 $ tst1 = tst1 + cabs1( h( k+3, k+1 ) )
478 $ tst1 = tst1 + cabs1( h( k+4, k+1 ) )
480 IF( cabs1( h( k+1, k ) )
481 $ .LE.max( smlnum, ulp*tst1 ) )
THEN 482 h12 = max( cabs1( h( k+1, k ) ),
483 $ cabs1( h( k, k+1 ) ) )
484 h21 = min( cabs1( h( k+1, k ) ),
485 $ cabs1( h( k, k+1 ) ) )
486 h11 = max( cabs1( h( k+1, k+1 ) ),
487 $ cabs1( h( k, k )-h( k+1, k+1 ) ) )
488 h22 = min( cabs1( h( k+1, k+1 ) ),
489 $ cabs1( h( k, k )-h( k+1, k+1 ) ) )
491 tst2 = h22*( h11 / scl )
493 IF( tst2.EQ.rzero .OR. h21*( h12 / scl ).LE.
494 $ max( smlnum, ulp*tst2 ) )h( k+1, k ) = zero
503 DO 50 j = max( 1, ktop-incol ), kdu
504 refsum = v( 1, m22 )*( u( j, kms+1 )+
505 $ v( 2, m22 )*u( j, kms+2 ) )
506 u( j, kms+1 ) = u( j, kms+1 ) - refsum
507 u( j, kms+2 ) = u( j, kms+2 ) -
508 $ refsum*dconjg( v( 2, m22 ) )
510 ELSE IF( wantz )
THEN 512 refsum = v( 1, m22 )*( z( j, k+1 )+v( 2, m22 )*
514 z( j, k+1 ) = z( j, k+1 ) - refsum
515 z( j, k+2 ) = z( j, k+2 ) -
516 $ refsum*dconjg( v( 2, m22 ) )
523 DO 80 m = mbot, mtop, -1
524 k = krcol + 2*( m-1 )
525 IF( k.EQ.ktop-1 )
THEN 526 CALL zlaqr1( 3, h( ktop, ktop ), ldh, s( 2*m-1 ),
527 $ s( 2*m ), v( 1, m ) )
529 CALL zlarfg( 3, alpha, v( 2, m ), 1, v( 1, m ) )
536 refsum = v( 1, m )*v( 3, m )*h( k+3, k+2 )
537 h( k+3, k ) = -refsum
538 h( k+3, k+1 ) = -refsum*dconjg( v( 2, m ) )
539 h( k+3, k+2 ) = h( k+3, k+2 ) -
540 $ refsum*dconjg( v( 3, m ) )
546 v( 2, m ) = h( k+2, k )
547 v( 3, m ) = h( k+3, k )
548 CALL zlarfg( 3, beta, v( 2, m ), 1, v( 1, m ) )
555 IF( h( k+3, k ).NE.zero .OR. h( k+3, k+1 ).NE.
556 $ zero .OR. h( k+3, k+2 ).EQ.zero )
THEN 571 CALL zlaqr1( 3, h( k+1, k+1 ), ldh, s( 2*m-1 ),
574 CALL zlarfg( 3, alpha, vt( 2 ), 1, vt( 1 ) )
575 refsum = dconjg( vt( 1 ) )*
576 $ ( h( k+1, k )+dconjg( vt( 2 ) )*
579 IF( cabs1( h( k+2, k )-refsum*vt( 2 ) )+
580 $ cabs1( refsum*vt( 3 ) ).GT.ulp*
581 $ ( cabs1( h( k, k ) )+cabs1( h( k+1,
582 $ k+1 ) )+cabs1( h( k+2, k+2 ) ) ) )
THEN 598 h( k+1, k ) = h( k+1, k ) - refsum
615 t2 = t1*dconjg( v( 2, m ) )
616 t3 = t1*dconjg( v( 3, m ) )
617 DO 70 j = jtop, min( kbot, k+3 )
618 refsum = h( j, k+1 ) + v( 2, m )*h( j, k+2 )
619 $ + v( 3, m )*h( j, k+3 )
620 h( j, k+1 ) = h( j, k+1 ) - refsum*t1
621 h( j, k+2 ) = h( j, k+2 ) - refsum*t2
622 h( j, k+3 ) = h( j, k+3 ) - refsum*t3
628 t1 = dconjg( v( 1, m ) )
631 refsum = h( k+1, k+1 )
632 $ + dconjg( v( 2, m ) )*h( k+2, k+1 )
633 $ + dconjg( v( 3, m ) )*h( k+3, k+1 )
634 h( k+1, k+1 ) = h( k+1, k+1 ) - refsum*t1
635 h( k+2, k+1 ) = h( k+2, k+1 ) - refsum*t2
636 h( k+3, k+1 ) = h( k+3, k+1 ) - refsum*t3
649 IF( h( k+1, k ).NE.zero )
THEN 650 tst1 = cabs1( h( k, k ) ) + cabs1( h( k+1, k+1 ) )
651 IF( tst1.EQ.rzero )
THEN 653 $ tst1 = tst1 + cabs1( h( k, k-1 ) )
655 $ tst1 = tst1 + cabs1( h( k, k-2 ) )
657 $ tst1 = tst1 + cabs1( h( k, k-3 ) )
659 $ tst1 = tst1 + cabs1( h( k+2, k+1 ) )
661 $ tst1 = tst1 + cabs1( h( k+3, k+1 ) )
663 $ tst1 = tst1 + cabs1( h( k+4, k+1 ) )
665 IF( cabs1( h( k+1, k ) ).LE.max( smlnum, ulp*tst1 ) )
667 h12 = max( cabs1( h( k+1, k ) ),
668 $ cabs1( h( k, k+1 ) ) )
669 h21 = min( cabs1( h( k+1, k ) ),
670 $ cabs1( h( k, k+1 ) ) )
671 h11 = max( cabs1( h( k+1, k+1 ) ),
672 $ cabs1( h( k, k )-h( k+1, k+1 ) ) )
673 h22 = min( cabs1( h( k+1, k+1 ) ),
674 $ cabs1( h( k, k )-h( k+1, k+1 ) ) )
676 tst2 = h22*( h11 / scl )
678 IF( tst2.EQ.rzero .OR. h21*( h12 / scl ).LE.
679 $ max( smlnum, ulp*tst2 ) )h( k+1, k ) = zero
687 jbot = min( ndcol, kbot )
688 ELSE IF( wantt )
THEN 694 DO 100 m = mbot, mtop, -1
695 k = krcol + 2*( m-1 )
696 t1 = dconjg( v( 1, m ) )
699 DO 90 j = max( ktop, krcol + 2*m ), jbot
700 refsum = h( k+1, j ) + dconjg( v( 2, m ) )*h( k+2, j )
701 $ + dconjg( v( 3, m ) )*h( k+3, j )
702 h( k+1, j ) = h( k+1, j ) - refsum*t1
703 h( k+2, j ) = h( k+2, j ) - refsum*t2
704 h( k+3, j ) = h( k+3, j ) - refsum*t3
716 DO 120 m = mbot, mtop, -1
717 k = krcol + 2*( m-1 )
719 i2 = max( 1, ktop-incol )
720 i2 = max( i2, kms-(krcol-incol)+1 )
721 i4 = min( kdu, krcol + 2*( mbot-1 ) - incol + 5 )
723 t2 = t1*dconjg( v( 2, m ) )
724 t3 = t1*dconjg( v( 3, m ) )
726 refsum = u( j, kms+1 ) + v( 2, m )*u( j, kms+2 )
727 $ + v( 3, m )*u( j, kms+3 )
728 u( j, kms+1 ) = u( j, kms+1 ) - refsum*t1
729 u( j, kms+2 ) = u( j, kms+2 ) - refsum*t2
730 u( j, kms+3 ) = u( j, kms+3 ) - refsum*t3
733 ELSE IF( wantz )
THEN 739 DO 140 m = mbot, mtop, -1
740 k = krcol + 2*( m-1 )
742 t2 = t1*dconjg( v( 2, m ) )
743 t3 = t1*dconjg( v( 3, m ) )
744 DO 130 j = iloz, ihiz
745 refsum = z( j, k+1 ) + v( 2, m )*z( j, k+2 )
746 $ + v( 3, m )*z( j, k+3 )
747 z( j, k+1 ) = z( j, k+1 ) - refsum*t1
748 z( j, k+2 ) = z( j, k+2 ) - refsum*t2
749 z( j, k+3 ) = z( j, k+3 ) - refsum*t3
770 k1 = max( 1, ktop-incol )
771 nu = ( kdu-max( 0, ndcol-kbot ) ) - k1 + 1
775 DO 150 jcol = min( ndcol, kbot ) + 1, jbot, nh
776 jlen = min( nh, jbot-jcol+1 )
777 CALL zgemm(
'C',
'N', nu, jlen, nu, one, u( k1, k1 ),
778 $ ldu, h( incol+k1, jcol ), ldh, zero, wh,
780 CALL zlacpy(
'ALL', nu, jlen, wh, ldwh,
781 $ h( incol+k1, jcol ), ldh )
786 DO 160 jrow = jtop, max( ktop, incol ) - 1, nv
787 jlen = min( nv, max( ktop, incol )-jrow )
788 CALL zgemm(
'N',
'N', jlen, nu, nu, one,
789 $ h( jrow, incol+k1 ), ldh, u( k1, k1 ),
790 $ ldu, zero, wv, ldwv )
791 CALL zlacpy(
'ALL', jlen, nu, wv, ldwv,
792 $ h( jrow, incol+k1 ), ldh )
798 DO 170 jrow = iloz, ihiz, nv
799 jlen = min( nv, ihiz-jrow+1 )
800 CALL zgemm(
'N',
'N', jlen, nu, nu, one,
801 $ z( jrow, incol+k1 ), ldz, u( k1, k1 ),
802 $ ldu, zero, wv, ldwv )
803 CALL zlacpy(
'ALL', jlen, nu, wv, ldwv,
804 $ z( jrow, incol+k1 ), ldz )
subroutine ztrmm(SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA, A, LDA, B, LDB)
ZTRMM
subroutine zlarfg(N, ALPHA, X, INCX, TAU)
ZLARFG generates an elementary reflector (Householder matrix).
subroutine zlaqr5(WANTT, WANTZ, KACC22, N, KTOP, KBOT, NSHFTS, S, H, LDH, ILOZ, IHIZ, Z, LDZ, V, LDV, U, LDU, NV, WV, LDWV, NH, WH, LDWH)
ZLAQR5 performs a single small-bulge multi-shift QR sweep.
subroutine zlacpy(UPLO, M, N, A, LDA, B, LDB)
ZLACPY copies all or part of one two-dimensional array to another.
subroutine zgemm(TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC)
ZGEMM
subroutine zlaset(UPLO, M, N, ALPHA, BETA, A, LDA)
ZLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values...
subroutine dlabad(SMALL, LARGE)
DLABAD
subroutine zlaqr1(N, H, LDH, S1, S2, V)
ZLAQR1 sets a scalar multiple of the first column of the product of 2-by-2 or 3-by-3 matrix H and spe...