173 SUBROUTINE dlaed3( K, N, N1, D, Q, LDQ, RHO, DLAMBDA, Q2, INDX,
181 INTEGER INFO, K, LDQ, N, N1
185 INTEGER CTOT( * ), INDX( * )
186 DOUBLE PRECISION D( * ), DLAMBDA( * ), Q( LDQ, * ), Q2( * ),
193 DOUBLE PRECISION ONE, ZERO
194 parameter( one = 1.0d0, zero = 0.0d0 )
197 INTEGER I, II, IQ2, J, N12, N2, N23
198 DOUBLE PRECISION TEMP
201 DOUBLE PRECISION DNRM2
209 INTRINSIC max, sign, sqrt
219 ELSE IF( n.LT.k )
THEN
221 ELSE IF( ldq.LT.max( 1, n ) )
THEN
225 CALL xerbla(
'DLAED3', -info )
236 CALL dlaed4( k, j, dlambda, w, q( 1, j ), rho, d( j ),
261 CALL dcopy( k, w, 1, s, 1 )
265 CALL dcopy( k, q, ldq+1, w, 1 )
268 w( i ) = w( i )*( q( i, j )/( dlambda( i )-dlambda( j ) ) )
271 w( i ) = w( i )*( q( i, j )/( dlambda( i )-dlambda( j ) ) )
275 w( i ) = sign( sqrt( -w( i ) ), s( i ) )
282 s( i ) = w( i ) / q( i, j )
284 temp = dnrm2( k, s, 1 )
287 q( i, j ) = s( ii ) / temp
296 n12 = ctot( 1 ) + ctot( 2 )
297 n23 = ctot( 2 ) + ctot( 3 )
299 CALL dlacpy(
'A', n23, k, q( ctot( 1 )+1, 1 ), ldq, s, n23 )
302 CALL dgemm(
'N',
'N', n2, k, n23, one, q2( iq2 ), n2, s,
304 $ zero, q( n1+1, 1 ), ldq )
306 CALL dlaset(
'A', n2, k, zero, zero, q( n1+1, 1 ), ldq )
309 CALL dlacpy(
'A', n12, k, q, ldq, s, n12 )
311 CALL dgemm(
'N',
'N', n1, k, n12, one, q2, n1, s, n12, zero,
315 CALL dlaset(
'A', n1, k, zero, zero, q( 1, 1 ), ldq )
subroutine dgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
DGEMM
subroutine dlacpy(uplo, m, n, a, lda, b, ldb)
DLACPY copies all or part of one two-dimensional array to another.
subroutine dlaed3(k, n, n1, d, q, ldq, rho, dlambda, q2, indx, ctot, w, s, info)
DLAED3 used by DSTEDC. Finds the roots of the secular equation and updates the eigenvectors....
subroutine dlaed4(n, i, d, z, delta, rho, dlam, info)
DLAED4 used by DSTEDC. Finds a single root of the secular equation.
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.