328 SUBROUTINE dbbcsd( JOBU1, JOBU2, JOBV1T, JOBV2T, TRANS, M, P, Q,
329 $ THETA, PHI, U1, LDU1, U2, LDU2, V1T, LDV1T,
330 $ V2T, LDV2T, B11D, B11E, B12D, B12E, B21D, B21E,
331 $ B22D, B22E, WORK, LWORK, INFO )
338 CHARACTER JOBU1, JOBU2, JOBV1T, JOBV2T, TRANS
339 INTEGER INFO, LDU1, LDU2, LDV1T, LDV2T, LWORK, M, P, Q
342 DOUBLE PRECISION B11D( * ), B11E( * ), B12D( * ), B12E( * ),
343 $ b21d( * ), b21e( * ), b22d( * ), b22e( * ),
344 $ phi( * ), theta( * ), work( * )
345 DOUBLE PRECISION U1( ldu1, * ), U2( ldu2, * ), V1T( ldv1t, * ),
353 parameter( maxitr = 6 )
354 DOUBLE PRECISION HUNDRED, MEIGHTH, ONE, TEN, ZERO
355 parameter( hundred = 100.0d0, meighth = -0.125d0,
356 $ one = 1.0d0, ten = 10.0d0, zero = 0.0d0 )
357 DOUBLE PRECISION NEGONE
358 parameter( negone = -1.0d0 )
359 DOUBLE PRECISION PIOVER2
360 parameter( piover2 = 1.57079632679489661923132169163975144210d0 )
363 LOGICAL COLMAJOR, LQUERY, RESTART11, RESTART12,
364 $ restart21, restart22, wantu1, wantu2, wantv1t,
366 INTEGER I, IMIN, IMAX, ITER, IU1CS, IU1SN, IU2CS,
367 $ iu2sn, iv1tcs, iv1tsn, iv2tcs, iv2tsn, j,
368 $ lworkmin, lworkopt, maxit, mini
369 DOUBLE PRECISION B11BULGE, B12BULGE, B21BULGE, B22BULGE, DUMMY,
370 $ eps, mu, nu, r, sigma11, sigma21,
371 $ temp, thetamax, thetamin, thresh, tol, tolmul,
372 $ unfl, x1, x2, y1, y2
379 DOUBLE PRECISION DLAMCH
381 EXTERNAL lsame, dlamch
384 INTRINSIC abs, atan2, cos, max, min, sin, sqrt
391 lquery = lwork .EQ. -1
392 wantu1 = lsame( jobu1,
'Y' )
393 wantu2 = lsame( jobu2,
'Y' )
394 wantv1t = lsame( jobv1t,
'Y' )
395 wantv2t = lsame( jobv2t,
'Y' )
396 colmajor = .NOT. lsame( trans,
'T' )
400 ELSE IF( p .LT. 0 .OR. p .GT. m )
THEN 402 ELSE IF( q .LT. 0 .OR. q .GT. m )
THEN 404 ELSE IF( q .GT. p .OR. q .GT. m-p .OR. q .GT. m-q )
THEN 406 ELSE IF( wantu1 .AND. ldu1 .LT. p )
THEN 408 ELSE IF( wantu2 .AND. ldu2 .LT. m-p )
THEN 410 ELSE IF( wantv1t .AND. ldv1t .LT. q )
THEN 412 ELSE IF( wantv2t .AND. ldv2t .LT. m-q )
THEN 418 IF( info .EQ. 0 .AND. q .EQ. 0 )
THEN 426 IF( info .EQ. 0 )
THEN 435 lworkopt = iv2tsn + q - 1
438 IF( lwork .LT. lworkmin .AND. .NOT. lquery )
THEN 443 IF( info .NE. 0 )
THEN 444 CALL xerbla(
'DBBCSD', -info )
446 ELSE IF( lquery )
THEN 452 eps = dlamch(
'Epsilon' )
453 unfl = dlamch(
'Safe minimum' )
454 tolmul = max( ten, min( hundred, eps**meighth ) )
456 thresh = max( tol, maxitr*q*q*unfl )
461 IF( theta(i) .LT. thresh )
THEN 463 ELSE IF( theta(i) .GT. piover2-thresh )
THEN 468 IF( phi(i) .LT. thresh )
THEN 470 ELSE IF( phi(i) .GT. piover2-thresh )
THEN 478 DO WHILE( imax .GT. 1 )
479 IF( phi(imax-1) .NE. zero )
THEN 485 IF ( imin .GT. 1 )
THEN 486 DO WHILE( phi(imin-1) .NE. zero )
488 IF ( imin .LE. 1 )
EXIT 499 DO WHILE( imax .GT. 1 )
503 b11d(imin) = cos( theta(imin) )
504 b21d(imin) = -sin( theta(imin) )
505 DO i = imin, imax - 1
506 b11e(i) = -sin( theta(i) ) * sin( phi(i) )
507 b11d(i+1) = cos( theta(i+1) ) * cos( phi(i) )
508 b12d(i) = sin( theta(i) ) * cos( phi(i) )
509 b12e(i) = cos( theta(i+1) ) * sin( phi(i) )
510 b21e(i) = -cos( theta(i) ) * sin( phi(i) )
511 b21d(i+1) = -sin( theta(i+1) ) * cos( phi(i) )
512 b22d(i) = cos( theta(i) ) * cos( phi(i) )
513 b22e(i) = -sin( theta(i+1) ) * sin( phi(i) )
515 b12d(imax) = sin( theta(imax) )
516 b22d(imax) = cos( theta(imax) )
520 IF( iter .GT. maxit )
THEN 523 IF( phi(i) .NE. zero )
529 iter = iter + imax - imin
533 thetamax = theta(imin)
534 thetamin = theta(imin)
536 IF( theta(i) > thetamax )
537 $ thetamax = theta(i)
538 IF( theta(i) < thetamin )
539 $ thetamin = theta(i)
542 IF( thetamax .GT. piover2 - thresh )
THEN 550 ELSE IF( thetamin .LT. thresh )
THEN 562 CALL dlas2( b11d(imax-1), b11e(imax-1), b11d(imax), sigma11,
564 CALL dlas2( b21d(imax-1), b21e(imax-1), b21d(imax), sigma21,
567 IF( sigma11 .LE. sigma21 )
THEN 569 nu = sqrt( one - mu**2 )
570 IF( mu .LT. thresh )
THEN 576 mu = sqrt( 1.0 - nu**2 )
577 IF( nu .LT. thresh )
THEN 586 IF( mu .LE. nu )
THEN 587 CALL dlartgs( b11d(imin), b11e(imin), mu,
588 $ work(iv1tcs+imin-1), work(iv1tsn+imin-1) )
590 CALL dlartgs( b21d(imin), b21e(imin), nu,
591 $ work(iv1tcs+imin-1), work(iv1tsn+imin-1) )
594 temp = work(iv1tcs+imin-1)*b11d(imin) +
595 $ work(iv1tsn+imin-1)*b11e(imin)
596 b11e(imin) = work(iv1tcs+imin-1)*b11e(imin) -
597 $ work(iv1tsn+imin-1)*b11d(imin)
599 b11bulge = work(iv1tsn+imin-1)*b11d(imin+1)
600 b11d(imin+1) = work(iv1tcs+imin-1)*b11d(imin+1)
601 temp = work(iv1tcs+imin-1)*b21d(imin) +
602 $ work(iv1tsn+imin-1)*b21e(imin)
603 b21e(imin) = work(iv1tcs+imin-1)*b21e(imin) -
604 $ work(iv1tsn+imin-1)*b21d(imin)
606 b21bulge = work(iv1tsn+imin-1)*b21d(imin+1)
607 b21d(imin+1) = work(iv1tcs+imin-1)*b21d(imin+1)
611 theta( imin ) = atan2( sqrt( b21d(imin)**2+b21bulge**2 ),
612 $ sqrt( b11d(imin)**2+b11bulge**2 ) )
616 IF( b11d(imin)**2+b11bulge**2 .GT. thresh**2 )
THEN 617 CALL dlartgp( b11bulge, b11d(imin), work(iu1sn+imin-1),
618 $ work(iu1cs+imin-1), r )
619 ELSE IF( mu .LE. nu )
THEN 620 CALL dlartgs( b11e( imin ), b11d( imin + 1 ), mu,
621 $ work(iu1cs+imin-1), work(iu1sn+imin-1) )
623 CALL dlartgs( b12d( imin ), b12e( imin ), nu,
624 $ work(iu1cs+imin-1), work(iu1sn+imin-1) )
626 IF( b21d(imin)**2+b21bulge**2 .GT. thresh**2 )
THEN 627 CALL dlartgp( b21bulge, b21d(imin), work(iu2sn+imin-1),
628 $ work(iu2cs+imin-1), r )
629 ELSE IF( nu .LT. mu )
THEN 630 CALL dlartgs( b21e( imin ), b21d( imin + 1 ), nu,
631 $ work(iu2cs+imin-1), work(iu2sn+imin-1) )
633 CALL dlartgs( b22d(imin), b22e(imin), mu,
634 $ work(iu2cs+imin-1), work(iu2sn+imin-1) )
636 work(iu2cs+imin-1) = -work(iu2cs+imin-1)
637 work(iu2sn+imin-1) = -work(iu2sn+imin-1)
639 temp = work(iu1cs+imin-1)*b11e(imin) +
640 $ work(iu1sn+imin-1)*b11d(imin+1)
641 b11d(imin+1) = work(iu1cs+imin-1)*b11d(imin+1) -
642 $ work(iu1sn+imin-1)*b11e(imin)
644 IF( imax .GT. imin+1 )
THEN 645 b11bulge = work(iu1sn+imin-1)*b11e(imin+1)
646 b11e(imin+1) = work(iu1cs+imin-1)*b11e(imin+1)
648 temp = work(iu1cs+imin-1)*b12d(imin) +
649 $ work(iu1sn+imin-1)*b12e(imin)
650 b12e(imin) = work(iu1cs+imin-1)*b12e(imin) -
651 $ work(iu1sn+imin-1)*b12d(imin)
653 b12bulge = work(iu1sn+imin-1)*b12d(imin+1)
654 b12d(imin+1) = work(iu1cs+imin-1)*b12d(imin+1)
655 temp = work(iu2cs+imin-1)*b21e(imin) +
656 $ work(iu2sn+imin-1)*b21d(imin+1)
657 b21d(imin+1) = work(iu2cs+imin-1)*b21d(imin+1) -
658 $ work(iu2sn+imin-1)*b21e(imin)
660 IF( imax .GT. imin+1 )
THEN 661 b21bulge = work(iu2sn+imin-1)*b21e(imin+1)
662 b21e(imin+1) = work(iu2cs+imin-1)*b21e(imin+1)
664 temp = work(iu2cs+imin-1)*b22d(imin) +
665 $ work(iu2sn+imin-1)*b22e(imin)
666 b22e(imin) = work(iu2cs+imin-1)*b22e(imin) -
667 $ work(iu2sn+imin-1)*b22d(imin)
669 b22bulge = work(iu2sn+imin-1)*b22d(imin+1)
670 b22d(imin+1) = work(iu2cs+imin-1)*b22d(imin+1)
676 DO i = imin+1, imax-1
680 x1 = sin(theta(i-1))*b11e(i-1) + cos(theta(i-1))*b21e(i-1)
681 x2 = sin(theta(i-1))*b11bulge + cos(theta(i-1))*b21bulge
682 y1 = sin(theta(i-1))*b12d(i-1) + cos(theta(i-1))*b22d(i-1)
683 y2 = sin(theta(i-1))*b12bulge + cos(theta(i-1))*b22bulge
685 phi(i-1) = atan2( sqrt(x1**2+x2**2), sqrt(y1**2+y2**2) )
690 restart11 = b11e(i-1)**2 + b11bulge**2 .LE. thresh**2
691 restart21 = b21e(i-1)**2 + b21bulge**2 .LE. thresh**2
692 restart12 = b12d(i-1)**2 + b12bulge**2 .LE. thresh**2
693 restart22 = b22d(i-1)**2 + b22bulge**2 .LE. thresh**2
699 IF( .NOT. restart11 .AND. .NOT. restart21 )
THEN 700 CALL dlartgp( x2, x1, work(iv1tsn+i-1), work(iv1tcs+i-1),
702 ELSE IF( .NOT. restart11 .AND. restart21 )
THEN 703 CALL dlartgp( b11bulge, b11e(i-1), work(iv1tsn+i-1),
704 $ work(iv1tcs+i-1), r )
705 ELSE IF( restart11 .AND. .NOT. restart21 )
THEN 706 CALL dlartgp( b21bulge, b21e(i-1), work(iv1tsn+i-1),
707 $ work(iv1tcs+i-1), r )
708 ELSE IF( mu .LE. nu )
THEN 709 CALL dlartgs( b11d(i), b11e(i), mu, work(iv1tcs+i-1),
712 CALL dlartgs( b21d(i), b21e(i), nu, work(iv1tcs+i-1),
715 work(iv1tcs+i-1) = -work(iv1tcs+i-1)
716 work(iv1tsn+i-1) = -work(iv1tsn+i-1)
717 IF( .NOT. restart12 .AND. .NOT. restart22 )
THEN 718 CALL dlartgp( y2, y1, work(iv2tsn+i-1-1),
719 $ work(iv2tcs+i-1-1), r )
720 ELSE IF( .NOT. restart12 .AND. restart22 )
THEN 721 CALL dlartgp( b12bulge, b12d(i-1), work(iv2tsn+i-1-1),
722 $ work(iv2tcs+i-1-1), r )
723 ELSE IF( restart12 .AND. .NOT. restart22 )
THEN 724 CALL dlartgp( b22bulge, b22d(i-1), work(iv2tsn+i-1-1),
725 $ work(iv2tcs+i-1-1), r )
726 ELSE IF( nu .LT. mu )
THEN 727 CALL dlartgs( b12e(i-1), b12d(i), nu, work(iv2tcs+i-1-1),
728 $ work(iv2tsn+i-1-1) )
730 CALL dlartgs( b22e(i-1), b22d(i), mu, work(iv2tcs+i-1-1),
731 $ work(iv2tsn+i-1-1) )
734 temp = work(iv1tcs+i-1)*b11d(i) + work(iv1tsn+i-1)*b11e(i)
735 b11e(i) = work(iv1tcs+i-1)*b11e(i) -
736 $ work(iv1tsn+i-1)*b11d(i)
738 b11bulge = work(iv1tsn+i-1)*b11d(i+1)
739 b11d(i+1) = work(iv1tcs+i-1)*b11d(i+1)
740 temp = work(iv1tcs+i-1)*b21d(i) + work(iv1tsn+i-1)*b21e(i)
741 b21e(i) = work(iv1tcs+i-1)*b21e(i) -
742 $ work(iv1tsn+i-1)*b21d(i)
744 b21bulge = work(iv1tsn+i-1)*b21d(i+1)
745 b21d(i+1) = work(iv1tcs+i-1)*b21d(i+1)
746 temp = work(iv2tcs+i-1-1)*b12e(i-1) +
747 $ work(iv2tsn+i-1-1)*b12d(i)
748 b12d(i) = work(iv2tcs+i-1-1)*b12d(i) -
749 $ work(iv2tsn+i-1-1)*b12e(i-1)
751 b12bulge = work(iv2tsn+i-1-1)*b12e(i)
752 b12e(i) = work(iv2tcs+i-1-1)*b12e(i)
753 temp = work(iv2tcs+i-1-1)*b22e(i-1) +
754 $ work(iv2tsn+i-1-1)*b22d(i)
755 b22d(i) = work(iv2tcs+i-1-1)*b22d(i) -
756 $ work(iv2tsn+i-1-1)*b22e(i-1)
758 b22bulge = work(iv2tsn+i-1-1)*b22e(i)
759 b22e(i) = work(iv2tcs+i-1-1)*b22e(i)
763 x1 = cos(phi(i-1))*b11d(i) + sin(phi(i-1))*b12e(i-1)
764 x2 = cos(phi(i-1))*b11bulge + sin(phi(i-1))*b12bulge
765 y1 = cos(phi(i-1))*b21d(i) + sin(phi(i-1))*b22e(i-1)
766 y2 = cos(phi(i-1))*b21bulge + sin(phi(i-1))*b22bulge
768 theta(i) = atan2( sqrt(y1**2+y2**2), sqrt(x1**2+x2**2) )
773 restart11 = b11d(i)**2 + b11bulge**2 .LE. thresh**2
774 restart12 = b12e(i-1)**2 + b12bulge**2 .LE. thresh**2
775 restart21 = b21d(i)**2 + b21bulge**2 .LE. thresh**2
776 restart22 = b22e(i-1)**2 + b22bulge**2 .LE. thresh**2
782 IF( .NOT. restart11 .AND. .NOT. restart12 )
THEN 783 CALL dlartgp( x2, x1, work(iu1sn+i-1), work(iu1cs+i-1),
785 ELSE IF( .NOT. restart11 .AND. restart12 )
THEN 786 CALL dlartgp( b11bulge, b11d(i), work(iu1sn+i-1),
787 $ work(iu1cs+i-1), r )
788 ELSE IF( restart11 .AND. .NOT. restart12 )
THEN 789 CALL dlartgp( b12bulge, b12e(i-1), work(iu1sn+i-1),
790 $ work(iu1cs+i-1), r )
791 ELSE IF( mu .LE. nu )
THEN 792 CALL dlartgs( b11e(i), b11d(i+1), mu, work(iu1cs+i-1),
795 CALL dlartgs( b12d(i), b12e(i), nu, work(iu1cs+i-1),
798 IF( .NOT. restart21 .AND. .NOT. restart22 )
THEN 799 CALL dlartgp( y2, y1, work(iu2sn+i-1), work(iu2cs+i-1),
801 ELSE IF( .NOT. restart21 .AND. restart22 )
THEN 802 CALL dlartgp( b21bulge, b21d(i), work(iu2sn+i-1),
803 $ work(iu2cs+i-1), r )
804 ELSE IF( restart21 .AND. .NOT. restart22 )
THEN 805 CALL dlartgp( b22bulge, b22e(i-1), work(iu2sn+i-1),
806 $ work(iu2cs+i-1), r )
807 ELSE IF( nu .LT. mu )
THEN 808 CALL dlartgs( b21e(i), b21e(i+1), nu, work(iu2cs+i-1),
811 CALL dlartgs( b22d(i), b22e(i), mu, work(iu2cs+i-1),
814 work(iu2cs+i-1) = -work(iu2cs+i-1)
815 work(iu2sn+i-1) = -work(iu2sn+i-1)
817 temp = work(iu1cs+i-1)*b11e(i) + work(iu1sn+i-1)*b11d(i+1)
818 b11d(i+1) = work(iu1cs+i-1)*b11d(i+1) -
819 $ work(iu1sn+i-1)*b11e(i)
821 IF( i .LT. imax - 1 )
THEN 822 b11bulge = work(iu1sn+i-1)*b11e(i+1)
823 b11e(i+1) = work(iu1cs+i-1)*b11e(i+1)
825 temp = work(iu2cs+i-1)*b21e(i) + work(iu2sn+i-1)*b21d(i+1)
826 b21d(i+1) = work(iu2cs+i-1)*b21d(i+1) -
827 $ work(iu2sn+i-1)*b21e(i)
829 IF( i .LT. imax - 1 )
THEN 830 b21bulge = work(iu2sn+i-1)*b21e(i+1)
831 b21e(i+1) = work(iu2cs+i-1)*b21e(i+1)
833 temp = work(iu1cs+i-1)*b12d(i) + work(iu1sn+i-1)*b12e(i)
834 b12e(i) = work(iu1cs+i-1)*b12e(i) - work(iu1sn+i-1)*b12d(i)
836 b12bulge = work(iu1sn+i-1)*b12d(i+1)
837 b12d(i+1) = work(iu1cs+i-1)*b12d(i+1)
838 temp = work(iu2cs+i-1)*b22d(i) + work(iu2sn+i-1)*b22e(i)
839 b22e(i) = work(iu2cs+i-1)*b22e(i) - work(iu2sn+i-1)*b22d(i)
841 b22bulge = work(iu2sn+i-1)*b22d(i+1)
842 b22d(i+1) = work(iu2cs+i-1)*b22d(i+1)
848 x1 = sin(theta(imax-1))*b11e(imax-1) +
849 $ cos(theta(imax-1))*b21e(imax-1)
850 y1 = sin(theta(imax-1))*b12d(imax-1) +
851 $ cos(theta(imax-1))*b22d(imax-1)
852 y2 = sin(theta(imax-1))*b12bulge + cos(theta(imax-1))*b22bulge
854 phi(imax-1) = atan2( abs(x1), sqrt(y1**2+y2**2) )
858 restart12 = b12d(imax-1)**2 + b12bulge**2 .LE. thresh**2
859 restart22 = b22d(imax-1)**2 + b22bulge**2 .LE. thresh**2
861 IF( .NOT. restart12 .AND. .NOT. restart22 )
THEN 862 CALL dlartgp( y2, y1, work(iv2tsn+imax-1-1),
863 $ work(iv2tcs+imax-1-1), r )
864 ELSE IF( .NOT. restart12 .AND. restart22 )
THEN 865 CALL dlartgp( b12bulge, b12d(imax-1), work(iv2tsn+imax-1-1),
866 $ work(iv2tcs+imax-1-1), r )
867 ELSE IF( restart12 .AND. .NOT. restart22 )
THEN 868 CALL dlartgp( b22bulge, b22d(imax-1), work(iv2tsn+imax-1-1),
869 $ work(iv2tcs+imax-1-1), r )
870 ELSE IF( nu .LT. mu )
THEN 871 CALL dlartgs( b12e(imax-1), b12d(imax), nu,
872 $ work(iv2tcs+imax-1-1), work(iv2tsn+imax-1-1) )
874 CALL dlartgs( b22e(imax-1), b22d(imax), mu,
875 $ work(iv2tcs+imax-1-1), work(iv2tsn+imax-1-1) )
878 temp = work(iv2tcs+imax-1-1)*b12e(imax-1) +
879 $ work(iv2tsn+imax-1-1)*b12d(imax)
880 b12d(imax) = work(iv2tcs+imax-1-1)*b12d(imax) -
881 $ work(iv2tsn+imax-1-1)*b12e(imax-1)
883 temp = work(iv2tcs+imax-1-1)*b22e(imax-1) +
884 $ work(iv2tsn+imax-1-1)*b22d(imax)
885 b22d(imax) = work(iv2tcs+imax-1-1)*b22d(imax) -
886 $ work(iv2tsn+imax-1-1)*b22e(imax-1)
893 CALL dlasr(
'R',
'V',
'F', p, imax-imin+1,
894 $ work(iu1cs+imin-1), work(iu1sn+imin-1),
897 CALL dlasr(
'L',
'V',
'F', imax-imin+1, p,
898 $ work(iu1cs+imin-1), work(iu1sn+imin-1),
904 CALL dlasr(
'R',
'V',
'F', m-p, imax-imin+1,
905 $ work(iu2cs+imin-1), work(iu2sn+imin-1),
908 CALL dlasr(
'L',
'V',
'F', imax-imin+1, m-p,
909 $ work(iu2cs+imin-1), work(iu2sn+imin-1),
915 CALL dlasr(
'L',
'V',
'F', imax-imin+1, q,
916 $ work(iv1tcs+imin-1), work(iv1tsn+imin-1),
917 $ v1t(imin,1), ldv1t )
919 CALL dlasr(
'R',
'V',
'F', q, imax-imin+1,
920 $ work(iv1tcs+imin-1), work(iv1tsn+imin-1),
921 $ v1t(1,imin), ldv1t )
926 CALL dlasr(
'L',
'V',
'F', imax-imin+1, m-q,
927 $ work(iv2tcs+imin-1), work(iv2tsn+imin-1),
928 $ v2t(imin,1), ldv2t )
930 CALL dlasr(
'R',
'V',
'F', m-q, imax-imin+1,
931 $ work(iv2tcs+imin-1), work(iv2tsn+imin-1),
932 $ v2t(1,imin), ldv2t )
938 IF( b11e(imax-1)+b21e(imax-1) .GT. 0 )
THEN 939 b11d(imax) = -b11d(imax)
940 b21d(imax) = -b21d(imax)
943 CALL dscal( q, negone, v1t(imax,1), ldv1t )
945 CALL dscal( q, negone, v1t(1,imax), 1 )
952 x1 = cos(phi(imax-1))*b11d(imax) +
953 $ sin(phi(imax-1))*b12e(imax-1)
954 y1 = cos(phi(imax-1))*b21d(imax) +
955 $ sin(phi(imax-1))*b22e(imax-1)
957 theta(imax) = atan2( abs(y1), abs(x1) )
962 IF( b11d(imax)+b12e(imax-1) .LT. 0 )
THEN 963 b12d(imax) = -b12d(imax)
966 CALL dscal( p, negone, u1(1,imax), 1 )
968 CALL dscal( p, negone, u1(imax,1), ldu1 )
972 IF( b21d(imax)+b22e(imax-1) .GT. 0 )
THEN 973 b22d(imax) = -b22d(imax)
976 CALL dscal( m-p, negone, u2(1,imax), 1 )
978 CALL dscal( m-p, negone, u2(imax,1), ldu2 )
985 IF( b12d(imax)+b22d(imax) .LT. 0 )
THEN 988 CALL dscal( m-q, negone, v2t(imax,1), ldv2t )
990 CALL dscal( m-q, negone, v2t(1,imax), 1 )
998 IF( theta(i) .LT. thresh )
THEN 1000 ELSE IF( theta(i) .GT. piover2-thresh )
THEN 1005 IF( phi(i) .LT. thresh )
THEN 1007 ELSE IF( phi(i) .GT. piover2-thresh )
THEN 1014 IF (imax .GT. 1)
THEN 1015 DO WHILE( phi(imax-1) .EQ. zero )
1017 IF (imax .LE. 1)
EXIT 1020 IF( imin .GT. imax - 1 )
1022 IF (imin .GT. 1)
THEN 1023 DO WHILE (phi(imin-1) .NE. zero)
1025 IF (imin .LE. 1)
EXIT 1040 IF( theta(j) .LT. thetamin )
THEN 1046 IF( mini .NE. i )
THEN 1047 theta(mini) = theta(i)
1051 $
CALL dswap( p, u1(1,i), 1, u1(1,mini), 1 )
1053 $
CALL dswap( m-p, u2(1,i), 1, u2(1,mini), 1 )
1055 $
CALL dswap( q, v1t(i,1), ldv1t, v1t(mini,1), ldv1t )
1057 $
CALL dswap( m-q, v2t(i,1), ldv2t, v2t(mini,1),
1061 $
CALL dswap( p, u1(i,1), ldu1, u1(mini,1), ldu1 )
1063 $
CALL dswap( m-p, u2(i,1), ldu2, u2(mini,1), ldu2 )
1065 $
CALL dswap( q, v1t(1,i), 1, v1t(1,mini), 1 )
1067 $
CALL dswap( m-q, v2t(1,i), 1, v2t(1,mini), 1 )
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine dlasr(SIDE, PIVOT, DIRECT, M, N, C, S, A, LDA)
DLASR applies a sequence of plane rotations to a general rectangular matrix.
subroutine dlartgs(X, Y, SIGMA, CS, SN)
DLARTGS generates a plane rotation designed to introduce a bulge in implicit QR iteration for the bid...
subroutine dscal(N, DA, DX, INCX)
DSCAL
subroutine dlartgp(F, G, CS, SN, R)
DLARTGP generates a plane rotation so that the diagonal is nonnegative.
subroutine dswap(N, DX, INCX, DY, INCY)
DSWAP
subroutine dlas2(F, G, H, SSMIN, SSMAX)
DLAS2 computes singular values of a 2-by-2 triangular matrix.
subroutine dbbcsd(JOBU1, JOBU2, JOBV1T, JOBV2T, TRANS, M, P, Q, THETA, PHI, U1, LDU1, U2, LDU2, V1T, LDV1T, V2T, LDV2T, B11D, B11E, B12D, B12E, B21D, B21E, B22D, B22E, WORK, LWORK, INFO)
DBBCSD