191 INTEGER INFO, KB, LDA, LDW, N, NB
195 COMPLEX*16 A( LDA, * ), W( LDW, * )
201 DOUBLE PRECISION ZERO, ONE
202 parameter( zero = 0.0d+0, one = 1.0d+0 )
204 parameter( cone = ( 1.0d+0, 0.0d+0 ) )
205 DOUBLE PRECISION EIGHT, SEVTEN
206 parameter( eight = 8.0d+0, sevten = 17.0d+0 )
210 INTEGER IMAX, ITEMP, II, J, JB, JJ, JMAX, JP1, JP2, K,
211 $ kk, kkw, kp, kstep, kw, p
212 DOUBLE PRECISION ABSAKK, ALPHA, COLMAX, DTEMP, R1, ROWMAX, T,
214 COMPLEX*16 D11, D21, D22, Z
219 DOUBLE PRECISION DLAMCH
220 EXTERNAL lsame, izamax, dlamch
226 INTRINSIC abs, dble, dconjg, dimag,
max,
min, sqrt
229 DOUBLE PRECISION CABS1
232 cabs1( z ) = abs( dble( z ) ) + abs( dimag( z ) )
240 alpha = ( one+sqrt( sevten ) ) / eight
244 sfmin = dlamch(
'S' )
246 IF( lsame( uplo,
'U' ) )
THEN
263 IF( ( k.LE.n-nb+1 .AND. nb.LT.n ) .OR. k.LT.1 )
272 $
CALL zcopy( k-1, a( 1, k ), 1, w( 1, kw ), 1 )
273 w( k, kw ) = dble( a( k, k ) )
275 CALL zgemv(
'No transpose', k, n-k, -cone, a( 1, k+1 ), lda,
276 $ w( k, kw+1 ), ldw, cone, w( 1, kw ), 1 )
277 w( k, kw ) = dble( w( k, kw ) )
283 absakk = abs( dble( w( k, kw ) ) )
290 imax = izamax( k-1, w( 1, kw ), 1 )
291 colmax = cabs1( w( imax, kw ) )
296 IF(
max( absakk, colmax ).EQ.zero )
THEN
303 a( k, k ) = dble( w( k, kw ) )
305 $
CALL zcopy( k-1, w( 1, kw ), 1, a( 1, k ), 1 )
315 IF( .NOT.( absakk.LT.alpha*colmax ) )
THEN
335 $
CALL zcopy( imax-1, a( 1, imax ), 1, w( 1, kw-1 ),
337 w( imax, kw-1 ) = dble( a( imax, imax ) )
339 CALL zcopy( k-imax, a( imax, imax+1 ), lda,
340 $ w( imax+1, kw-1 ), 1 )
341 CALL zlacgv( k-imax, w( imax+1, kw-1 ), 1 )
344 CALL zgemv( 'no transpose
', K, N-K, -CONE,
345 $ A( 1, K+1 ), LDA, W( IMAX, KW+1 ), LDW,
346 $ CONE, W( 1, KW-1 ), 1 )
347 W( IMAX, KW-1 ) = DBLE( W( IMAX, KW-1 ) )
355 JMAX = IMAX + IZAMAX( K-IMAX, W( IMAX+1, KW-1 ),
357 ROWMAX = CABS1( W( JMAX, KW-1 ) )
363 ITEMP = IZAMAX( IMAX-1, W( 1, KW-1 ), 1 )
364 DTEMP = CABS1( W( ITEMP, KW-1 ) )
365.GT.
IF( DTEMPROWMAX ) THEN
376.NOT.
IF( ( ABS( DBLE( W( IMAX,KW-1 ) ) )
377.LT.
$ ALPHA*ROWMAX ) ) THEN
386 CALL ZCOPY( K, W( 1, KW-1 ), 1, W( 1, KW ), 1 )
394.EQ..OR..LE.
ELSE IF( ( PJMAX ) ( ROWMAXCOLMAX ) )
415 CALL ZCOPY( K, W( 1, KW-1 ), 1, W( 1, KW ), 1 )
422.NOT.
IF( DONE ) GOTO 12
441.EQ..AND..NE.
IF( ( KSTEP2 ) ( PK ) ) THEN
448 A( P, P ) = DBLE( A( K, K ) )
449 CALL ZCOPY( K-1-P, A( P+1, K ), 1, A( P, P+1 ),
451 CALL ZLACGV( K-1-P, A( P, P+1 ), LDA )
453 $ CALL ZCOPY( P-1, A( 1, K ), 1, A( 1, P ), 1 )
461 $ CALL ZSWAP( N-K, A( K, K+1 ), LDA, A( P, K+1 ),
463 CALL ZSWAP( N-KK+1, W( K, KKW ), LDW, W( P, KKW ),
477 A( KP, KP ) = DBLE( A( KK, KK ) )
478 CALL ZCOPY( KK-1-KP, A( KP+1, KK ), 1, A( KP, KP+1 ),
480 CALL ZLACGV( KK-1-KP, A( KP, KP+1 ), LDA )
482 $ CALL ZCOPY( KP-1, A( 1, KK ), 1, A( 1, KP ), 1 )
490 $ CALL ZSWAP( N-K, A( KK, K+1 ), LDA, A( KP, K+1 ),
492 CALL ZSWAP( N-KK+1, W( KK, KKW ), LDW, W( KP, KKW ),
496.EQ.
IF( KSTEP1 ) THEN
514 CALL ZCOPY( K, W( 1, KW ), 1, A( 1, K ), 1 )
523 T = DBLE( A( K, K ) )
524.GE.
IF( ABS( T )SFMIN ) THEN
526 CALL ZDSCAL( K-1, R1, A( 1, K ), 1 )
529 A( II, K ) = A( II, K ) / T
535 CALL ZLACGV( K-1, W( 1, KW ), 1 )
603 D11 = W( K, KW ) / DCONJG( D21 )
604 D22 = W( K-1, KW-1 ) / D21
605 T = ONE / ( DBLE( D11*D22 )-ONE )
612 A( J, K-1 ) = T*( ( D11*W( J, KW-1 )-W( J, KW ) ) /
614 A( J, K ) = T*( ( D22*W( J, KW )-W( J, KW-1 ) ) /
621 A( K-1, K-1 ) = W( K-1, KW-1 )
622 A( K-1, K ) = W( K-1, KW )
623 A( K, K ) = W( K, KW )
627 CALL ZLACGV( K-1, W( 1, KW ), 1 )
628 CALL ZLACGV( K-2, W( 1, KW-1 ), 1 )
636.EQ.
IF( KSTEP1 ) THEN
657 DO 50 J = ( ( K-1 ) / NB )*NB + 1, 1, -NB
658 JB = MIN( NB, K-J+1 )
662 DO 40 JJ = J, J + JB - 1
663 A( JJ, JJ ) = DBLE( A( JJ, JJ ) )
664 CALL ZGEMV( 'no transpose
', JJ-J+1, N-K, -CONE,
665 $ A( J, K+1 ), LDA, W( JJ, KW+1 ), LDW, CONE,
667 A( JJ, JJ ) = DBLE( A( JJ, JJ ) )
673 $ CALL ZGEMM( 'no transpose
', 'transpose
', J-1, JB, N-K,
674 $ -CONE, A( 1, K+1 ), LDA, W( J, KW+1 ), LDW,
675 $ CONE, A( 1, J ), LDA )
702.NE..AND..LE.
IF( JP2JJ JN )
703 $ CALL ZSWAP( N-J+1, A( JP2, J ), LDA, A( JJ, J ), LDA )
705.EQ..AND..NE..AND..LE.
IF( KSTEP2 JP1JJ JN )
706 $ CALL ZSWAP( N-J+1, A( JP1, J ), LDA, A( JJ, J ), LDA )
727.GE..AND..LT..OR..GT.
IF( ( KNB NBN ) KN )
735 W( K, K ) = DBLE( A( K, K ) )
737 $ CALL ZCOPY( N-K, A( K+1, K ), 1, W( K+1, K ), 1 )
739 CALL ZGEMV( 'no transpose
', N-K+1, K-1, -CONE, A( K, 1 ),
740 $ LDA, W( K, 1 ), LDW, CONE, W( K, K ), 1 )
741 W( K, K ) = DBLE( W( K, K ) )
747 ABSAKK = ABS( DBLE( W( K, K ) ) )
754 IMAX = K + IZAMAX( N-K, W( K+1, K ), 1 )
755 COLMAX = CABS1( W( IMAX, K ) )
760.EQ.
IF( MAX( ABSAKK, COLMAX )ZERO ) THEN
767 A( K, K ) = DBLE( W( K, K ) )
769 $ CALL ZCOPY( N-K, W( K+1, K ), 1, A( K+1, K ), 1 )
780.NOT..LT.
IF( ( ABSAKKALPHA*COLMAX ) ) THEN
799 CALL ZCOPY( IMAX-K, A( IMAX, K ), LDA, W( K, K+1 ), 1)
800 CALL ZLACGV( IMAX-K, W( K, K+1 ), 1 )
801 W( IMAX, K+1 ) = DBLE( A( IMAX, IMAX ) )
804 $ CALL ZCOPY( N-IMAX, A( IMAX+1, IMAX ), 1,
805 $ W( IMAX+1, K+1 ), 1 )
808 CALL ZGEMV( 'no transpose
', N-K+1, K-1, -CONE,
809 $ A( K, 1 ), LDA, W( IMAX, 1 ), LDW,
810 $ CONE, W( K, K+1 ), 1 )
811 W( IMAX, K+1 ) = DBLE( W( IMAX, K+1 ) )
819 JMAX = K - 1 + IZAMAX( IMAX-K, W( K, K+1 ), 1 )
820 ROWMAX = CABS1( W( JMAX, K+1 ) )
826 ITEMP = IMAX + IZAMAX( N-IMAX, W( IMAX+1, K+1 ), 1)
827 DTEMP = CABS1( W( ITEMP, K+1 ) )
828.GT.
IF( DTEMPROWMAX ) THEN
839.NOT.
IF( ( ABS( DBLE( W( IMAX,K+1 ) ) )
840.LT.
$ ALPHA*ROWMAX ) ) THEN
849 CALL ZCOPY( N-K+1, W( K, K+1 ), 1, W( K, K ), 1 )
857.EQ..OR..LE.
ELSE IF( ( PJMAX ) ( ROWMAXCOLMAX ) )
878 CALL ZCOPY( N-K+1, W( K, K+1 ), 1, W( K, K ), 1 )
885.NOT.
IF( DONE ) GOTO 72
900.EQ..AND..NE.
IF( ( KSTEP2 ) ( PK ) ) THEN
907 A( P, P ) = DBLE( A( K, K ) )
908 CALL ZCOPY( P-K-1, A( K+1, K ), 1, A( P, K+1 ), LDA )
909 CALL ZLACGV( P-K-1, A( P, K+1 ), LDA )
911 $ CALL ZCOPY( N-P, A( P+1, K ), 1, A( P+1, P ), 1 )
919 $ CALL ZSWAP( K-1, A( K, 1 ), LDA, A( P, 1 ), LDA )
920 CALL ZSWAP( KK, W( K, 1 ), LDW, W( P, 1 ), LDW )
933 A( KP, KP ) = DBLE( A( KK, KK ) )
934 CALL ZCOPY( KP-KK-1, A( KK+1, KK ), 1, A( KP, KK+1 ),
936 CALL ZLACGV( KP-KK-1, A( KP, KK+1 ), LDA )
938 $ CALL ZCOPY( N-KP, A( KP+1, KK ), 1, A( KP+1, KP ), 1 )
946 $ CALL ZSWAP( K-1, A( KK, 1 ), LDA, A( KP, 1 ), LDA )
947 CALL ZSWAP( KK, W( KK, 1 ), LDW, W( KP, 1 ), LDW )
950.EQ.
IF( KSTEP1 ) THEN
968 CALL ZCOPY( N-K+1, W( K, K ), 1, A( K, K ), 1 )
977 T = DBLE( A( K, K ) )
978.GE.
IF( ABS( T )SFMIN ) THEN
980 CALL ZDSCAL( N-K, R1, A( K+1, K ), 1 )
983 A( II, K ) = A( II, K ) / T
989 CALL ZLACGV( N-K, W( K+1, K ), 1 )
1057 D11 = W( K+1, K+1 ) / D21
1058 D22 = W( K, K ) / DCONJG( D21 )
1059 T = ONE / ( DBLE( D11*D22 )-ONE )
1066 A( J, K ) = T*( ( D11*W( J, K )-W( J, K+1 ) ) /
1068 A( J, K+1 ) = T*( ( D22*W( J, K+1 )-W( J, K ) ) /
1075 A( K, K ) = W( K, K )
1076 A( K+1, K ) = W( K+1, K )
1077 A( K+1, K+1 ) = W( K+1, K+1 )
1081 CALL ZLACGV( N-K, W( K+1, K ), 1 )
1082 CALL ZLACGV( N-K-1, W( K+2, K+1 ), 1 )
1090.EQ.
IF( KSTEP1 ) THEN
1112 JB = MIN( NB, N-J+1 )
1116 DO 100 JJ = J, J + JB - 1
1117 A( JJ, JJ ) = DBLE( A( JJ, JJ ) )
1118 CALL ZGEMV( 'no transpose
', J+JB-JJ, K-1, -CONE,
1119 $ A( JJ, 1 ), LDA, W( JJ, 1 ), LDW, CONE,
1121 A( JJ, JJ ) = DBLE( A( JJ, JJ ) )
1127 $ CALL ZGEMM( 'no transpose
', 'transpose
', N-J-JB+1, JB,
1128 $ K-1, -CONE, A( J+JB, 1 ), LDA, W( J, 1 ),
1129 $ LDW, CONE, A( J+JB, J ), LDA )
1156.NE..AND..GE.
IF( JP2JJ J1 )
1157 $ CALL ZSWAP( J, A( JP2, 1 ), LDA, A( JJ, 1 ), LDA )
1159.EQ..AND..NE..AND..GE.
IF( KSTEP2 JP1JJ J1 )
1160 $ CALL ZSWAP( J, A( JP1, 1 ), LDA, A( JJ, 1 ), LDA )