194      SUBROUTINE sbdsdc( UPLO, COMPQ, N, D, E, U, LDU, VT, LDVT, Q,
 
  196     $                   WORK, IWORK, INFO )
 
  203      CHARACTER          COMPQ, UPLO
 
  204      INTEGER            INFO, LDU, LDVT, N
 
  207      INTEGER            IQ( * ), IWORK( * )
 
  208      REAL               D( * ), E( * ), Q( * ), U( LDU, * ),
 
  209     $                   vt( ldvt, * ), work( * )
 
  219      PARAMETER          ( ZERO = 0.0e+0, one = 1.0e+0, two = 2.0e+0 )
 
  222      INTEGER            DIFL, DIFR, GIVCOL, GIVNUM, GIVPTR, I, IC,
 
  223     $                   ICOMPQ, IERR, II, IS, IU, IUPLO, IVT, J, K, KK,
 
  224     $                   mlvl, nm1, nsize, perm, poles, qstart, smlsiz,
 
  225     $                   smlszp, sqre, start, wstart, z
 
  226      REAL               CS, EPS, ORGNRM, P, R, SN
 
  232      EXTERNAL           slamch, slanst, ilaenv, lsame
 
  240      INTRINSIC          real, abs, int, log, sign
 
  249      IF( lsame( uplo, 
'U' ) )
 
  251      IF( lsame( uplo, 
'L' ) )
 
  253      IF( lsame( compq, 
'N' ) ) 
THEN 
  255      ELSE IF( lsame( compq, 
'P' ) ) 
THEN 
  257      ELSE IF( lsame( compq, 
'I' ) ) 
THEN 
  262      IF( iuplo.EQ.0 ) 
THEN 
  264      ELSE IF( icompq.LT.0 ) 
THEN 
  266      ELSE IF( n.LT.0 ) 
