410 SUBROUTINE cgesvdq( JOBA, JOBP, JOBR, JOBU, JOBV, M, N, A, LDA,
411 $ S, U, LDU, V, LDV, NUMRANK, IWORK, LIWORK,
412 $ CWORK, LCWORK, RWORK, LRWORK, INFO )
415 CHARACTER JOBA, JOBP, JOBR, JOBU, JOBV
416 INTEGER M, N, LDA, LDU, LDV, , LIWORK, LCWORK, LRWORK,
420 COMPLEX A( LDA, * ), U( LDU, * ), V( LDV, * ), ( * )
421 REAL S( * ), RWORK( * )
428 PARAMETER ( ZERO = 0.0e0, one = 1.0e0 )
430 parameter( czero = ( 0.0e0, 0.0e0 ), cone = ( 1.0e0, 0.0e0 ) )
433 INTEGER IERR, NR, N1, OPTRATIO, p, q
434 INTEGER LWCON, LWQP3, LWRK_CGELQF, LWRK_CGESVD
436 $ lwrk_cunmqr2, lwlqf, lwqrf, lwsvd, lwsvd2, lwunq,
437 $ lwunq2, lwunlq, minwrk, minwrk2, optwrk, optwrk2,
439 LOGICAL ACCLA, ACCLM, ACCLH, ASCALED, CONDA, DNTWU, DNTWV,
440 $ LQUERY, LSVC0, LSVEC, ROWPRM, RSVEC, RTRANS, WNTUA,
441 $ wntuf, wntur, wntus, wntva, wntvr
442 REAL BIG, EPSLN, RTMP, SCONDA, SFMIN
457 REAL CLANGE, SCNRM2, SLAMCH
458 EXTERNAL clange, lsame, isamax, scnrm2, slamch
461 INTRINSIC abs, conjg,
max,
min, real, sqrt
467 wntus = lsame( jobu,
'S' ) .OR. lsame( jobu,
'U' )
468 wntur = lsame( jobu,
'R' )
469 wntua = lsame( jobu,
'A' )
470 wntuf = lsame( jobu,
'F' )
471 lsvc0 = wntus .OR. wntur .OR. wntua
472 lsvec = lsvc0 .OR. wntuf
473 dntwu = lsame( jobu,
'N' )
475 wntvr = lsame( jobv,
'R' )
476 wntva = lsame( jobv,
'A' ) .OR. lsame( jobv,
'V' )
477 rsvec = wntvr .OR. wntva
478 dntwv = lsame( jobv,
'N' )
480 accla = lsame( joba,
'A' )
481 acclm = lsame( joba,
'M' )
482 conda = lsame( joba,
'E' )
483 acclh = lsame( joba,
'H' ) .OR. conda
485 rowprm = lsame( jobp,
'P' )
486 rtrans = lsame( jobr,
'T' )
489 iminwrk =
max( 1, n + m - 1 )
490 rminwrk =
max( 2, m, 5*n )
492 iminwrk =
max( 1, n )
493 rminwrk =
max( 2, 5*n )
495 lquery = (liwork .EQ. -1 .OR. lcwork .EQ. -1 .OR. lrwork .EQ. -1)
497 IF ( .NOT. ( accla .OR. acclm .OR. acclh ) )
THEN
499 ELSE IF ( .NOT.( rowprm .OR. lsame( jobp,
'N' ) ) )
THEN
501 ELSE IF ( .NOT.( rtrans .OR. lsame( jobr,
'N' ) ) )
THEN
503 ELSE IF ( .NOT.( lsvec .OR. dntwu ) )
THEN
505 ELSE IF ( wntur .AND. wntva )
THEN
507 ELSE IF ( .NOT.( rsvec .OR. dntwv ))
THEN
509 ELSE IF ( m.LT.0 )
THEN
511 ELSE IF ( ( n.LT.0 ) .OR. ( n.GT.m ) )
THEN
513 ELSE IF ( lda.LT.
max( 1, m ) )
THEN
515 ELSE IF ( ldu.LT.1 .OR. ( lsvc0 .AND. ldu.LT.m ) .OR.
516 $ ( wntuf .AND. ldu.LT.n ) )
THEN
518 ELSE IF ( ldv.LT.1 .OR. ( rsvec .AND. ldv.LT.n ) .OR.
519 $ ( conda .AND. ldv.LT.n ) )
THEN
521 ELSE IF ( liwork .LT. iminwrk .AND. .NOT. lquery )
THEN
526 IF ( info .EQ. 0 )
THEN
538 IF ( wntus .OR. wntur )
THEN
540 ELSE IF ( wntua )
THEN
546 lwsvd =
max( 3 * n, 1 )
548 CALL cgeqp3( m, n, a, lda, iwork, cdummy, cdummy, -1,
550 lwrk_cgeqp3 = int( cdummy(1) )
551 IF ( wntus .OR. wntur )
THEN
552 CALL cunmqr(
'L',
'N', m, n, n, a, lda, cdummy, u,
553 $ ldu, cdummy, -1, ierr )
554 lwrk_cunmqr = int( cdummy(1) )
555 ELSE IF ( wntua )
THEN
556 CALL cunmqr(
'L',
'N', m, m, n, a, lda, cdummy, u,
557 $ ldu, cdummy, -1, ierr )
558 lwrk_cunmqr = 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 cgesvd(
'N',
'N', n, n, a, lda, s, u, ldu,
575 $ v, ldv, cdummy, -1, rdummy, ierr )
576 lwrk_cgesvd = int( cdummy(1) )
578 optwrk =
max( n+lwrk_cgeqp3, n+lwcon, lwrk_cgesvd )
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 cgesvd(
'N',
'O', n, n, a, lda, s, u, ldu,
594 $ v, ldv, cdummy, -1, rdummy, ierr )
596 CALL cgesvd(
'O',
'N', n, n, a, lda, s, u, ldu,
599 lwrk_cgesvd = int( cdummy(1) )
601 optwrk = n +
max( lwrk_cgeqp3, lwcon, lwrk_cgesvd,
604 optwrk = n +
max( lwrk_cgeqp3, lwrk_cgesvd,
608 ELSE IF ( rsvec .AND. (.NOT.lsvec) )
THEN
612 minwrk = n +
max( lwqp3, lwcon, lwsvd )
614 minwrk = n +
max( lwqp3, lwsvd )
618 CALL cgesvd(
'O',
'N', n, n, a, lda, s, u, ldu,
619 $ v, ldv, cdummy, -1, rdummy, ierr )
621 CALL cgesvd( 'n
', 'o
', N, N, A, LDA, S, U, LDU,
622 $ V, LDV, CDUMMY, -1, RDUMMY, IERR )
624 LWRK_CGESVD = INT( CDUMMY(1) )
626 OPTWRK = N + MAX( LWRK_CGEQP3, LWCON, LWRK_CGESVD )
628 OPTWRK = N + MAX( LWRK_CGEQP3, LWRK_CGESVD )
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 CGESVD( 'o
', 'a
', N, N, A, LDA, S, U, LDU,
669 $ V, LDV, CDUMMY, -1, RDUMMY, IERR )
670 LWRK_CGESVD = INT( CDUMMY(1) )
671 OPTWRK = MAX(LWRK_CGEQP3,LWRK_CGESVD,LWRK_CUNMQR)
672 IF ( CONDA ) OPTWRK = MAX( OPTWRK, LWCON )
675 CALL CGEQRF(N,N/2,U,LDU,CDUMMY,CDUMMY,-1,IERR)
676 LWRK_CGEQRF = INT( CDUMMY(1) )
677 CALL CGESVD( 's
', 'o
', N/2,N/2, V,LDV, S, U,LDU,
678 $ V, LDV, CDUMMY, -1, RDUMMY, IERR )
679 LWRK_CGESVD2 = INT( CDUMMY(1) )
680 CALL CUNMQR( 'r
', 'c
', N, N, N/2, U, LDU, CDUMMY,
681 $ V, LDV, CDUMMY, -1, IERR )
682 LWRK_CUNMQR2 = INT( CDUMMY(1) )
683 OPTWRK2 = MAX( LWRK_CGEQP3, N/2+LWRK_CGEQRF,
684 $ N/2+LWRK_CGESVD2, N/2+LWRK_CUNMQR2 )
685 IF ( CONDA ) OPTWRK2 = MAX( OPTWRK2, LWCON )
686 OPTWRK2 = N + OPTWRK2
687 OPTWRK = MAX( OPTWRK, OPTWRK2 )
690 CALL CGESVD( 's
', 'o
', N, N, A, LDA, S, U, LDU,
691 $ V, LDV, CDUMMY, -1, RDUMMY, IERR )
692 LWRK_CGESVD = INT( CDUMMY(1) )
693 OPTWRK = MAX(LWRK_CGEQP3,LWRK_CGESVD,LWRK_CUNMQR)
694 IF ( CONDA ) OPTWRK = MAX( OPTWRK, LWCON )
697 CALL CGELQF(N/2,N,U,LDU,CDUMMY,CDUMMY,-1,IERR)
698 LWRK_CGELQF = INT( CDUMMY(1) )
699 CALL CGESVD( 's
','o
', N/2,N/2, V, LDV, S, U, LDU,
700 $ V, LDV, CDUMMY, -1, RDUMMY, IERR )
701 LWRK_CGESVD2 = INT( CDUMMY(1) )
702 CALL CUNMLQ( 'r
', 'n
', N, N, N/2, U, LDU, CDUMMY,
703 $ V, LDV, CDUMMY,-1,IERR )
704 LWRK_CUNMLQ = INT( CDUMMY(1) )
705 OPTWRK2 = MAX( LWRK_CGEQP3, N/2+LWRK_CGELQF,
706 $ N/2+LWRK_CGESVD2, N/2+LWRK_CUNMLQ )
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.LT..AND..NOT.
IF ( LCWORK MINWRK (LQUERY) ) INFO = -19
721.EQ..AND..LT..AND..NOT.
IF (INFO 0 LRWORK RMINWRK LQUERY) THEN
725 CALL XERBLA( 'cgesvdq', -INFO )
727 ELSE IF ( LQUERY ) THEN
740.EQ..OR..EQ.
IF( ( M0 ) ( N0 ) ) THEN
754 RWORK(p) = CLANGE( 'm
', 1, N, A(p,1), LDA, RDUMMY )
756.NE..OR.
IF ( ( RWORK(p) RWORK(p) )
757.NE.
$ ( (RWORK(p)*ZERO) ZERO ) ) THEN
759 CALL XERBLA( 'cgesvdq', -INFO )
764 q = ISAMAX( M-p+1, RWORK(p), 1 ) + p - 1
773.EQ.
IF ( RWORK(1) ZERO ) THEN
776 CALL SLASET( 'g
', N, 1, ZERO, ZERO, S, N )
777 IF ( WNTUS ) CALL CLASET('g
', M, N, CZERO, CONE, U, LDU)
778 IF ( WNTUA ) CALL CLASET('g
', M, M, CZERO, CONE, U, LDU)
779 IF ( WNTVA ) CALL CLASET('g
', N, N, CZERO, CONE, V, LDV)
781 CALL CLASET( 'g
', N, 1, CZERO, CZERO, CWORK, N )
782 CALL CLASET( 'g
', M, N, CZERO, CONE, U, LDU )
788 DO 5002 p = N + 1, N + M - 1
792 IF ( CONDA ) RWORK(1) = -1
797.GT.
IF ( RWORK(1) BIG / SQRT(REAL(M)) ) THEN
800 CALL CLASCL('g
',0,0,SQRT(REAL(M)),ONE, M,N, A,LDA, IERR)
803 CALL CLASWP( N, A, LDA, 1, M-1, IWORK(N+1), 1 )
811.NOT.
IF ( ROWPRM ) THEN
812 RTMP = CLANGE( 'm
', M, N, A, LDA, RWORK )
813.NE..OR.
IF ( ( RTMP RTMP )
814.NE.
$ ( (RTMP*ZERO) ZERO ) ) THEN
816 CALL XERBLA( 'cgesvdq', -INFO )
819.GT.
IF ( RTMP BIG / SQRT(REAL(M)) ) THEN
822 CALL CLASCL('g
',0,0, SQRT(REAL(M)),ONE, M,N, A,LDA, IERR)
836 CALL CGEQP3( M, N, A, LDA, IWORK, CWORK, CWORK(N+1), LCWORK-N,
855 RTMP = SQRT(REAL(N))*EPSLN
857.LT.
IF ( ABS(A(p,p)) (RTMP*ABS(A(1,1))) ) GO TO 3002
862 ELSEIF ( ACCLM ) THEN
871.LT..OR.
IF ( ( ABS(A(p,p)) (EPSLN*ABS(A(p-1,p-1))) )
872.LT.
$ ( ABS(A(p,p)) SFMIN ) ) GO TO 3402
884.EQ.
IF ( ABS(A(p,p)) ZERO ) GO TO 3502
893 CALL CLACPY( 'u
', N, N, A, LDA, V, LDV )
900 RTMP = SCNRM2( p, V(1,p), 1 )
901 CALL CSSCAL( p, ONE/RTMP, V(1,p), 1 )
903.NOT..OR.
IF ( ( LSVEC RSVEC ) ) THEN
904 CALL CPOCON( 'u
', NR, V, LDV, ONE, RTMP,
905 $ CWORK, RWORK, IERR )
907 CALL CPOCON( 'u
', NR, V, LDV, ONE, RTMP,
908 $ CWORK(N+1), RWORK, IERR )
910 SCONDA = ONE / SQRT(RTMP)
920.OR.
ELSE IF ( WNTUS WNTUF) THEN
922 ELSE IF ( WNTUA ) THEN
926.NOT..OR.
IF ( ( RSVEC 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.LE.
IF ( q NR ) A(p,q) = CZERO
943 CALL CGESVD( 'n
', 'n
', N, NR, A, LDA, S, U, LDU,
944 $ V, LDV, CWORK, LCWORK, RWORK, INFO )
951 $ CALL CLASET( 'l
', NR-1,NR-1, CZERO,CZERO, A(2,1), LDA )
952 CALL CGESVD( 'n
', 'n
', NR, N, A, LDA, S, U, LDU,
953 $ V, LDV, CWORK, LCWORK, RWORK, INFO )
957.AND..NOT.
ELSE IF ( LSVEC ( RSVEC) ) THEN
967 U(q,p) = CONJG(A(p,q))
971 $ CALL CLASET( 'u
', NR-1,NR-1, CZERO,CZERO, U(1,2), LDU )
975 CALL CGESVD( '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 CLACPY( 'u
', NR, N, A, LDA, U, LDU )
992 $ CALL CLASET( 'l
', NR-1, NR-1, CZERO, CZERO, U(2,1), LDU )
995 CALL CGESVD( 'o
', 'n
', NR, N, U, LDU, S, U, LDU,
996 $ V, LDV, CWORK(N+1), LCWORK-N, RWORK, INFO )
1004.LT..AND..NOT.
IF ( ( NR M ) ( WNTUF ) ) THEN
1005 CALL CLASET('a
', M-NR, NR, CZERO, CZERO, U(NR+1,1), LDU)
1006.LT.
IF ( NR N1 ) THEN
1007 CALL CLASET( 'a
',NR,N1-NR,CZERO,CZERO,U(1,NR+1), LDU )
1008 CALL CLASET( 'a',m-nr,n1-nr,czero,cone,
1009 $ u(nr+1,nr+1), ldu )
1017 $
CALL cunmqr(
'L',
'N', m, n1, n, a, lda, cwork, u,
1018 $ ldu, cwork(n+1), lcwork
1019 IF ( rowprm .AND. .NOT.wntuf )
1020 $
CALL claswp( 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 claset(
'U', nr-1,nr-1, czero,czero, v(1,2), ldv )
1038 IF ( wntvr .OR. ( nr .EQ. n ) )
THEN
1039 CALL cgesvd(
'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 clapmt( .false., nr, n, v, ldv, iwork )
1065 CALL claset(
'G', n, n-nr, czero, czero, v(1,nr+1), ldv)
1066 CALL cgesvd(
'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 clapmt( .false., n, n, v, ldv, iwork )
1083 CALL clacpy(
'U', nr, n, a, lda, v, ldv )
1085 $
CALL claset(
'L', nr-1, nr-1, czero, czero, v(2,1), ldv )
1088 IF ( wntvr .OR. ( nr .EQ. n ) )
THEN
1089 CALL cgesvd(
'N',
'O', nr, n, v, ldv, s, u, ldu,
1090 $ v, ldv, cwork(n+1), lcwork-n, rwork, info )
1091 CALL clapmt( .false., nr, n, v, ldv, iwork )
1099 CALL claset(
'G', n-nr, n, czero,czero, v(nr+1,1), ldv)
1100 CALL cgesvd(
'N',
'O', n, n, v, ldv, s, u, ldu,
1101 $ v, ldv, cwork(n+1), lcwork-n, rwork, info )
1102 CALL clapmt( .false., n, n, v, ldv, iwork )
1116 IF ( wntvr .OR. ( nr .EQ. n ) )
THEN
1121 v(q,p) = conjg(a(p,q))
1125 $
CALL claset(
'U', nr-1,nr-1, czero,czero, v(1,2), ldv )
1130 CALL cgesvd(
'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 clapmt( .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 claset(
'A', m-nr,nr, czero,czero, u(nr+1,1), ldu)
1161 IF ( nr .LT. n1 )
THEN
1162 CALL claset(
'A',nr,n1-nr,czero,czero,u(1,nr+1),ldu)
1163 CALL claset(
'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 claset(
'U',nr-1,nr-1, czero,czero, v(1,2),ldv)
1187 CALL claset(
'A',n,n-nr,czero,czero,v(1,nr+1),ldv)
1188 CALL cgesvd(
'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 clapmt( .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 claset(
'A',m-n,n,czero,czero,u(n+1,1),ldu)
1214 IF ( n .LT. n1 )
THEN
1215 CALL claset(
'A',n,n1-n,czero,czero,u(1,n+1),ldu)
1216 CALL claset(
'A',m-n,n1-n,czero,cone,
1225 u(q,nr+p) = conjg(a(p,q))
1229 $
CALL claset(
'U',nr-1,nr-1,czero,czero,u(1,nr+2),ldu)
1230 CALL cgeqrf( 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 claset(
'U',nr-1,nr-1,czero,czero,v(1,2),ldv)
1239 $ v,ldv, cwork(n+nr+1),lcwork-n-nr,rwork, info )
1240 CALL claset(
'A',n-nr,nr,czero,czero,v(nr+1,1),ldv)
1241 CALL claset(
'A',nr,n-nr,czero,czero,v(1,nr+1),ldv)
1242 CALL claset(
'A',n-nr,n-nr,czero,cone,v(nr+1,nr+1),ldv)
1243 CALL cunmqr(
'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 clapmt( .false., n, n, v, ldv, iwork )
1248 IF ( ( nr .LT. m ) .AND. .NOT.(wntuf))
THEN
1249 CALL claset(
'A',m-nr,nr,czero,czero,u(nr+1,1),ldu)
1250 IF ( nr .LT. n1 )
THEN
1251 CALL claset(
'A',nr,n1-nr,czero,czero,u(1,nr+1),ldu)
1252 CALL claset(
'A',m-nr,n1-nr,czero,cone,
1263 IF ( wntvr .OR. ( nr .EQ. n ) )
THEN
1265 CALL clacpy(
'U', nr, n, a, lda, v, ldv )
1267 $
CALL claset(
'L', nr-1,nr-1, czero,czero, v(2,1), ldv )
1270 CALL cgesvd(
'S',
'O', nr, n, v, ldv, s, u, ldu
1271 $ v, ldv, cwork(n+1), lcwork-n, rwork, info )
1272 CALL clapmt( .false., nr, n, v, ldv, iwork )
1276 IF ( ( nr .LT. m ) .AND. .NOT.(wntuf))
THEN
1277 CALL claset(
'A', m-nr,nr, czero,czero, u(nr+1,1), ldu)
1278 IF ( nr .LT. n1 )
THEN
1279 CALL claset(
'A',nr,n1-nr,czero,czero,u(1,nr+1),ldu)
1280 CALL claset(
'A',m-nr,n1-nr,czero,cone,
1281 $ u(nr+1,nr+1), ldu )
1295 IF ( optratio * nr .GT. n )
THEN
1296 CALL clacpy(
'U', nr, n, a, lda, v, ldv )
1298 $
CALL claset(
'L', nr-1,nr-1, czero,czero, v(2,1),ldv)
1301 CALL claset(
'A', n-nr,n, czero,czero, v(nr+1,1),ldv)
1302 CALL cgesvd(
'S',
'O', n, n, v, ldv, s, u, ldu,
1303 $ v, ldv, cwork(n+1), lcwork-n, rwork, info )
1304 CALL clapmt( .false., n, n, v, ldv, iwork )
1310 IF ( ( n .LT. m ) .AND. .NOT.(wntuf))
THEN
1311 CALL claset(
'A',m-n,n,czero,czero,u(n+1,1),ldu)
1312 IF ( n .LT. n1 )
THEN
1313 CALL claset(
'A',n,n1-n,czero,czero,u(1,n+1),ldu)
1314 CALL claset(
'A',m-n,n1-n,czero,cone,
1319 CALL clacpy(
'U', nr, n, a, lda, u(nr+1,1), ldu )
1321 $
CALL claset(
'L',nr-1,nr-1,czero,czero,u(nr+2,1),ldu)
1322 CALL cgelqf( nr, n, u(nr+1,1), ldu, cwork(n+1),
1323 $ cwork(n+nr+1), lcwork-n-nr, ierr )
1324 CALL clacpy(
'L',nr,nr,u(nr+1,1),ldu,v,ldv)
1326 $
CALL claset(
'U',nr-1,nr-1,czero,czero,v(1,2),ldv)
1327 CALL cgesvd(
'S',
'O', nr, nr, v, ldv, s, u, ldu,
1328 $ v, ldv, cwork(n+nr+1), lcwork-n-nr, rwork, info )
1329 CALL claset(
'A',n-nr,nr,czero,czero,v(nr+1,1),ldv)
1330 CALL claset(
'A',nr,n-nr,czero,czero,v(1,nr+1),ldv)
1331 CALL claset(
'A',n-nr,n-nr,czero,cone,v(nr+1,nr+1),ldv)
1332 CALL cunmlq(
'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 clapmt( .false., n, n, v, ldv, iwork )
1337 IF ( ( nr .LT. m ) .AND. .NOT.(wntuf))
THEN
1338 CALL claset(
'A',m-nr,nr,czero,czero,u(nr+1,1),ldu)
1339 IF ( nr .LT. n1 )
THEN
1340 CALL claset(
'A',nr,n1-nr,czero,czero,u(1,nr+1),ldu)
1341 CALL claset(
'A',m-nr,n1-nr,czero,cone,
1342 $ u(nr+1,nr+1), ldu )
1354 $
CALL cunmqr(
'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 claswp( 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 slaset(
'G', n-nr,1, zero,zero, s(nr+1), n )
1377 $
CALL slascl(
'G',0,0, one,sqrt(real(m)), nr,1, s, n, ierr )
1378 IF ( conda ) rwork(1) = sconda