241       SUBROUTINE dbdsqr( UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U,
 
  242      $                   LDU, C, LDC, WORK, INFO )
 
  251       INTEGER            INFO, LDC, LDU, LDVT, N, NCC, NCVT, NRU
 
  254       DOUBLE PRECISION   C( LDC, * ), D( * ), E( * ), U( LDU, * ),
 
  255      $                   vt( ldvt, * ), work( * )
 
  261       DOUBLE PRECISION   ZERO
 
  262       parameter( zero = 0.0d0 )
 
  264       parameter( one = 1.0d0 )
 
  265       DOUBLE PRECISION   NEGONE
 
  266       parameter( negone = -1.0d0 )
 
  267       DOUBLE PRECISION   HNDRTH
 
  268       parameter( hndrth = 0.01d0 )
 
  270       parameter( ten = 10.0d0 )
 
  271       DOUBLE PRECISION   HNDRD
 
  272       parameter( hndrd = 100.0d0 )
 
  273       DOUBLE PRECISION   MEIGTH
 
  274       parameter( meigth = -0.125d0 )
 
  276       parameter( maxitr = 6 )
 
  279       LOGICAL            LOWER, ROTATE
 
  280       INTEGER            I, IDIR, ISUB, ITER, ITERDIVN, J, LL, LLL, M,
 
  281      $                   maxitdivn, nm1, nm12, nm13, oldll, oldm
 
  282       DOUBLE PRECISION   ABSE, ABSS, COSL, COSR, CS, EPS, F, G, H, MU,
 
  283      $                   oldcs, oldsn, r, shift, sigmn, sigmx, sinl,
 
  284      $                   sinr, sll, smax, smin, sminl, sminoa,
 
  285      $                   sn, thresh, tol, tolmul, unfl
 
  289       DOUBLE PRECISION   DLAMCH
 
  290       EXTERNAL           lsame, dlamch
 
  297       INTRINSIC          abs, dble, max, min, sign, sqrt
 
  304       lower = lsame( uplo, 
'L' )
 
  305       IF( .NOT.lsame( uplo, 
'U' ) .AND. .NOT.lower ) 
THEN 
  307       ELSE IF( n.LT.0 ) 
THEN 
  309       ELSE IF( ncvt.LT.0 ) 
THEN 
  311       ELSE IF( nru.LT.0 ) 
THEN 
  313       ELSE IF( ncc.LT.0 ) 
THEN 
  315       ELSE IF( ( ncvt.EQ.0 .AND. ldvt.LT.1 ) .OR.
 
  316      $         ( ncvt.GT.0 .AND. ldvt.LT.max( 1, n ) ) ) 
THEN 
  318       ELSE IF( ldu.LT.max( 1, nru ) ) 
THEN 
  320       ELSE IF( ( ncc.EQ.0 .AND. ldc.LT.1 ) .OR.
 
  321      $         ( ncc.GT.0 .AND. ldc.LT.max( 1, n ) ) ) 
THEN 
  325          CALL xerbla( 
'DBDSQR', -info )
 
  335       rotate = ( ncvt.GT.0 ) .OR. ( nru.GT.0 ) .OR. ( ncc.GT.0 )
 
  339       IF( .NOT.rotate ) 
THEN 
  340          CALL dlasq1( n, d, e, work, info )
 
  344          IF( info .NE. 2 ) 
RETURN 
  355       eps = dlamch( 
'Epsilon' )
 
  356       unfl = dlamch( 
'Safe minimum' )
 
  363             CALL dlartg( d( i ), e( i ), cs, sn, r )
 
  366             d( i+1 ) = cs*d( i+1 )
 
  374      $      
