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