238 SUBROUTINE slaed8( ICOMPQ, K, N, QSIZ, D, Q, LDQ, INDXQ, RHO,
239 $ CUTPNT, Z, DLAMBDA, Q2, LDQ2, W, PERM, GIVPTR,
240 $ GIVCOL, GIVNUM, INDXP, INDX, INFO )
247 INTEGER CUTPNT, GIVPTR, ICOMPQ, INFO, K, LDQ, LDQ2, N,
252 INTEGER GIVCOL( 2, * ), INDX( * ), INDXP( * ),
253 $ INDXQ( * ), PERM( * )
254 REAL D( * ), DLAMBDA( * ), GIVNUM( 2, * ),
255 $ Q( LDQ, * ), Q2( LDQ2, * ), W( * ), Z( * )
261 REAL MONE, ZERO, ONE, TWO, EIGHT
262 PARAMETER ( MONE = -1.0e0, zero = 0.0e0, one = 1.0e0,
263 $ two = 2.0e0, eight = 8.0e0 )
267 INTEGER I, IMAX, J, JLAM, JMAX, JP, K2, N1, N1P1, N2
268 REAL C, EPS, S, T, TAU, TOL
273 EXTERNAL isamax, slamch, slapy2
280 INTRINSIC abs, max, min, sqrt
288 IF( icompq.LT.0 .OR. icompq.GT.1 )
THEN
290 ELSE IF( n.LT.0 )
THEN
292 ELSE IF( icompq.EQ.1 .AND. qsiz.LT.n )
THEN
294 ELSE IF( ldq.LT.max( 1, n ) )
THEN
296 ELSE IF( cutpnt.LT.min( 1, n ) .OR. cutpnt.GT.n )
THEN
298 ELSE IF( ldq2.LT.max( 1, n ) )
THEN
302 CALL xerbla(
'SLAED8', -info )
322 IF( rho.LT.zero )
THEN
323 CALL sscal( n2, mone, z( n1p1 ), 1 )
328 t = one / sqrt( two )
332 CALL sscal( n, t, z, 1 )
337 DO 20 i = cutpnt + 1, n
338 indxq( i ) = indxq( i ) + cutpnt
341 dlambda( i ) = d( indxq( i ) )
342 w( i ) = z( indxq( i ) )
346 CALL slamrg( n1, n2, dlambda, 1, 1, indx )
348 d( i ) = dlambda( indx( i ) )
349 z( i ) = w( indx( i ) )
354 imax = isamax( n, z, 1 )
355 jmax = isamax( n, d, 1 )
356 eps = slamch(
'Epsilon' )
357 tol = eight*eps*abs( d( jmax ) )
363 IF( rho*abs( z( imax ) ).LE.tol )
THEN
365 IF( icompq.EQ.0 )
THEN
367 perm( j ) = indxq( indx( j ) )
371 perm( j ) = indxq( indx( j ) )
372 CALL scopy( qsiz, q( 1, perm( j ) ), 1, q2( 1, j ),
375 CALL slacpy(
'A', qsiz, n, q2( 1, 1 ), ldq2, q( 1, 1 ),
390 IF( rho*abs( z( j ) ).LE.tol )
THEN
407 IF( rho*abs( z( j ) ).LE.tol )
THEN
424 t = d( j ) - d( jlam )
427 IF( abs( t*c*s ).LE.tol )
THEN
437 givcol( 1, givptr ) = indxq( indx( jlam ) )
438 givcol( 2, givptr ) = indxq( indx( j ) )
439 givnum( 1, givptr ) = c
440 givnum( 2, givptr ) = s
441 IF( icompq.EQ.1 )
THEN
442 CALL srot( qsiz, q( 1, indxq( indx( jlam ) ) ), 1,
443 $ q( 1, indxq( indx( j ) ) ), 1, c, s )
445 t = d( jlam )*c*c + d( j )*s*s
446 d( j ) = d( jlam )*s*s + d( j )*c*c
452 IF( d( jlam ).LT.d( indxp( k2+i ) ) )
THEN
453 indxp( k2+i-1 ) = indxp( k2+i )
458 indxp( k2+i-1 ) = jlam
461 indxp( k2+i-1 ) = jlam
467 dlambda( k ) = d( jlam )
479 dlambda( k ) = d( jlam )
489 IF( icompq.EQ.0 )
THEN
492 dlambda( j ) = d( jp )
493 perm( j ) = indxq( indx( jp ) )
498 dlambda( j ) = d( jp )
499 perm( j ) = indxq( indx( jp ) )
500 CALL scopy( qsiz, q( 1, perm( j ) ), 1, q2( 1, j ), 1 )
508 IF( icompq.EQ.0 )
THEN
509 CALL scopy( n-k, dlambda( k+1 ), 1, d( k+1 ), 1 )
511 CALL scopy( n-k, dlambda( k+1 ), 1, d( k+1 ), 1 )
512 CALL slacpy(
'A', qsiz, n-k, q2( 1, k+1 ), ldq2,
subroutine slaed8(icompq, k, n, qsiz, d, q, ldq, indxq, rho, cutpnt, z, dlambda, q2, ldq2, w, perm, givptr, givcol, givnum, indxp, indx, info)
SLAED8 used by SSTEDC. Merges eigenvalues and deflates secular equation. Used when the original matri...