248 SUBROUTINE claqr5( WANTT, WANTZ, KACC22, N, KTOP, KBOT, NSHFTS, S,
249 $ H, LDH, ILOZ, IHIZ, Z, LDZ, V, LDV, U, LDU, NV,
250 $ WV, LDWV, NH, WH, LDWH )
258 INTEGER IHIZ, ILOZ, KACC22, KBOT, KTOP, LDH, LDU, LDV,
259 $ ldwh, ldwv, ldz, n, nh, nshfts, nv
263 COMPLEX H( ldh, * ), S( * ), U( ldu, * ), V( ldv, * ),
264 $ wh( ldwh, * ), wv( ldwv, * ), z( ldz, * )
270 parameter( zero = ( 0.0e0, 0.0e0 ),
271 $ one = ( 1.0e0, 0.0e0 ) )
273 parameter( rzero = 0.0e0, rone = 1.0e0 )
276 COMPLEX ALPHA, BETA, CDUM, REFSUM
277 REAL H11, H12, H21, H22, SAFMAX, SAFMIN, SCL,
278 $ smlnum, tst1, tst2, ulp
279 INTEGER I2, I4, INCOL, J, J2, J4, JBOT, JCOL, JLEN,
280 $ jrow, jtop, k, k1, kdu, kms, knz, krcol, kzs,
281 $ m, m22, mbot, mend, mstart, mtop, nbmps, ndcol,
283 LOGICAL ACCUM, BLK22, BMP22
291 INTRINSIC abs, aimag, conjg, max, min, mod, real
304 cabs1( cdum ) = abs(
REAL( CDUM ) ) + abs( AIMAG( cdum ) )
322 ns = nshfts - mod( nshfts, 2 )
326 safmin = slamch(
'SAFE MINIMUM' )
327 safmax = rone / safmin
328 CALL slabad( safmin, safmax )
329 ulp = slamch(
'PRECISION' )
330 smlnum = safmin*(
REAL( N ) / ULP )
335 accum = ( kacc22.EQ.1 ) .OR. ( kacc22.EQ.2 )
339 blk22 = ( ns.GT.2 ) .AND. ( kacc22.EQ.2 )
344 $ h( ktop+2, ktop ) = zero
356 DO 210 incol = 3*( 1-nbmps ) + ktop - 1, kbot - 2, 3*nbmps - 2
359 $
CALL claset(
'ALL', kdu, kdu, zero, one, u, ldu )
373 DO 140 krcol = incol, min( incol+3*nbmps-3, kbot-2 )
382 mtop = max( 1, ( ( ktop-1 )-krcol+2 ) / 3+1 )
383 mbot = min( nbmps, ( kbot-krcol ) / 3 )
385 bmp22 = ( mbot.LT.nbmps ) .AND. ( krcol+3*( m22-1 ) ).EQ.
392 k = krcol + 3*( m-1 )
393 IF( k.EQ.ktop-1 )
THEN 394 CALL claqr1( 3, h( ktop, ktop ), ldh, s( 2*m-1 ),
395 $ s( 2*m ), v( 1, m ) )
397 CALL clarfg( 3, alpha, v( 2, m ), 1, v( 1, m ) )
400 v( 2, m ) = h( k+2, k )
401 v( 3, m ) = h( k+3, k )
402 CALL clarfg( 3, beta, v( 2, m ), 1, v( 1, m ) )
409 IF( h( k+3, k ).NE.zero .OR. h( k+3, k+1 ).NE.
410 $ zero .OR. h( k+3, k+2 ).EQ.zero )
THEN 425 CALL claqr1( 3, h( k+1, k+1 ), ldh, s( 2*m-1 ),
428 CALL clarfg( 3, alpha, vt( 2 ), 1, vt( 1 ) )
429 refsum = conjg( vt( 1 ) )*
430 $ ( h( k+1, k )+conjg( vt( 2 ) )*
433 IF( cabs1( h( k+2, k )-refsum*vt( 2 ) )+
434 $ cabs1( refsum*vt( 3 ) ).GT.ulp*
435 $ ( cabs1( h( k, k ) )+cabs1( h( k+1,
436 $ k+1 ) )+cabs1( h( k+2, k+2 ) ) ) )
THEN 452 h( k+1, k ) = h( k+1, k ) - refsum
465 k = krcol + 3*( m22-1 )
467 IF( k.EQ.ktop-1 )
THEN 468 CALL claqr1( 2, h( k+1, k+1 ), ldh, s( 2*m22-1 ),
469 $ s( 2*m22 ), v( 1, m22 ) )
471 CALL clarfg( 2, beta, v( 2, m22 ), 1, v( 1, m22 ) )
474 v( 2, m22 ) = h( k+2, k )
475 CALL clarfg( 2, beta, v( 2, m22 ), 1, v( 1, m22 ) )
484 jbot = min( ndcol, kbot )
485 ELSE IF( wantt )
THEN 490 DO 30 j = max( ktop, krcol ), jbot
491 mend = min( mbot, ( j-krcol+2 ) / 3 )
493 k = krcol + 3*( m-1 )
494 refsum = conjg( v( 1, m ) )*
495 $ ( h( k+1, j )+conjg( v( 2, m ) )*h( k+2, j )+
496 $ conjg( v( 3, m ) )*h( k+3, j ) )
497 h( k+1, j ) = h( k+1, j ) - refsum
498 h( k+2, j ) = h( k+2, j ) - refsum*v( 2, m )
499 h( k+3, j ) = h( k+3, j ) - refsum*v( 3, m )
503 k = krcol + 3*( m22-1 )
504 DO 40 j = max( k+1, ktop ), jbot
505 refsum = conjg( v( 1, m22 ) )*
506 $ ( h( k+1, j )+conjg( v( 2, m22 ) )*
508 h( k+1, j ) = h( k+1, j ) - refsum
509 h( k+2, j ) = h( k+2, j ) - refsum*v( 2, m22 )
518 jtop = max( ktop, incol )
519 ELSE IF( wantt )
THEN 525 IF( v( 1, m ).NE.zero )
THEN 526 k = krcol + 3*( m-1 )
527 DO 50 j = jtop, min( kbot, k+3 )
528 refsum = v( 1, m )*( h( j, k+1 )+v( 2, m )*
529 $ h( j, k+2 )+v( 3, m )*h( j, k+3 ) )
530 h( j, k+1 ) = h( j, k+1 ) - refsum
531 h( j, k+2 ) = h( j, k+2 ) -
532 $ refsum*conjg( v( 2, m ) )
533 h( j, k+3 ) = h( j, k+3 ) -
534 $ refsum*conjg( v( 3, m ) )
544 DO 60 j = max( 1, ktop-incol ), kdu
545 refsum = v( 1, m )*( u( j, kms+1 )+v( 2, m )*
546 $ u( j, kms+2 )+v( 3, m )*u( j, kms+3 ) )
547 u( j, kms+1 ) = u( j, kms+1 ) - refsum
548 u( j, kms+2 ) = u( j, kms+2 ) -
549 $ refsum*conjg( v( 2, m ) )
550 u( j, kms+3 ) = u( j, kms+3 ) -
551 $ refsum*conjg( v( 3, m ) )
553 ELSE IF( wantz )
THEN 560 refsum = v( 1, m )*( z( j, k+1 )+v( 2, m )*
561 $ z( j, k+2 )+v( 3, m )*z( j, k+3 ) )
562 z( j, k+1 ) = z( j, k+1 ) - refsum
563 z( j, k+2 ) = z( j, k+2 ) -
564 $ refsum*conjg( v( 2, m ) )
565 z( j, k+3 ) = z( j, k+3 ) -
566 $ refsum*conjg( v( 3, m ) )
574 k = krcol + 3*( m22-1 )
576 IF ( v( 1, m22 ).NE.zero )
THEN 577 DO 90 j = jtop, min( kbot, k+3 )
578 refsum = v( 1, m22 )*( h( j, k+1 )+v( 2, m22 )*
580 h( j, k+1 ) = h( j, k+1 ) - refsum
581 h( j, k+2 ) = h( j, k+2 ) -
582 $ refsum*conjg( v( 2, m22 ) )
587 DO 100 j = max( 1, ktop-incol ), kdu
588 refsum = v( 1, m22 )*( u( j, kms+1 )+
589 $ v( 2, m22 )*u( j, kms+2 ) )
590 u( j, kms+1 ) = u( j, kms+1 ) - refsum
591 u( j, kms+2 ) = u( j, kms+2 ) -
592 $ refsum*conjg( v( 2, m22 ) )
594 ELSE IF( wantz )
THEN 595 DO 110 j = iloz, ihiz
596 refsum = v( 1, m22 )*( z( j, k+1 )+v( 2, m22 )*
598 z( j, k+1 ) = z( j, k+1 ) - refsum
599 z( j, k+2 ) = z( j, k+2 ) -
600 $ refsum*conjg( v( 2, m22 ) )
609 IF( krcol+3*( mstart-1 ).LT.ktop )
610 $ mstart = mstart + 1
614 IF( krcol.EQ.kbot-2 )
616 DO 120 m = mstart, mend
617 k = min( kbot-1, krcol+3*( m-1 ) )
628 IF( h( k+1, k ).NE.zero )
THEN 629 tst1 = cabs1( h( k, k ) ) + cabs1( h( k+1, k+1 ) )
630 IF( tst1.EQ.rzero )
THEN 632 $ tst1 = tst1 + cabs1( h( k, k-1 ) )
634 $ tst1 = tst1 + cabs1( h( k, k-2 ) )
636 $ tst1 = tst1 + cabs1( h( k, k-3 ) )
638 $ tst1 = tst1 + cabs1( h( k+2, k+1 ) )
640 $ tst1 = tst1 + cabs1( h( k+3, k+1 ) )
642 $ tst1 = tst1 + cabs1( h( k+4, k+1 ) )
644 IF( cabs1( h( k+1, k ) ).LE.max( smlnum, ulp*tst1 ) )
646 h12 = max( cabs1( h( k+1, k ) ),
647 $ cabs1( h( k, k+1 ) ) )
648 h21 = min( cabs1( h( k+1, k ) ),
649 $ cabs1( h( k, k+1 ) ) )
650 h11 = max( cabs1( h( k+1, k+1 ) ),
651 $ cabs1( h( k, k )-h( k+1, k+1 ) ) )
652 h22 = min( cabs1( h( k+1, k+1 ) ),
653 $ cabs1( h( k, k )-h( k+1, k+1 ) ) )
655 tst2 = h22*( h11 / scl )
657 IF( tst2.EQ.rzero .OR. h21*( h12 / scl ).LE.
658 $ max( smlnum, ulp*tst2 ) )h( k+1, k ) = zero
665 mend = min( nbmps, ( kbot-krcol-1 ) / 3 )
666 DO 130 m = mtop, mend
667 k = krcol + 3*( m-1 )
668 refsum = v( 1, m )*v( 3, m )*h( k+4, k+3 )
669 h( k+4, k+1 ) = -refsum
670 h( k+4, k+2 ) = -refsum*conjg( v( 2, m ) )
671 h( k+4, k+3 ) = h( k+4, k+3 ) - refsum*conjg( v( 3, m ) )
690 IF( ( .NOT.blk22 ) .OR. ( incol.LT.ktop ) .OR.
691 $ ( ndcol.GT.kbot ) .OR. ( ns.LE.2 ) )
THEN 702 k1 = max( 1, ktop-incol )
703 nu = ( kdu-max( 0, ndcol-kbot ) ) - k1 + 1
707 DO 150 jcol = min( ndcol, kbot ) + 1, jbot, nh
708 jlen = min( nh, jbot-jcol+1 )
709 CALL cgemm(
'C',
'N', nu, jlen, nu, one, u( k1, k1 ),
710 $ ldu, h( incol+k1, jcol ), ldh, zero, wh,
712 CALL clacpy(
'ALL', nu, jlen, wh, ldwh,
713 $ h( incol+k1, jcol ), ldh )
718 DO 160 jrow = jtop, max( ktop, incol ) - 1, nv
719 jlen = min( nv, max( ktop, incol )-jrow )
720 CALL cgemm(
'N',
'N', jlen, nu, nu, one,
721 $ h( jrow, incol+k1 ), ldh, u( k1, k1 ),
722 $ ldu, zero, wv, ldwv )
723 CALL clacpy(
'ALL', jlen, nu, wv, ldwv,
724 $ h( jrow, incol+k1 ), ldh )
730 DO 170 jrow = iloz, ihiz, nv
731 jlen = min( nv, ihiz-jrow+1 )
732 CALL cgemm(
'N',
'N', jlen, nu, nu, one,
733 $ z( jrow, incol+k1 ), ldz, u( k1, k1 ),
734 $ ldu, zero, wv, ldwv )
735 CALL clacpy(
'ALL', jlen, nu, wv, ldwv,
736 $ z( jrow, incol+k1 ), ldz )
754 kzs = ( j4-j2 ) - ( ns+1 )
759 DO 180 jcol = min( ndcol, kbot ) + 1, jbot, nh
760 jlen = min( nh, jbot-jcol+1 )
765 CALL clacpy(
'ALL', knz, jlen, h( incol+1+j2, jcol ),
766 $ ldh, wh( kzs+1, 1 ), ldwh )
770 CALL claset(
'ALL', kzs, jlen, zero, zero, wh, ldwh )
771 CALL ctrmm(
'L',
'U',
'C',
'N', knz, jlen, one,
772 $ u( j2+1, 1+kzs ), ldu, wh( kzs+1, 1 ),
777 CALL cgemm(
'C',
'N', i2, jlen, j2, one, u, ldu,
778 $ h( incol+1, jcol ), ldh, one, wh, ldwh )
782 CALL clacpy(
'ALL', j2, jlen, h( incol+1, jcol ), ldh,
783 $ wh( i2+1, 1 ), ldwh )
787 CALL ctrmm(
'L',
'L',
'C',
'N', j2, jlen, one,
788 $ u( 1, i2+1 ), ldu, wh( i2+1, 1 ), ldwh )
792 CALL cgemm(
'C',
'N', i4-i2, jlen, j4-j2, one,
793 $ u( j2+1, i2+1 ), ldu,
794 $ h( incol+1+j2, jcol ), ldh, one,
795 $ wh( i2+1, 1 ), ldwh )
799 CALL clacpy(
'ALL', kdu, jlen, wh, ldwh,
800 $ h( incol+1, jcol ), ldh )
805 DO 190 jrow = jtop, max( incol, ktop ) - 1, nv
806 jlen = min( nv, max( incol, ktop )-jrow )
811 CALL clacpy(
'ALL', jlen, knz, h( jrow, incol+1+j2 ),
812 $ ldh, wv( 1, 1+kzs ), ldwv )
816 CALL claset(
'ALL', jlen, kzs, zero, zero, wv, ldwv )
817 CALL ctrmm(
'R',
'U',
'N',
'N', jlen, knz, one,
818 $ u( j2+1, 1+kzs ), ldu, wv( 1, 1+kzs ),
823 CALL cgemm(
'N',
'N', jlen, i2, j2, one,
824 $ h( jrow, incol+1 ), ldh, u, ldu, one, wv,
829 CALL clacpy(
'ALL', jlen, j2, h( jrow, incol+1 ), ldh,
830 $ wv( 1, 1+i2 ), ldwv )
834 CALL ctrmm(
'R',
'L',
'N',
'N', jlen, i4-i2, one,
835 $ u( 1, i2+1 ), ldu, wv( 1, 1+i2 ), ldwv )
839 CALL cgemm(
'N',
'N', jlen, i4-i2, j4-j2, one,
840 $ h( jrow, incol+1+j2 ), ldh,
841 $ u( j2+1, i2+1 ), ldu, one, wv( 1, 1+i2 ),
846 CALL clacpy(
'ALL', jlen, kdu, wv, ldwv,
847 $ h( jrow, incol+1 ), ldh )
853 DO 200 jrow = iloz, ihiz, nv
854 jlen = min( nv, ihiz-jrow+1 )
859 CALL clacpy(
'ALL', jlen, knz,
860 $ z( jrow, incol+1+j2 ), ldz,
861 $ wv( 1, 1+kzs ), ldwv )
865 CALL claset(
'ALL', jlen, kzs, zero, zero, wv,
867 CALL ctrmm(
'R',
'U',
'N',
'N', jlen, knz, one,
868 $ u( j2+1, 1+kzs ), ldu, wv( 1, 1+kzs ),
873 CALL cgemm(
'N',
'N', jlen, i2, j2, one,
874 $ z( jrow, incol+1 ), ldz, u, ldu, one,
879 CALL clacpy(
'ALL', jlen, j2, z( jrow, incol+1 ),
880 $ ldz, wv( 1, 1+i2 ), ldwv )
884 CALL ctrmm(
'R',
'L',
'N',
'N', jlen, i4-i2, one,
885 $ u( 1, i2+1 ), ldu, wv( 1, 1+i2 ),
890 CALL cgemm(
'N',
'N', jlen, i4-i2, j4-j2, one,
891 $ z( jrow, incol+1+j2 ), ldz,
892 $ u( j2+1, i2+1 ), ldu, one,
893 $ wv( 1, 1+i2 ), ldwv )
897 CALL clacpy(
'ALL', jlen, kdu, wv, ldwv,
898 $ z( jrow, incol+1 ), ldz )
subroutine clarfg(N, ALPHA, X, INCX, TAU)
CLARFG generates an elementary reflector (Householder matrix).
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 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 clacpy(UPLO, M, N, A, LDA, B, LDB)
CLACPY copies all or part of one two-dimensional array to another.
subroutine slabad(SMALL, LARGE)
SLABAD
subroutine ctrmm(SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA, A, LDA, B, LDB)
CTRMM
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 cgemm(TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC)
CGEMM