203 SUBROUTINE dbdsdc( 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( * ), ( * )
216 DOUBLE PRECISION D( * ), E( * ), Q( * ), U( LDU, * ),
217 $ vt( ldvt, * ), work( * )
226 DOUBLE PRECISION ZERO, ONE, TWO
227 parameter( zero = 0.0d+0, one = 1.0d+0, two = 2.0d+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 DOUBLE PRECISION CS, EPS, ORGNRM, P, R, SN
239 DOUBLE PRECISION DLAMCH, DLANST
240 EXTERNAL lsame, ilaenv, dlamch, dlanst
247 INTRINSIC abs, dble, 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.
291 SMLSIZ = ILAENV( 9, 'dbdsdc', ' ', 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 DCOPY( N, D, 1, Q( 1 ), 1 )
312 CALL DCOPY( N-1, E, 1, Q( N+1 ), 1 )
314.EQ.
IF( IUPLO2 ) THEN
316.EQ.
IF( ICOMPQ 2 ) WSTART = 2*N - 1
318 CALL DLARTG( 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 DLASDQ( '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 DLASET( 'a
', N, N, ZERO, ONE, U, LDU )
349 CALL DLASET( 'a
', N, N, ZERO, ONE, VT, LDVT )
350 CALL DLASDQ( '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 DLASET( 'a
', N, N, ZERO, ONE, Q( IU+( QSTART-1 )*N ),
357 CALL DLASET( 'a
', N, N, ZERO, ONE, Q( IVT+( QSTART-1 )*N ),
359 CALL DLASDQ( '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 DLASET( 'a
', N, N, ZERO, ONE, U, LDU )
370 CALL DLASET( 'a
', N, N, ZERO, ONE, VT, LDVT )
375 ORGNRM = DLANST( 'm
', N, D, E )
378 CALL DLASCL( 'g
', 0, 0, ORGNRM, ONE, N, 1, D, N, IERR )
379 CALL DLASCL( 'g
', 0, 0, ORGNRM, ONE, NM1, 1, E, NM1, IERR )
381 EPS = (0.9D+0)*DLAMCH( 'epsilon
' )
383 MLVL = INT( LOG( DBLE( N ) / DBLE( 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 DLASD0( NSIZE, SQRE, D( START ), E( START ),
446 $ U( START, START ), LDU, VT( START, START ),
447 $ LDVT, SMLSIZ, IWORK, WORK( WSTART ), INFO )
449 CALL DLASDA( 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 DLASCL( '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 DSWAP( N, U( 1, I ), 1, U( 1, KK ), 1 )
494 CALL DSWAP( 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 DLASR( 'l
', 'v
', 'b
', N, N, WORK( 1 ), WORK( N ), U, LDU )
subroutine dlasd0(n, sqre, d, e, u, ldu, vt, ldvt, smlsiz, iwork, work, info)
DLASD0 computes the singular values of a real upper bidiagonal n-by-m matrix B with diagonal d and of...
subroutine dlasdq(uplo, sqre, n, ncvt, nru, ncc, d, e, vt, ldvt, u, ldu, c, ldc, work, info)
DLASDQ computes the SVD of a real bidiagonal matrix with diagonal d and off-diagonal e....
subroutine dlartg(f, g, c, s, r)
DLARTG generates a plane rotation with real cosine and real sine.
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 dlaset(uplo, m, n, alpha, beta, a, lda)
DLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine dlasr(side, pivot, direct, m, n, c, s, a, lda)
DLASR applies a sequence of plane rotations to a general rectangular matrix.
subroutine dlasda(icompq, smlsiz, n, sqre, d, e, u, ldu, vt, k, difl, difr, z, poles, givptr, givcol, ldgcol, perm, givnum, c, s, work, iwork, info)
DLASDA computes the singular value decomposition (SVD) of a real upper bidiagonal matrix with diagona...
subroutine dbdsdc(uplo, compq, n, d, e, u, ldu, vt, ldvt, q, iq, work, iwork, info)
DBDSDC
subroutine xerbla(srname, info)
XERBLA
subroutine dswap(n, dx, incx, dy, incy)
DSWAP
subroutine dcopy(n, dx, incx, dy, incy)
DCOPY