328 SUBROUTINE zbbcsd( 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, RWORK, LRWORK, INFO )
338 CHARACTER JOBU1, JOBU2, JOBV1T, JOBV2T, TRANS
339 INTEGER INFO, LDU1, LDU2, LDV1T, LDV2T, LRWORK, M, P, Q
342 DOUBLE PRECISION B11D( * ), B11E( * ), B12D( * ), B12E( * ),
343 $ b21d( * ), b21e( * ), b22d( * ), b22e( * ),
344 $ phi( * ), theta( * ), rwork( * )
345 COMPLEX*16 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 COMPLEX*16 NEGONECOMPLEX
358 parameter( negonecomplex = (-1.0d0,0.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 $ lrworkmin, lrworkopt, 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
378 DOUBLE PRECISION DLAMCH
380 EXTERNAL lsame, dlamch
383 INTRINSIC abs, atan2, cos, max, min, sin, sqrt
390 lquery = lrwork .EQ. -1
391 wantu1 = lsame( jobu1,
'Y' )
392 wantu2 = lsame( jobu2,
'Y' )
393 wantv1t = lsame( jobv1t,
'Y' )
394 wantv2t = lsame( jobv2t,
'Y' )
395 colmajor = .NOT. lsame( trans,
'T' )
399 ELSE IF( p .LT. 0 .OR. p .GT. m )
THEN 401 ELSE IF( q .LT. 0 .OR. q .GT. m )
THEN 403 ELSE IF( q .GT. p .OR. q .GT. m-p .OR. q .GT. m-q )
THEN 405 ELSE IF( wantu1 .AND. ldu1 .LT. p )
THEN 407 ELSE IF( wantu2 .AND. ldu2 .LT. m-p )
THEN 409 ELSE IF( wantv1t .AND. ldv1t .LT. q )
THEN 411 ELSE IF( wantv2t .AND. ldv2t .LT. m-q )
THEN 417 IF( info .EQ. 0 .AND. q .EQ. 0 )
THEN 425 IF( info .EQ. 0 )
THEN 434 lrworkopt = iv2tsn + q - 1
435 lrworkmin = lrworkopt
437 IF( lrwork .LT. lrworkmin .AND. .NOT. lquery )
THEN 442 IF( info .NE. 0 )
THEN 443 CALL xerbla(
'ZBBCSD', -info )
445 ELSE IF( lquery )
THEN 451 eps = dlamch(
'Epsilon' )
452 unfl = dlamch(
'Safe minimum' )
453 tolmul = max( ten, min( hundred, eps**meighth ) )
455 thresh = max( tol, maxitr*q*q*unfl )
460 IF( theta(i) .LT. thresh )
THEN 462 ELSE IF( theta(i) .GT. piover2-thresh )
THEN 467 IF( phi(i) .LT. thresh )
THEN 469 ELSE IF( phi(i) .GT. piover2-thresh )
THEN 477 DO WHILE( imax .GT. 1 )
478 IF( phi(imax-1) .NE. zero )
THEN 484 IF ( imin .GT. 1 )
THEN 485 DO WHILE( phi(imin-1) .NE. zero )
487 IF ( imin .LE. 1 )
EXIT 498 DO WHILE( imax .GT. 1 )
502 b11d(imin) = cos( theta(imin) )
503 b21d(imin) = -sin( theta(imin) )
504 DO i = imin, imax - 1
505 b11e(i) = -sin( theta(i) ) * sin( phi(i) )
506 b11d(i+1) = cos( theta(i+1) ) * cos( phi(i) )
507 b12d(i) = sin( theta(i) ) * cos( phi(i) )
508 b12e(i) = cos( theta(i+1) ) * sin( phi(i) )
509 b21e(i) = -cos( theta(i) ) * sin( phi(i) )
510 b21d(i+1) = -sin( theta(i+1) ) * cos( phi(i) )
511 b22d(i) = cos( theta(i) ) * cos( phi(i) )
512 b22e(i) = -sin( theta(i+1) ) * sin( phi(i) )
514 b12d(imax) = sin( theta(imax) )
515 b22d(imax) = cos( theta(imax) )
519 IF( iter .GT. maxit )
THEN 522 IF( phi(i) .NE. zero )
528 iter = iter + imax - imin
532 thetamax = theta(imin)
533 thetamin = theta(imin)
535 IF( theta(i) > thetamax )
536 $ thetamax = theta(i)
537 IF( theta(i) < thetamin )
538 $ thetamin = theta(i)
541 IF( thetamax .GT. piover2 - thresh )
THEN 549 ELSE IF( thetamin .LT. thresh )
THEN 561 CALL dlas2( b11d(imax-1), b11e(imax-1), b11d(imax), sigma11,
563 CALL dlas2( b21d(imax-1), b21e(imax-1), b21d(imax), sigma21,
566 IF( sigma11 .LE. sigma21 )
THEN 568 nu = sqrt( one - mu**2 )
569 IF( mu .LT. thresh )
THEN 575 mu = sqrt( 1.0 - nu**2 )
576 IF( nu .LT. thresh )
THEN 585 IF( mu .LE. nu )
THEN 586 CALL dlartgs( b11d(imin), b11e(imin), mu,
587 $ rwork(iv1tcs+imin-1), rwork(iv1tsn+imin-1) )
589 CALL dlartgs( b21d(imin), b21e(imin), nu,
590 $ rwork(iv1tcs+imin-1), rwork(iv1tsn+imin-1) )
593 temp = rwork(iv1tcs+imin-1)*b11d(imin) +
594 $ rwork(iv1tsn+imin-1)*b11e(imin)
595 b11e(imin) = rwork(iv1tcs+imin-1)*b11e(imin) -
596 $ rwork(iv1tsn+imin-1)*b11d(imin)
598 b11bulge = rwork(iv1tsn+imin-1)*b11d(imin+1)
599 b11d(imin+1) = rwork(iv1tcs+imin-1)*b11d(imin+1)
600 temp = rwork(iv1tcs+imin-1)*b21d(imin) +
601 $ rwork(iv1tsn+imin-1)*b21e(imin)
602 b21e(imin) = rwork(iv1tcs+imin-1)*b21e(imin) -
603 $ rwork(iv1tsn+imin-1)*b21d(imin)
605 b21bulge = rwork(iv1tsn+imin-1)*b21d(imin+1)
606 b21d(imin+1) = rwork(iv1tcs+imin-1)*b21d(imin+1)
610 theta( imin ) = atan2( sqrt( b21d(imin)**2+b21bulge**2 ),
611 $ sqrt( b11d(imin)**2+b11bulge**2 ) )
615 IF( b11d(imin)**2+b11bulge**2 .GT. thresh**2 )
THEN 616 CALL dlartgp( b11bulge, b11d(imin), rwork(iu1sn+imin-1),
617 $ rwork(iu1cs+imin-1), r )
618 ELSE IF( mu .LE. nu )
THEN 619 CALL dlartgs( b11e( imin ), b11d( imin + 1 ), mu,
620 $ rwork(iu1cs+imin-1), rwork(iu1sn+imin-1) )
622 CALL dlartgs( b12d( imin ), b12e( imin ), nu,
623 $ rwork(iu1cs+imin-1), rwork(iu1sn+imin-1) )
625 IF( b21d(imin)**2+b21bulge**2 .GT. thresh**2 )
THEN 626 CALL dlartgp( b21bulge, b21d(imin), rwork(iu2sn+imin-1),
627 $ rwork(iu2cs+imin-1), r )
628 ELSE IF( nu .LT. mu )
THEN 629 CALL dlartgs( b21e( imin ), b21d( imin + 1 ), nu,
630 $ rwork(iu2cs+imin-1), rwork(iu2sn+imin-1) )
632 CALL dlartgs( b22d(imin), b22e(imin), mu,
633 $ rwork(iu2cs+imin-1), rwork(iu2sn+imin-1) )
635 rwork(iu2cs+imin-1) = -rwork(iu2cs+imin-1)
636 rwork(iu2sn+imin-1) = -rwork(iu2sn+imin-1)
638 temp = rwork(iu1cs+imin-1)*b11e(imin) +
639 $ rwork(iu1sn+imin-1)*b11d(imin+1)
640 b11d(imin+1) = rwork(iu1cs+imin-1)*b11d(imin+1) -
641 $ rwork(iu1sn+imin-1)*b11e(imin)
643 IF( imax .GT. imin+1 )
THEN 644 b11bulge = rwork(iu1sn+imin-1)*b11e(imin+1)
645 b11e(imin+1) = rwork(iu1cs+imin-1)*b11e(imin+1)
647 temp = rwork(iu1cs+imin-1)*b12d(imin) +
648 $ rwork(iu1sn+imin-1)*b12e(imin)
649 b12e(imin) = rwork(iu1cs+imin-1)*b12e(imin) -
650 $ rwork(iu1sn+imin-1)*b12d(imin)
652 b12bulge = rwork(iu1sn+imin-1)*b12d(imin+1)
653 b12d(imin+1) = rwork(iu1cs+imin-1)*b12d(imin+1)
654 temp = rwork(iu2cs+imin-1)*b21e(imin) +
655 $ rwork(iu2sn+imin-1)*b21d(imin+1)
656 b21d(imin+1) = rwork(iu2cs+imin-1)*b21d(imin+1) -
657 $ rwork(iu2sn+imin-1)*b21e(imin)
659 IF( imax .GT. imin+1 )
THEN 660 b21bulge = rwork(iu2sn+imin-1)*b21e(imin+1)
661 b21e(imin+1) = rwork(iu2cs+imin-1)*b21e(imin+1)
663 temp = rwork(iu2cs+imin-1)*b22d(imin) +
664 $ rwork(iu2sn+imin-1)*b22e(imin)
665 b22e(imin) = rwork(iu2cs+imin-1)*b22e(imin) -
666 $ rwork(iu2sn+imin-1)*b22d(imin)
668 b22bulge = rwork(iu2sn+imin-1)*b22d(imin+1)
669 b22d(imin+1) = rwork(iu2cs+imin-1)*b22d(imin+1)
675 DO i = imin+1, imax-1
679 x1 = sin(theta(i-1))*b11e(i-1) + cos(theta(i-1))*b21e(i-1)
680 x2 = sin(theta(i-1))*b11bulge + cos(theta(i-1))*b21bulge
681 y1 = sin(theta(i-1))*b12d(i-1) + cos(theta(i-1))*b22d(i-1)
682 y2 = sin(theta(i-1))*b12bulge + cos(theta(i-1))*b22bulge
684 phi(i-1) = atan2( sqrt(x1**2+x2**2), sqrt(y1**2+y2**2) )
689 restart11 = b11e(i-1)**2 + b11bulge**2 .LE. thresh**2
690 restart21 = b21e(i-1)**2 + b21bulge**2 .LE. thresh**2
691 restart12 = b12d(i-1)**2 + b12bulge**2 .LE. thresh**2
692 restart22 = b22d(i-1)**2 + b22bulge**2 .LE. thresh**2
698 IF( .NOT. restart11 .AND. .NOT. restart21 )
THEN 699 CALL dlartgp( x2, x1, rwork(iv1tsn+i-1),
700 $ rwork(iv1tcs+i-1), r )
701 ELSE IF( .NOT. restart11 .AND. restart21 )
THEN 702 CALL dlartgp( b11bulge, b11e(i-1), rwork(iv1tsn+i-1),
703 $ rwork(iv1tcs+i-1), r )
704 ELSE IF( restart11 .AND. .NOT. restart21 )
THEN 705 CALL dlartgp( b21bulge, b21e(i-1), rwork(iv1tsn+i-1),
706 $ rwork(iv1tcs+i-1), r )
707 ELSE IF( mu .LE. nu )
THEN 708 CALL dlartgs( b11d(i), b11e(i), mu, rwork(iv1tcs+i-1),
709 $ rwork(iv1tsn+i-1) )
711 CALL dlartgs( b21d(i), b21e(i), nu, rwork(iv1tcs+i-1),
712 $ rwork(iv1tsn+i-1) )
714 rwork(iv1tcs+i-1) = -rwork(iv1tcs+i-1)
715 rwork(iv1tsn+i-1) = -rwork(iv1tsn+i-1)
716 IF( .NOT. restart12 .AND. .NOT. restart22 )
THEN 717 CALL dlartgp( y2, y1, rwork(iv2tsn+i-1-1),
718 $ rwork(iv2tcs+i-1-1), r )
719 ELSE IF( .NOT. restart12 .AND. restart22 )
THEN 720 CALL dlartgp( b12bulge, b12d(i-1), rwork(iv2tsn+i-1-1),
721 $ rwork(iv2tcs+i-1-1), r )
722 ELSE IF( restart12 .AND. .NOT. restart22 )
THEN 723 CALL dlartgp( b22bulge, b22d(i-1), rwork(iv2tsn+i-1-1),
724 $ rwork(iv2tcs+i-1-1), r )
725 ELSE IF( nu .LT. mu )
THEN 726 CALL dlartgs( b12e(i-1), b12d(i), nu,
727 $ rwork(iv2tcs+i-1-1), rwork(iv2tsn+i-1-1) )
729 CALL dlartgs( b22e(i-1), b22d(i), mu,
730 $ rwork(iv2tcs+i-1-1), rwork(iv2tsn+i-1-1) )
733 temp = rwork(iv1tcs+i-1)*b11d(i) + rwork(iv1tsn+i-1)*b11e(i)
734 b11e(i) = rwork(iv1tcs+i-1)*b11e(i) -
735 $ rwork(iv1tsn+i-1)*b11d(i)
737 b11bulge = rwork(iv1tsn+i-1)*b11d(i+1)
738 b11d(i+1) = rwork(iv1tcs+i-1)*b11d(i+1)
739 temp = rwork(iv1tcs+i-1)*b21d(i) + rwork(iv1tsn+i-1)*b21e(i)
740 b21e(i) = rwork(iv1tcs+i-1)*b21e(i) -
741 $ rwork(iv1tsn+i-1)*b21d(i)
743 b21bulge = rwork(iv1tsn+i-1)*b21d(i+1)
744 b21d(i+1) = rwork(iv1tcs+i-1)*b21d(i+1)
745 temp = rwork(iv2tcs+i-1-1)*b12e(i-1) +
746 $ rwork(iv2tsn+i-1-1)*b12d(i)
747 b12d(i) = rwork(iv2tcs+i-1-1)*b12d(i) -
748 $ rwork(iv2tsn+i-1-1)*b12e(i-1)
750 b12bulge = rwork(iv2tsn+i-1-1)*b12e(i)
751 b12e(i) = rwork(iv2tcs+i-1-1)*b12e(i)
752 temp = rwork(iv2tcs+i-1-1)*b22e(i-1) +
753 $ rwork(iv2tsn+i-1-1)*b22d(i)
754 b22d(i) = rwork(iv2tcs+i-1-1)*b22d(i) -
755 $ rwork(iv2tsn+i-1-1)*b22e(i-1)
757 b22bulge = rwork(iv2tsn+i-1-1)*b22e(i)
758 b22e(i) = rwork(iv2tcs+i-1-1)*b22e(i)
762 x1 = cos(phi(i-1))*b11d(i) + sin(phi(i-1))*b12e(i-1)
763 x2 = cos(phi(i-1))*b11bulge + sin(phi(i-1))*b12bulge
764 y1 = cos(phi(i-1))*b21d(i) + sin(phi(i-1))*b22e(i-1)
765 y2 = cos(phi(i-1))*b21bulge + sin(phi(i-1))*b22bulge
767 theta(i) = atan2( sqrt(y1**2+y2**2), sqrt(x1**2+x2**2) )
772 restart11 = b11d(i)**2 + b11bulge**2 .LE. thresh**2
773 restart12 = b12e(i-1)**2 + b12bulge**2 .LE. thresh**2
774 restart21 = b21d(i)**2 + b21bulge**2 .LE. thresh**2
775 restart22 = b22e(i-1)**2 + b22bulge**2 .LE. thresh**2
781 IF( .NOT. restart11 .AND. .NOT. restart12 )
THEN 782 CALL dlartgp( x2, x1, rwork(iu1sn+i-1), rwork(iu1cs+i-1),
784 ELSE IF( .NOT. restart11 .AND. restart12 )
THEN 785 CALL dlartgp( b11bulge, b11d(i), rwork(iu1sn+i-1),
786 $ rwork(iu1cs+i-1), r )
787 ELSE IF( restart11 .AND. .NOT. restart12 )
THEN 788 CALL dlartgp( b12bulge, b12e(i-1), rwork(iu1sn+i-1),
789 $ rwork(iu1cs+i-1), r )
790 ELSE IF( mu .LE. nu )
THEN 791 CALL dlartgs( b11e(i), b11d(i+1), mu, rwork(iu1cs+i-1),
794 CALL dlartgs( b12d(i), b12e(i), nu, rwork(iu1cs+i-1),
797 IF( .NOT. restart21 .AND. .NOT. restart22 )
THEN 798 CALL dlartgp( y2, y1, rwork(iu2sn+i-1), rwork(iu2cs+i-1),
800 ELSE IF( .NOT. restart21 .AND. restart22 )
THEN 801 CALL dlartgp( b21bulge, b21d(i), rwork(iu2sn+i-1),
802 $ rwork(iu2cs+i-1), r )
803 ELSE IF( restart21 .AND. .NOT. restart22 )
THEN 804 CALL dlartgp( b22bulge, b22e(i-1), rwork(iu2sn+i-1),
805 $ rwork(iu2cs+i-1), r )
806 ELSE IF( nu .LT. mu )
THEN 807 CALL dlartgs( b21e(i), b21e(i+1), nu, rwork(iu2cs+i-1),
810 CALL dlartgs( b22d(i), b22e(i), mu, rwork(iu2cs+i-1),
813 rwork(iu2cs+i-1) = -rwork(iu2cs+i-1)
814 rwork(iu2sn+i-1) = -rwork(iu2sn+i-1)
816 temp = rwork(iu1cs+i-1)*b11e(i) + rwork(iu1sn+i-1)*b11d(i+1)
817 b11d(i+1) = rwork(iu1cs+i-1)*b11d(i+1) -
818 $ rwork(iu1sn+i-1)*b11e(i)
820 IF( i .LT. imax - 1 )
THEN 821 b11bulge = rwork(iu1sn+i-1)*b11e(i+1)
822 b11e(i+1) = rwork(iu1cs+i-1)*b11e(i+1)
824 temp = rwork(iu2cs+i-1)*b21e(i) + rwork(iu2sn+i-1)*b21d(i+1)
825 b21d(i+1) = rwork(iu2cs+i-1)*b21d(i+1) -
826 $ rwork(iu2sn+i-1)*b21e(i)
828 IF( i .LT. imax - 1 )
THEN 829 b21bulge = rwork(iu2sn+i-1)*b21e(i+1)
830 b21e(i+1) = rwork(iu2cs+i-1)*b21e(i+1)
832 temp = rwork(iu1cs+i-1)*b12d(i) + rwork(iu1sn+i-1)*b12e(i)
833 b12e(i) = rwork(iu1cs+i-1)*b12e(i) -
834 $ rwork(iu1sn+i-1)*b12d(i)
836 b12bulge = rwork(iu1sn+i-1)*b12d(i+1)
837 b12d(i+1) = rwork(iu1cs+i-1)*b12d(i+1)
838 temp = rwork(iu2cs+i-1)*b22d(i) + rwork(iu2sn+i-1)*b22e(i)
839 b22e(i) = rwork(iu2cs+i-1)*b22e(i) -
840 $ rwork(iu2sn+i-1)*b22d(i)
842 b22bulge = rwork(iu2sn+i-1)*b22d(i+1)
843 b22d(i+1) = rwork(iu2cs+i-1)*b22d(i+1)
849 x1 = sin(theta(imax-1))*b11e(imax-1) +
850 $ cos(theta(imax-1))*b21e(imax-1)
851 y1 = sin(theta(imax-1))*b12d(imax-1) +
852 $ cos(theta(imax-1))*b22d(imax-1)
853 y2 = sin(theta(imax-1))*b12bulge + cos(theta(imax-1))*b22bulge
855 phi(imax-1) = atan2( abs(x1), sqrt(y1**2+y2**2) )
859 restart12 = b12d(imax-1)**2 + b12bulge**2 .LE. thresh**2
860 restart22 = b22d(imax-1)**2 + b22bulge**2 .LE. thresh**2
862 IF( .NOT. restart12 .AND. .NOT. restart22 )
THEN 863 CALL dlartgp( y2, y1, rwork(iv2tsn+imax-1-1),
864 $ rwork(iv2tcs+imax-1-1), r )
865 ELSE IF( .NOT. restart12 .AND. restart22 )
THEN 866 CALL dlartgp( b12bulge, b12d(imax-1),
867 $ rwork(iv2tsn+imax-1-1),
868 $ rwork(iv2tcs+imax-1-1), r )
869 ELSE IF( restart12 .AND. .NOT. restart22 )
THEN 870 CALL dlartgp( b22bulge, b22d(imax-1),
871 $ rwork(iv2tsn+imax-1-1),
872 $ rwork(iv2tcs+imax-1-1), r )
873 ELSE IF( nu .LT. mu )
THEN 874 CALL dlartgs( b12e(imax-1), b12d(imax), nu,
875 $ rwork(iv2tcs+imax-1-1),
876 $ rwork(iv2tsn+imax-1-1) )
878 CALL dlartgs( b22e(imax-1), b22d(imax), mu,
879 $ rwork(iv2tcs+imax-1-1),
880 $ rwork(iv2tsn+imax-1-1) )
883 temp = rwork(iv2tcs+imax-1-1)*b12e(imax-1) +
884 $ rwork(iv2tsn+imax-1-1)*b12d(imax)
885 b12d(imax) = rwork(iv2tcs+imax-1-1)*b12d(imax) -
886 $ rwork(iv2tsn+imax-1-1)*b12e(imax-1)
888 temp = rwork(iv2tcs+imax-1-1)*b22e(imax-1) +
889 $ rwork(iv2tsn+imax-1-1)*b22d(imax)
890 b22d(imax) = rwork(iv2tcs+imax-1-1)*b22d(imax) -
891 $ rwork(iv2tsn+imax-1-1)*b22e(imax-1)
898 CALL zlasr(
'R',
'V',
'F', p, imax-imin+1,
899 $ rwork(iu1cs+imin-1), rwork(iu1sn+imin-1),
902 CALL zlasr(
'L',
'V',
'F', imax-imin+1, p,
903 $ rwork(iu1cs+imin-1), rwork(iu1sn+imin-1),
909 CALL zlasr(
'R',
'V',
'F', m-p, imax-imin+1,
910 $ rwork(iu2cs+imin-1), rwork(iu2sn+imin-1),
913 CALL zlasr(
'L',
'V',
'F', imax-imin+1, m-p,
914 $ rwork(iu2cs+imin-1), rwork(iu2sn+imin-1),
920 CALL zlasr(
'L',
'V',
'F', imax-imin+1, q,
921 $ rwork(iv1tcs+imin-1), rwork(iv1tsn+imin-1),
922 $ v1t(imin,1), ldv1t )
924 CALL zlasr(
'R',
'V',
'F', q, imax-imin+1,
925 $ rwork(iv1tcs+imin-1), rwork(iv1tsn+imin-1),
926 $ v1t(1,imin), ldv1t )
931 CALL zlasr(
'L',
'V',
'F', imax-imin+1, m-q,
932 $ rwork(iv2tcs+imin-1), rwork(iv2tsn+imin-1),
933 $ v2t(imin,1), ldv2t )
935 CALL zlasr(
'R',
'V',
'F', m-q, imax-imin+1,
936 $ rwork(iv2tcs+imin-1), rwork(iv2tsn+imin-1),
937 $ v2t(1,imin), ldv2t )
943 IF( b11e(imax-1)+b21e(imax-1) .GT. 0 )
THEN 944 b11d(imax) = -b11d(imax)
945 b21d(imax) = -b21d(imax)
948 CALL zscal( q, negonecomplex, v1t(imax,1), ldv1t )
950 CALL zscal( q, negonecomplex, v1t(1,imax), 1 )
957 x1 = cos(phi(imax-1))*b11d(imax) +
958 $ sin(phi(imax-1))*b12e(imax-1)
959 y1 = cos(phi(imax-1))*b21d(imax) +
960 $ sin(phi(imax-1))*b22e(imax-1)
962 theta(imax) = atan2( abs(y1), abs(x1) )
967 IF( b11d(imax)+b12e(imax-1) .LT. 0 )
THEN 968 b12d(imax) = -b12d(imax)
971 CALL zscal( p, negonecomplex, u1(1,imax), 1 )
973 CALL zscal( p, negonecomplex, u1(imax,1), ldu1 )
977 IF( b21d(imax)+b22e(imax-1) .GT. 0 )
THEN 978 b22d(imax) = -b22d(imax)
981 CALL zscal( m-p, negonecomplex, u2(1,imax), 1 )
983 CALL zscal( m-p, negonecomplex, u2(imax,1), ldu2 )
990 IF( b12d(imax)+b22d(imax) .LT. 0 )
THEN 993 CALL zscal( m-q, negonecomplex, v2t(imax,1), ldv2t )
995 CALL zscal( m-q, negonecomplex, v2t(1,imax), 1 )
1003 IF( theta(i) .LT. thresh )
THEN 1005 ELSE IF( theta(i) .GT. piover2-thresh )
THEN 1010 IF( phi(i) .LT. thresh )
THEN 1012 ELSE IF( phi(i) .GT. piover2-thresh )
THEN 1019 IF (imax .GT. 1)
THEN 1020 DO WHILE( phi(imax-1) .EQ. zero )
1022 IF (imax .LE. 1)
EXIT 1025 IF( imin .GT. imax - 1 )
1027 IF (imin .GT. 1)
THEN 1028 DO WHILE (phi(imin-1) .NE. zero)
1030 IF (imin .LE. 1)
EXIT 1045 IF( theta(j) .LT. thetamin )
THEN 1051 IF( mini .NE. i )
THEN 1052 theta(mini) = theta(i)
1056 $
CALL zswap( p, u1(1,i), 1, u1(1,mini), 1 )
1058 $
CALL zswap( m-p, u2(1,i), 1, u2(1,mini), 1 )
1060 $
CALL zswap( q, v1t(i,1), ldv1t, v1t(mini,1), ldv1t )
1062 $
CALL zswap( m-q, v2t(i,1), ldv2t, v2t(mini,1),
1066 $
CALL zswap( p, u1(i,1), ldu1, u1(mini,1), ldu1 )
1068 $
CALL zswap( m-p, u2(i,1), ldu2, u2(mini,1), ldu2 )
1070 $
CALL zswap( q, v1t(1,i), 1, v1t(1,mini), 1 )
1072 $
CALL zswap( m-q, v2t(1,i), 1, v2t(1,mini), 1 )
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine zbbcsd(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, RWORK, LRWORK, INFO)
ZBBCSD
subroutine zlasr(SIDE, PIVOT, DIRECT, M, N, C, S, A, LDA)
ZLASR 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 dlartgp(F, G, CS, SN, R)
DLARTGP generates a plane rotation so that the diagonal is nonnegative.
subroutine dlas2(F, G, H, SSMIN, SSMAX)
DLAS2 computes singular values of a 2-by-2 triangular matrix.
subroutine zswap(N, ZX, INCX, ZY, INCY)
ZSWAP
subroutine zscal(N, ZA, ZX, INCX)
ZSCAL