CALL dlasr( 
'R', 
'V', 
'F', nru, n, work( 1 ), work( n ), u,
 
  377      $      
CALL dlasr( 
'L', 
'V', 
'F', n, ncc, work( 1 ), work( n ), c,
 
  385       tolmul = max( ten, min( hndrd, eps**meigth ) )
 
  392          smax = max( smax, abs( d( i ) ) )
 
  395          smax = max( smax, abs( e( i ) ) )
 
  398       IF( tol.GE.zero ) 
THEN 
  402          sminoa = abs( d( 1 ) )
 
  407             mu = abs( d( i ) )*( mu / ( mu+abs( e( i-1 ) ) ) )
 
  408             sminoa = min( sminoa, mu )
 
  413          sminoa = sminoa / sqrt( dble( n ) )
 
  414          thresh = max( tol*sminoa, maxitr*(n*(n*unfl)) )
 
  419          thresh = max( abs( tol )*smax, maxitr*(n*(n*unfl)) )
 
  447          iterdivn = iterdivn + 1
 
  448          IF( iterdivn.GE.maxitdivn )
 
  454       IF( tol.LT.zero .AND. abs( d( m ) ).LE.thresh )
 
  460          abss = abs( d( ll ) )
 
  461          abse = abs( e( ll ) )
 
  462          IF( tol.LT.zero .AND. abss.LE.thresh )
 
  466          smin = min( smin, abss )
 
  467          smax = max( smax, abss, abse )
 
  492          CALL dlasv2( d( m-1 ), e( m-1 ), d( m ), sigmn, sigmx, sinr,
 
  501      $      
CALL drot( ncvt, vt( m-1, 1 ), ldvt, vt( m, 1 ), ldvt, cosr,
 
  504      $      
CALL drot( nru, u( 1, m-1 ), 1, u( 1, m ), 1, cosl, sinl )
 
  506      $      
CALL drot( ncc, c( m-1, 1 ), ldc, c( m, 1 ), ldc, cosl,
 
  515       IF( ll.GT.oldm .OR. m.LT.oldll ) 
THEN 
  516          IF( abs( d( ll ) ).GE.abs( d( m ) ) ) 
THEN 
  536          IF( abs( e( m-1 ) ).LE.abs( tol )*abs( d( m ) ) .OR.
 
  537      $       ( tol.LT.zero .AND. abs( e( m-1 ) ).LE.thresh ) ) 
THEN 
  542          IF( tol.GE.zero ) 
THEN 
  549             DO 100 lll = ll, m - 1
 
  550                IF( abs( e( lll ) ).LE.tol*mu ) 
THEN 
  554                mu = abs( d( lll+1 ) )*( mu / ( mu+abs( e( lll ) ) ) )
 
  555                sminl = min( sminl, mu )
 
  564          IF( abs( e( ll ) ).LE.abs( tol )*abs( d( ll ) ) .OR.
 
  565      $       ( tol.LT.zero .AND. abs( e( ll ) ).LE.thresh ) ) 
THEN 
  570          IF( tol.GE.zero ) 
THEN 
  577             DO 110 lll = m - 1, ll, -1
 
  578                IF( abs( e( lll ) ).LE.tol*mu ) 
THEN 
  582                mu = abs( d( lll ) )*( mu / ( mu+abs( e( lll ) ) ) )
 
  583                sminl = min( sminl, mu )
 
  593       IF( tol.GE.zero .AND. n*tol*( sminl / smax ).LE.
 
  594      $    max( eps, hndrth*tol ) ) 
THEN 
  605             CALL dlas2( d( m-1 ), e( m-1 ), d( m ), shift, r )
 
  608             CALL dlas2( d( ll ), e( ll ), d( ll+1 ), shift, r )
 
  613          IF( sll.GT.zero ) 
THEN 
  614             IF( ( shift / sll )**2.LT.eps )
 
  625       IF( shift.EQ.zero ) 
THEN 
  634                CALL dlartg( d( i )*cs, e( i ), cs, sn, r )
 
  637                CALL dlartg( oldcs*r, d( i+1 )*sn, oldcs, oldsn, d( i ) )
 
  639                work( i-ll+1+nm1 ) = sn
 
  640                work( i-ll+1+nm12 ) = oldcs
 
  641                work( i-ll+1+nm13 ) = oldsn
 
  650      $         
CALL dlasr( 
'L', 
'V', 
'F', m-ll+1, ncvt, work( 1 ),
 
  651      $                     work( n ), vt( ll, 1 ), ldvt )
 
  653      $         
CALL dlasr( 
'R', 
'V', 
'F', nru, m-ll+1, work( nm12+1 ),
 
  654      $                     work( nm13+1 ), u( 1, ll ), ldu )
 
  656      $         
CALL dlasr( 
'L', 
'V', 
'F', m-ll+1, ncc, work( nm12+1 ),
 
  657      $                     work( nm13+1 ), c( ll, 1 ), ldc )
 
  661             IF( abs( e( m-1 ) ).LE.thresh )
 
  671             DO 130 i = m, ll + 1, -1
 
  672                CALL dlartg( d( i )*cs, e( i-1 ), cs, sn, r )
 
  675                CALL dlartg( oldcs*r, d( i-1 )*sn, oldcs, oldsn, d( i ) )
 
  677                work( i-ll+nm1 ) = -sn
 
  678                work( i-ll+nm12 ) = oldcs
 
  679                work( i-ll+nm13 ) = -oldsn
 
  688      $         
CALL dlasr( 
'L', 
'V', 
'B', m-ll+1, ncvt, work( nm12+1 ),
 
  689      $                     work( nm13+1 ), vt( ll, 1 ), ldvt )
 
  691      $         
CALL dlasr( 
'R', 
'V', 
'B', nru, m-ll+1, work( 1 ),
 
  692      $                     work( n ), u( 1, ll ), ldu )
 
  694      $         
CALL dlasr( 
'L', 
'V', 
'B', m-ll+1, ncc, work( 1 ),
 
  695      $                     work( n ), c( ll, 1 ), ldc )
 
  699             IF( abs( e( ll ) ).LE.thresh )
 
  711             f = ( abs( d( ll ) )-shift )*
 
  712      $          ( sign( one, d( ll ) )+shift / d( ll ) )
 
  715                CALL dlartg( f, g, cosr, sinr, r )
 
  718                f = cosr*d( i ) + sinr*e( i )
 
  719                e( i ) = cosr*e( i ) - sinr*d( i )
 
  721                d( i+1 ) = cosr*d( i+1 )
 
  722                CALL dlartg( f, g, cosl, sinl, r )
 
  724                f = cosl*e( i ) + sinl*d( i+1 )
 
  725                d( i+1 ) = cosl*d( i+1 ) - sinl*e( i )
 
  728                   e( i+1 ) = cosl*e( i+1 )
 
  730                work( i-ll+1 ) = cosr
 
  731                work( i-ll+1+nm1 ) = sinr
 
  732                work( i-ll+1+nm12 ) = cosl
 
  733                work( i-ll+1+nm13 ) = sinl
 
  740      $         
CALL dlasr( 
'L', 
'V', 
'F', m-ll+1, ncvt, work( 1 ),
 
  741      $                     work( n ), vt( ll, 1 ), ldvt )
 
  743      $         
CALL dlasr( 
'R', 
'V', 
'F', nru, m-ll+1, work( nm12+1 ),
 
  744      $                     work( nm13+1 ), u( 1, ll ), ldu )
 
  746      $         
CALL dlasr( 
'L', 
'V', 
'F', m-ll+1, ncc, work( nm12+1 ),
 
  747      $                     work( nm13+1 ), c( ll, 1 ), ldc )
 
  751             IF( abs( e( m-1 ) ).LE.thresh )
 
  759             f = ( abs( d( m ) )-shift )*( sign( one, d( m ) )+shift /
 
  762             DO 150 i = m, ll + 1, -1
 
  763                CALL dlartg( f, g, cosr, sinr, r )
 
  766                f = cosr*d( i ) + sinr*e( i-1 )
 
  767                e( i-1 ) = cosr*e( i-1 ) - sinr*d( i )
 
  769                d( i-1 ) = cosr*d( i-1 )
 
  770                CALL dlartg( f, g, cosl, sinl, r )
 
  772                f = cosl*e( i-1 ) + sinl*d( i-1 )
 
  773                d( i-1 ) = cosl*d( i-1 ) - sinl*e( i-1 )
 
  776                   e( i-2 ) = cosl*e( i-2 )
 
  779                work( i-ll+nm1 ) = -sinr
 
  780                work( i-ll+nm12 ) = cosl
 
  781                work( i-ll+nm13 ) = -sinl
 
  787             IF( abs( e( ll ) ).LE.thresh )
 
  793      $         
CALL dlasr( 
'L', 
'V', 
'B', m-ll+1, ncvt, work( nm12+1 ),
 
  794      $                     work( nm13+1 ), vt( ll, 1 ), ldvt )
 
  796      $         
CALL dlasr( 
'R', 
'V', 
'B', nru, m-ll+1, work( 1 ),
 
  797      $                     work( n ), u( 1, ll ), ldu )
 
  799      $         
CALL dlasr( 
'L', 
'V', 
'B', m-ll+1, ncc, work( 1 ),
 
  800      $                     work( n ), c( ll, 1 ), ldc )
 
  812          IF( d( i ).LT.zero ) 
THEN 
  818      $         
CALL dscal( ncvt, negone, vt( i, 1 ), ldvt )
 
  831          DO 180 j = 2, n + 1 - i
 
  832             IF( d( j ).LE.smin ) 
THEN 
  837          IF( isub.NE.n+1-i ) 
THEN 
  841             d( isub ) = d( n+1-i )
 
  844      $         
CALL dswap( ncvt, vt( isub, 1 ), ldvt, vt( n+1-i, 1 ),
 
  847      $         
CALL dswap( nru, u( 1, isub ), 1, u( 1, n+1-i ), 1 )
 
  849      $         
CALL dswap( ncc, c( isub, 1 ), ldc, c( n+1-i, 1 ), ldc )