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 xerbla(SRNAME, INFO)
XERBLA
subroutine dlasq1(N, D, E, WORK, INFO)
DLASQ1 computes the singular values of a real square bidiagonal matrix. Used by sbdsqr.
subroutine dlasr(SIDE, PIVOT, DIRECT, M, N, C, S, A, LDA)
DLASR applies a sequence of plane rotations to a general rectangular matrix.
subroutine dscal(N, DA, DX, INCX)
DSCAL
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 drot(N, DX, INCX, DY, INCY, C, S)
DROT
subroutine dswap(N, DX, INCX, DY, INCY)
DSWAP
subroutine dbdsqr(UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U, LDU, C, LDC, WORK, INFO)
DBDSQR
subroutine dlas2(F, G, H, SSMIN, SSMAX)
DLAS2 computes singular values of a 2-by-2 triangular matrix.