221 SUBROUTINE slasd3( NL, NR, SQRE, K, D, Q, LDQ, DSIGMA, U, LDU, U2,
222 $ LDU2, VT, LDVT, VT2, LDVT2, IDXC, CTOT, Z,
230 INTEGER INFO, K, LDQ, LDU, LDU2, LDVT, LDVT2, NL, NR,
234 INTEGER CTOT( * ), IDXC( * )
235 REAL D( * ), DSIGMA( * ), Q( LDQ, * ), U( LDU, * ),
243 REAL ONE, ZERO, NEGONE
244 PARAMETER ( ONE = 1.0e+0, zero = 0.0e+0,
248 INTEGER CTEMP, I, J, JC, KTEMP, M, N, NLP1, NLP2, NRP1
253 EXTERNAL SLAMC3, SNRM2
259 INTRINSIC abs, sign, sqrt
269 ELSE IF( nr.LT.1 )
THEN
271 ELSE IF( ( sqre.NE.1 ) .AND. ( sqre.NE.0 ) )
THEN
280 IF( ( k.LT.1 ) .OR. ( k.GT.n ) )
THEN
282 ELSE IF( ldq.LT.k )
THEN
284 ELSE IF( ldu.LT.n )
THEN
286 ELSE IF( ldu2.LT.n )
THEN
288 ELSE IF( ldvt.LT.m )
THEN
290 ELSE IF( ldvt2.LT.m )
THEN
294 CALL xerbla(
'SLASD3', -info )
301 d( 1 ) = abs( z( 1 ) )
302 CALL scopy( m, vt2( 1, 1 ), ldvt2, vt( 1, 1 ), ldvt )
303 IF( z( 1 ).GT.zero )
THEN
304 CALL scopy( n, u2( 1, 1 ), 1, u( 1, 1 ), 1 )
307 u( i, 1 ) = -u2( i, 1 )
331 dsigma( i ) = slamc3( dsigma( i ), dsigma( i ) ) - dsigma( i )
336 CALL scopy( k, z, 1, q, 1 )
340 rho = snrm2( k, z, 1 )
341 CALL slascl( 'g
', 0, 0, RHO, ONE, K, 1, Z, K, INFO )
347 CALL SLASD4( K, J, DSIGMA, Z, U( 1, J ), RHO, D( J ),
360 Z( I ) = U( I, K )*VT( I, K )
362 Z( I ) = Z( I )*( U( I, J )*VT( I, J ) /
363 $ ( DSIGMA( I )-DSIGMA( J ) ) /
364 $ ( DSIGMA( I )+DSIGMA( J ) ) )
367 Z( I ) = Z( I )*( U( I, J )*VT( I, J ) /
368 $ ( DSIGMA( I )-DSIGMA( J+1 ) ) /
369 $ ( DSIGMA( I )+DSIGMA( J+1 ) ) )
371 Z( I ) = SIGN( SQRT( ABS( Z( I ) ) ), Q( I, 1 ) )
378 VT( 1, I ) = Z( 1 ) / U( 1, I ) / VT( 1, I )
381 VT( J, I ) = Z( J ) / U( J, I ) / VT( J, I )
382 U( J, I ) = DSIGMA( J )*VT( J, I )
384 TEMP = SNRM2( K, U( 1, I ), 1 )
385 Q( 1, I ) = U( 1, I ) / TEMP
388 Q( J, I ) = U( JC, I ) / TEMP
395 CALL SGEMM( 'n
', 'n
', N, K, K, ONE, U2, LDU2, Q, LDQ, ZERO, U,
399.GT.
IF( CTOT( 1 )0 ) THEN
400 CALL SGEMM( 'n
', 'n
', NL, K, CTOT( 1 ), ONE, U2( 1, 2 ), LDU2,
401 $ Q( 2, 1 ), LDQ, ZERO, U( 1, 1 ), LDU )
402.GT.
IF( CTOT( 3 )0 ) THEN
403 KTEMP = 2 + CTOT( 1 ) + CTOT( 2 )
404 CALL SGEMM( 'n
', 'n
', NL, K, CTOT( 3 ), ONE, U2( 1, KTEMP ),
405 $ LDU2, Q( KTEMP, 1 ), LDQ, ONE, U( 1, 1 ), LDU )
407.GT.
ELSE IF( CTOT( 3 )0 ) THEN
408 KTEMP = 2 + CTOT( 1 ) + CTOT( 2 )
409 CALL SGEMM( 'n
', 'n
', NL, K, CTOT( 3 ), ONE, U2( 1, KTEMP ),
410 $ LDU2, Q( KTEMP, 1 ), LDQ, ZERO, U( 1, 1 ), LDU )
412 CALL SLACPY( 'f
', NL, K, U2, LDU2, U, LDU )
414 CALL SCOPY( K, Q( 1, 1 ), LDQ, U( NLP1, 1 ), LDU )
415 KTEMP = 2 + CTOT( 1 )
416 CTEMP = CTOT( 2 ) + CTOT( 3 )
417 CALL SGEMM( 'n
', 'n
', NR, K, CTEMP, ONE, U2( NLP2, KTEMP ), LDU2,
418 $ Q( KTEMP, 1 ), LDQ, ZERO, U( NLP2, 1 ), LDU )
424 TEMP = SNRM2( K, VT( 1, I ), 1 )
425 Q( I, 1 ) = VT( 1, I ) / TEMP
428 Q( I, J ) = VT( JC, I ) / TEMP
435 CALL SGEMM( 'n
', 'n
', K, M, K, ONE, Q, LDQ, VT2, LDVT2, ZERO,
439 KTEMP = 1 + CTOT( 1 )
440 CALL SGEMM( 'n
', 'n
', K, NLP1, KTEMP, ONE, Q( 1, 1 ), LDQ,
441 $ VT2( 1, 1 ), LDVT2, ZERO, VT( 1, 1 ), LDVT )
442 KTEMP = 2 + CTOT( 1 ) + CTOT( 2 )
444 $ CALL SGEMM( 'n
', 'n
', K, NLP1, CTOT( 3 ), ONE, Q( 1, KTEMP ),
445 $ LDQ, VT2( KTEMP, 1 ), LDVT2, ONE, VT( 1, 1 ),
448 KTEMP = CTOT( 1 ) + 1
450.GT.
IF( KTEMP1 ) THEN
452 Q( I, KTEMP ) = Q( I, 1 )
455 VT2( KTEMP, I ) = VT2( 1, I )
458 CTEMP = 1 + CTOT( 2 ) + CTOT( 3 )
459 CALL SGEMM( 'n
', 'n
', K, NRP1, CTEMP, ONE, Q( 1, KTEMP ), LDQ,
460 $ VT2( KTEMP, NLP2 ), LDVT2, ZERO, VT( 1, NLP2 ), LDVT )
subroutine slasd4(n, i, d, z, delta, rho, sigma, work, info)
SLASD4 computes the square root of the i-th updated eigenvalue of a positive symmetric rank-one modif...
subroutine slasd3(nl, nr, sqre, k, d, q, ldq, dsigma, u, ldu, u2, ldu2, vt, ldvt, vt2, ldvt2, idxc, ctot, z, info)
SLASD3 finds all square roots of the roots of the secular equation, as defined by the values in D and...
subroutine slacpy(uplo, m, n, a, lda, b, ldb)
SLACPY copies all or part of one two-dimensional array to another.
subroutine slascl(type, kl, ku, cfrom, cto, m, n, a, lda, info)
SLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
subroutine xerbla(srname, info)
XERBLA
subroutine scopy(n, sx, incx, sy, incy)
SCOPY
subroutine sgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
SGEMM