260 SUBROUTINE clahef_rk( UPLO, N, NB, KB, A, LDA, E, IPIV, W, LDW,
269 INTEGER INFO, KB, LDA, LDW, N, NB
273 COMPLEX A( LDA, * ), W( LDW, * ), E( * )
280 parameter( zero = 0.0e+0, one = 1.0e+0 )
282 parameter( eight = 8.0e+0, sevten = 17.0e+0 )
284 parameter( cone = ( 1.0e+0, 0.0e+0 ),
285 $ czero = ( 0.0e+0, 0.0e+0 ) )
289 INTEGER IMAX, ITEMP, II, J, JB, JJ, JMAX, K, KK, KKW,
291 REAL ABSAKK, ALPHA, COLMAX, STEMP, R1, ROWMAX, T,
293 COMPLEX D11, D21, D22, Z
299 EXTERNAL lsame, icamax, slamch
305 INTRINSIC abs, conjg, aimag,
max,
min, real, sqrt
311 cabs1( z ) = abs( real( z ) ) + abs( aimag( z ) )
319 alpha = ( one+sqrt( sevten ) ) / eight
323 sfmin = slamch(
'S' )
325 IF( lsame( uplo,
'U' ) )
THEN
347 IF( ( k.LE.n-nb+1 .AND. nb.LT.n ) .OR. k.LT.1 )
356 $
CALL ccopy( k-1, a( 1, k ), 1, w( 1, kw ), 1 )
357 w( k, kw ) = real( a( k, k ) )
359 CALL cgemv(
'No transpose', k, n-k, -cone, a( 1, k+1 ), lda,
360 $ w( k, kw+1 ), ldw, cone, w( 1, kw ), 1 )
361 w( k, kw ) = real( w( k, kw ) )
367 absakk = abs( real( w( k, kw ) ) )
374 imax = icamax( k-1, w( 1, kw ), 1 )
375 colmax = cabs1( w( imax, kw ) )
380 IF(
max( absakk, colmax ).EQ.zero )
THEN
387 a( k, k ) = real( w( k, kw ) )
389 $
CALL ccopy( k-1, w( 1, kw ), 1, a( 1, k ), 1 )
405 IF( .NOT.( absakk.LT.alpha*colmax ) )
THEN
425 $
CALL ccopy( imax-1, a( 1, imax ), 1, w( 1, kw-1 ),
427 w( imax, kw-1 ) = real( a( imax, imax ) )
429 CALL ccopy( k-imax, a( imax, imax+1 ), lda,
430 $ w( imax+1, kw-1 ), 1 )
431 CALL clacgv( k-imax, w( imax+1, kw-1 ), 1 )
434 CALL cgemv(
'No transpose', k, n-k, -cone,
435 $ a( 1, k+1 ), lda, w( imax, kw+1 ), ldw,
436 $ cone, w( 1, kw-1 ), 1 )
437 w( imax, kw-1 ) = real( w( imax, kw-1 ) )
445 jmax = imax + icamax( k-imax, w( imax+1, kw-1 ),
447 rowmax = cabs1( w( jmax, kw-1 ) )
453 itemp = icamax( imax-1, w( 1, kw-1 ), 1 )
454 stemp = cabs1( w( itemp, kw-1 ) )
455 IF( stemp.GT.rowmax )
THEN
466 IF( .NOT.( abs( real( w( imax,kw-1 ) ) )
467 $ .LT.alpha*rowmax ) )
THEN
476 CALL ccopy( k, w( 1, kw-1 ), 1, w( 1, kw ), 1 )
484 ELSE IF( ( p.EQ.jmax ) .OR. ( rowmax.LE.colmax ) )
505 CALL ccopy( k, w( 1, kw-1 ), 1, w( 1, kw ), 1 )
512 IF( .NOT.done )
GOTO 12
531 IF( ( kstep.EQ.2 ) .AND. ( p.NE.k ) )
THEN
538 a( p, p ) = real( a( k, k ) )
539 CALL ccopy( k-1-p, a( p+1, k ), 1, a( p, p+1 ),
541 CALL clacgv( k-1-p, a( p, p+1 ), lda )
543 $
CALL ccopy( p-1, a( 1, k ), 1, a( 1, p ), 1 )
551 $
CALL cswap( n-k, a( k, k+1 ), lda, a( p, k+1 ),
553 CALL cswap( n-kk+1, w( k, kkw ), ldw, w( p, kkw ),
567 a( kp, kp ) = real( a( kk, kk ) )
568 CALL ccopy( kk-1-kp, a( kp+1, kk ), 1, a( kp, kp+1 ),
570 CALL clacgv( kk-1-kp, a( kp, kp+1 ), lda )
572 $
CALL ccopy( kp-1, a( 1, kk ), 1, a( 1, kp ), 1 )
580 $
CALL cswap( n-k, a( kk, k+1 ), lda, a( kp, k+1 ),
582 CALL cswap( n-kk+1, w( kk, kkw ), ldw, w( kp, kkw ),
586 IF( kstep.EQ.1 )
THEN
604 CALL ccopy( k, w( 1, kw ), 1, a( 1, k ), 1 )
613 t = real( a( k, k ) )
614 IF( abs( t ).GE.sfmin )
THEN
616 CALL csscal( k-1, r1, a( 1, k ), 1 )
619 a( ii, k ) = a( ii, k ) / t
625 CALL clacgv( k-1, w( 1, kw ), 1 )
698 d11 = w( k, kw ) / conjg( d21 )
699 d22 = w( k-1, kw-1 ) / d21
700 t = one / ( real( d11*d22 )-one )
707 a( j, k-1 ) = t*( ( d11*w( j, kw-1 )-w( j, kw ) ) /
709 a( j, k ) = t*( ( d22*w( j, kw )-w( j, kw-1 ) ) /
718 a( k-1, k-1 ) = w( k-1, kw-1 )
720 a( k, k ) = w( k, kw )
721 e( k ) = w( k-1, kw )
726 CALL clacgv( k-1, w( 1, kw ), 1 )
727 CALL clacgv( k-2, w( 1, kw-1 ), 1 )
737 IF( kstep.EQ.1 )
THEN
758 DO 50 j = ( ( k-1 ) / nb )*nb + 1, 1, -nb
759 jb =
min( nb, k-j+1 )
763 DO 40 jj = j, j + jb - 1
764 a( jj, jj ) = real( a( jj, jj ) )
765 CALL cgemv( 'no transpose
', JJ-J+1, N-K, -CONE,
766 $ A( J, K+1 ), LDA, W( JJ, KW+1 ), LDW, CONE,
768 A( JJ, JJ ) = REAL( A( JJ, JJ ) )
774 $ CALL CGEMM( 'no transpose
', 'transpose
', J-1, JB, N-K,
775 $ -CONE, A( 1, K+1 ), LDA, W( J, KW+1 ), LDW,
776 $ CONE, A( 1, J ), LDA )
800.GE..AND..LT..OR..GT.
IF( ( KNB NBN ) KN )
808 W( K, K ) = REAL( A( K, K ) )
810 $ CALL CCOPY( N-K, A( K+1, K ), 1, W( K+1, K ), 1 )
812 CALL CGEMV( 'no transpose
', N-K+1, K-1, -CONE, A( K, 1 ),
813 $ LDA, W( K, 1 ), LDW, CONE, W( K, K ), 1 )
814 W( K, K ) = REAL( W( K, K ) )
820 ABSAKK = ABS( REAL( W( K, K ) ) )
827 IMAX = K + ICAMAX( N-K, W( K+1, K ), 1 )
828 COLMAX = CABS1( W( IMAX, K ) )
833.EQ.
IF( MAX( ABSAKK, COLMAX )ZERO ) THEN
840 A( K, K ) = REAL( W( K, K ) )
842 $ CALL CCOPY( N-K, W( K+1, K ), 1, A( K+1, K ), 1 )
859.NOT..LT.
IF( ( ABSAKKALPHA*COLMAX ) ) THEN
878 CALL CCOPY( IMAX-K, A( IMAX, K ), LDA, W( K, K+1 ), 1)
879 CALL CLACGV( IMAX-K, W( K, K+1 ), 1 )
880 W( IMAX, K+1 ) = REAL( A( IMAX, IMAX ) )
883 $ CALL CCOPY( N-IMAX, A( IMAX+1, IMAX ), 1,
884 $ W( IMAX+1, K+1 ), 1 )
887 CALL CGEMV( 'no transpose
', N-K+1, K-1, -CONE,
888 $ A( K, 1 ), LDA, W( IMAX, 1 ), LDW,
889 $ CONE, W( K, K+1 ), 1 )
890 W( IMAX, K+1 ) = REAL( W( IMAX, K+1 ) )
898 JMAX = K - 1 + ICAMAX( IMAX-K, W( K, K+1 ), 1 )
899 ROWMAX = CABS1( W( JMAX, K+1 ) )
905 ITEMP = IMAX + ICAMAX( N-IMAX, W( IMAX+1, K+1 ), 1)
906 STEMP = CABS1( W( ITEMP, K+1 ) )
907.GT.
IF( STEMPROWMAX ) THEN
918.NOT.
IF( ( ABS( REAL( W( IMAX,K+1 ) ) )
919.LT.
$ ALPHA*ROWMAX ) ) THEN
928 CALL CCOPY( N-K+1, W( K, K+1 ), 1, W( K, K ), 1 )
936.EQ..OR..LE.
ELSE IF( ( PJMAX ) ( ROWMAXCOLMAX ) )
957 CALL CCOPY( N-K+1, W( K, K+1 ), 1, W( K, K ), 1 )
964.NOT.
IF( DONE ) GOTO 72
979.EQ..AND..NE.
IF( ( KSTEP2 ) ( PK ) ) THEN
986 A( P, P ) = REAL( A( K, K ) )
987 CALL CCOPY( P-K-1, A( K+1, K ), 1, A( P, K+1 ), LDA )
988 CALL CLACGV( P-K-1, A( P, K+1 ), LDA )
990 $ CALL CCOPY( N-P, A( P+1, K ), 1, A( P+1, P ), 1 )
998 $ CALL CSWAP( K-1, A( K, 1 ), LDA, A( P, 1 ), LDA )
999 CALL CSWAP( KK, W( K, 1 ), LDW, W( P, 1 ), LDW )
1012 A( KP, KP ) = REAL( A( KK, KK ) )
1013 CALL CCOPY( KP-KK-1, A( KK+1, KK ), 1, A( KP, KK+1 ),
1015 CALL CLACGV( KP-KK-1, A( KP, KK+1 ), LDA )
1017 $ CALL CCOPY( N-KP, A( KP+1, KK ), 1, A( KP+1, KP ), 1 )
1025 $ CALL CSWAP( K-1, A( KK, 1 ), LDA, A( KP, 1 ), LDA )
1026 CALL CSWAP( KK, W( KK, 1 ), LDW, W( KP, 1 ), LDW )
1029.EQ.
IF( KSTEP1 ) THEN
1047 CALL CCOPY( N-K+1, W( K, K ), 1, A( K, K ), 1 )
1056 T = REAL( A( K, K ) )
1057.GE.
IF( ABS( T )SFMIN ) THEN
1059 CALL CSSCAL( N-K, R1, A( K+1, K ), 1 )
1062 A( II, K ) = A( II, K ) / T
1068 CALL CLACGV( N-K, W( K+1, K ), 1 )
1141 D11 = W( K+1, K+1 ) / D21
1142 D22 = W( K, K ) / CONJG( D21 )
1143 T = ONE / ( REAL( D11*D22 )-ONE )
1150 A( J, K ) = T*( ( D11*W( J, K )-W( J, K+1 ) ) /
1152 A( J, K+1 ) = T*( ( D22*W( J, K+1 )-W( J, K ) ) /
1161 A( K, K ) = W( K, K )
1163 A( K+1, K+1 ) = W( K+1, K+1 )
1164 E( K ) = W( K+1, K )
1169 CALL CLACGV( N-K, W( K+1, K ), 1 )
1170 CALL CLACGV( N-K-1, W( K+2, K+1 ), 1 )
1180.EQ.
IF( KSTEP1 ) THEN
1202 JB = MIN( NB, N-J+1 )
1206 DO 100 JJ = J, J + JB - 1
1207 A( JJ, JJ ) = REAL( A( JJ, JJ ) )
1208 CALL CGEMV( 'no transpose
', J+JB-JJ, K-1, -CONE,
1209 $ A( JJ, 1 ), LDA, W( JJ, 1 ), LDW, CONE,
1211 A( JJ, JJ ) = REAL( A( JJ, JJ ) )
1217 $ CALL CGEMM( 'no transpose
', 'transpose
', N-J-JB+1, JB,
1218 $ K-1, -CONE, A( J+JB, 1 ), LDA, W( J, 1 ),
1219 $ LDW, CONE, A( J+JB, J ), LDA )