207 SUBROUTINE slasdq( UPLO, SQRE, N, NCVT, NRU, NCC, D, E, VT,
209 $ U, LDU, C, LDC, WORK, INFO )
217 INTEGER INFO, LDC, LDU, LDVT, N, NCC, NCVT, NRU, SQRE
220 REAL C( LDC, * ), D( * ), E( * ), U( LDU, * ),
221 $ VT( LDVT, * ), WORK( * )
228 PARAMETER ( ZERO = 0.0e+0 )
232 INTEGER I, ISUB, IUPLO, J, NP1, SQRE1
252 IF( lsame( uplo,
'U' ) )
254 IF( lsame( uplo,
'L' ) )
256 IF( iuplo.EQ.0 )
THEN
258 ELSE IF( ( sqre.LT.0 ) .OR. ( sqre.GT.1 ) )
THEN
260 ELSE IF( n.LT.0 )
THEN
262 ELSE IF( ncvt.LT.0 )
THEN
264 ELSE IF( nru.LT.0 )
THEN
266 ELSE IF( ncc.LT.0 )
THEN
268 ELSE IF( ( ncvt.EQ.0 .AND. ldvt.LT.1 ) .OR.
269 $ ( ncvt.GT.0 .AND. ldvt.LT.max( 1, n ) ) )
THEN
271 ELSE IF( ldu.LT.max( 1, nru ) )
THEN
273 ELSE IF( ( ncc.EQ.0 .AND. ldc.LT.1 ) .OR.
274 $ ( ncc.GT.0 .AND. ldc.LT.max( 1, n ) ) )
THEN
278 CALL xerbla(
'SLASDQ', -info )
286 rotate = ( ncvt.GT.0 ) .OR. ( nru.GT.0 ) .OR. ( ncc.GT.0 )
293 IF( ( iuplo.EQ.1 ) .AND. ( sqre1.EQ.1 ) )
THEN
295 CALL slartg( d( i ), e( i ), cs, sn, r )
298 d( i+1 ) = cs*d( i+1 )
304 CALL slartg( d( n ), e( n ), cs, sn, r )
317 $
CALL slasr(
'L',
'V',
'F', np1, ncvt, work( 1 ),
318 $ work( np1 ), vt, ldvt )
324 IF( iuplo.EQ.2 )
THEN
326 CALL slartg( d( i ), e( i ), cs, sn, r )
329 d( i+1 ) = cs*d( i+1 )
339 IF( sqre1.EQ.1 )
THEN
340 CALL slartg( d( n ), e( n ), cs, sn, r )
351 IF( sqre1.EQ.0 )
THEN
352 CALL slasr(
'R',
'V',
'F', nru, n, work( 1 ),
353 $ work( np1 ), u, ldu )
355 CALL slasr(
'R',
'V',
'F', nru, np1, work( 1 ),
356 $ work( np1 ), u, ldu )
360 IF( sqre1.EQ.0 )
THEN
361 CALL slasr(
'L',
'V',
'F', n, ncc, work( 1 ),
362 $ work( np1 ), c, ldc )
364 CALL slasr(
'L',
'V',
'F', np1, ncc, work( 1 ),
365 $ work( np1 ), c, ldc )
373 CALL sbdsqr(
'U', n, ncvt, nru, ncc, d, e, vt, ldvt, u, ldu, c,
386 IF( d( j ).LT.smin )
THEN
398 $
CALL sswap( ncvt, vt( isub, 1 ), ldvt, vt( i, 1 ),
401 $
CALL sswap( nru, u( 1, isub ), 1, u( 1, i ), 1 )
403 $
CALL sswap( ncc, c( isub, 1 ), ldc, c( i, 1 ), ldc )
subroutine sbdsqr(uplo, n, ncvt, nru, ncc, d, e, vt, ldvt, u, ldu, c, ldc, work, info)
SBDSQR
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 slasr(side, pivot, direct, m, n, c, s, a, lda)
SLASR applies a sequence of plane rotations to a general rectangular matrix.