203 SUBROUTINE sbdsdc( UPLO, COMPQ, N, D, E, U, LDU, VT, LDVT, Q, IQ,
204 $ WORK, IWORK, INFO )
211 CHARACTER COMPQ, UPLO
212 INTEGER INFO, LDU, LDVT, N
215 INTEGER IQ( * ), IWORK( * )
216 REAL D( * ), E( * ), Q( * ), U( ldu, * ),
217 $ vt( ldvt, * ), work( * )
227 parameter( zero = 0.0e+0, one = 1.0e+0, two = 2.0e+0 )
230 INTEGER DIFL, DIFR, GIVCOL, GIVNUM, GIVPTR, I, IC,
231 $ icompq, ierr, ii, is, iu, iuplo, ivt, j, k, kk,
232 $ mlvl, nm1, nsize, perm, poles, qstart, smlsiz,
233 $ smlszp, sqre, start, wstart, z
234 REAL CS, EPS, ORGNRM, P, R, SN
240 EXTERNAL slamch, slanst, ilaenv, lsame
247 INTRINSIC REAL, ABS, INT, LOG, SIGN
256 IF( lsame( uplo,
'U' ) )
258 IF( lsame( uplo,
'L' ) )
260 IF( lsame( compq,
'N' ) )
THEN 262 ELSE IF( lsame( compq,
'P' ) )
THEN 264 ELSE IF( lsame( compq,
'I' ) )
THEN 269 IF( iuplo.EQ.0 )
THEN 271 ELSE IF( icompq.LT.0 )
THEN 273 ELSE IF( n.LT.0 )
THEN 275 ELSE IF( ( ldu.LT.1 ) .OR. ( ( icompq.EQ.2 ) .AND. ( ldu.LT.
278 ELSE IF( ( ldvt.LT.1 ) .OR. ( ( icompq.EQ.2 ) .AND. ( ldvt.LT.
283 CALL xerbla(
'SBDSDC', -info )
291 smlsiz = ilaenv( 9,
'SBDSDC',
' ', 0, 0, 0, 0 )
293 IF( icompq.EQ.1 )
THEN 294 q( 1 ) = sign( one, d( 1 ) )
295 q( 1+smlsiz*n ) = one
296 ELSE IF( icompq.EQ.2 )
THEN 297 u( 1, 1 ) = sign( one, d( 1 ) )
300 d( 1 ) = abs( d( 1 ) )
310 IF( icompq.EQ.1 )
THEN 311 CALL scopy( n, d, 1, q( 1 ), 1 )
312 CALL scopy( n-1, e, 1, q( n+1 ), 1 )
314 IF( iuplo.EQ.2 )
THEN 316 IF( icompq .EQ. 2 ) wstart = 2*n - 1
318 CALL slartg( d( i ), e( i ), cs, sn, r )
321 d( i+1 ) = cs*d( i+1 )
322 IF( icompq.EQ.1 )
THEN 325 ELSE IF( icompq.EQ.2 )
THEN 334 IF( icompq.EQ.0 )
THEN 338 CALL slasdq(
'U', 0, n, 0, 0, 0, d, e, vt, ldvt, u, ldu, u,
339 $ ldu, work( 1 ), info )
346 IF( n.LE.smlsiz )
THEN 347 IF( icompq.EQ.2 )
THEN 348 CALL slaset(
'A', n, n, zero, one, u, ldu )
349 CALL slaset(
'A', n, n, zero, one, vt, ldvt )
350 CALL slasdq(
'U', 0, n, n, n, 0, d, e, vt, ldvt, u, ldu, u,
351 $ ldu, work( wstart ), info )
352 ELSE IF( icompq.EQ.1 )
THEN 355 CALL slaset(
'A', n, n, zero, one, q( iu+( qstart-1 )*n ),
357 CALL slaset(
'A', n, n, zero, one, q( ivt+( qstart-1 )*n ),
359 CALL slasdq(
'U', 0, n, n, n, 0, d, e,
360 $ q( ivt+( qstart-1 )*n ), n,
361 $ q( iu+( qstart-1 )*n ), n,
362 $ q( iu+( qstart-1 )*n ), n, work( wstart ),
368 IF( icompq.EQ.2 )
THEN 369 CALL slaset(
'A', n, n, zero, one, u, ldu )
370 CALL slaset(
'A', n, n, zero, one, vt, ldvt )
375 orgnrm = slanst(
'M', n, d, e )
378 CALL slascl(
'G', 0, 0, orgnrm, one, n, 1, d, n, ierr )
379 CALL slascl(
'G', 0, 0, orgnrm, one, nm1, 1, e, nm1, ierr )
381 eps = slamch(
'Epsilon' )
383 mlvl = int( log(
REAL( N ) /
REAL( SMLSIZ+1 ) ) / log( TWO ) ) + 1
386 IF( icompq.EQ.1 )
THEN 395 givnum = poles + 2*mlvl
404 IF( abs( d( i ) ).LT.eps )
THEN 405 d( i ) = sign( eps, d( i ) )
413 IF( ( abs( e( i ) ).LT.eps ) .OR. ( i.EQ.nm1 ) )
THEN 422 nsize = i - start + 1
423 ELSE IF( abs( e( i ) ).GE.eps )
THEN 427 nsize = n - start + 1
434 nsize = i - start + 1
435 IF( icompq.EQ.2 )
THEN 436 u( n, n ) = sign( one, d( n ) )
438 ELSE IF( icompq.EQ.1 )
THEN 439 q( n+( qstart-1 )*n ) = sign( one, d( n ) )
440 q( n+( smlsiz+qstart-1 )*n ) = one
442 d( n ) = abs( d( n ) )
444 IF( icompq.EQ.2 )
THEN 445 CALL slasd0( nsize, sqre, d( start ), e( start ),
446 $ u( start, start ), ldu, vt( start, start ),
447 $ ldvt, smlsiz, iwork, work( wstart ), info )
449 CALL slasda( icompq, smlsiz, nsize, sqre, d( start ),
450 $ e( start ), q( start+( iu+qstart-2 )*n ), n,
451 $ q( start+( ivt+qstart-2 )*n ),
452 $ iq( start+k*n ), q( start+( difl+qstart-2 )*
453 $ n ), q( start+( difr+qstart-2 )*n ),
454 $ q( start+( z+qstart-2 )*n ),
455 $ q( start+( poles+qstart-2 )*n ),
456 $ iq( start+givptr*n ), iq( start+givcol*n ),
457 $ n, iq( start+perm*n ),
458 $ q( start+( givnum+qstart-2 )*n ),
459 $ q( start+( ic+qstart-2 )*n ),
460 $ q( start+( is+qstart-2 )*n ),
461 $ work( wstart ), iwork, info )
472 CALL slascl(
'G', 0, 0, one, orgnrm, n, 1, d, n, ierr )
482 IF( d( j ).GT.p )
THEN 490 IF( icompq.EQ.1 )
THEN 492 ELSE IF( icompq.EQ.2 )
THEN 493 CALL sswap( n, u( 1, i ), 1, u( 1, kk ), 1 )
494 CALL sswap( n, vt( i, 1 ), ldvt, vt( kk, 1 ), ldvt )
496 ELSE IF( icompq.EQ.1 )
THEN 503 IF( icompq.EQ.1 )
THEN 504 IF( iuplo.EQ.1 )
THEN 514 IF( ( iuplo.EQ.2 ) .AND. ( icompq.EQ.2 ) )
515 $
CALL slasr(
'L',
'V',
'B', n, n, work( 1 ), work( n ), u, ldu )
subroutine slasdq(UPLO, SQRE, N, NCVT, NRU, NCC, D, E, VT, LDVT, U, LDU, C, LDC, WORK, INFO)
SLASDQ computes the SVD of a real bidiagonal matrix with diagonal d and off-diagonal e...
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine sswap(N, SX, INCX, SY, INCY)
SSWAP
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 slaset(UPLO, M, N, ALPHA, BETA, A, LDA)
SLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values...
subroutine scopy(N, SX, INCX, SY, INCY)
SCOPY
subroutine sbdsdc(UPLO, COMPQ, N, D, E, U, LDU, VT, LDVT, Q, IQ, WORK, IWORK, INFO)
SBDSDC
subroutine slasr(SIDE, PIVOT, DIRECT, M, N, C, S, A, LDA)
SLASR applies a sequence of plane rotations to a general rectangular matrix.
subroutine slasd0(N, SQRE, D, E, U, LDU, VT, LDVT, SMLSIZ, IWORK, WORK, INFO)
SLASD0 computes the singular values of a real upper bidiagonal n-by-m matrix B with diagonal d and of...
subroutine slasda(ICOMPQ, SMLSIZ, N, SQRE, D, E, U, LDU, VT, K, DIFL, DIFR, Z, POLES, GIVPTR, GIVCOL, LDGCOL, PERM, GIVNUM, C, S, WORK, IWORK, INFO)
SLASDA computes the singular value decomposition (SVD) of a real upper bidiagonal matrix with diagona...