1 SUBROUTINE ssteqr2( COMPZ, N, D, E, Z, LDZ, NR, WORK, INFO )
13 REAL D( * ), E( * ), WORK( * ), Z( LDZ, * )
82 REAL ZERO, ONE, TWO, THREE
83 parameter( zero = 0.0e0, one = 1.0e0, two = 2.0e0,
86 parameter( maxit = 30 )
89 INTEGER I, ICOMPZ, II, ISCALE, J, JTOT, K, L, L1, LEND,
90 $ LENDM1, LENDP1, LENDSV, LM1, LSV, M, MM, MM1,
92 REAL ANORM, B, C, EPS, EPS2, F, G, P, R, RT1, RT2,
93 $ S, SAFMAX, SAFMIN, SSFMAX, SSFMIN, TST
97 REAL SLAMCH, SLANST, SLAPY2
98 EXTERNAL lsame, slamch, slanst, slapy2
105 INTRINSIC abs,
max, sign, sqrt
113 IF( lsame( compz,
'N' ) )
THEN
115 ELSE IF( lsame( compz,
'I' ) )
THEN
120 IF( icompz.LT.0 )
THEN
122 ELSE IF( n.LT.0 )
THEN
124 ELSE IF( icompz.GT.0 .AND. ldz.LT.
max( 1, nr ) )
THEN
128 CALL xerbla(
'SSTEQR2', -info )
147 safmin = slamch(
'S' )
148 safmax = one / safmin
149 ssfmax = sqrt( safmax ) / three
150 ssfmin = sqrt( safmin ) / eps2
175 IF( tst.LE.( sqrt( abs( d( m ) ) )*sqrt( abs( d( m+
176 $ 1 ) ) ) )*eps )
THEN
195 anorm = slanst(
'I', lend-l+1, d( l ), e( l ) )
199 IF( anorm.GT.ssfmax )
THEN
201 CALL slascl(
'G', 0, 0, anorm, ssfmax, lend-l+1, 1, d( l ), n,
203 CALL slascl(
'G', 0, 0, anorm, ssfmax, lend-l, 1, e( l ), n,
205 ELSE IF( anorm.LT.ssfmin )
THEN
207 CALL slascl(
'G', 0, 0, anorm, ssfmin, lend-l+1, 1, d( l ), n,
209 CALL slascl(
'G', 0, 0, anorm, ssfmin, lend-l, 1, e( l ), n,
215 IF( abs( d( lend ) ).LT.abs( d( l ) ) )
THEN
230 tst = abs( e( m ) )**2
231 IF( tst.LE.( eps2*abs( d( m ) ) )*abs( d( m+1 ) )+
249 IF( icompz.GT.0 )
THEN
250 CALL slaev2( d( l ), e( l ), d( l+1 ), rt1, rt2, c, s )
253 CALL slasr(
'R',
'V',
'B', nr, 2, work( l ),
254 $ work( n-1+l ), z( 1, l ), ldz )
256 CALL slae2( d( l ), e( l ), d( l+1 ), rt1, rt2 )
273 g = ( d( l+1 )-p ) / ( two*e( l ) )
287 CALL slartg( g, f, c, s, r )
291 r = ( d( i )-g )*s + two*c*b
298 IF( icompz.GT.0 )
THEN
307 IF( icompz.GT.0 )
THEN
309 CALL slasr'R',
'V',
'B', nr, mm, work( l ), work( n-1+l ),
336 DO 100 m = l, lendp1, -1
337 tst = abs( e( m-1 ) )**2
338 IF( tst.LE.( eps2*abs( d( m ) ) )*abs( d( m-1 ) )+
356 IF( icompz.GT.0 )
THEN
357 CALL slaev2( d( l-1 ), e( l-1 ), d( l ), rt1, rt2, c, s )
360 CALL slasr( 'r
', 'v
', 'f
', NR, 2, WORK( M ),
361 $ WORK( N-1+M ), Z( 1, L-1 ), LDZ )
363 CALL SLAE2( D( L-1 ), E( L-1 ), D( L ), RT1, RT2 )
380 G = ( D( L-1 )-P ) / ( TWO*E( L-1 ) )
382 G = D( M ) - P + ( E( L-1 ) / ( G+SIGN( R, G ) ) )
394 CALL SLARTG( G, F, C, S, R )
398 R = ( D( I+1 )-G )*S + TWO*C*B
405.GT.
IF( ICOMPZ0 ) THEN
414.GT.
IF( ICOMPZ0 ) THEN
416 CALL SLASR( 'r
', 'v
', 'f
', NR, MM, WORK( M ), WORK( N-1+M ),
439.EQ.
IF( ISCALE1 ) THEN
440 CALL SLASCL( 'g
', 0, 0, SSFMAX, ANORM, LENDSV-LSV+1, 1,
441 $ D( LSV ), N, INFO )
442 CALL SLASCL( 'g
', 0, 0, SSFMAX, ANORM, LENDSV-LSV, 1, E( LSV ),
444.EQ.
ELSE IF( ISCALE2 ) THEN
445 CALL SLASCL( 'g
', 0, 0, SSFMIN, ANORM, LENDSV-LSV+1, 1,
446 $ D( LSV ), N, INFO )
447 CALL SLASCL( 'g
', 0, 0, SSFMIN, ANORM, LENDSV-LSV, 1, E( LSV ),
465.EQ.
IF( ICOMPZ0 ) THEN
469 CALL SLASRT( 'i
', N, D, INFO )
480.LT.
IF( D( J )P ) THEN
488 CALL SSWAP( NR, Z( 1, I ), 1, Z( 1, K ), 1 )