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, , 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.EQ.
IF( IUPLO0 ) THEN
271.LT.
ELSE IF( ICOMPQ0 ) THEN
273.LT.
ELSE IF( N0 ) THEN
275.LT..OR..EQ..AND..LT.
ELSE IF( ( LDU1 ) ( ( ICOMPQ2 ) ( LDU
278.LT..OR..EQ..AND..LT.
ELSE IF( ( LDVT1 ) ( ( ICOMPQ2 ) ( LDVT
283 CALL XERBLA( 'sbdsdc', -INFO )
291 SMLSIZ = ILAENV( 9, 'sbdsdc', ' ', 0, 0, 0, 0 )
293.EQ.
IF( ICOMPQ1 ) THEN
294 Q( 1 ) = SIGN( ONE, D( 1 ) )
295 Q( 1+SMLSIZ*N ) = ONE
296.EQ.
ELSE IF( ICOMPQ2 ) THEN
297 U( 1, 1 ) = SIGN( ONE, D( 1 ) )
300 D( 1 ) = ABS( D( 1 ) )
310.EQ.
IF( ICOMPQ1 ) THEN
311 CALL SCOPY( N, D, 1, Q( 1 ), 1 )
312 CALL SCOPY( N-1, E, 1, Q( N+1 ), 1 )
314.EQ.
IF( IUPLO2 ) THEN
316.EQ.
IF( ICOMPQ 2 ) WSTART = 2*N - 1
318 CALL SLARTG( D( I ), E( I ), CS, SN, R )
321 D( I+1 ) = CS*D( I+1 )
322.EQ.
IF( ICOMPQ1 ) THEN
325.EQ.
ELSE IF( ICOMPQ2 ) THEN
334.EQ.
IF( ICOMPQ0 ) THEN
338 CALL SLASDQ( 'u
', 0, N, 0, 0, 0, D, E, VT, LDVT, U, LDU, U,
339 $ LDU, WORK( 1 ), INFO )
346.LE.
IF( NSMLSIZ ) THEN
347.EQ.
IF( ICOMPQ2 ) 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.EQ.
ELSE IF( ICOMPQ1 ) 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.EQ.
IF( ICOMPQ2 ) 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.EQ.
IF( ICOMPQ1 ) THEN
395 GIVNUM = POLES + 2*MLVL
404.LT.
IF( ABS( D( I ) )EPS ) THEN
405 D( I ) = SIGN( EPS, D( I ) )
413.LT..OR..EQ.
IF( ( ABS( E( I ) )EPS ) ( INM1 ) ) THEN
422 NSIZE = I - START + 1
423.GE.
ELSE IF( ABS( E( I ) )EPS ) THEN
427 NSIZE = N - START + 1
434 NSIZE = I - START + 1
435.EQ.
IF( ICOMPQ2 ) THEN
436 U( N, N ) = SIGN( ONE, D( N ) )
438.EQ.
ELSE IF( ICOMPQ1 ) 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.EQ.
IF( ICOMPQ2 ) 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.GT.
IF( D( J )P ) THEN
490.EQ.
IF( ICOMPQ1 ) THEN
492.EQ.
ELSE IF( ICOMPQ2 ) 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.EQ.
ELSE IF( ICOMPQ1 ) THEN
503.EQ.
IF( ICOMPQ1 ) THEN
504.EQ.
IF( IUPLO1 ) THEN
514.EQ..AND..EQ.
IF( ( IUPLO2 ) ( ICOMPQ2 ) )
515 $ CALL SLASR( 'l
', 'v
', 'b
', N, N, WORK( 1 ), WORK( N ), U, LDU )
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...
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 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 slasr(side, pivot, direct, m, n, c, s, a, lda)
SLASR applies a sequence of plane rotations to a general rectangular matrix.
subroutine slartg(f, g, c, s, r)
SLARTG generates a plane rotation with real cosine and real sine.
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 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 sbdsdc(uplo, compq, n, d, e, u, ldu, vt, ldvt, q, iq, work, iwork, info)
SBDSDC
subroutine xerbla(srname, info)
XERBLA
subroutine scopy(n, sx, incx, sy, incy)
SCOPY
subroutine sswap(n, sx, incx, sy, incy)
SSWAP