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.LE.
IF( ABS( E( M-1 ) )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.LE.
IF( ABS( E( LL ) )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.LE.
IF( ABS( E( M-1 ) )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.LE.
IF( ABS( E( LL ) )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 )