221 SUBROUTINE dlasd3( NL, NR, SQRE, K, D, Q, LDQ, DSIGMA, U, LDU, U2,
222 $ LDU2, VT, LDVT, VT2, LDVT2, IDXC, CTOT, Z,
230 INTEGER , K, LDQ, LDU, LDU2, LDVT, LDVT2, NL, NR,
234 INTEGER CTOT( * ), IDXC( * )
235 DOUBLE PRECISION D( * ), DSIGMA( * ), Q( LDQ, * ), U( LDU, * ),
236 $ u2( ldu2, * ), vt( ldvt, * ), vt2( ldvt2, * ),
243 DOUBLE PRECISION ONE, ZERO, NEGONE
244 PARAMETER ( ONE = 1.0d+0, zero = 0.0d+0,
248 INTEGER CTEMP, I, J, JC, KTEMP, M, N, NLP1, NLP2, NRP1
249 DOUBLE PRECISION RHO, TEMP
252 DOUBLE PRECISION DLAMC3, DNRM2
253 EXTERNAL DLAMC3, DNRM2
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(
'DLASD3', -info )
301 d( 1 ) = abs( z( 1 ) )
302 CALL dcopy( m, vt2( 1, 1 ), ldvt2, vt( 1, 1 ), ldvt )
303 IF( z( 1 ).GT.zero )
THEN
304 CALL dcopy( n, u2( 1, 1 ), 1, u( 1, 1 ), 1 )
307 u( i, 1 ) = -u2( i, 1 )
331 dsigma( i ) = dlamc3( dsigma( i ), dsigma( i ) ) - dsigma( i )
336 CALL dcopy( k, z, 1, q, 1 )
340 rho = dnrm2( k, z, 1 )
341 CALL dlascl( 'g
', 0, 0, RHO, ONE, K, 1, Z, K, INFO )
347 CALL DLASD4( 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 = DNRM2( K, U( 1, I ), 1 )
385 Q( 1, I ) = U( 1, I ) / TEMP
388 Q( J, I ) = U( JC, I ) / TEMP
395 CALL DGEMM( 'n
', 'n
', N, K, K, ONE, U2, LDU2, Q, LDQ, ZERO, U,
399.GT.
IF( CTOT( 1 )0 ) THEN
400 CALL DGEMM( '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 DGEMM( '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 DGEMM( 'n
', 'n
', NL, K, CTOT( 3 ), ONE, U2( 1, KTEMP ),
410 $ LDU2, Q( KTEMP, 1 ), LDQ, ZERO, U( 1, 1 ), LDU )
412 CALL DLACPY( 'f
', NL, K, U2, LDU2, U, LDU )
414 CALL DCOPY( K, Q( 1, 1 ), LDQ, U( NLP1, 1 ), LDU )
415 KTEMP = 2 + CTOT( 1 )
416 CTEMP = CTOT( 2 ) + CTOT( 3 )
417 CALL DGEMM( 'n
', 'n
', NR, K, CTEMP, ONE, U2( NLP2, KTEMP ), LDU2,
418 $ Q( KTEMP, 1 ), LDQ, ZERO, U( NLP2, 1 ), LDU )
424 TEMP = DNRM2( K, VT( 1, I ), 1 )
425 Q( I, 1 ) = VT( 1, I ) / TEMP
428 Q( I, J ) = VT( JC, I ) / TEMP
435 CALL DGEMM( 'n
', 'n
', K, M, K, ONE, Q, LDQ, VT2, LDVT2, ZERO,
439 KTEMP = 1 + CTOT( 1 )
440 CALL DGEMM( '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 DGEMM( '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 DGEMM( 'n
', 'n
', K, NRP1, CTEMP, ONE, Q( 1, KTEMP ), LDQ,
460 $ VT2( KTEMP, NLP2 ), LDVT2, ZERO, VT( 1, NLP2 ), LDVT )
subroutine dlasd3(nl, nr, sqre, k, d, q, ldq, dsigma, u, ldu, u2, ldu2, vt, ldvt, vt2, ldvt2, idxc, ctot, z, info)
DLASD3 finds all square roots of the roots of the secular equation, as defined by the values in D and...
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 dlacpy(uplo, m, n, a, lda, b, ldb)
DLACPY copies all or part of one two-dimensional array to another.
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 dgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
DGEMM