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, T1, T2, T3
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 ) )
428 t2 = t1*conjg( 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 = conjg( v( 1, m22 ) )
448 refsum = h( k+1, j ) +
449 $ conjg( 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*conjg( 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*conjg( 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 claqr1( 3, h( ktop, ktop ), ldh, s( 2*m-1 ),
527 $ s( 2*m ), v( 1, m ) )
529 CALL clarfg( 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*conjg( v( 2, m ) )
539 h( k+3, k+2 ) = h( k+3, k+2 ) -
540 $ refsum*conjg( v( 3, m ) )
546 v( 2, m ) = h( k+2, k )
547 v( 3, m ) = h( k+3, k )
548 CALL clarfg( 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 claqr1( 3, h( k+1, k+1 ), ldh, s( 2*m-1 ),
574 CALL clarfg( 3, alpha, vt( 2 ), 1, vt( 1 ) )
575 refsum = conjg( vt( 1 ) )*
576 $ ( h( k+1, k )+conjg( 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*conjg( v( 2, m ) )
616 t3 = t1*conjg( 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 = conjg( v( 1, m ) )
631 refsum = h( k+1, k+1 ) + conjg( v( 2, m ) )*h( k+2, k+1 )
632 $ + conjg( v( 3, m ) )*h( k+3, k+1 )
633 h( k+1, k+1 ) = h( k+1, k+1 ) - refsum*t1
634 h( k+2, k+1 ) = h( k+2, k+1 ) - refsum*t2
635 h( k+3, k+1 ) = h( k+3, k+1 ) - refsum*t3
648 IF( h( k+1, k ).NE.zero )
THEN 649 tst1 = cabs1( h( k, k ) ) + cabs1( h( k+1, k+1 ) )
650 IF( tst1.EQ.rzero )
THEN 652 $ tst1 = tst1 + cabs1( h( k, k-1 ) )
654 $ tst1 = tst1 + cabs1( h( k, k-2 ) )
656 $ tst1 = tst1 + cabs1( h( k, k-3 ) )
658 $ tst1 = tst1 + cabs1( h( k+2, k+1 ) )
660 $ tst1 = tst1 + cabs1( h( k+3, k+1 ) )
662 $ tst1 = tst1 + cabs1( h( k+4, k+1 ) )
664 IF( cabs1( h( k+1, k ) ).LE.max( smlnum, ulp*tst1 ) )
666 h12 = max( cabs1( h( k+1, k ) ),
667 $ cabs1( h( k, k+1 ) ) )
668 h21 = min( cabs1( h( k+1, k ) ),
669 $ cabs1( h( k, k+1 ) ) )
670 h11 = max( cabs1( h( k+1, k+1 ) ),
671 $ cabs1( h( k, k )-h( k+1, k+1 ) ) )
672 h22 = min( cabs1( h( k+1, k+1 ) ),
673 $ cabs1( h( k, k )-h( k+1, k+1 ) ) )
675 tst2 = h22*( h11 / scl )
677 IF( tst2.EQ.rzero .OR. h21*( h12 / scl ).LE.
678 $ max( smlnum, ulp*tst2 ) )h( k+1, k ) = zero
686 jbot = min( ndcol, kbot )
687 ELSE IF( wantt )
THEN 693 DO 100 m = mbot, mtop, -1
694 k = krcol + 2*( m-1 )
695 t1 = conjg( v( 1, m ) )
698 DO 90 j = max( ktop, krcol + 2*m ), jbot
699 refsum = h( k+1, j ) + conjg( v( 2, m ) )*
700 $ h( k+2, j ) + conjg( v( 3, m ) )*h( k+3, j )
701 h( k+1, j ) = h( k+1, j ) - refsum*t1
702 h( k+2, j ) = h( k+2, j ) - refsum*t2
703 h( k+3, j ) = h( k+3, j ) - refsum*t3
715 DO 120 m = mbot, mtop, -1
716 k = krcol + 2*( m-1 )
718 i2 = max( 1, ktop-incol )
719 i2 = max( i2, kms-(krcol-incol)+1 )
720 i4 = min( kdu, krcol + 2*( mbot-1 ) - incol + 5 )
722 t2 = t1*conjg( v( 2, m ) )
723 t3 = t1*conjg( v( 3, m ) )
725 refsum = u( j, kms+1 ) + v( 2, m )*u( j, kms+2 )
726 $ + v( 3, m )*u( j, kms+3 )
727 u( j, kms+1 ) = u( j, kms+1 ) - refsum*t1
728 u( j, kms+2 ) = u( j, kms+2 ) - refsum*t2
729 u( j, kms+3 ) = u( j, kms+3 ) - refsum*t3
732 ELSE IF( wantz )
THEN 738 DO 140 m = mbot, mtop, -1
739 k = krcol + 2*( m-1 )
741 t2 = t1*conjg( v( 2, m ) )
742 t3 = t1*conjg( v( 3, m ) )
743 DO 130 j = iloz, ihiz
744 refsum = z( j, k+1 ) + v( 2, m )*z( j, k+2 )
745 $ + v( 3, m )*z( j, k+3 )
746 z( j, k+1 ) = z( j, k+1 ) - refsum*t1
747 z( j, k+2 ) = z( j, k+2 ) - refsum*t2
748 z( j, k+3 ) = z( j, k+3 ) - refsum*t3
769 k1 = max( 1, ktop-incol )
770 nu = ( kdu-max( 0, ndcol-kbot ) ) - k1 + 1
774 DO 150 jcol = min( ndcol, kbot ) + 1, jbot, nh
775 jlen = min( nh, jbot-jcol+1 )
776 CALL cgemm(
'C',
'N', nu, jlen, nu, one, u( k1, k1 ),
777 $ ldu, h( incol+k1, jcol ), ldh, zero, wh,
779 CALL clacpy(
'ALL', nu, jlen, wh, ldwh,
780 $ h( incol+k1, jcol ), ldh )
785 DO 160 jrow = jtop, max( ktop, incol ) - 1, nv
786 jlen = min( nv, max( ktop, incol )-jrow )
787 CALL cgemm(
'N',
'N', jlen, nu, nu, one,
788 $ h( jrow, incol+k1 ), ldh, u( k1, k1 ),
789 $ ldu, zero, wv, ldwv )
790 CALL clacpy(
'ALL', jlen, nu, wv, ldwv,
791 $ h( jrow, incol+k1 ), ldh )
797 DO 170 jrow = iloz, ihiz, nv
798 jlen = min( nv, ihiz-jrow+1 )
799 CALL cgemm(
'N',
'N', jlen, nu, nu, one,
800 $ z( jrow, incol+k1 ), ldz, u( k1, k1 ),
801 $ ldu, zero, wv, ldwv )
802 CALL clacpy(
'ALL', jlen, nu, wv, ldwv,
803 $ z( jrow, incol+k1 ), ldz )
subroutine clarfg(N, ALPHA, X, INCX, TAU)
CLARFG generates an elementary reflector (Householder matrix).
subroutine clacpy(UPLO, M, N, A, LDA, B, LDB)
CLACPY copies all or part of one two-dimensional array to another.
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 cgemm(TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC)
CGEMM
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 slabad(SMALL, LARGE)
SLABAD
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...