THEN 
  268      ELSE IF( ( ldu.LT.1 ) .OR. ( ( icompq.EQ.2 ) .AND. ( ldu.LT.
 
  271      ELSE IF( ( ldvt.LT.1 ) .OR. ( ( icompq.EQ.2 ) .AND. ( ldvt.LT.
 
  276         CALL xerbla( 
'SBDSDC', -info )
 
  284      smlsiz = ilaenv( 9, 
'SBDSDC', 
' ', 0, 0, 0, 0 )
 
  286         IF( icompq.EQ.1 ) 
THEN 
  287            q( 1 ) = sign( one, d( 1 ) )
 
  288            q( 1+smlsiz*n ) = one
 
  289         ELSE IF( icompq.EQ.2 ) 
THEN 
  290            u( 1, 1 ) = sign( one, d( 1 ) )
 
  293         d( 1 ) = abs( d( 1 ) )
 
  303      IF( icompq.EQ.1 ) 
THEN 
  304         CALL scopy( n, d, 1, q( 1 ), 1 )
 
  305         CALL scopy( n-1, e, 1, q( n+1 ), 1 )
 
  307      IF( iuplo.EQ.2 ) 
THEN 
  309         IF( icompq .EQ. 2 ) wstart = 2*n - 1
 
  311            CALL slartg( d( i ), e( i ), cs, sn, r )
 
  314            d( i+1 ) = cs*d( i+1 )
 
  315            IF( icompq.EQ.1 ) 
THEN 
  318            ELSE IF( icompq.EQ.2 ) 
THEN 
  327      IF( icompq.EQ.0 ) 
THEN 
  331         CALL slasdq( 
'U', 0, n, 0, 0, 0, d, e, vt, ldvt, u, ldu, u,
 
  332     $                ldu, work( 1 ), info )
 
  339      IF( n.LE.smlsiz ) 
THEN 
  340         IF( icompq.EQ.2 ) 
THEN 
  341            CALL slaset( 
'A', n, n, zero, one, u, ldu )
 
  342            CALL slaset( 
'A', n, n, zero, one, vt, ldvt )
 
  343            CALL slasdq( 
'U', 0, n, n, n, 0, d, e, vt, ldvt, u, ldu,
 
  345     $                   ldu, work( wstart ), info )
 
  346         ELSE IF( icompq.EQ.1 ) 
THEN 
  349            CALL slaset( 
'A', n, n, zero, one,
 
  350     $                   q( iu+( qstart-1 )*n ),
 
  352            CALL slaset( 
'A', n, n, zero, one,
 
  353     $                   q( ivt+( qstart-1 )*n ),
 
  355            CALL slasdq( 
'U', 0, n, n, n, 0, d, e,
 
  356     $                   q( ivt+( qstart-1 )*n ), n,
 
  357     $                   q( iu+( qstart-1 )*n ), n,
 
  358     $                   q( iu+( qstart-1 )*n ), n, work( wstart ),
 
  364      IF( icompq.EQ.2 ) 
THEN 
  365         CALL slaset( 
'A', n, n, zero, one, u, ldu )
 
  366         CALL slaset( 
'A', n, n, zero, one, vt, ldvt )
 
  371      orgnrm = slanst( 
'M', n, d, e )
 
  374      CALL slascl( 
'G', 0, 0, orgnrm, one, n, 1, d, n, ierr )
 
  375      CALL slascl( 
'G', 0, 0, orgnrm, one, nm1, 1, e, nm1, ierr )
 
  377      eps = slamch( 
'Epsilon' )
 
  379      mlvl = int( log( real( n ) / real( smlsiz+1 ) ) / log( two ) ) + 1
 
  382      IF( icompq.EQ.1 ) 
THEN 
  391         givnum = poles + 2*mlvl
 
  400         IF( abs( d( i ) ).LT.eps ) 
THEN 
  401            d( i ) = sign( eps, d( i ) )
 
  409         IF( ( abs( e( i ) ).LT.eps ) .OR. ( i.EQ.nm1 ) ) 
THEN 
  418               nsize = i - start + 1
 
  419            ELSE IF( abs( e( i ) ).GE.eps ) 
THEN 
  423               nsize = n - start + 1
 
  430               nsize = i - start + 1
 
  431               IF( icompq.EQ.2 ) 
THEN 
  432                  u( n, n ) = sign( one, d( n ) )
 
  434               ELSE IF( icompq.EQ.1 ) 
THEN 
  435                  q( n+( qstart-1 )*n ) = sign( one, d( n ) )
 
  436                  q( n+( smlsiz+qstart-1 )*n ) = one
 
  438               d( n ) = abs( d( n ) )
 
  440            IF( icompq.EQ.2 ) 
THEN 
  441               CALL slasd0( nsize, sqre, d( start ), e( start ),
 
  442     $                      u( start, start ), ldu, vt( start, start ),
 
  443     $                      ldvt, smlsiz, iwork, work( wstart ), info )
 
  445               CALL slasda( icompq, smlsiz, nsize, sqre, d( start ),
 
  446     $                      e( start ), q( start+( iu+qstart-2 )*n ), n,
 
  447     $                      q( start+( ivt+qstart-2 )*n ),
 
  448     $                      iq( start+k*n ), q( start+( difl+qstart-2 )*
 
  449     $                      n ), q( start+( difr+qstart-2 )*n ),
 
  450     $                      q( start+( z+qstart-2 )*n ),
 
  451     $                      q( start+( poles+qstart-2 )*n ),
 
  452     $                      iq( start+givptr*n ), iq( start+givcol*n ),
 
  453     $                      n, iq( start+perm*n ),
 
  454     $                      q( start+( givnum+qstart-2 )*n ),
 
  455     $                      q( start+( ic+qstart-2 )*n ),
 
  456     $                      q( start+( is+qstart-2 )*n ),
 
  457     $                      work( wstart ), iwork, info )
 
  468      CALL slascl( 
'G', 0, 0, one, orgnrm, n, 1, d, n, ierr )
 
  478            IF( d( j ).GT.p ) 
THEN 
  486            IF( icompq.EQ.1 ) 
THEN 
  488            ELSE IF( icompq.EQ.2 ) 
THEN 
  489               CALL sswap( n, u( 1, i ), 1, u( 1, kk ), 1 )
 
  490               CALL sswap( n, vt( i, 1 ), ldvt, vt( kk, 1 ), ldvt )
 
  492         ELSE IF( icompq.EQ.1 ) 
THEN 
  499      IF( icompq.EQ.1 ) 
THEN 
  500         IF( iuplo.EQ.1 ) 
THEN 
  510      IF( ( iuplo.EQ.2 ) .AND. ( icompq.EQ.2 ) )
 
  511     $   
CALL slasr( 
'L', 
'V', 
'B', n, n, work( 1 ), work( n ), u,