239 SUBROUTINE dbdsqr( UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U,
240 $ LDU, C, LDC, WORK, INFO )
248 INTEGER INFO, LDC, LDU, LDVT, N, NCC, NCVT, NRU
251 DOUBLE PRECISION C( LDC, * ), D( * ), E( * ), U( LDU, * ),
252 $ vt( ldvt, * ), work( * )
258 DOUBLE PRECISION ZERO
259 parameter( zero = 0.0d0 )
261 parameter( one = 1.0d0 )
262 DOUBLE PRECISION NEGONE
263 parameter( negone = -1.0d0 )
264 DOUBLE PRECISION HNDRTH
265 parameter( hndrth = 0.01d0 )
267 parameter( ten = 10.0d0 )
268 DOUBLE PRECISION HNDRD
269 parameter( hndrd = 100.0d0 )
270 DOUBLE PRECISION MEIGTH
271 parameter( meigth = -0.125d0 )
273 parameter( maxitr = 6 )
276 LOGICAL LOWER, ROTATE
277 INTEGER I, IDIR, ISUB, ITER, ITERDIVN, J, LL, LLL, M,
278 $ maxitdivn, nm1, nm12, nm13, oldll, oldm
279 DOUBLE PRECISION ABSE, ABSS, COSL, COSR, CS, EPS, F, G, H, MU,
280 $ oldcs, oldsn, r, shift, sigmn, sigmx, sinl,
281 $ sinr, sll, smax, smin, sminl, sminoa,
282 $ sn, thresh, tol, tolmul, unfl
286 DOUBLE PRECISION DLAMCH
287 EXTERNAL lsame, dlamch
294 INTRINSIC abs, dble, max, min, sign, sqrt
301 lower = lsame( uplo,
'L' )
302 IF( .NOT.lsame( uplo,
'U' ) .AND. .NOT.lower )
THEN
304 ELSE IF( n.LT.0 )
THEN
306 ELSE IF( ncvt.LT.0 )
THEN
308 ELSE IF( nru.LT.0 )
THEN
310 ELSE IF( ncc.LT.0 )
THEN
312 ELSE IF( ( ncvt.EQ.0 .AND. ldvt.LT.1 ) .OR.
313 $ ( ncvt.GT.0 .AND. ldvt.LT.max( 1, n ) ) )
THEN
315 ELSE IF( ldu.LT.max( 1, nru ) )
THEN
317 ELSE IF( ( ncc.EQ.0 .AND. ldc.LT.1 ) .OR.
318 $ ( ncc.GT.0 .AND. ldc.LT.max( 1, n ) ) )
THEN
322 CALL xerbla(
'DBDSQR', -info )
332 rotate = ( ncvt.GT.0 ) .OR. ( nru.GT.0 ) .OR. ( ncc.GT.0 )
336 IF( .NOT.rotate )
THEN
337 CALL dlasq1( n, d, e, work, info )
341 IF( info .NE. 2 )
RETURN
352 eps = dlamch(
'Epsilon' )
353 unfl = dlamch(
'Safe minimum' )
360 CALL dlartg( d( i ), e( i ), cs, sn, r )
363 d( i+1 ) = cs*d( i+1 )
371 $
CALL dlasr(
'R',
'V',
'F', nru, n, work( 1 ), work( n ), u,
374 $
CALL dlasr(
'L',
'V',
'F', n, ncc, work( 1 ), work( n ), c,
382 tolmul = max( ten, min( hndrd, eps**meigth ) )
389 smax = max( smax, abs( d( i ) ) )
392 smax = max( smax, abs( e( i ) ) )
395 IF( tol.GE.zero )
THEN
399 sminoa = abs( d( 1 ) )
404 mu = abs( d( i ) )*( mu / ( mu+abs( e( i-1 ) ) ) )
405 sminoa = min( sminoa, mu )
410 sminoa = sminoa / sqrt( dble( n ) )
411 thresh = max( tol*sminoa, maxitr*(n*(n*unfl)) )
416 thresh = max( abs( tol )*smax, maxitr*(n*(n*unfl)) )
444 iterdivn = iterdivn + 1
445 IF( iterdivn.GE.maxitdivn )
451 IF( tol.LT.zero .AND. abs( d( m ) ).LE.thresh )
457 abss = abs( d( ll ) )
458 abse = abs( e( ll ) )
459 IF( tol.LT.zero .AND. abss.LE.thresh )
463 smin = min( smin, abss )
464 smax = max( smax, abss, abse )
489 CALL dlasv2( d( m-1 ), e( m-1 ), d( m ), sigmn, sigmx, sinr,
498 $
CALL drot( ncvt, vt( m-1, 1 ), ldvt, vt( m, 1 ), ldvt, cosr,
501 $
CALL drot( nru, u( 1, m-1 ), 1, u( 1, m ), 1, cosl, sinl )
503 $
CALL drot( ncc, c( m-1, 1 ), ldc, c( m, 1 ), ldc, cosl,
512 IF( ll.GT.oldm .OR. m.LT.oldll )
THEN
513 IF( abs( d( ll ) ).GE.abs( d( m ) ) )
THEN
533 IF( abs( e( m-1 ) ).LE.abs( tol )*abs( d( m ) ) .OR.
534 $ ( tol.LT.zero .AND. abs( e( m-1 ) ).LE.thresh ) )
THEN
539 IF( tol.GE.zero )
THEN
546 DO 100 lll = ll, m - 1
547 IF( abs( e( lll ) ).LE.tol*mu )
THEN
551 mu = abs( d( lll+1 ) )*( mu / ( mu+abs( e( lll ) ) ) )
552 sminl = min( sminl, mu )
561 IF( abs( e( ll ) ).LE.abs( tol )*abs( d( ll ) ) .OR.
562 $ ( tol.LT.zero .AND. abs( e( ll ) ).LE.thresh ) )
THEN
567 IF( tol.GE.zero )
THEN
574 DO 110 lll = m - 1, ll, -1
575 IF( abs( e( lll ) ).LE.tol*mu )
THEN
579 mu = abs( d( lll ) )*( mu / ( mu+abs( e( lll ) ) ) )
580 sminl = min( sminl, mu )
590 IF( tol.GE.zero .AND. n*tol*( sminl / smax ).LE.
591 $ max( eps, hndrth*tol ) )
THEN
602 CALL dlas2( d( m-1 ), e( m-1 ), d( m ), shift, r )
605 CALL dlas2( d( ll ), e( ll ), d( ll+1 ), shift, r )
610 IF( sll.GT.zero )
THEN
611 IF( ( shift / sll )**2.LT.eps )
622 IF( shift.EQ.zero )
THEN
631 CALL dlartg( d( i )*cs, e( i ), cs, sn, r )
634 CALL dlartg( oldcs*r, d( i+1 )*sn, oldcs, oldsn, d( i ) )
636 work( i-ll+1+nm1 ) = sn
637 work( i-ll+1+nm12 ) = oldcs
638 work( i-ll+1+nm13 ) = oldsn
647 $
CALL dlasr(
'L',
'V',
'F', m-ll+1, ncvt, work( 1 ),
648 $ work( n ), vt( ll, 1 ), ldvt )
650 $
CALL dlasr(
'R',
'V',
'F', nru, m-ll+1, work( nm12+1 ),
651 $ work( nm13+1 ), u( 1, ll ), ldu )
653 $
CALL dlasr(
'L',
'V',
'F', m-ll+1, ncc, work( nm12+1 ),
654 $ work( nm13+1 ), c( ll, 1 ), ldc )
658 IF( abs( e( m-1 ) ).LE.thresh )
668 DO 130 i = m, ll + 1, -1
669 CALL dlartg( d( i )*cs, e( i-1 ), cs, sn, r )
672 CALL dlartg( oldcs*r, d( i-1 )*sn, oldcs, oldsn, d( i ) )
674 work( i-ll+nm1 ) = -sn
675 work( i-ll+nm12 ) = oldcs
676 work( i-ll+nm13 ) = -oldsn
685 $
CALL dlasr(
'L',
'V',
'B', m-ll+1, ncvt, work( nm12+1 ),
686 $ work( nm13+1 ), vt( ll, 1 ), ldvt )
688 $
CALL dlasr(
'R',
'V',
'B', nru, m-ll+1, work( 1 ),
689 $ work( n ), u( 1, ll ), ldu )
691 $
CALL dlasr(
'L',
'V',
'B', m-ll+1, ncc, work( 1 ),
692 $ work( n ), c( ll, 1 ), ldc )
696 IF( abs( e( ll ) ).LE.thresh )
708 f = ( abs( d( ll ) )-shift )*
709 $ ( sign( one, d( ll ) )+shift / d( ll ) )
712 CALL dlartg( f, g, cosr, sinr, r )
715 f = cosr*d( i ) + sinr*e( i )
716 e( i ) = cosr*e( i ) - sinr*d( i )
718 d( i+1 ) = cosr*d( i+1 )
719 CALL dlartg( f, g, cosl, sinl, r )
721 f = cosl*e( i ) + sinl*d( i+1 )
722 d( i+1 ) = cosl*d( i+1 ) - sinl*e( i )
725 e( i+1 ) = cosl*e( i+1 )
727 work( i-ll+1 ) = cosr
728 work( i-ll+1+nm1 ) = sinr
729 work( i-ll+1+nm12 ) = cosl
730 work( i-ll+1+nm13 ) = sinl
737 $
CALL dlasr(
'L',
'V',
'F', m-ll+1, ncvt, work( 1 ),
738 $ work( n ), vt( ll, 1 ), ldvt )
740 $
CALL dlasr(
'R',
'V',
'F', nru, m-ll+1, work( nm12+1 ),
741 $ work( nm13+1 ), u( 1, ll ), ldu )
743 $
CALL dlasr(
'L',
'V',
'F', m-ll+1, ncc, work( nm12+1 ),
744 $ work( nm13+1 ), c( ll, 1 ), ldc )
748 IF( abs( e( m-1 ) ).LE.thresh )
756 f = ( abs( d( m ) )-shift )*( sign( one, d( m ) )+shift /
759 DO 150 i = m, ll + 1, -1
760 CALL dlartg( f, g, cosr, sinr, r )
763 f = cosr*d( i ) + sinr*e( i-1 )
764 e( i-1 ) = cosr*e( i-1 ) - sinr*d( i )
766 d( i-1 ) = cosr*d( i-1 )
767 CALL dlartg( f, g, cosl, sinl, r )
769 f = cosl*e( i-1 ) + sinl*d( i-1 )
770 d( i-1 ) = cosl*d( i-1 ) - sinl*e( i-1 )
773 e( i-2 ) = cosl*e( i-2 )
776 work( i-ll+nm1 ) = -sinr
777 work( i-ll+nm12 ) = cosl
778 work( i-ll+nm13 ) = -sinl
784 IF( abs( e( ll ) ).LE.thresh )
790 $
CALL dlasr(
'L',
'V',
'B', m-ll+1, ncvt, work( nm12+1 ),
791 $ work( nm13+1 ), vt( ll, 1 ), ldvt )
793 $
CALL dlasr(
'R',
'V',
'B', nru, m-ll+1, work( 1 ),
794 $ work( n ), u( 1, ll ), ldu )
796 $
CALL dlasr(
'L',
'V',
'B', m-ll+1, ncc, work( 1 ),
797 $ work( n ), c( ll, 1 ), ldc )
809 IF( d( i ).LT.zero )
THEN
815 $
CALL dscal( ncvt, negone, vt( i, 1 ), ldvt )
828 DO 180 j = 2, n + 1 - i
829 IF( d( j ).LE.smin )
THEN
834 IF( isub.NE.n+1-i )
THEN
838 d( isub ) = d( n+1-i )
841 $
CALL dswap( ncvt, vt( isub, 1 ), ldvt, vt( n+1-i, 1 ),
844 $
CALL dswap( nru, u( 1, isub ), 1, u( 1, n+1-i ), 1 )
846 $
CALL dswap( ncc, c( isub, 1 ), ldc, c( n+1-i, 1 ), ldc )
subroutine dlas2(F, G, H, SSMIN, SSMAX)
DLAS2 computes singular values of a 2-by-2 triangular matrix.
subroutine dlartg(f, g, c, s, r)
DLARTG generates a plane rotation with real cosine and real sine.
subroutine dlasr(SIDE, PIVOT, DIRECT, M, N, C, S, A, LDA)
DLASR applies a sequence of plane rotations to a general rectangular matrix.
subroutine dlasv2(F, G, H, SSMIN, SSMAX, SNR, CSR, SNL, CSL)
DLASV2 computes the singular value decomposition of a 2-by-2 triangular matrix.
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine dbdsqr(UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U, LDU, C, LDC, WORK, INFO)
DBDSQR
subroutine dlasq1(N, D, E, WORK, INFO)
DLASQ1 computes the singular values of a real square bidiagonal matrix. Used by sbdsqr.
subroutine drot(N, DX, INCX, DY, INCY, C, S)
DROT
subroutine dscal(N, DA, DX, INCX)
DSCAL
subroutine dswap(N, DX, INCX, DY, INCY)
DSWAP