254 SUBROUTINE claqr5( 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 H( LDH, * ), S( * ), U( LDU, * ), V( LDV, * ),
270 $ WH( LDWH, * ), WV( LDWV, * ), Z( LDZ, * )
276 PARAMETER ( ZERO = ( 0.0e0, 0.0e0 ),
277 $ one = ( 1.0e0, 0.0e0 ) )
279 PARAMETER ( RZERO = 0.0e0, rone = 1.0e0 )
282 COMPLEX ALPHA, BETA, CDUM, REFSUM
283 REAL 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,
297 INTRINSIC abs, aimag, conjg, max, min, mod, real
310 cabs1( cdum ) = abs( real( cdum ) ) + abs( aimag( cdum ) )
328 ns = nshfts - mod( nshfts, 2 )
332 safmin = slamch(
'SAFE MINIMUM' )
333 safmax = rone / safmin
334 CALL slabad( safmin, safmax )
335 ulp = slamch(
'PRECISION' )
336 smlnum = safmin*( real( 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 claset(
'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 claqr1( 2, h( k+1, k+1 ), ldh, s( 2*m22-1 ),
412 $ s( 2*m22 ), v( 1, m22 ) )
414 CALL clarfg( 2, beta, v( 2, m22 ), 1, v( 1, m22 ) )
417 v( 2, m22 ) = h( k+2, k )
418 CALL clarfg( 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*conjg( v( 2, m22 ) )
439 jbot = min( ndcol, kbot )
440 ELSE IF( wantt )
THEN
446 refsum = conjg( v( 1, m22 ) )*
447 $ ( h( k+1, j )+conjg( 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*conjg( 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*conjg( 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 claqr1( 3, h( ktop, ktop ), ldh, s( 2*m-1 ),
526 $ s( 2*m ), v( 1, m ) )
528 CALL clarfg( 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*conjg( v( 2, m ) )
538 h( k+3, k+2 ) = h( k+3, k+2 ) -
539 $ refsum*conjg( v( 3, m ) )
545 v( 2, m ) = h( k+2, k )
546 v( 3, m ) = h( k+3, k )
547 CALL clarfg( 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 claqr1( 3, h( k+1, k+1 ), ldh, s( 2*m-1 ),
573 CALL clarfg( 3, alpha, vt( 2 ), 1, vt( 1 ) )
574 refsum = conjg( vt( 1 ) )*
575 $ ( h( k+1, k )+conjg( 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*conjg( v( 2, m ) )
619 h( j, k+3 ) = h( j, k+3 ) -
620 $ refsum*conjg( v( 3, m ) )
626 refsum = conjg( v( 1, m ) )*( h( k+1, k+1 )
627 $ +conjg( v( 2, m ) )*h( k+2, k+1 )
628 $ +conjg( 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 = conjg( v( 1, m ) )*
693 $ ( h( k+1, j )+conjg( v( 2, m ) )*
694 $ h( k+2, j )+conjg( 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*conjg( v( 2, m ) )
721 u( j, kms+3 ) = u( j, kms+3 ) -
722 $ refsum*conjg( 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*conjg( v( 2, m ) )
739 z( j, k+3 ) = z( j, k+3 ) -
740 $ refsum*conjg( 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 cgemm(
'C',
'N', nu, jlen, nu, one, u( k1, k1 ),
769 $ ldu, h( incol+k1, jcol ), ldh, zero, wh,
771 CALL clacpy(
'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 cgemm(
'N',
'N', jlen, nu, nu, one,
780 $ h( jrow, incol+k1 ), ldh, u( k1, k1 ),
781 $ ldu, zero, wv, ldwv )
782 CALL clacpy(
'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 cgemm(
'N',
'N', jlen, nu, nu, one,
792 $ z( jrow, incol+k1 ), ldz, u( k1, k1 ),
793 $ ldu, zero, wv, ldwv )
794 CALL clacpy(
'ALL', jlen, nu, wv, ldwv,
795 $ z( jrow, incol+k1 ), ldz )
subroutine slabad(SMALL, LARGE)
SLABAD
subroutine cgemm(TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC)
CGEMM
subroutine ctrmm(SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA, A, LDA, B, LDB)
CTRMM
subroutine claqr5(WANTT, WANTZ, KACC22, N, KTOP, KBOT, NSHFTS, S, H, LDH, ILOZ, IHIZ, Z, LDZ, V, LDV, U, LDU, NV, WV, LDWV, NH, WH, LDWH)
CLAQR5 performs a single small-bulge multi-shift QR sweep.
subroutine claset(UPLO, M, N, ALPHA, BETA, A, LDA)
CLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine clarfg(N, ALPHA, X, INCX, TAU)
CLARFG generates an elementary reflector (Householder matrix).
subroutine claqr1(N, H, LDH, S1, S2, V)
CLAQR1 sets a scalar multiple of the first column of the product of 2-by-2 or 3-by-3 matrix H and spe...
subroutine clacpy(UPLO, M, N, A, LDA, B, LDB)
CLACPY copies all or part of one two-dimensional array to another.