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
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 ) )
427 DO 30 j = jtop, min( kbot, k+3 )
428 refsum = v( 1, m22 )*( h( j, k+1 )+v( 2, m22 )*
430 h( j, k+1 ) = h( j, k+1 ) - refsum
431 h( j, k+2 ) = h( j, k+2 ) -
432 $ refsum*dconjg( v( 2, m22 ) )
439 jbot = min( ndcol, kbot )
440 ELSE IF( wantt )
THEN
446 refsum = dconjg( v( 1, m22 ) )*
447 $ ( h( k+1, j )+dconjg( v( 2, m22 ) )*
449 h( k+1, j ) = h( k+1, j ) - refsum
450 h( k+2, j ) = h( k+2, j ) - refsum*v( 2, m22 )
463 IF( h( k+1, k ).NE.zero )
THEN
464 tst1 = cabs1( h( k, k ) ) + cabs1( h( k+1, k+1 ) )
465 IF( tst1.EQ.rzero )
THEN
467 $ tst1 = tst1 + cabs1( h( k, k-1 ) )
469 $ tst1 = tst1 + cabs1( h( k, k-2 ) )
471 $ tst1 = tst1 + cabs1( h( k, k-3 ) )
473 $ tst1 = tst1 + cabs1( h( k+2, k+1 ) )
475 $ tst1 = tst1 + cabs1( h( k+3, k+1 ) )
477 $ tst1 = tst1 + cabs1( h( k+4, k+1 ) )
479 IF( cabs1( h( k+1, k ) )
480 $ .LE.max( smlnum, ulp*tst1 ) )
THEN
481 h12 = max( cabs1( h( k+1, k ) ),
482 $ cabs1( h( k, k+1 ) ) )
483 h21 = min( cabs1( h( k+1, k ) ),
484 $ cabs1( h( k, k+1 ) ) )
485 h11 = max( cabs1( h( k+1, k+1 ) ),
486 $ cabs1( h( k, k )-h( k+1, k+1 ) ) )
487 h22 = min( cabs1( h( k+1, k+1 ) ),
488 $ cabs1( h( k, k )-h( k+1, k+1 ) ) )
490 tst2 = h22*( h11 / scl )
492 IF( tst2.EQ.rzero .OR. h21*( h12 / scl ).LE.
493 $ max( smlnum, ulp*tst2 ) )h( k+1, k ) = zero
502 DO 50 j = max( 1, ktop-incol ), kdu
503 refsum = v( 1, m22 )*( u( j, kms+1 )+
504 $ v( 2, m22 )*u( j, kms+2 ) )
505 u( j, kms+1 ) = u( j, kms+1 ) - refsum
506 u( j, kms+2 ) = u( j, kms+2 ) -
507 $ refsum*dconjg( v( 2, m22 ) )
509 ELSE IF( wantz )
THEN
511 refsum = v( 1, m22 )*( z( j, k+1 )+v( 2, m22 )*
513 z( j, k+1 ) = z( j, k+1 ) - refsum
514 z( j, k+2 ) = z( j, k+2 ) -
515 $ refsum*dconjg( v( 2, m22 ) )
522 DO 80 m = mbot, mtop, -1
523 k = krcol + 2*( m-1 )
524 IF( k.EQ.ktop-1 )
THEN
525 CALL zlaqr1( 3, h( ktop, ktop ), ldh, s( 2*m-1 ),
526 $ s( 2*m ), v( 1, m ) )
528 CALL zlarfg( 3, alpha, v( 2, m ), 1, v( 1, m ) )
535 refsum = v( 1, m )*v( 3, m )*h( k+3, k+2 )
536 h( k+3, k ) = -refsum
537 h( k+3, k+1 ) = -refsum*dconjg( v( 2, m ) )
538 h( k+3, k+2 ) = h( k+3, k+2 ) -
539 $ refsum*dconjg( v( 3, m ) )
545 v( 2, m ) = h( k+2, k )
546 v( 3, m ) = h( k+3, k )
547 CALL zlarfg( 3, beta, v( 2, m ), 1, v( 1, m ) )
554 IF( h( k+3, k ).NE.zero .OR. h( k+3, k+1 ).NE.
555 $ zero .OR. h( k+3, k+2 ).EQ.zero )
THEN
570 CALL zlaqr1( 3, h( k+1, k+1 ), ldh, s( 2*m-1 ),
573 CALL zlarfg( 3, alpha, vt( 2 ), 1, vt( 1 ) )
574 refsum = dconjg( vt( 1 ) )*
575 $ ( h( k+1, k )+dconjg( vt( 2 ) )*
578 IF( cabs1( h( k+2, k )-refsum*vt( 2 ) )+
579 $ cabs1( refsum*vt( 3 ) ).GT.ulp*
580 $ ( cabs1( h( k, k ) )+cabs1( h( k+1,
581 $ k+1 ) )+cabs1( h( k+2, k+2 ) ) ) )
THEN
597 h( k+1, k ) = h( k+1, k ) - refsum
613 DO 70 j = jtop, min( kbot, k+3 )
614 refsum = v( 1, m )*( h( j, k+1 )+v( 2, m )*
615 $ h( j, k+2 )+v( 3, m )*h( j, k+3 ) )
616 h( j, k+1 ) = h( j, k+1 ) - refsum
617 h( j, k+2 ) = h( j, k+2 ) -
618 $ refsum*dconjg( v( 2, m ) )
619 h( j, k+3 ) = h( j, k+3 ) -
620 $ refsum*dconjg( v( 3, m ) )
626 refsum = dconjg( v( 1, m ) )*( h( k+1, k+1 )
627 $ +dconjg( v( 2, m ) )*h( k+2, k+1 )
628 $ +dconjg( v( 3, m ) )*h( k+3, k+1 ) )
629 h( k+1, k+1 ) = h( k+1, k+1 ) - refsum
630 h( k+2, k+1 ) = h( k+2, k+1 ) - refsum*v( 2, m )
631 h( k+3, k+1 ) = h( k+3, k+1 ) - refsum*v( 3, m )
644 IF( h( k+1, k ).NE.zero )
THEN
645 tst1 = cabs1( h( k, k ) ) + cabs1( h( k+1, k+1 ) )
646 IF( tst1.EQ.rzero )
THEN
648 $ tst1 = tst1 + cabs1( h( k, k-1 ) )
650 $ tst1 = tst1 + cabs1( h( k, k-2 ) )
652 $ tst1 = tst1 + cabs1( h( k, k-3 ) )
654 $ tst1 = tst1 + cabs1( h( k+2, k+1 ) )
656 $ tst1 = tst1 + cabs1( h( k+3, k+1 ) )
658 $ tst1 = tst1 + cabs1( h( k+4, k+1 ) )
660 IF( cabs1( h( k+1, k ) ).LE.max( smlnum, ulp*tst1 ) )
662 h12 = max( cabs1( h( k+1, k ) ),
663 $ cabs1( h( k, k+1 ) ) )
664 h21 = min( cabs1( h( k+1, k ) ),
665 $ cabs1( h( k, k+1 ) ) )
666 h11 = max( cabs1( h( k+1, k+1 ) ),
667 $ cabs1( h( k, k )-h( k+1, k+1 ) ) )
668 h22 = min( cabs1( h( k+1, k+1 ) ),
669 $ cabs1( h( k, k )-h( k+1, k+1 ) ) )
671 tst2 = h22*( h11 / scl )
673 IF( tst2.EQ.rzero .OR. h21*( h12 / scl ).LE.
674 $ max( smlnum, ulp*tst2 ) )h( k+1, k ) = zero
682 jbot = min( ndcol, kbot )
683 ELSE IF( wantt )
THEN
689 DO 100 m = mbot, mtop, -1
690 k = krcol + 2*( m-1 )
691 DO 90 j = max( ktop, krcol + 2*m ), jbot
692 refsum = dconjg( v( 1, m ) )*
693 $ ( h( k+1, j )+dconjg( v( 2, m ) )*
694 $ h( k+2, j )+dconjg( v( 3, m ) )*h( k+3, j ) )
695 h( k+1, j ) = h( k+1, j ) - refsum
696 h( k+2, j ) = h( k+2, j ) - refsum*v( 2, m )
697 h( k+3, j ) = h( k+3, j ) - refsum*v( 3, m )
709 DO 120 m = mbot, mtop, -1
710 k = krcol + 2*( m-1 )
712 i2 = max( 1, ktop-incol )
713 i2 = max( i2, kms-(krcol-incol)+1 )
714 i4 = min( kdu, krcol + 2*( mbot-1 ) - incol + 5 )
716 refsum = v( 1, m )*( u( j, kms+1 )+v( 2, m )*
717 $ u( j, kms+2 )+v( 3, m )*u( j, kms+3 ) )
718 u( j, kms+1 ) = u( j, kms+1 ) - refsum
719 u( j, kms+2 ) = u( j, kms+2 ) -
720 $ refsum*dconjg( v( 2, m ) )
721 u( j, kms+3 ) = u( j, kms+3 ) -
722 $ refsum*dconjg( v( 3, m ) )
725 ELSE IF( wantz )
THEN
731 DO 140 m = mbot, mtop, -1
732 k = krcol + 2*( m-1 )
733 DO 130 j = iloz, ihiz
734 refsum = v( 1, m )*( z( j, k+1 )+v( 2, m )*
735 $ z( j, k+2 )+v( 3, m )*z( j, k+3 ) )
736 z( j, k+1 ) = z( j, k+1 ) - refsum
737 z( j, k+2 ) = z( j, k+2 ) -
738 $ refsum*dconjg( v( 2, m ) )
739 z( j, k+3 ) = z( j, k+3 ) -
740 $ refsum*dconjg( v( 3, m ) )
761 k1 = max( 1, ktop-incol )
762 nu = ( kdu-max( 0, ndcol-kbot ) ) - k1 + 1
766 DO 150 jcol = min( ndcol, kbot ) + 1, jbot, nh
767 jlen = min( nh, jbot-jcol+1 )
768 CALL zgemm(
'C',
'N', nu, jlen, nu, one, u( k1, k1 ),
769 $ ldu, h( incol+k1, jcol ), ldh, zero, wh,
771 CALL zlacpy(
'ALL', nu, jlen, wh, ldwh,
772 $ h( incol+k1, jcol ), ldh )
777 DO 160 jrow = jtop, max( ktop, incol ) - 1, nv
778 jlen = min( nv, max( ktop, incol )-jrow )
779 CALL zgemm(
'N',
'N', jlen, nu, nu, one,
780 $ h( jrow, incol+k1 ), ldh, u( k1, k1 ),
781 $ ldu, zero, wv, ldwv )
782 CALL zlacpy(
'ALL', jlen, nu, wv, ldwv,
783 $ h( jrow, incol+k1 ), ldh )
789 DO 170 jrow = iloz, ihiz, nv
790 jlen = min( nv, ihiz-jrow+1 )
791 CALL zgemm(
'N',
'N', jlen, nu, nu, one,
792 $ z( jrow, incol+k1 ), ldz, u( k1, k1 ),
793 $ ldu, zero, wv, ldwv )
794 CALL zlacpy(
'ALL', jlen, nu, wv, ldwv,
795 $ z( jrow, incol+k1 ), ldz )
subroutine dlabad(SMALL, LARGE)
DLABAD
subroutine zgemm(TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC)
ZGEMM
subroutine ztrmm(SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA, A, LDA, B, LDB)
ZTRMM
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 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...
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 zlarfg(N, ALPHA, X, INCX, TAU)
ZLARFG generates an elementary reflector (Householder matrix).