164 SUBROUTINE dlasd8( ICOMPQ, K, D, Z, VF, VL, DIFL, DIFR, LDDIFR,
165 $ DSIGMA, WORK, INFO )
172 INTEGER ICOMPQ, INFO, K, LDDIFR
175 DOUBLE PRECISION D( * ), DIFL( * ), DIFR( LDDIFR, * ),
176 $ dsigma( * ), vf( * ), vl( * ), work( *
184 parameter( one = 1.0d+0 )
187 INTEGER I, IWK1, IWK2, IWK2I, IWK3, , J
188 DOUBLE PRECISION DIFLJ, DIFRJ, DJ, DSIGJ, DSIGJP, RHO, TEMP
194 DOUBLE PRECISION , DLAMC3, DNRM2
195 EXTERNAL ddot, dlamc3, dnrm2
198 INTRINSIC abs, sign, sqrt
206 IF( ( icompq.LT.0 ) .OR. ( icompq.GT.1 ) )
THEN
208 ELSE IF( k.LT.1 )
THEN
210 ELSE IF( lddifr.LT.k )
THEN
214 CALL xerbla(
'DLASD8', -info )
221 d( 1 ) = abs( z( 1 ) )
223 IF( icompq.EQ.1 )
THEN
248 dsigma( i ) = dlamc3( dsigma( i ), dsigma( i ) ) - dsigma( i )
261 rho = dnrm2( k, z, 1 )
262 CALL dlascl(
'G', 0, 0, rho, one, k, 1, z, k, info )
267 CALL dlaset(
'A', k, 1, one, one, work( iwk3 ), k )
273 CALL dlasd4( k, j, dsigma, z, work( iwk1 ), rho, d( j ),
274 $ work( iwk2 ), info )
281 work( iwk3i+j ) = work( iwk3i+j )*work( j )*work( iwk2i+j )
282 difl( j ) = -work( j )
283 difr( j, 1 ) = -work( j+1 )
285 work( iwk3i+i ) = work( iwk3i+i )*work( i )*
286 $ work( iwk2i+i ) / ( dsigma( i )-
287 $ dsigma( j ) ) / ( dsigma( i )+
291 work( iwk3i+i ) = work( iwk3i+i )*work( i )*
292 $ work( iwk2i+i ) / ( dsigma( i )-
293 $ dsigma( j ) ) / ( dsigma( i )+
301 z( i ) = sign( sqrt( abs( work( iwk3i+i ) ) ), z( i ) )
311 difrj = -difr( j, 1 )
312 dsigjp = -dsigma( j+1 )
314 work( j ) = -z( j ) / diflj / ( dsigma( j )+dj )
316 work( i ) = z( i ) / ( dlamc3( dsigma( i ), dsigj )-diflj )
317 $ / ( dsigma( i )+dj )
320 work( i ) = z( i ) / ( dlamc3( dsigma( i ), dsigjp )+difrj )
321 $ / ( dsigma( i )+dj )
323 temp = dnrm2( k, work, 1 )
324 work( iwk2i+j ) =
ddot( k, work, 1, vf, 1 ) / temp
325 work( iwk3i+j ) =
ddot( k, work, 1, vl, 1 ) / temp
326 IF( icompq.EQ.1 )
THEN
331 CALL dcopy( k, work( iwk2 ), 1, vf, 1 )
332 CALL dcopy( k, work( iwk3 ), 1, vl, 1 )
subroutine dlasd8(icompq, k, d, z, vf, vl, difl, difr, lddifr, dsigma, work, info)
DLASD8 finds the square roots of the roots of the secular equation, and stores, for each element in D...
subroutine dlasd4(n, i, d, z, delta, rho, sigma, work, info)
DLASD4 computes the square root of the i-th updated eigenvalue of a positive symmetric rank-one modif...
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.