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( , * ), U2( LDU2, * ), V1T( LDV1T, * ),
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, , B22BULGE, DUMMY,
370 $ EPS, MU, NU, R, SIGMA11, SIGMA21,
371 $ TEMP, THETAMAX, THETAMIN, THRESH, , 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
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 )
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) )
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
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,
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)
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
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 )
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) -
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.GT.
IF( B11E(IMAX-1)+B21E(IMAX-1) 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.LT.
IF( B11D(IMAX)+B12E(IMAX-1) 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.GT.
IF( B21D(IMAX)+B22E(IMAX-1) 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.LT.
IF( B12D(IMAX)+B22D(IMAX) 0 ) THEN
993 CALL ZSCAL( M-Q, NEGONECOMPLEX, V2T(IMAX,1), LDV2T )
995 CALL ZSCAL( M-Q, NEGONECOMPLEX, V2T(1,IMAX), 1 )
1003.LT.
IF( THETA(I) THRESH ) THEN
1005.GT.
ELSE IF( THETA(I) PIOVER2-THRESH ) THEN
1010.LT.
IF( PHI(I) THRESH ) THEN
1012.GT.
ELSE IF( PHI(I) PIOVER2-THRESH ) THEN
1019.GT.
IF (IMAX 1) THEN
1020.EQ.
DO WHILE( PHI(IMAX-1) ZERO )
1022.LE.
IF (IMAX 1) EXIT
1025.GT.
IF( IMIN IMAX - 1 )
1027.GT.
IF (IMIN 1) THEN
1028.NE.
DO WHILE (PHI(IMIN-1) ZERO)
1030.LE.
IF (IMIN 1) EXIT
1045.LT.
IF( THETA(J) THETAMIN ) THEN
1051.NE.
IF( MINI 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 )