223 SUBROUTINE dlasd3( NL, NR, SQRE, K, D, Q, LDQ, DSIGMA, U, LDU, U2,
224 $ LDU2, VT, LDVT, VT2, LDVT2, IDXC, CTOT, Z,
233 INTEGER INFO, K, LDQ, LDU, LDU2, LDVT, LDVT2, NL, NR,
237 INTEGER CTOT( * ), IDXC( * )
238 DOUBLE PRECISION D( * ), DSIGMA( * ), Q( ldq, * ), U( ldu, * ),
239 $ u2( ldu2, * ), vt( ldvt, * ), vt2( ldvt2, * ),
246 DOUBLE PRECISION ONE, ZERO, NEGONE
247 parameter( one = 1.0d+0, zero = 0.0d+0,
251 INTEGER CTEMP, I, J, JC, KTEMP, M, N, NLP1, NLP2, NRP1
252 DOUBLE PRECISION RHO, TEMP
255 DOUBLE PRECISION DLAMC3, DNRM2
256 EXTERNAL dlamc3, dnrm2
262 INTRINSIC abs, sign, sqrt
272 ELSE IF( nr.LT.1 )
THEN 274 ELSE IF( ( sqre.NE.1 ) .AND. ( sqre.NE.0 ) )
THEN 283 IF( ( k.LT.1 ) .OR. ( k.GT.n ) )
THEN 285 ELSE IF( ldq.LT.k )
THEN 287 ELSE IF( ldu.LT.n )
THEN 289 ELSE IF( ldu2.LT.n )
THEN 291 ELSE IF( ldvt.LT.m )
THEN 293 ELSE IF( ldvt2.LT.m )
THEN 297 CALL xerbla(
'DLASD3', -info )
304 d( 1 ) = abs( z( 1 ) )
305 CALL dcopy( m, vt2( 1, 1 ), ldvt2, vt( 1, 1 ), ldvt )
306 IF( z( 1 ).GT.zero )
THEN 307 CALL dcopy( n, u2( 1, 1 ), 1, u( 1, 1 ), 1 )
310 u( i, 1 ) = -u2( i, 1 )
334 dsigma( i ) = dlamc3( dsigma( i ), dsigma( i ) ) - dsigma( i )
339 CALL dcopy( k, z, 1, q, 1 )
343 rho = dnrm2( k, z, 1 )
344 CALL dlascl(
'G', 0, 0, rho, one, k, 1, z, k, info )
350 CALL dlasd4( k, j, dsigma, z, u( 1, j ), rho, d( j ),
363 z( i ) = u( i, k )*vt( i, k )
365 z( i ) = z( i )*( u( i, j )*vt( i, j ) /
366 $ ( dsigma( i )-dsigma( j ) ) /
367 $ ( dsigma( i )+dsigma( j ) ) )
370 z( i ) = z( i )*( u( i, j )*vt( i, j ) /
371 $ ( dsigma( i )-dsigma( j+1 ) ) /
372 $ ( dsigma( i )+dsigma( j+1 ) ) )
374 z( i ) = sign( sqrt( abs( z( i ) ) ), q( i, 1 ) )
381 vt( 1, i ) = z( 1 ) / u( 1, i ) / vt( 1, i )
384 vt( j, i ) = z( j ) / u( j, i ) / vt( j, i )
385 u( j, i ) = dsigma( j )*vt( j, i )
387 temp = dnrm2( k, u( 1, i ), 1 )
388 q( 1, i ) = u( 1, i ) / temp
391 q( j, i ) = u( jc, i ) / temp
398 CALL dgemm(
'N',
'N', n, k, k, one, u2, ldu2, q, ldq, zero, u,
402 IF( ctot( 1 ).GT.0 )
THEN 403 CALL dgemm(
'N',
'N', nl, k, ctot( 1 ), one, u2( 1, 2 ), ldu2,
404 $ q( 2, 1 ), ldq, zero, u( 1, 1 ), ldu )
405 IF( ctot( 3 ).GT.0 )
THEN 406 ktemp = 2 + ctot( 1 ) + ctot( 2 )
407 CALL dgemm(
'N',
'N', nl, k, ctot( 3 ), one, u2( 1, ktemp ),
408 $ ldu2, q( ktemp, 1 ), ldq, one, u( 1, 1 ), ldu )
410 ELSE IF( ctot( 3 ).GT.0 )
THEN 411 ktemp = 2 + ctot( 1 ) + ctot( 2 )
412 CALL dgemm(
'N',
'N', nl, k, ctot( 3 ), one, u2( 1, ktemp ),
413 $ ldu2, q( ktemp, 1 ), ldq, zero, u( 1, 1 ), ldu )
415 CALL dlacpy(
'F', nl, k, u2, ldu2, u, ldu )
417 CALL dcopy( k, q( 1, 1 ), ldq, u( nlp1, 1 ), ldu )
418 ktemp = 2 + ctot( 1 )
419 ctemp = ctot( 2 ) + ctot( 3 )
420 CALL dgemm(
'N',
'N', nr, k, ctemp, one, u2( nlp2, ktemp ), ldu2,
421 $ q( ktemp, 1 ), ldq, zero, u( nlp2, 1 ), ldu )
427 temp = dnrm2( k, vt( 1, i ), 1 )
428 q( i, 1 ) = vt( 1, i ) / temp
431 q( i, j ) = vt( jc, i ) / temp
438 CALL dgemm(
'N',
'N', k, m, k, one, q, ldq, vt2, ldvt2, zero,
442 ktemp = 1 + ctot( 1 )
443 CALL dgemm(
'N',
'N', k, nlp1, ktemp, one, q( 1, 1 ), ldq,
444 $ vt2( 1, 1 ), ldvt2, zero, vt( 1, 1 ), ldvt )
445 ktemp = 2 + ctot( 1 ) + ctot( 2 )
447 $
CALL dgemm(
'N',
'N', k, nlp1, ctot( 3 ), one, q( 1, ktemp ),
448 $ ldq, vt2( ktemp, 1 ), ldvt2, one, vt( 1, 1 ),
451 ktemp = ctot( 1 ) + 1
453 IF( ktemp.GT.1 )
THEN 455 q( i, ktemp ) = q( i, 1 )
458 vt2( ktemp, i ) = vt2( 1, i )
461 ctemp = 1 + ctot( 2 ) + ctot( 3 )
462 CALL dgemm(
'N',
'N', k, nrp1, ctemp, one, q( 1, ktemp ), ldq,
463 $ vt2( ktemp, nlp2 ), ldvt2, zero, vt( 1, nlp2 ), ldvt )
subroutine dlacpy(UPLO, M, N, A, LDA, B, LDB)
DLACPY copies all or part of one two-dimensional array to another.
subroutine dcopy(N, DX, INCX, DY, INCY)
DCOPY
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 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 dgemm(TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC)
DGEMM
subroutine xerbla(SRNAME, INFO)
XERBLA