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 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.
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 slartg(f, g, c, s, r)
SLARTG generates a plane rotation with real cosine and real sine.
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine slasq1(N, D, E, WORK, INFO)
SLASQ1 computes the singular values of a real square bidiagonal matrix. Used by sbdsqr.
subroutine sbdsqr(UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U, LDU, C, LDC, WORK, INFO)
SBDSQR
subroutine sswap(N, SX, INCX, SY, INCY)
SSWAP
subroutine srot(N, SX, INCX, SY, INCY, C, S)
SROT
subroutine sscal(N, SA, SX, INCX)
SSCAL