130 SUBROUTINE dsteqr( COMPZ, N, D, E, Z, LDZ, WORK, INFO )
141 DOUBLE PRECISION D( * ), E( * ), WORK( * ), Z( LDZ, * )
147 DOUBLE PRECISION ZERO, ONE, TWO, THREE
148 parameter( zero = 0.0d0, one = 1.0d0, two = 2.0d0,
151 parameter( maxit = 30 )
154 INTEGER I, ICOMPZ, II, ISCALE, J, JTOT, K, L, L1, LEND,
155 $ LENDM1, LENDP1, LENDSV, , LSV, M, MM, MM1,
157 DOUBLE PRECISION , B, C, EPS, EPS2, F, G, P, R, RT1
158, SAFMIN, SSFMAX, , TST
162 DOUBLE PRECISION DLAMCH, DLANST, DLAPY2
163 EXTERNAL lsame, dlamch, dlanst, dlapy2
170 INTRINSIC abs,
max, sign, sqrt
178 IF( lsame( compz,
'N' ) )
THEN
180 ELSE IF( lsame( compz,
'V' ) )
THEN
182 ELSE IF( lsame( compz,
'I' ) )
THEN
187 IF( icompz.LT.0 )
THEN
189 ELSE IF( n.LT.0 )
THEN
191 ELSE IF( ( ldz.LT.1 ) .OR. ( icompz.GT.0 .AND. ldz.LT.
max( 1,
196 CALL xerbla(
'DSTEQR', -info )
215 safmin = dlamch(
'S' )
216 safmax = one / safmin
217 ssfmax = sqrt( safmax ) / three
218 ssfmin = sqrt( safmin ) / eps2
224 $
CALL dlaset(
'Full', n, n, zero, one, z, ldz )
246 IF( tst.LE.( sqrt( abs( d( m ) ) )*sqrt( abs( d( m+
247 $ 1 ) ) ) )*eps )
THEN
266 anorm = dlanst(
'M', lend-l+1, d( l ), e( l ) )
270 IF( anorm.GT.ssfmax )
THEN
272 CALL dlascl(
'G', 0, 0, anorm, ssfmax, lend-l+1, 1, d( l ), n,
274 CALL dlascl(
'G', 0, 0, anorm, ssfmax, lend-l, 1, e( l ), n,
276 ELSE IF( anorm.LT.ssfmin )
THEN
278 CALL dlascl( 'g
', 0, 0, ANORM, SSFMIN, LEND-L+1, 1, D( L ), N,
280 CALL DLASCL( 'g
', 0, 0, ANORM, SSFMIN, LEND-L, 1, E( L ), N,
286.LT.
IF( ABS( D( LEND ) )ABS( D( L ) ) ) THEN
301 TST = ABS( E( M ) )**2
302.LE.
IF( TST( EPS2*ABS( D( M ) ) )*ABS( D( M+1 ) )+
320.GT.
IF( ICOMPZ0 ) THEN
321 CALL DLAEV2( D( L ), E( L ), D( L+1 ), RT1, RT2, C, S )
324 CALL DLASR( 'r
', 'v
', 'b
', N, 2, WORK( L ),
325 $ WORK( N-1+L ), Z( 1, L ), LDZ )
327 CALL DLAE2( D( L ), E( L ), D( L+1 ), RT1, RT2 )
344 G = ( D( L+1 )-P ) / ( TWO*E( L ) )
346 G = D( M ) - P + ( E( L ) / ( G+SIGN( R, G ) ) )
358 CALL DLARTG( G, F, C, S, R )
362 R = ( D( I )-G )*S + TWO*C*B
369.GT.
IF( ICOMPZ0 ) THEN
378.GT.
IF( ICOMPZ0 ) THEN
380 CALL DLASR( 'r
', 'v
', 'b
', N, MM, WORK( L ), WORK( N-1+L ),
407 DO 100 M = L, LENDP1, -1
408 TST = ABS( E( M-1 ) )**2
409.LE.
IF( TST( EPS2*ABS( D( M ) ) )*ABS( D( M-1 ) )+
427.GT.
IF( ICOMPZ0 ) THEN
428 CALL DLAEV2( D( L-1 ), E( L-1 ), D( L ), RT1, RT2, C, S )
431 CALL DLASR( 'r
', 'v
', 'f
', N, 2, WORK( M ),
432 $ WORK( N-1+M ), Z( 1, L-1 ), LDZ )
434 CALL DLAE2( D( L-1 ), E( L-1 ), D( L ), RT1, RT2 )
451 G = ( D( L-1 )-P ) / ( TWO*E( L-1 ) )
453 G = D( M ) - P + ( E( L-1 ) / ( G+SIGN( R, G ) ) )
465 CALL DLARTG( G, F, C, S, R )
469 R = ( D( I+1 )-G )*S + TWO*C*B
476.GT.
IF( ICOMPZ0 ) THEN
485.GT.
IF( ICOMPZ0 ) THEN
487 CALL DLASR( 'r
', 'v
', 'f
', N, MM, WORK( M ), WORK( N-1+M ),
510.EQ.
IF( ISCALE1 ) THEN
511 CALL DLASCL( 'g
', 0, 0, SSFMAX, ANORM, LENDSV-LSV+1, 1,
512 $ D( LSV ), N, INFO )
513 CALL DLASCL( 'g
', 0, 0, SSFMAX, ANORM, LENDSV-LSV, 1, E( LSV ),
515.EQ.
ELSE IF( ISCALE2 ) THEN
516 CALL DLASCL( 'g
', 0, 0, SSFMIN, ANORM, LENDSV-LSV+1, 1,
517 $ D( LSV ), N, INFO )
518 CALL DLASCL( 'g
', 0, 0, SSFMIN, ANORM, LENDSV-LSV, 1, E( LSV ),
536.EQ.
IF( ICOMPZ0 ) THEN
540 CALL DLASRT( 'i
', N, D, INFO )
551.LT.
IF( D( J )P ) THEN
559 CALL DSWAP( N, Z( 1, I ), 1, Z( 1, K ), 1 )
subroutine dlae2(a, b, c, rt1, rt2)
DLAE2 computes the eigenvalues of a 2-by-2 symmetric matrix.
subroutine dlartg(f, g, c, s, r)
DLARTG generates a plane rotation with real cosine and real sine.
subroutine dlaev2(a, b, c, rt1, rt2, cs1, sn1)
DLAEV2 computes the eigenvalues and eigenvectors of a 2-by-2 symmetric/Hermitian matrix.
subroutine dlascl(type, kl, ku, cfrom, cto, m, n, a, lda, info)
DLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
subroutine dlaset(uplo, m, n, alpha, beta, a, lda)
DLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine dlasr(side, pivot, direct, m, n, c, s, a, lda)
DLASR applies a sequence of plane rotations to a general rectangular matrix.
subroutine dsteqr(compz, n, d, e, z, ldz, work, info)
DSTEQR