258 SUBROUTINE zlahef_rk( UPLO, N, NB, KB, A, LDA, E, IPIV, W, LDW,
267 INTEGER INFO, KB, LDA, LDW, N, NB
271 COMPLEX*16 A( LDA, * ), W( LDW, * ), E( * )
277 DOUBLE PRECISION ZERO, ONE
278 parameter( zero = 0.0d+0, one = 1.0d+0 )
280 parameter( cone = ( 1.0d+0, 0.0d+0 ) )
281 DOUBLE PRECISION EIGHT, SEVTEN
282 parameter( eight = 8.0d+0, sevten = 17.0d+0 )
284 parameter( czero = ( 0.0d+0, 0.0d+0 ) )
288 INTEGER IMAX, ITEMP, II, J, JMAX, K, KK, KKW,
290 DOUBLE PRECISION ABSAKK, ALPHA, COLMAX, DTEMP, R1, ROWMAX, T,
292 COMPLEX*16 D11, D21, D22, Z
297 DOUBLE PRECISION DLAMCH
298 EXTERNAL lsame, izamax, dlamch
305 INTRINSIC abs, dble, dconjg, dimag, max, min, sqrt
308 DOUBLE PRECISION CABS1
311 cabs1( z ) = abs( dble( z ) ) + abs( dimag( z ) )
319 alpha = ( one+sqrt( sevten ) ) / eight
323 sfmin = dlamch(
'S' )
325 IF( lsame( uplo,
'U' ) )
THEN
346 IF( ( k.LE.n-nb+1 .AND. nb.LT.n ) .OR. k.LT.1 )
355 $
CALL zcopy( k-1, a( 1, k ), 1, w( 1, kw ), 1 )
356 w( k, kw ) = dble( a( k, k ) )
358 CALL zgemv(
'No transpose', k, n-k, -cone, a( 1, k+1 ),
360 $ w( k, kw+1 ), ldw, cone, w( 1, kw ), 1 )
361 w( k, kw ) = dble( w( k, kw ) )
367 absakk = abs( dble( w( k, kw ) ) )
374 imax = izamax( k-1, w( 1, kw ), 1 )
375 colmax = cabs1( w( imax, kw ) )
380 IF( max( absakk, colmax ).EQ.zero )
THEN
387 a( k, k ) = dble( w( k, kw ) )
389 $
CALL zcopy( k-1, w( 1, kw ), 1, a( 1, k ), 1 )
405 IF( .NOT.( absakk.LT.alpha*colmax ) )
THEN
425 $
CALL zcopy( imax-1, a( 1, imax ), 1, w( 1,
428 w( imax, kw-1 ) = dble( a( imax, imax ) )
430 CALL zcopy( k-imax, a( imax, imax+1 ), lda,
431 $ w( imax+1, kw-1 ), 1 )
432 CALL zlacgv( k-imax, w( imax+1, kw-1 ), 1 )
435 CALL zgemv(
'No transpose', k, n-k, -cone,
436 $ a( 1, k+1 ), lda, w( imax, kw+1 ), ldw,
437 $ cone, w( 1, kw-1 ), 1 )
438 w( imax, kw-1 ) = dble( w( imax, kw-1 ) )
446 jmax = imax + izamax( k-imax, w( imax+1, kw-1 ),
448 rowmax = cabs1( w( jmax, kw-1 ) )
454 itemp = izamax( imax-1, w( 1, kw-1 ), 1 )
455 dtemp = cabs1( w( itemp, kw-1 ) )
456 IF( dtemp.GT.rowmax )
THEN
467 IF( .NOT.( abs( dble( w( imax,kw-1 ) ) )
468 $ .LT.alpha*rowmax ) )
THEN
477 CALL zcopy( k, w( 1, kw-1 ), 1, w( 1, kw ), 1 )
485 ELSE IF( ( p.EQ.jmax ) .OR. ( rowmax.LE.colmax ) )
506 CALL zcopy( k, w( 1, kw-1 ), 1, w( 1, kw ), 1 )
513 IF( .NOT.done )
GOTO 12
532 IF( ( kstep.EQ.2 ) .AND. ( p.NE.k ) )
THEN
539 a( p, p ) = dble( a( k, k ) )
540 CALL zcopy( k-1-p, a( p+1, k ), 1, a( p, p+1 ),
542 CALL zlacgv( k-1-p, a( p, p+1 ), lda )
544 $
CALL zcopy( p-1, a( 1, k ), 1, a( 1, p ), 1 )
552 $
CALL zswap( n-k, a( k, k+1 ), lda, a( p, k+1 ),
554 CALL zswap( n-kk+1, w( k, kkw ), ldw, w( p, kkw ),
568 a( kp, kp ) = dble( a( kk, kk ) )
569 CALL zcopy( kk-1-kp, a( kp+1, kk ), 1, a( kp, kp+1 ),
571 CALL zlacgv( kk-1-kp, a( kp, kp+1 ), lda )
573 $
CALL zcopy( kp-1, a( 1, kk ), 1, a( 1, kp ), 1 )
581 $
CALL zswap( n-k, a( kk, k+1 ), lda, a( kp, k+1 ),
583 CALL zswap( n-kk+1, w( kk, kkw ), ldw, w( kp, kkw ),
587 IF( kstep.EQ.1 )
THEN
605 CALL zcopy( k, w( 1, kw ), 1, a( 1, k ), 1 )
614 t = dble( a( k, k ) )
615 IF( abs( t ).GE.sfmin )
THEN
617 CALL zdscal( k-1, r1, a( 1, k ), 1 )
620 a( ii, k ) = a( ii, k ) / t
626 CALL zlacgv( k-1, w( 1, kw ), 1 )
699 d11 = w( k, kw ) / dconjg( d21 )
700 d22 = w( k-1, kw-1 ) / d21
701 t = one / ( dble( d11*d22 )-one )
708 a( j, k-1 ) = t*( ( d11*w( j, kw-1 )-w( j, kw ) ) /
710 a( j, k ) = t*( ( d22*w( j, kw )-w( j, kw-1 ) ) /
719 a( k-1, k-1 ) = w( k-1, kw-1 )
721 a( k, k ) = w( k, kw )
722 e( k ) = w( k-1, kw )
727 CALL zlacgv( k-1, w( 1, kw ), 1 )
728 CALL zlacgv( k-2, w( 1, kw-1 ), 1 )
738 IF( kstep.EQ.1 )
THEN
758 CALL zgemmtr(
'Upper',
'No transpose',
'Transpose', k, n-k,
759 $ -cone, a( 1, k+1 ), lda, w( 1, kw+1 ), ldw,
760 $ cone, a( 1, 1 ), lda )
783 IF( ( k.GE.nb .AND. nb.LT.n ) .OR. k.GT.n )
791 w( k, k ) = dble( a( k, k ) )
793 $
CALL zcopy( n-k, a( k+1, k ), 1, w( k+1, k ), 1 )
795 CALL zgemv(
'No transpose', n-k+1, k-1, -cone, a( k, 1 ),
796 $ lda, w( k, 1 ), ldw, cone, w( k, k ), 1 )
797 w( k, k ) = dble( w( k, k ) )
803 absakk = abs( dble( w( k, k ) ) )
810 imax = k + izamax( n-k, w( k+1, k ), 1 )
811 colmax = cabs1( w( imax, k ) )
816 IF( max( absakk, colmax ).EQ.zero )
THEN
823 a( k, k ) = dble( w( k, k ) )
825 $
CALL zcopy( n-k, w( k+1, k ), 1, a( k+1, k ), 1 )
842 IF( .NOT.( absakk.LT.alpha*colmax ) )
THEN
861 CALL zcopy( imax-k, a( imax, k ), lda, w( k, k+1 ),
863 CALL zlacgv( imax-k, w( k, k+1 ), 1 )
864 w( imax, k+1 ) = dble( a( imax, imax ) )
867 $
CALL zcopy( n-imax, a( imax+1, imax ), 1,
868 $ w( imax+1, k+1 ), 1 )
871 CALL zgemv(
'No transpose', n-k+1, k-1, -cone,
872 $ a( k, 1 ), lda, w( imax, 1 ), ldw,
873 $ cone, w( k, k+1 ), 1 )
874 w( imax, k+1 ) = dble( w( imax, k+1 ) )
882 jmax = k - 1 + izamax( imax-k, w( k, k+1 ), 1 )
883 rowmax = cabs1( w( jmax, k+1 ) )
889 itemp = imax + izamax( n-imax, w( imax+1, k+1 ),
891 dtemp = cabs1( w( itemp, k+1 ) )
892 IF( dtemp.GT.rowmax )
THEN
903 IF( .NOT.( abs( dble( w( imax,k+1 ) ) )
904 $ .LT.alpha*rowmax ) )
THEN
913 CALL zcopy( n-k+1, w( k, k+1 ), 1, w( k, k ),
922 ELSE IF( ( p.EQ.jmax ) .OR. ( rowmax.LE.colmax ) )
943 CALL zcopy( n-k+1, w( k, k+1 ), 1, w( k, k ),
951 IF( .NOT.done )
GOTO 72
966 IF( ( kstep.EQ.2 ) .AND. ( p.NE.k ) )
THEN
973 a( p, p ) = dble( a( k, k ) )
974 CALL zcopy( p-k-1, a( k+1, k ), 1, a( p, k+1 ), lda )
975 CALL zlacgv( p-k-1, a( p, k+1 ), lda )
977 $
CALL zcopy( n-p, a( p+1, k ), 1, a( p+1, p ), 1 )
985 $
CALL zswap( k-1, a( k, 1 ), lda, a( p, 1 ), lda )
986 CALL zswap( kk, w( k, 1 ), ldw, w( p, 1 ), ldw )
999 a( kp, kp ) = dble( a( kk, kk ) )
1000 CALL zcopy( kp-kk-1, a( kk+1, kk ), 1, a( kp, kk+1 ),
1002 CALL zlacgv( kp-kk-1, a( kp, kk+1 ), lda )
1004 $
CALL zcopy( n-kp, a( kp+1, kk ), 1, a( kp+1, kp ),
1013 $
CALL zswap( k-1, a( kk, 1 ), lda, a( kp, 1 ), lda )
1014 CALL zswap( kk, w( kk, 1 ), ldw, w( kp, 1 ), ldw )
1017 IF( kstep.EQ.1 )
THEN
1035 CALL zcopy( n-k+1, w( k, k ), 1, a( k, k ), 1 )
1044 t = dble( a( k, k ) )
1045 IF( abs( t ).GE.sfmin )
THEN
1047 CALL zdscal( n-k, r1, a( k+1, k ), 1 )
1050 a( ii, k ) = a( ii, k ) / t
1056 CALL zlacgv( n-k, w( k+1, k ), 1 )
1129 d11 = w( k+1, k+1 ) / d21
1130 d22 = w( k, k ) / dconjg( d21 )
1131 t = one / ( dble( d11*d22 )-one )
1138 a( j, k ) = t*( ( d11*w( j, k )-w( j, k+1 ) ) /
1140 a( j, k+1 ) = t*( ( d22*w( j, k+1 )-w( j, k ) ) /
1149 a( k, k ) = w( k, k )
1151 a( k+1, k+1 ) = w( k+1, k+1 )
1152 e( k ) = w( k+1, k )
1157 CALL zlacgv( n-k, w( k+1, k ), 1 )
1158 CALL zlacgv( n-k-1, w( k+2, k+1 ), 1 )
1168 IF( kstep.EQ.1 )
THEN
1188 CALL zgemmtr(
'Lower',
'No transpose',
'Transpose', n-k+1,
1189 $ k-1, -cone, a( k, 1 ), lda, w( k, 1 ), ldw,
1190 $ cone, a( k, k ), lda )