266 subroutine dlasd2( nl, nr, sqre, k, D, Z, alpha, beta, U, ldu, VT,
267 $ ldvt, dsigma, U2, ldu2, VT2, ldvt2, idxp, idx,
268 $ idxc, idxq, coltype, info )
275 integer info, k, ldu, ldu2, ldvt, ldvt2, nl, nr, sqre
276 double precision alpha, beta
279 integer coltype( * ), idx( * ), idxc( * ), idxp( * ),
281 double precision d( * ), dsigma( * ), u( ldu, * ),
282 $ u2( ldu2, * ), vt( ldvt, * ), vt2( ldvt2, * ),
287 double precision zero, one, two, eight
288 parameter( zero = 0.0d+0, one = 1.0d+0, two = 2.0d+0,
292 integer ctot( 4 ), psm( 4 )
295 integer ct, i, idxi, idxj, idxjp, j, jp, jprev, k2, m,
297 double precision c, eps, hlftol, s, tau, tol, z1
317 else if (nr < 1)
then 319 else if (( sqre .ne. 1 ) .and. ( sqre .ne. 0 ))
then 328 else if (ldvt < m)
then 330 else if (ldu2 < n)
then 332 else if (ldvt2 < m)
then 335 if (info .ne. 0)
then 336 call xerbla(
'dlasd2', -info )
345 z1 = alpha*vt( nl+1, nl+1 )
348 z( i+1 ) = alpha*vt( i, nl+1 )
350 idxq( i+1 ) = idxq( i ) + 1
355 z( i ) = beta*vt( i, nl+2 )
367 idxq( i ) = idxq( i ) + nl+1
373 dsigma( i ) = d( idxq( i ) )
374 u2( i, 1 ) = z( idxq( i ) )
375 idxc( i ) = coltype( idxq( i ) )
380 call dlamrg( nl, nr, dsigma( 2 ), 1, 1, idx( 2 ) )
384 d( i ) = dsigma( idxi )
385 z( i ) = u2( idxi, 1 )
386 coltype( i ) = idxc( idxi )
391 tol = eight * eps * max( abs( d(n) ), abs( alpha ), abs( beta ) )
436 if (abs( z( j ) ) <= tol)
then 441 else if (jprev > 0)
then 442 if (abs( d( j ) - d( jprev ) ) <= tol)
then 457 idxjp = idxq( idx( jprev )+1 )
458 idxj = idxq( idx( j )+1 )
459 if (idxjp <= nl+1)
then 462 if (idxj <= nl+1)
then 465 call drot( n, u( 1, idxjp ), 1, u( 1, idxj ), 1, c, s )
466 call drot( m, vt( idxjp, 1 ), ldvt, vt( idxj, 1 ), ldvt, c
467 if (coltype( j ) .ne. coltype( jprev ))
then 476 u2( k, 1 ) = z( jprev )
477 dsigma( k ) = d( jprev )
491 u2( k, 1 ) = z( jprev )
492 dsigma( k ) = d( jprev )
506 ctot( ct ) = ctot( ct ) + 1
511 psm( 2 ) = 2 + ctot( 1 )
512 psm( 3 ) = psm( 2 ) + ctot( 2 )
513 psm( 4 ) = psm( 3 ) + ctot( 3 )
522 idxc( psm( ct ) ) = j
523 psm( ct ) = psm( ct ) + 1
534 dsigma( j ) = d( jp )
535 idxj = idxq( idx( idxp( idxc( j ) ) )+1 )
536 if (idxj <= nl+1)
then 539 call dcopy( n, u( 1, idxj ), 1, u2( 1, j ), 1 )
540 call dcopy( m, vt( idxj, 1 ), ldvt, vt2( j, 1 ), ldvt2 )
546 if (abs( dsigma( 2 ) ) <= hlftol)
then 550 z( 1 ) =
dlapy2( z1, z( m ) )
551 if (z( 1 ) <= tol)
then 560 if (abs( z1 ) <= tol)
then 568 call dcopy( k-1, u2( 2, 1 ), 1, z( 2 ), 1 )
572 call dlaset(
'a', n, 1, zero, zero, u2, ldu2 )
576 vt( m, i ) = -s*vt( nl+1, i )
577 vt2( 1, i ) = c*vt( nl+1, i )
580 vt2( 1, i ) = s*vt( m, i )
581 vt( m, i ) = c*vt( m, i )
584 call dcopy( m, vt( nl+1, 1 ), ldvt, vt2( 1, 1 ), ldvt2 )
587 call dcopy( m, vt( m, 1 ), ldvt, vt2( m, 1 ), ldvt2 )
593 call dcopy( n-k, dsigma( k+1 ), 1, d( k+1 ), 1 )
594 call dlacpy(
'a', n, n-k, u2( 1, k+1 ), ldu2, u( 1, k+1 ),
596 call dlacpy(
'a', n-k, m, vt2( k+1, 1 ), ldvt2, vt( k+1, 1 ),
602 coltype( j ) = ctot( j )
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine dlacpy(UPLO, M, N, A, LDA, B, LDB)
DLACPY copies all or part of one two-dimensional array to another.
subroutine dlasd2(NL, NR, SQRE, K, D, Z, ALPHA, BETA, U, LDU, VT, LDVT, DSIGMA, U2, LDU2, VT2, LDVT2, IDXP, IDX, IDXC, IDXQ, COLTYP, INFO)
DLASD2 merges the two sets of singular values together into a single sorted set. Used by sbdsdc...
double precision function dlamch(CMACH)
DLAMCH
subroutine dlamrg(N1, N2, A, DTRD1, DTRD2, INDEX)
DLAMRG creates a permutation list to merge the entries of two independently sorted sets into a single...
subroutine drot(N, DX, INCX, DY, INCY, C, S)
DROT
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...
double precision function dlapy2(X, Y)
DLAPY2 returns sqrt(x2+y2).
subroutine dcopy(N, DX, INCX, DY, INCY)
DCOPY