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 )