238 SUBROUTINE sbdsqr( UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U,
239 $ LDU, C, LDC, WORK, INFO )
247 INTEGER INFO, LDC, LDU, LDVT, N, NCC, NCVT, NRU
250 REAL C( ldc, * ), D( * ), E( * ), U( ldu, * ),
251 $ vt( ldvt, * ), work( * )
258 parameter( zero = 0.0e0 )
260 parameter( one = 1.0e0 )
262 parameter( negone = -1.0e0 )
264 parameter( hndrth = 0.01e0 )
266 parameter( ten = 10.0e0 )
268 parameter( hndrd = 100.0e0 )
270 parameter( meigth = -0.125e0 )
272 parameter( maxitr = 6 )
275 LOGICAL LOWER, ROTATE
276 INTEGER I, IDIR, ISUB, ITER, ITERDIVN, J, LL, LLL, M,
277 $ maxitdivn, nm1, nm12, nm13, oldll, oldm
278 REAL ABSE, ABSS, COSL, COSR, CS, EPS, F, G, H, MU,
279 $ oldcs, oldsn, r, shift, sigmn, sigmx, sinl,
280 $ sinr, sll, smax, smin, sminl, sminoa,
281 $ sn, thresh, tol, tolmul, unfl
286 EXTERNAL lsame, slamch
293 INTRINSIC abs, max, min,
REAL, SIGN, SQRT
300 lower = lsame( uplo,
'L' )
301 IF( .NOT.lsame( uplo,
'U' ) .AND. .NOT.lower )
THEN 303 ELSE IF( n.LT.0 )
THEN 305 ELSE IF( ncvt.LT.0 )
THEN 307 ELSE IF( nru.LT.0 )
THEN 309 ELSE IF( ncc.LT.0 )
THEN 311 ELSE IF( ( ncvt.EQ.0 .AND. ldvt.LT.1 ) .OR.
312 $ ( ncvt.GT.0 .AND. ldvt.LT.max( 1, n ) ) )
THEN 314 ELSE IF( ldu.LT.max( 1, nru ) )
THEN 316 ELSE IF( ( ncc.EQ.0 .AND. ldc.LT.1 ) .OR.
317 $ ( ncc.GT.0 .AND. ldc.LT.max( 1, n ) ) )
THEN 321 CALL xerbla(
'SBDSQR', -info )
331 rotate = ( ncvt.GT.0 ) .OR. ( nru.GT.0 ) .OR. ( ncc.GT.0 )
335 IF( .NOT.rotate )
THEN 336 CALL slasq1( n, d, e, work, info )
340 IF( info .NE. 2 )
RETURN 351 eps = slamch(
'Epsilon' )
352 unfl = slamch(
'Safe minimum' )
359 CALL slartg( d( i ), e( i ), cs, sn, r )
362 d( i+1 ) = cs*d( i+1 )
370 $
CALL slasr(
'R',
'V',
'F', nru, n, work( 1 ), work( n ), u,
373 $
CALL slasr(
'L',
'V',
'F', n, ncc, work( 1 ), work( n ), c,
381 tolmul = max( ten, min( hndrd, eps**meigth ) )
388 smax = max( smax, abs( d( i ) ) )
391 smax = max( smax, abs( e( i ) ) )
394 IF( tol.GE.zero )
THEN 398 sminoa = abs( d( 1 ) )
403 mu = abs( d( i ) )*( mu / ( mu+abs( e( i-1 ) ) ) )
404 sminoa = min( sminoa, mu )
409 sminoa = sminoa / sqrt(
REAL( N ) )
410 thresh = max( tol*sminoa, maxitr*(n*(n*unfl)) )
415 thresh = max( abs( tol )*smax, maxitr*(n*(n*unfl)) )
443 iterdivn = iterdivn + 1
444 IF( iterdivn.GE.maxitdivn )
450 IF( tol.LT.zero .AND. abs( d( m ) ).LE.thresh )
456 abss = abs( d( ll ) )
457 abse = abs( e( ll ) )
458 IF( tol.LT.zero .AND. abss.LE.thresh )
462 smin = min( smin, abss )
463 smax = max( smax, abss, abse )
488 CALL slasv2( d( m-1 ), e( m-1 ), d( m ), sigmn, sigmx, sinr,
497 $
CALL srot( ncvt, vt( m-1, 1 ), ldvt, vt( m, 1 ), ldvt, cosr,
500 $
CALL srot( nru, u( 1, m-1 ), 1, u( 1, m ), 1, cosl, sinl )
502 $
CALL srot( ncc, c( m-1, 1 ), ldc, c( m, 1 ), ldc, cosl,
511 IF( ll.GT.oldm .OR. m.LT.oldll )
THEN 512 IF( abs( d( ll ) ).GE.abs( d( m ) ) )
THEN 532 IF( abs( e( m-1 ) ).LE.abs( tol )*abs( d( m ) ) .OR.
533 $ ( tol.LT.zero .AND. abs( e( m-1 ) ).LE.thresh ) )
THEN 538 IF( tol.GE.zero )
THEN 545 DO 100 lll = ll, m - 1
546 IF( abs( e( lll ) ).LE.tol*mu )
THEN 550 mu = abs( d( lll+1 ) )*( mu / ( mu+abs( e( lll ) ) ) )
551 sminl = min( sminl, mu )
560 IF( abs( e( ll ) ).LE.abs( tol )*abs( d( ll ) ) .OR.
561 $ ( tol.LT.zero .AND. abs( e( ll ) ).LE.thresh ) )
THEN 566 IF( tol.GE.zero )
THEN 573 DO 110 lll = m - 1, ll, -1
574 IF( abs( e( lll ) ).LE.tol*mu )
THEN 578 mu = abs( d( lll ) )*( mu / ( mu+abs( e( lll ) ) ) )
579 sminl = min( sminl, mu )
589 IF( tol.GE.zero .AND. n*tol*( sminl / smax ).LE.
590 $ max( eps, hndrth*tol ) )
THEN 601 CALL slas2( d( m-1 ), e( m-1 ), d( m ), shift, r )
604 CALL slas2( d( ll ), e( ll ), d( ll+1 ), shift, r )
609 IF( sll.GT.zero )
THEN 610 IF( ( shift / sll )**2.LT.eps )
621 IF( shift.EQ.zero )
THEN 630 CALL slartg( d( i )*cs, e( i ), cs, sn, r )
633 CALL slartg( oldcs*r, d( i+1 )*sn, oldcs, oldsn, d( i ) )
635 work( i-ll+1+nm1 ) = sn
636 work( i-ll+1+nm12 ) = oldcs
637 work( i-ll+1+nm13 ) = oldsn
646 $
CALL slasr(
'L',
'V',
'F', m-ll+1, ncvt, work( 1 ),
647 $ work( n ), vt( ll, 1 ), ldvt )
649 $
CALL slasr(
'R',
'V',
'F', nru, m-ll+1, work( nm12+1 ),
650 $ work( nm13+1 ), u( 1, ll ), ldu )
652 $
CALL slasr(
'L',
'V',
'F', m-ll+1, ncc, work( nm12+1 ),
653 $ work( nm13+1 ), c( ll, 1 ), ldc )
657 IF( abs( e( m-1 ) ).LE.thresh )
667 DO 130 i = m, ll + 1, -1
668 CALL slartg( d( i )*cs, e( i-1 ), cs, sn, r )
671 CALL slartg( oldcs*r, d( i-1 )*sn, oldcs, oldsn, d( i ) )
673 work( i-ll+nm1 ) = -sn
674 work( i-ll+nm12 ) = oldcs
675 work( i-ll+nm13 ) = -oldsn
684 $
CALL slasr(
'L',
'V',
'B', m-ll+1, ncvt, work( nm12+1 ),
685 $ work( nm13+1 ), vt( ll, 1 ), ldvt )
687 $
CALL slasr(
'R',
'V',
'B', nru, m-ll+1, work( 1 ),
688 $ work( n ), u( 1, ll ), ldu )
690 $
CALL slasr(
'L',
'V',
'B', m-ll+1, ncc, work( 1 ),
691 $ work( n ), c( ll, 1 ), ldc )
695 IF( abs( e( ll ) ).LE.thresh )
707 f = ( abs( d( ll ) )-shift )*
708 $ ( sign( one, d( ll ) )+shift / d( ll ) )
711 CALL slartg( f, g, cosr, sinr, r )
714 f = cosr*d( i ) + sinr*e( i )
715 e( i ) = cosr*e( i ) - sinr*d( i )
717 d( i+1 ) = cosr*d( i+1 )
718 CALL slartg( f, g, cosl, sinl, r )
720 f = cosl*e( i ) + sinl*d( i+1 )
721 d( i+1 ) = cosl*d( i+1 ) - sinl*e( i )
724 e( i+1 ) = cosl*e( i+1 )
726 work( i-ll+1 ) = cosr
727 work( i-ll+1+nm1 ) = sinr
728 work( i-ll+1+nm12 ) = cosl
729 work( i-ll+1+nm13 ) = sinl
736 $
CALL slasr(
'L',
'V',
'F', m-ll+1, ncvt, work( 1 ),
737 $ work( n ), vt( ll, 1 ), ldvt )
739 $
CALL slasr(
'R',
'V',
'F', nru, m-ll+1, work( nm12+1 ),
740 $ work( nm13+1 ), u( 1, ll ), ldu )
742 $
CALL slasr(
'L',
'V',
'F', m-ll+1, ncc, work( nm12+1 ),
743 $ work( nm13+1 ), c( ll, 1 ), ldc )
747 IF( abs( e( m-1 ) ).LE.thresh )
755 f = ( abs( d( m ) )-shift )*( sign( one, d( m ) )+shift /
758 DO 150 i = m, ll + 1, -1
759 CALL slartg( f, g, cosr, sinr, r )
762 f = cosr*d( i ) + sinr*e( i-1 )
763 e( i-1 ) = cosr*e( i-1 ) - sinr*d( i )
765 d( i-1 ) = cosr*d( i-1 )
766 CALL slartg( f, g, cosl, sinl, r )
768 f = cosl*e( i-1 ) + sinl*d( i-1 )
769 d( i-1 ) = cosl*d( i-1 ) - sinl*e( i-1 )
772 e( i-2 ) = cosl*e( i-2 )
775 work( i-ll+nm1 ) = -sinr
776 work( i-ll+nm12 ) = cosl
777 work( i-ll+nm13 ) = -sinl
783 IF( abs( e( ll ) ).LE.thresh )
789 $
CALL slasr(
'L',
'V',
'B', m-ll+1, ncvt, work( nm12+1 ),
790 $ work( nm13+1 ), vt( ll, 1 ), ldvt )
792 $
CALL slasr(
'R',
'V',
'B', nru, m-ll+1, work( 1 ),
793 $ work( n ), u( 1, ll ), ldu )
795 $
CALL slasr(
'L',
'V',
'B', m-ll+1, ncc, work( 1 ),
796 $ work( n ), c( ll, 1 ), ldc )
808 IF( d( i ).LT.zero )
THEN 814 $
CALL sscal( ncvt, negone, vt( i, 1 ), ldvt )
827 DO 180 j = 2, n + 1 - i
828 IF( d( j ).LE.smin )
THEN 833 IF( isub.NE.n+1-i )
THEN 837 d( isub ) = d( n+1-i )
840 $
CALL sswap( ncvt, vt( isub, 1 ), ldvt, vt( n+1-i, 1 ),
843 $
CALL sswap( nru, u( 1, isub ), 1, u( 1, n+1-i ), 1 )
845 $
CALL sswap( ncc, c( isub, 1 ), ldc, c( n+1-i, 1 ), ldc )
subroutine slasv2(F, G, H, SSMIN, SSMAX, SNR, CSR, SNL, CSL)
SLASV2 computes the singular value decomposition of a 2-by-2 triangular matrix.
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine sswap(N, SX, INCX, SY, INCY)
SSWAP
subroutine sbdsqr(UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U, LDU, C, LDC, WORK, INFO)
SBDSQR
subroutine slasq1(N, D, E, WORK, INFO)
SLASQ1 computes the singular values of a real square bidiagonal matrix. Used by sbdsqr.
subroutine sscal(N, SA, SX, INCX)
SSCAL
subroutine srot(N, SX, INCX, SY, INCY, C, S)
SROT
subroutine slasr(SIDE, PIVOT, DIRECT, M, N, C, S, A, LDA)
SLASR applies a sequence of plane rotations to a general rectangular matrix.
subroutine slas2(F, G, H, SSMIN, SSMAX)
SLAS2 computes singular values of a 2-by-2 triangular matrix.