412 SUBROUTINE zgesvdq( JOBA, JOBP, JOBR, JOBU, JOBV, M, N, A, LDA,
413 $ S, U, LDU, V, LDV, NUMRANK, IWORK, LIWORK,
414 $ CWORK, LCWORK, RWORK, LRWORK, INFO )
417 CHARACTER JOBA, JOBP, JOBR, JOBU, JOBV
418 INTEGER M, N, LDA, LDU, LDV, NUMRANK, LIWORK, LCWORK, LRWORK,
422 COMPLEX*16 A( LDA, * ), U( LDU, * ), V( LDV, * ), CWORK( * )
423 DOUBLE PRECISION S( * ), RWORK( * )
429 DOUBLE PRECISION ZERO, ONE
430 PARAMETER ( ZERO = 0.0d0, one = 1.0d0 )
431 COMPLEX*16 CZERO, CONE
432 parameter( czero = (0.0d0,0.0d0), cone = (1.0d0,0.0d0) )
435 INTEGER IERR, NR, N1, OPTRATIO, p, q
436 INTEGER LWCON, LWQP3, LWRK_ZGELQF, LWRK_ZGESVD, LWRK_ZGESVD2,
437 $ lwrk_zgeqp3, lwrk_zgeqrf, lwrk_zunmlq, lwrk_zunmqr,
438 $ lwrk_zunmqr2, lwlqf, lwqrf, lwsvd, lwsvd2, lwunq,
439 $ lwunq2, lwunlq, minwrk, minwrk2, optwrk, optwrk2,
441 LOGICAL ACCLA, ACCLM, ACCLH, ASCALED, CONDA, DNTWU, DNTWV,
442 $ LQUERY, LSVC0, LSVEC, ROWPRM, RSVEC, RTRANS, WNTUA,
443 $ wntuf, wntur, wntus, wntva, wntvr
444 DOUBLE PRECISION BIG, EPSLN, RTMP, SCONDA, SFMIN
449 DOUBLE PRECISION RDUMMY(1)
459 DOUBLE PRECISION ZLANGE, DZNRM2, DLAMCH
460 EXTERNAL lsame, zlange, idamax, dznrm2, dlamch
463 INTRINSIC abs, conjg, max, min, dble, sqrt
469 wntus = lsame( jobu,
'S' ) .OR. lsame( jobu,
'U' )
470 wntur = lsame( jobu,
'R' )
471 wntua = lsame( jobu,
'A' )
472 wntuf = lsame( jobu,
'F' )
473 lsvc0 = wntus .OR. wntur .OR. wntua
474 lsvec = lsvc0 .OR. wntuf
475 dntwu = lsame( jobu,
'N' )
477 wntvr = lsame( jobv,
'R' )
478 wntva = lsame( jobv,
'A' ) .OR. lsame( jobv,
'V' )
479 rsvec = wntvr .OR. wntva
480 dntwv = lsame( jobv,
'N' )
482 accla = lsame( joba,
'A' )
483 acclm = lsame( joba,
'M' )
484 conda = lsame( joba,
'E' )
485 acclh = lsame( joba,
'H' ) .OR. conda
487 rowprm = lsame( jobp,
'P' )
488 rtrans = lsame( jobr,
'T' )
491 iminwrk = max( 1, n + m - 1 )
492 rminwrk = max( 2, m, 5*n )
494 iminwrk = max( 1, n )
495 rminwrk = max( 2, 5*n )
497 lquery = (liwork .EQ. -1 .OR. lcwork .EQ. -1 .OR. lrwork .EQ. -1)
499 IF ( .NOT. ( accla .OR. acclm .OR. acclh ) )
THEN
501 ELSE IF ( .NOT.( rowprm .OR. lsame( jobp,
'N' ) ) )
THEN
503 ELSE IF ( .NOT.( rtrans .OR. lsame( jobr,
'N' ) ) )
THEN
505 ELSE IF ( .NOT.( lsvec .OR. dntwu ) )
THEN
507 ELSE IF ( wntur .AND. wntva )
THEN
509 ELSE IF ( .NOT.( rsvec .OR. dntwv ))
THEN
511 ELSE IF ( m.LT.0 )
THEN
513 ELSE IF ( ( n.LT.0 ) .OR. ( n.GT.m ) )
THEN
515 ELSE IF ( lda.LT.max( 1, m ) )
THEN
517 ELSE IF ( ldu.LT.1 .OR. ( lsvc0 .AND. ldu.LT.m ) .OR.
518 $ ( wntuf .AND. ldu.LT.n ) )
THEN
520 ELSE IF ( ldv.LT.1 .OR. ( rsvec .AND. ldv.LT.n ) .OR.
521 $ ( conda .AND. ldv.LT.n ) )
THEN
523 ELSE IF ( liwork .LT. iminwrk .AND. .NOT. lquery )
THEN
528 IF ( info .EQ. 0 )
THEN
538 IF ( wntus .OR. wntur )
THEN
540 ELSE IF ( wntua )
THEN
546 lwsvd = max( 3 * n, 1 )
548 CALL zgeqp3( m, n, a, lda, iwork, cdummy, cdummy, -1,
550 lwrk_zgeqp3 = int( cdummy(1) )
551 IF ( wntus .OR. wntur )
THEN
552 CALL zunmqr(
'L',
'N', m, n, n, a, lda, cdummy, u,
553 $ ldu, cdummy, -1, ierr )
554 lwrk_zunmqr = int( cdummy(1) )
555 ELSE IF ( wntua )
THEN
556 CALL zunmqr(
'L',
'N', m, m, n, a, lda, cdummy, u,
557 $ ldu, cdummy, -1, ierr )
558 lwrk_zunmqr = int( cdummy(1) )
565 IF ( .NOT. (lsvec .OR. rsvec ) )
THEN
569 minwrk = max( n+lwqp3, lwcon, lwsvd )
571 minwrk = max( n+lwqp3, lwsvd )
574 CALL zgesvd(
'N',
'N', n, n, a, lda, s, u, ldu,
575 $ v, ldv, cdummy, -1, rdummy, ierr )
576 lwrk_zgesvd = int( cdummy(1) )
578 optwrk = max( n+lwrk_zgeqp3, n+lwcon, lwrk_zgesvd )
580 optwrk = max( n+lwrk_zgeqp3, lwrk_zgesvd )
583 ELSE IF ( lsvec .AND. (.NOT.rsvec) )
THEN
587 minwrk = n + max( lwqp3, lwcon, lwsvd, lwunq )
589 minwrk = n + max( lwqp3, lwsvd, lwunq )
593 CALL zgesvd(
'N',
'O', n, n, a, lda, s, u, ldu,
594 $ v, ldv, cdummy, -1, rdummy, ierr )
596 CALL zgesvd(
'O',
'N', n, n, a, lda, s, u, ldu,
597 $ v, ldv, cdummy, -1, rdummy, ierr )
599 lwrk_zgesvd = int( cdummy(1) )
601 optwrk = n + max( lwrk_zgeqp3, lwcon, lwrk_zgesvd,
604 optwrk = n + max( lwrk_zgeqp3, lwrk_zgesvd,
608 ELSE IF ( rsvec .AND. (.NOT.lsvec) )
THEN
612 minwrk = n + max( lwqp3, lwcon, lwsvd )
614 minwrk = n + max( lwqp3, lwsvd )
618 CALL zgesvd(
'O',
'N', n, n, a, lda, s, u, ldu,
619 $ v, ldv, cdummy, -1, rdummy, ierr )
621 CALL zgesvd(
'N',
'O', n, n, a, lda, s, u, ldu,
622 $ v, ldv, cdummy, -1, rdummy, ierr )
624 lwrk_zgesvd = int( cdummy(1) )
626 optwrk = n + max( lwrk_zgeqp3, lwcon, lwrk_zgesvd )
628 optwrk = n + max( lwrk_zgeqp3, lwrk_zgesvd )
635 minwrk = max( lwqp3, lwsvd, lwunq )
636 IF ( conda ) minwrk = max( minwrk, lwcon )
640 lwqrf = max( n/2, 1 )
642 lwsvd2 = max( 3 * (n/2), 1 )
644 minwrk2 = max( lwqp3, n/2+lwqrf, n/2+lwsvd2,
645 $ n/2+lwunq2, lwunq )
646 IF ( conda ) minwrk2 = max( minwrk2, lwcon )
647 minwrk2 = n + minwrk2
648 minwrk = max( minwrk, minwrk2 )
651 minwrk = max( lwqp3, lwsvd, lwunq )
652 IF ( conda ) minwrk = max( minwrk, lwcon )
656 lwlqf = max( n/2, 1 )
657 lwsvd2 = max( 3 * (n/2), 1 )
658 lwunlq = max( n , 1 )
659 minwrk2 = max( lwqp3, n/2+lwlqf, n/2+lwsvd2,
660 $ n/2+lwunlq, lwunq )
661 IF ( conda ) minwrk2 = max( minwrk2, lwcon )
662 minwrk2 = n + minwrk2
663 minwrk = max( minwrk, minwrk2 )
668 CALL zgesvd(
'O',
'A', n, n, a, lda, s, u, ldu,
669 $ v, ldv, cdummy, -1, rdummy, ierr )
670 lwrk_zgesvd = int( cdummy(1) )
671 optwrk = max(lwrk_zgeqp3,lwrk_zgesvd,lwrk_zunmqr)
672 IF ( conda ) optwrk = max( optwrk, lwcon )
675 CALL zgeqrf(n,n/2,u,ldu,cdummy,cdummy,-1,ierr)
676 lwrk_zgeqrf = int( cdummy(1) )
677 CALL zgesvd(
'S',
'O', n/2,n/2, v,ldv, s, u,ldu,
678 $ v, ldv, cdummy, -1, rdummy, ierr )
679 lwrk_zgesvd2 = int( cdummy(1) )
680 CALL zunmqr(
'R',
'C', n, n, n/2, u, ldu, cdummy,
681 $ v, ldv, cdummy, -1, ierr )
682 lwrk_zunmqr2 = int( cdummy(1) )
683 optwrk2 = max( lwrk_zgeqp3, n/2+lwrk_zgeqrf,
684 $ n/2+lwrk_zgesvd2, n/2+lwrk_zunmqr2 )
685 IF ( conda ) optwrk2 = max( optwrk2, lwcon )
686 optwrk2 = n + optwrk2
687 optwrk = max( optwrk, optwrk2 )
690 CALL zgesvd(
'S',
'O', n, n, a, lda, s, u, ldu,
691 $ v, ldv, cdummy, -1, rdummy, ierr )
692 lwrk_zgesvd = int( cdummy(1) )
693 optwrk = max(lwrk_zgeqp3,lwrk_zgesvd,lwrk_zunmqr)
694 IF ( conda ) optwrk = max( optwrk, lwcon )
697 CALL zgelqf(n/2,n,u,ldu,cdummy,cdummy,-1,ierr)
698 lwrk_zgelqf = int( cdummy(1) )
699 CALL zgesvd(
'S',
'O', n/2,n/2, v, ldv, s, u, ldu,
700 $ v, ldv, cdummy, -1, rdummy, ierr )
701 lwrk_zgesvd2 = int( cdummy(1) )
702 CALL zunmlq(
'R',
'N', n, n, n/2, u, ldu, cdummy,
703 $ v, ldv, cdummy,-1,ierr )
704 lwrk_zunmlq = int( cdummy(1) )
705 optwrk2 = max( lwrk_zgeqp3, n/2+lwrk_zgelqf,
706 $ n/2+lwrk_zgesvd2, n/2+lwrk_zunmlq )
707 IF ( conda ) optwrk2 = max( optwrk2, lwcon )
708 optwrk2 = n + optwrk2
709 optwrk = max( optwrk, optwrk2 )
715 minwrk = max( 2, minwrk )
716 optwrk = max( 2, optwrk )
717 IF ( lcwork .LT. minwrk .AND. (.NOT.lquery) ) info = -19
721 IF (info .EQ. 0 .AND. lrwork .LT. rminwrk .AND. .NOT. lquery)
THEN
725 CALL xerbla(
'ZGESVDQ', -info )
727 ELSE IF ( lquery )
THEN
740 IF( ( m.EQ.0 ) .OR. ( n.EQ.0 ) )
THEN
754 rwork(p) = zlange(
'M', 1, n, a(p,1), lda, rdummy )
756 IF ( ( rwork(p) .NE. rwork(p) ) .OR.
757 $ ( (rwork(p)*zero) .NE. zero ) )
THEN
759 CALL xerbla(
'ZGESVDQ', -info )
764 q = idamax( m-p+1, rwork(p), 1 ) + p - 1
773 IF ( rwork(1) .EQ. zero )
THEN
776 CALL dlaset(
'G', n, 1, zero, zero, s, n )
777 IF ( wntus )
CALL zlaset(
'G', m, n, czero, cone, u, ldu)
778 IF ( wntua )
CALL zlaset(
'G', m, m, czero, cone, u, ldu)
779 IF ( wntva )
CALL zlaset(
'G', n, n, czero, cone, v, ldv)
781 CALL zlaset(
'G', n, 1, czero, czero, cwork, n )
782 CALL zlaset(
'G', m, n, czero, cone, u, ldu )
788 DO 5002 p = n + 1, n + m - 1
792 IF ( conda ) rwork(1) = -1
797 IF ( rwork(1) .GT. big / sqrt(dble(m)) )
THEN
800 CALL zlascl(
'G',0,0,sqrt(dble(m)),one, m,n, a,lda, ierr)
803 CALL zlaswp( n, a, lda, 1, m-1, iwork(n+1), 1 )
811 IF ( .NOT.rowprm )
THEN
812 rtmp = zlange(
'M', m, n, a, lda, rwork )
813 IF ( ( rtmp .NE. rtmp ) .OR.
814 $ ( (rtmp*zero) .NE. zero ) )
THEN
816 CALL xerbla(
'ZGESVDQ', -info )
819 IF ( rtmp .GT. big / sqrt(dble(m)) )
THEN
822 CALL zlascl(
'G',0,0, sqrt(dble(m)),one, m,n, a,lda, ierr)
836 CALL zgeqp3( m, n, a, lda, iwork, cwork, cwork(n+1), lcwork-n,
855 rtmp = sqrt(dble(n))*epsln
857 IF ( abs(a(p,p)) .LT. (rtmp*abs(a(1,1))) )
GO TO 3002
862 ELSEIF ( acclm )
THEN
871 IF ( ( abs(a(p,p)) .LT. (epsln*abs(a(p-1,p-1))) ) .OR.
872 $ ( abs(a(p,p)) .LT. sfmin ) )
GO TO 3402
884 IF ( abs(a(p,p)) .EQ. zero )
GO TO 3502
893 CALL zlacpy(
'U', n, n, a, lda, v, ldv )
900 rtmp = dznrm2( p, v(1,p), 1 )
901 CALL zdscal( p, one/rtmp, v(1,p), 1 )
903 IF ( .NOT. ( lsvec .OR. rsvec ) )
THEN
904 CALL zpocon(
'U', nr, v, ldv, one, rtmp,
905 $ cwork, rwork, ierr )
907 CALL zpocon(
'U', nr, v, ldv, one, rtmp,
908 $ cwork(n+1), rwork, ierr )
910 sconda = one / sqrt(rtmp)
920 ELSE IF ( wntus .OR. wntuf)
THEN
922 ELSE IF ( wntua )
THEN
926 IF ( .NOT. ( rsvec .OR. lsvec ) )
THEN
935 DO 1146 p = 1, min( n, nr )
936 a(p,p) = conjg(a(p,p))
938 a(q,p) = conjg(a(p,q))
939 IF ( q .LE. nr ) a(p,q) = czero
943 CALL zgesvd(
'N',
'N', n, nr, a, lda, s, u, ldu,
944 $ v, ldv, cwork, lcwork, rwork, info )
951 $
CALL zlaset(
'L', nr-1,nr-1, czero,czero, a(2,1), lda )
952 CALL zgesvd(
'N',
'N', nr, n, a, lda, s, u, ldu,
953 $ v, ldv, cwork, lcwork, rwork, info )
957 ELSE IF ( lsvec .AND. ( .NOT. rsvec) )
THEN
967 u(q,p) = conjg(a(p,q))
971 $
CALL zlaset(
'U', nr-1,nr-1, czero,czero, u(1,2), ldu )
975 CALL zgesvd(
'N',
'O', n, nr, u, ldu, s, u, ldu,
976 $ u, ldu, cwork(n+1), lcwork-n, rwork, info )
979 u(p,p) = conjg(u(p,p))
980 DO 1120 q = p + 1, nr
982 u(q,p) = conjg(u(p,q))
990 CALL zlacpy(
'U', nr, n, a, lda, u, ldu )
992 $
CALL zlaset(
'L', nr-1, nr-1, czero, czero, u(2,1), ldu )
995 CALL zgesvd(
'O',
'N', nr, n, u, ldu, s, u, ldu,
996 $ v, ldv, cwork(n+1), lcwork-n, rwork, info )
1004 IF ( ( nr .LT. m ) .AND. ( .NOT.wntuf ) )
THEN
1005 CALL zlaset(
'A', m-nr, nr, czero, czero, u(nr+1,1), ldu)
1006 IF ( nr .LT. n1 )
THEN
1007 CALL zlaset(
'A',nr,n1-nr,czero,czero,u(1,nr+1), ldu )
1008 CALL zlaset(
'A',m-nr,n1-nr,czero,cone,
1009 $ u(nr+1,nr+1), ldu )
1017 $
CALL zunmqr(
'L',
'N', m, n1, n, a, lda, cwork, u,
1018 $ ldu, cwork(n+1), lcwork-n, ierr )
1019 IF ( rowprm .AND. .NOT.wntuf )
1020 $
CALL zlaswp( n1, u, ldu, 1, m-1, iwork(n+1), -1 )
1022 ELSE IF ( rsvec .AND. ( .NOT. lsvec ) )
THEN
1031 v(q,p) = conjg(a(p,q))
1035 $
CALL zlaset(
'U', nr-1,nr-1, czero,czero, v(1,2), ldv )
1038 IF ( wntvr .OR. ( nr .EQ. n ) )
THEN
1039 CALL zgesvd(
'O',
'N', n, nr, v, ldv, s, u, ldu,
1040 $ u, ldu, cwork(n+1), lcwork-n, rwork, info )
1043 v(p,p) = conjg(v(p,p))
1044 DO 1122 q = p + 1, nr
1045 ctmp = conjg(v(q,p))
1046 v(q,p) = conjg(v(p,q))
1051 IF ( nr .LT. n )
THEN
1053 DO 1104 q = nr + 1, n
1054 v(p,q) = conjg(v(q,p))
1058 CALL zlapmt( .false., nr, n, v, ldv, iwork )
1065 CALL zlaset(
'G', n, n-nr, czero, czero, v(1,nr+1), ldv)
1066 CALL zgesvd(
'O',
'N', n, n, v, ldv, s, u, ldu,
1067 $ u, ldu, cwork(n+1), lcwork-n, rwork, info )
1070 v(p,p) = conjg(v(p,p))
1071 DO 1124 q = p + 1, n
1072 ctmp = conjg(v(q,p))
1073 v(q,p) = conjg(v(p,q))
1077 CALL zlapmt( .false., n, n, v, ldv, iwork )
1083 CALL zlacpy(
'U', nr, n, a, lda, v, ldv )
1085 $
CALL zlaset(
'L', nr-1, nr-1, czero, czero, v(2,1), ldv )
1088 IF ( wntvr .OR. ( nr .EQ. n ) )
THEN
1089 CALL zgesvd(
'N',
'O', nr, n, v, ldv, s, u, ldu,
1090 $ v, ldv, cwork(n+1), lcwork-n, rwork, info )
1091 CALL zlapmt( .false., nr, n, v, ldv, iwork )
1099 CALL zlaset(
'G', n-nr, n, czero,czero, v(nr+1,1), ldv)
1100 CALL zgesvd(
'N',
'O', n, n, v, ldv, s, u, ldu,
1101 $ v, ldv, cwork(n+1), lcwork-n, rwork, info )
1102 CALL zlapmt( .false., n, n, v, ldv, iwork )
1116 IF ( wntvr .OR. ( nr .EQ. n ) )
THEN
1121 v(q,p) = conjg(a(p,q))
1125 $
CALL zlaset(
'U', nr-1,nr-1, czero,czero, v(1,2), ldv )
1130 CALL zgesvd(
'O',
'A', n, nr, v, ldv, s, v, ldv,
1131 $ u, ldu, cwork(n+1), lcwork-n, rwork, info )
1134 v(p,p) = conjg(v(p,p))
1135 DO 1116 q = p + 1, nr
1136 ctmp = conjg(v(q,p))
1137 v(q,p) = conjg(v(p,q))
1141 IF ( nr .LT. n )
THEN
1144 v(p,q) = conjg(v(q,p))
1148 CALL zlapmt( .false., nr, n, v, ldv, iwork )
1151 u(p,p) = conjg(u(p,p))
1152 DO 1118 q = p + 1, nr
1153 ctmp = conjg(u(q,p))
1154 u(q,p) = conjg(u(p,q))
1159 IF ( ( nr .LT. m ) .AND. .NOT.(wntuf))
THEN
1160 CALL zlaset(
'A', m-nr,nr, czero,czero, u(nr+1,1), ldu)
1161 IF ( nr .LT. n1 )
THEN
1162 CALL zlaset(
'A',nr,n1-nr,czero,czero,u(1,nr+1),ldu)
1163 CALL zlaset(
'A',m-nr,n1-nr,czero,cone,
1164 $ u(nr+1,nr+1), ldu )
1178 IF ( optratio*nr .GT. n )
THEN
1181 v(q,p) = conjg(a(p,q))
1185 $
CALL zlaset(
'U',nr-1,nr-1, czero,czero, v(1,2),ldv)
1187 CALL zlaset(
'A',n,n-nr,czero,czero,v(1,nr+1),ldv)
1188 CALL zgesvd(
'O',
'A', n, n, v, ldv, s, v, ldv,
1189 $ u, ldu, cwork(n+1), lcwork-n, rwork, info )
1192 v(p,p) = conjg(v(p,p))
1193 DO 1114 q = p + 1, n
1194 ctmp = conjg(v(q,p))
1195 v(q,p) = conjg(v(p,q))
1199 CALL zlapmt( .false., n, n, v, ldv, iwork )
1204 u(p,p) = conjg(u(p,p))
1205 DO 1112 q = p + 1, n
1206 ctmp = conjg(u(q,p))
1207 u(q,p) = conjg(u(p,q))
1212 IF ( ( n .LT. m ) .AND. .NOT.(wntuf))
THEN
1213 CALL zlaset(
'A',m-n,n,czero,czero,u(n+1,1),ldu)
1214 IF ( n .LT. n1 )
THEN
1215 CALL zlaset(
'A',n,n1-n,czero,czero,u(1,n+1),ldu)
1216 CALL zlaset(
'A',m-n,n1-n,czero,cone,
1225 u(q,nr+p) = conjg(a(p,q))
1229 $
CALL zlaset(
'U',nr-1,nr-1,czero,czero,u(1,nr+2),ldu)
1230 CALL zgeqrf( n, nr, u(1,nr+1), ldu, cwork(n+1),
1231 $ cwork(n+nr+1), lcwork-n-nr, ierr )
1234 v(q,p) = conjg(u(p,nr+q))
1237 CALL zlaset(
'U',nr-1,nr-1,czero,czero,v(1,2),ldv)
1238 CALL zgesvd(
'S',
'O', nr, nr, v, ldv, s, u, ldu,
1239 $ v,ldv, cwork(n+nr+1),lcwork-n-nr,rwork, info )
1240 CALL zlaset(
'A',n-nr,nr,czero,czero,v(nr+1,1),ldv)
1241 CALL zlaset(
'A',nr,n-nr,czero,czero,v(1,nr+1),ldv)
1242 CALL zlaset(
'A',n-nr,n-nr,czero,cone,v(nr+1,nr+1),ldv)
1243 CALL zunmqr(
'R',
'C', n, n, nr, u(1,nr+1), ldu,
1244 $ cwork(n+1),v,ldv,cwork(n+nr+1),lcwork-n-nr,ierr)
1245 CALL zlapmt( .false., n, n, v, ldv, iwork )
1248 IF ( ( nr .LT. m ) .AND. .NOT.(wntuf))
THEN
1249 CALL zlaset(
'A',m-nr,nr,czero,czero,u(nr+1,1),ldu)
1250 IF ( nr .LT. n1 )
THEN
1251 CALL zlaset(
'A',nr,n1-nr,czero,czero,u(1,nr+1),ldu)
1252 CALL zlaset(
'A',m-nr,n1-nr,czero,cone,
1263 IF ( wntvr .OR. ( nr .EQ. n ) )
THEN
1265 CALL zlacpy(
'U', nr, n, a, lda, v, ldv )
1267 $
CALL zlaset(
'L', nr-1,nr-1, czero,czero, v(2,1), ldv )
1270 CALL zgesvd(
'S',
'O', nr, n, v, ldv, s, u, ldu,
1271 $ v, ldv, cwork(n+1), lcwork-n, rwork, info )
1272 CALL zlapmt( .false., nr, n, v, ldv, iwork )
1276 IF ( ( nr .LT. m ) .AND. .NOT.(wntuf))
THEN
1277 CALL zlaset(
'A', m-nr,nr, czero,czero, u(nr+1,1), ldu)
1278 IF ( nr .LT. n1 )
THEN
1279 CALL zlaset(
'A',nr,n1-nr,czero,czero,u(1,nr+1),ldu)
1280 CALL zlaset(
'A',m-nr,n1-nr,czero,cone,
1281 $ u(nr+1,nr+1), ldu )
1295 IF ( optratio * nr .GT. n )
THEN
1296 CALL zlacpy(
'U', nr, n, a, lda, v, ldv )
1298 $
CALL zlaset(
'L', nr-1,nr-1, czero,czero, v(2,1),ldv)
1301 CALL zlaset(
'A', n-nr,n, czero,czero, v(nr+1,1),ldv)
1302 CALL zgesvd(
'S',
'O', n, n, v, ldv, s, u, ldu,
1303 $ v, ldv, cwork(n+1), lcwork-n, rwork, info )
1304 CALL zlapmt( .false., n, n, v, ldv, iwork )
1310 IF ( ( n .LT. m ) .AND. .NOT.(wntuf))
THEN
1311 CALL zlaset(
'A',m-n,n,czero,czero,u(n+1,1),ldu)
1312 IF ( n .LT. n1 )
THEN
1313 CALL zlaset(
'A',n,n1-n,czero,czero,u(1,n+1),ldu)
1314 CALL zlaset(
'A',m-n,n1-n,czero,cone,
1319 CALL zlacpy(
'U', nr, n, a, lda, u(nr+1,1), ldu )
1321 $
CALL zlaset(
'L',nr-1,nr-1,czero,czero,u(nr+2,1),ldu)
1322 CALL zgelqf( nr, n, u(nr+1,1), ldu, cwork(n+1),
1323 $ cwork(n+nr+1), lcwork-n-nr, ierr )
1324 CALL zlacpy(
'L',nr,nr,u(nr+1,1),ldu,v,ldv)
1326 $
CALL zlaset(
'U',nr-1,nr-1,czero,czero,v(1,2),ldv)
1327 CALL zgesvd(
'S',
'O', nr, nr, v, ldv, s, u, ldu,
1328 $ v, ldv, cwork(n+nr+1), lcwork-n-nr, rwork, info )
1329 CALL zlaset(
'A',n-nr,nr,czero,czero,v(nr+1,1),ldv)
1330 CALL zlaset(
'A',nr,n-nr,czero,czero,v(1,nr+1),ldv)
1331 CALL zlaset(
'A',n-nr,n-nr,czero,cone,v(nr+1,nr+1),ldv)
1332 CALL zunmlq(
'R',
'N',n,n,nr,u(nr+1,1),ldu,cwork(n+1),
1333 $ v, ldv, cwork(n+nr+1),lcwork-n-nr,ierr)
1334 CALL zlapmt( .false., n, n, v, ldv, iwork )
1337 IF ( ( nr .LT. m ) .AND. .NOT.(wntuf))
THEN
1338 CALL zlaset(
'A',m-nr,nr,czero,czero,u(nr+1,1),ldu)
1339 IF ( nr .LT. n1 )
THEN
1340 CALL zlaset(
'A',nr,n1-nr,czero,czero,u(1,nr+1),ldu)
1341 CALL zlaset(
'A',m-nr,n1-nr,czero,cone,
1342 $ u(nr+1,nr+1), ldu )
1354 $
CALL zunmqr(
'L',
'N', m, n1, n, a, lda, cwork, u,
1355 $ ldu, cwork(n+1), lcwork-n, ierr )
1356 IF ( rowprm .AND. .NOT.wntuf )
1357 $
CALL zlaswp( n1, u, ldu, 1, m-1, iwork(n+1), -1 )
1365 DO 4001 q = p, 1, -1
1366 IF ( s(q) .GT. zero )
GO TO 4002
1373 IF ( nr .LT. n )
CALL dlaset(
'G', n-nr,1, zero,zero, s(nr+1), n )
1377 $
CALL dlascl(
'G',0,0, one,sqrt(dble(m)), nr,1, s, n, ierr )
1378 IF ( conda ) rwork(1) = sconda