210 SUBROUTINE dlaed2( K, N, N1, D, Q, LDQ, INDXQ, RHO, Z, DLAMBDA, W,
211 $ Q2, INDX, INDXC, INDXP, COLTYP, INFO )
218 INTEGER INFO, K, LDQ, N, N1
222 INTEGER COLTYP( * ), INDX( * ), INDXC( * ), INDXP( * ),
224 DOUBLE PRECISION D( * ), DLAMBDA( * ), Q( LDQ, * ), Q2( * ),
231 DOUBLE PRECISION MONE, ZERO, ONE, TWO, EIGHT
232 parameter( mone = -1.0d0, zero = 0.0d0, one = 1.0d0,
233 $ two = 2.0d0, eight = 8.0d0 )
236 INTEGER CTOT( 4 ), PSM( 4 )
239 INTEGER CT, I, IMAX, IQ1, IQ2, J, JMAX, JS, K2, N1P1,
241 DOUBLE PRECISION C, EPS, S, T, TAU, TOL
245 DOUBLE PRECISION DLAMCH, DLAPY2
246 EXTERNAL idamax, dlamch, dlapy2
252 INTRINSIC abs, max, min, sqrt
262 ELSE IF( ldq.LT.max( 1, n ) )
THEN
264 ELSE IF( min( 1, ( n / 2 ) ).GT.n1 .OR. ( n / 2 ).LT.n1 )
THEN
268 CALL xerbla(
'DLAED2', -info )
280 IF( rho.LT.zero )
THEN
281 CALL dscal( n2, mone, z( n1p1 ), 1 )
287 t = one / sqrt( two )
288 CALL dscal( n, t, z, 1 )
297 indxq( i ) = indxq( i ) + n1
303 dlambda( i ) = d( indxq( i ) )
305 CALL dlamrg( n1, n2, dlambda, 1, 1, indxc )
307 indx( i ) = indxq( indxc( i ) )
312 imax = idamax( n, z, 1 )
313 jmax = idamax( n, d, 1 )
314 eps = dlamch(
'Epsilon' )
315 tol = eight*eps*max( abs( d( jmax ) ), abs( z( imax ) ) )
321 IF( rho*abs( z( imax ) ).LE.tol )
THEN
326 CALL dcopy( n, q( 1, i ), 1, q2( iq2 ), 1 )
327 dlambda( j ) = d( i )
330 CALL dlacpy(
'A', n, n, q2, n, q, ldq )
331 CALL dcopy( n, dlambda, 1, d, 1 )
353 IF( rho*abs( z( nj ) ).LE.tol )
THEN
372 IF( rho*abs( z( nj ) ).LE.tol )
THEN
390 t = d( nj ) - d( pj )
393 IF( abs( t*c*s ).LE.tol )
THEN
399 IF( coltyp( nj ).NE.coltyp( pj ) )
402 CALL drot( n, q( 1, pj ), 1, q( 1, nj ), 1, c, s )
403 t = d( pj )*c**2 + d( nj )*s**2
404 d( nj ) = d( pj )*s**2 + d( nj )*c**2
410 IF( d( pj ).LT.d( indxp( k2+i ) ) )
THEN
411 indxp( k2+i-1 ) = indxp( k2+i )
424 dlambda( k ) = d( pj )
436 dlambda( k ) = d( pj )
450 ctot( ct ) = ctot( ct ) + 1
456 psm( 2 ) = 1 + ctot( 1 )
457 psm( 3 ) = psm( 2 ) + ctot( 2 )
458 psm( 4 ) = psm( 3 ) + ctot( 3 )
468 indx( psm( ct ) ) = js
469 indxc( psm( ct ) ) = j
470 psm( ct ) = psm( ct ) + 1
480 iq2 = 1 + ( ctot( 1 )+ctot( 2 ) )*n1
481 DO 140 j = 1, ctot( 1 )
483 CALL dcopy( n1, q( 1, js ), 1, q2( iq1 ), 1 )
489 DO 150 j = 1, ctot( 2 )
491 CALL dcopy( n1, q( 1, js ), 1, q2( iq1 ), 1 )
492 CALL dcopy( n2, q( n1+1, js ), 1, q2( iq2 ), 1 )
499 DO 160 j = 1, ctot( 3 )
501 CALL dcopy( n2, q( n1+1, js ), 1, q2( iq2 ), 1 )
508 DO 170 j = 1, ctot( 4 )
510 CALL dcopy( n, q( 1, js ), 1, q2( iq2 ), 1 )
520 CALL dlacpy(
'A', n, ctot( 4 ), q2( iq1 ), n,
522 CALL dcopy( n-k, z( k+1 ), 1, d( k+1 ), 1 )
528 coltyp( j ) = ctot( j )
subroutine xerbla(srname, info)
subroutine dcopy(n, dx, incx, dy, incy)
DCOPY
subroutine dlacpy(uplo, m, n, a, lda, b, ldb)
DLACPY copies all or part of one two-dimensional array to another.
subroutine dlaed2(k, n, n1, d, q, ldq, indxq, rho, z, dlambda, w, q2, indx, indxc, indxp, coltyp, info)
DLAED2 used by DSTEDC. Merges eigenvalues and deflates secular equation. Used when the original matri...
subroutine dlamrg(n1, n2, a, dtrd1, dtrd2, index)
DLAMRG creates a permutation list to merge the entries of two independently sorted sets into a single...
subroutine drot(n, dx, incx, dy, incy, c, s)
DROT
subroutine dscal(n, da, dx, incx)
DSCAL