412 SUBROUTINE cgesvdq( 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 A( LDA, * ), U( LDU, * ), V( LDV, * ), CWORK( * )
423 REAL S( * ), RWORK( * )
430 PARAMETER ( ZERO = 0.0e0, one = 1.0e0 )
432 parameter( czero = ( 0.0e0, 0.0e0 ), cone = ( 1.0e0, 0.0e0 ) )
435 INTEGER IERR, NR, N1, OPTRATIO, p, q
436 INTEGER LWCON, LWQP3, LWRK_CGELQF, LWRK_CGESVD, LWRK_CGESVD2,
437 $ lwrk_cgeqp3, lwrk_cgeqrf, lwrk_cunmlq, lwrk_cunmqr,
438 $ lwrk_cunmqr2, 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 REAL BIG, EPSLN, RTMP, SCONDA, SFMIN
459 REAL CLANGE, SCNRM2, SLAMCH
460 EXTERNAL clange, lsame, isamax, scnrm2, slamch
463 INTRINSIC abs, conjg, max, min, real, 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
540 IF ( wntus .OR. wntur )
THEN
542 ELSE IF ( wntua )
THEN
548 lwsvd = max( 3 * n, 1 )
550 CALL cgeqp3( m, n, a, lda, iwork, cdummy, cdummy, -1,
552 lwrk_cgeqp3 = int( cdummy(1) )
553 IF ( wntus .OR. wntur )
THEN
554 CALL cunmqr(
'L',
'N', m, n, n, a, lda, cdummy, u,
555 $ ldu, cdummy, -1, ierr )
556 lwrk_cunmqr = int( cdummy(1) )
557 ELSE IF ( wntua )
THEN
558 CALL cunmqr(
'L',
'N', m, m, n, a, lda, cdummy, u,
559 $ ldu, cdummy, -1, ierr )
560 lwrk_cunmqr = int( cdummy(1) )
567 IF ( .NOT. (lsvec .OR. rsvec ))
THEN
571 minwrk = max( n+lwqp3, lwcon, lwsvd )
573 minwrk = max( n+lwqp3, lwsvd )
576 CALL cgesvd(
'N',
'N', n, n, a, lda, s, u, ldu,
577 $ v, ldv, cdummy, -1, rdummy, ierr )
578 lwrk_cgesvd = int( cdummy(1) )
580 optwrk = max( n+lwrk_cgeqp3, n+lwcon, lwrk_cgesvd )
582 optwrk = max( n+lwrk_cgeqp3, lwrk_cgesvd )
585 ELSE IF ( lsvec .AND. (.NOT.rsvec) )
THEN
589 minwrk = n + max( lwqp3, lwcon, lwsvd, lwunq )
591 minwrk = n + max( lwqp3, lwsvd, lwunq )
595 CALL cgesvd(
'N',
'O', n, n, a, lda, s, u, ldu,
596 $ v, ldv, cdummy, -1, rdummy, ierr )
598 CALL cgesvd(
'O',
'N', n, n, a, lda, s, u, ldu,
599 $ v, ldv, cdummy, -1, rdummy, ierr )
601 lwrk_cgesvd = int( cdummy(1) )
603 optwrk = n + max( lwrk_cgeqp3, lwcon, lwrk_cgesvd,
606 optwrk = n + max( lwrk_cgeqp3, lwrk_cgesvd,
610 ELSE IF ( rsvec .AND. (.NOT.lsvec) )
THEN
614 minwrk = n + max( lwqp3, lwcon, lwsvd )
616 minwrk = n + max( lwqp3, lwsvd )
620 CALL cgesvd(
'O',
'N', n, n, a, lda, s, u, ldu,
621 $ v, ldv, cdummy, -1, rdummy, ierr )
623 CALL cgesvd(
'N',
'O', n, n, a, lda, s, u, ldu,
624 $ v, ldv, cdummy, -1, rdummy, ierr )
626 lwrk_cgesvd = int( cdummy(1) )
628 optwrk = n + max( lwrk_cgeqp3, lwcon, lwrk_cgesvd )
630 optwrk = n + max( lwrk_cgeqp3, lwrk_cgesvd )
637 minwrk = max( lwqp3, lwsvd, lwunq )
638 IF ( conda ) minwrk = max( minwrk, lwcon )
642 lwqrf = max( n/2, 1 )
644 lwsvd2 = max( 3 * (n/2), 1 )
646 minwrk2 = max( lwqp3, n/2+lwqrf, n/2+lwsvd2,
647 $ n/2+lwunq2, lwunq )
648 IF ( conda ) minwrk2 = max( minwrk2, lwcon )
649 minwrk2 = n + minwrk2
650 minwrk = max( minwrk, minwrk2 )
653 minwrk = max( lwqp3, lwsvd, lwunq )
654 IF ( conda ) minwrk = max( minwrk, lwcon )
658 lwlqf = max( n/2, 1 )
659 lwsvd2 = max( 3 * (n/2), 1 )
660 lwunlq = max( n , 1 )
661 minwrk2 = max( lwqp3, n/2+lwlqf, n/2+lwsvd2,
662 $ n/2+lwunlq, lwunq )
663 IF ( conda ) minwrk2 = max( minwrk2, lwcon )
664 minwrk2 = n + minwrk2
665 minwrk = max( minwrk, minwrk2 )
670 CALL cgesvd(
'O',
'A', n, n, a, lda, s, u, ldu,
671 $ v, ldv, cdummy, -1, rdummy, ierr )
672 lwrk_cgesvd = int( cdummy(1) )
673 optwrk = max(lwrk_cgeqp3,lwrk_cgesvd,lwrk_cunmqr)
674 IF ( conda ) optwrk = max( optwrk, lwcon )
677 CALL cgeqrf(n,n/2,u,ldu,cdummy,cdummy,-1,ierr)
678 lwrk_cgeqrf = int( cdummy(1) )
679 CALL cgesvd(
'S',
'O', n/2,n/2, v,ldv, s, u,ldu,
680 $ v, ldv, cdummy, -1, rdummy, ierr )
681 lwrk_cgesvd2 = int( cdummy(1) )
682 CALL cunmqr(
'R',
'C', n, n, n/2, u, ldu, cdummy,
683 $ v, ldv, cdummy, -1, ierr )
684 lwrk_cunmqr2 = int( cdummy(1) )
685 optwrk2 = max( lwrk_cgeqp3, n/2+lwrk_cgeqrf,
686 $ n/2+lwrk_cgesvd2, n/2+lwrk_cunmqr2 )
687 IF ( conda ) optwrk2 = max( optwrk2, lwcon )
688 optwrk2 = n + optwrk2
689 optwrk = max( optwrk, optwrk2 )
692 CALL cgesvd(
'S',
'O', n, n, a, lda, s, u, ldu,
693 $ v, ldv, cdummy, -1, rdummy, ierr )
694 lwrk_cgesvd = int( cdummy(1) )
695 optwrk = max(lwrk_cgeqp3,lwrk_cgesvd,lwrk_cunmqr)
696 IF ( conda ) optwrk = max( optwrk, lwcon )
699 CALL cgelqf(n/2,n,u,ldu,cdummy,cdummy,-1,ierr)
700 lwrk_cgelqf = int( cdummy(1) )
701 CALL cgesvd(
'S',
'O', n/2,n/2, v, ldv, s, u, ldu,
702 $ v, ldv, cdummy, -1, rdummy, ierr )
703 lwrk_cgesvd2 = int( cdummy(1) )
704 CALL cunmlq(
'R',
'N', n, n, n/2, u, ldu, cdummy,
705 $ v, ldv, cdummy,-1,ierr )
706 lwrk_cunmlq = int( cdummy(1) )
707 optwrk2 = max( lwrk_cgeqp3, n/2+lwrk_cgelqf,
708 $ n/2+lwrk_cgesvd2, n/2+lwrk_cunmlq )
709 IF ( conda ) optwrk2 = max( optwrk2, lwcon )
710 optwrk2 = n + optwrk2
711 optwrk = max( optwrk, optwrk2 )
717 minwrk = max( 2, minwrk )
718 optwrk = max( 2, optwrk )
719 IF ( lcwork .LT. minwrk .AND. (.NOT.lquery) ) info = -19
723 IF (info .EQ. 0 .AND. lrwork .LT. rminwrk .AND. .NOT. lquery)
THEN
727 CALL xerbla(
'CGESVDQ', -info )
729 ELSE IF ( lquery )
THEN
742 IF( ( m.EQ.0 ) .OR. ( n.EQ.0 ) )
THEN
756 rwork(p) = clange(
'M', 1, n, a(p,1), lda, rdummy )
758 IF ( ( rwork(p) .NE. rwork(p) ) .OR.
759 $ ( (rwork(p)*zero) .NE. zero ) )
THEN
761 CALL xerbla(
'CGESVDQ', -info )
766 q = isamax( m-p+1, rwork(p), 1 ) + p - 1
775 IF ( rwork(1) .EQ. zero )
THEN
778 CALL slaset(
'G', n, 1, zero, zero, s, n )
779 IF ( wntus )
CALL claset(
'G', m, n, czero, cone, u, ldu)
780 IF ( wntua )
CALL claset(
'G', m, m, czero, cone, u, ldu)
781 IF ( wntva )
CALL claset(
'G', n, n, czero, cone, v, ldv)
783 CALL claset(
'G', n, 1, czero, czero, cwork, n )
784 CALL claset(
'G', m, n, czero, cone, u, ldu )
790 DO 5002 p = n + 1, n + m - 1
794 IF ( conda ) rwork(1) = -1
799 IF ( rwork(1) .GT. big / sqrt(real(m)) )
THEN
802 CALL clascl(
'G',0,0,sqrt(real(m)),one, m,n, a,lda, ierr)
805 CALL claswp( n, a, lda, 1, m-1, iwork(n+1), 1 )
813 IF ( .NOT.rowprm )
THEN
814 rtmp = clange(
'M', m, n, a, lda, rwork )
815 IF ( ( rtmp .NE. rtmp ) .OR.
816 $ ( (rtmp*zero) .NE. zero ) )
THEN
818 CALL xerbla(
'CGESVDQ', -info )
821 IF ( rtmp .GT. big / sqrt(real(m)) )
THEN
824 CALL clascl(
'G',0,0, sqrt(real(m)),one, m,n, a,lda, ierr)
838 CALL cgeqp3( m, n, a, lda, iwork, cwork, cwork(n+1), lcwork-n,
857 rtmp = sqrt(real(n))*epsln
859 IF ( abs(a(p,p)) .LT. (rtmp*abs(a(1,1))) )
GO TO 3002
864 ELSEIF ( acclm )
THEN
873 IF ( ( abs(a(p,p)) .LT. (epsln*abs(a(p-1,p-1))) ) .OR.
874 $ ( abs(a(p,p)) .LT. sfmin ) )
GO TO 3402
886 IF ( abs(a(p,p)) .EQ. zero )
GO TO 3502
895 CALL clacpy(
'U', n, n, a, lda, v, ldv )
902 rtmp = scnrm2( p, v(1,p), 1 )
903 CALL csscal( p, one/rtmp, v(1,p), 1 )
905 IF ( .NOT. ( lsvec .OR. rsvec ) )
THEN
906 CALL cpocon(
'U', nr, v, ldv, one, rtmp,
907 $ cwork, rwork, ierr )
909 CALL cpocon(
'U', nr, v, ldv, one, rtmp,
910 $ cwork(n+1), rwork, ierr )
912 sconda = one / sqrt(rtmp)
922 ELSE IF ( wntus .OR. wntuf)
THEN
924 ELSE IF ( wntua )
THEN
928 IF ( .NOT. ( rsvec .OR. lsvec ) )
THEN
937 DO 1146 p = 1, min( n, nr )
938 a(p,p) = conjg(a(p,p))
940 a(q,p) = conjg(a(p,q))
941 IF ( q .LE. nr ) a(p,q) = czero
945 CALL cgesvd(
'N',
'N', n, nr, a, lda, s, u, ldu,
946 $ v, ldv, cwork, lcwork, rwork, info )
953 $
CALL claset(
'L', nr-1,nr-1, czero,czero, a(2,1), lda )
954 CALL cgesvd(
'N',
'N', nr, n, a, lda, s, u, ldu,
955 $ v, ldv, cwork, lcwork, rwork, info )
959 ELSE IF ( lsvec .AND. ( .NOT. rsvec) )
THEN
969 u(q,p) = conjg(a(p,q))
973 $
CALL claset(
'U', nr-1,nr-1, czero,czero, u(1,2), ldu )
977 CALL cgesvd(
'N',
'O', n, nr, u, ldu, s, u, ldu,
978 $ u, ldu, cwork(n+1), lcwork-n, rwork, info )
981 u(p,p) = conjg(u(p,p))
982 DO 1120 q = p + 1, nr
984 u(q,p) = conjg(u(p,q))
992 CALL clacpy(
'U', nr, n, a, lda, u, ldu )
994 $
CALL claset(
'L', nr-1, nr-1, czero, czero, u(2,1), ldu )
997 CALL cgesvd(
'O',
'N', nr, n, u, ldu, s, u, ldu,
998 $ v, ldv, cwork(n+1), lcwork-n, rwork, info )
1006 IF ( ( nr .LT. m ) .AND. ( .NOT.wntuf ) )
THEN
1007 CALL claset(
'A', m-nr, nr, czero, czero, u(nr+1,1), ldu)
1008 IF ( nr .LT. n1 )
THEN
1009 CALL claset(
'A',nr,n1-nr,czero,czero,u(1,nr+1), ldu )
1010 CALL claset(
'A',m-nr,n1-nr,czero,cone,
1011 $ u(nr+1,nr+1), ldu )
1019 $
CALL cunmqr(
'L',
'N', m, n1, n, a, lda, cwork, u,
1020 $ ldu, cwork(n+1), lcwork-n, ierr )
1021 IF ( rowprm .AND. .NOT.wntuf )
1022 $
CALL claswp( n1, u, ldu, 1, m-1, iwork(n+1), -1 )
1024 ELSE IF ( rsvec .AND. ( .NOT. lsvec ) )
THEN
1033 v(q,p) = conjg(a(p,q))
1037 $
CALL claset(
'U', nr-1,nr-1, czero,czero, v(1,2), ldv )
1040 IF ( wntvr .OR. ( nr .EQ. n ) )
THEN
1041 CALL cgesvd(
'O',
'N', n, nr, v, ldv, s, u, ldu,
1042 $ u, ldu, cwork(n+1), lcwork-n, rwork, info )
1045 v(p,p) = conjg(v(p,p))
1046 DO 1122 q = p + 1, nr
1047 ctmp = conjg(v(q,p))
1048 v(q,p) = conjg(v(p,q))
1053 IF ( nr .LT. n )
THEN
1055 DO 1104 q = nr + 1, n
1056 v(p,q) = conjg(v(q,p))
1060 CALL clapmt( .false., nr, n, v, ldv, iwork )
1067 CALL claset(
'G', n, n-nr, czero, czero, v(1,nr+1), ldv)
1068 CALL cgesvd(
'O',
'N', n, n, v, ldv, s, u, ldu,
1069 $ u, ldu, cwork(n+1), lcwork-n, rwork, info )
1072 v(p,p) = conjg(v(p,p))
1073 DO 1124 q = p + 1, n
1074 ctmp = conjg(v(q,p))
1075 v(q,p) = conjg(v(p,q))
1079 CALL clapmt( .false., n, n, v, ldv, iwork )
1085 CALL clacpy(
'U', nr, n, a, lda, v, ldv )
1087 $
CALL claset(
'L', nr-1, nr-1, czero, czero, v(2,1), ldv )
1090 IF ( wntvr .OR. ( nr .EQ. n ) )
THEN
1091 CALL cgesvd(
'N',
'O', nr, n, v, ldv, s, u, ldu,
1092 $ v, ldv, cwork(n+1), lcwork-n, rwork, info )
1093 CALL clapmt( .false., nr, n, v, ldv, iwork )
1101 CALL claset(
'G', n-nr, n, czero,czero, v(nr+1,1), ldv)
1102 CALL cgesvd(
'N',
'O', n, n, v, ldv, s, u, ldu,
1103 $ v, ldv, cwork(n+1), lcwork-n, rwork, info )
1104 CALL clapmt( .false., n, n, v, ldv, iwork )
1118 IF ( wntvr .OR. ( nr .EQ. n ) )
THEN
1123 v(q,p) = conjg(a(p,q))
1127 $
CALL claset(
'U', nr-1,nr-1, czero,czero, v(1,2), ldv )
1132 CALL cgesvd(
'O',
'A', n, nr, v, ldv, s, v, ldv,
1133 $ u, ldu, cwork(n+1), lcwork-n, rwork, info )
1136 v(p,p) = conjg(v(p,p))
1137 DO 1116 q = p + 1, nr
1138 ctmp = conjg(v(q,p))
1139 v(q,p) = conjg(v(p,q))
1143 IF ( nr .LT. n )
THEN
1146 v(p,q) = conjg(v(q,p))
1150 CALL clapmt( .false., nr, n, v, ldv, iwork )
1153 u(p,p) = conjg(u(p,p))
1154 DO 1118 q = p + 1, nr
1155 ctmp = conjg(u(q,p))
1156 u(q,p) = conjg(u(p,q))
1161 IF ( ( nr .LT. m ) .AND. .NOT.(wntuf))
THEN
1162 CALL claset(
'A', m-nr,nr, czero,czero, u(nr+1,1), ldu)
1163 IF ( nr .LT. n1 )
THEN
1164 CALL claset(
'A',nr,n1-nr,czero,czero,u(1,nr+1),ldu)
1165 CALL claset(
'A',m-nr,n1-nr,czero,cone,
1166 $ u(nr+1,nr+1), ldu )
1180 IF ( optratio*nr .GT. n )
THEN
1183 v(q,p) = conjg(a(p,q))
1187 $
CALL claset(
'U',nr-1,nr-1, czero,czero, v(1,2),ldv)
1189 CALL claset(
'A',n,n-nr,czero,czero,v(1,nr+1),ldv)
1190 CALL cgesvd(
'O',
'A', n, n, v, ldv, s, v, ldv,
1191 $ u, ldu, cwork(n+1), lcwork-n, rwork, info )
1194 v(p,p) = conjg(v(p,p))
1195 DO 1114 q = p + 1, n
1196 ctmp = conjg(v(q,p))
1197 v(q,p) = conjg(v(p,q))
1201 CALL clapmt( .false., n, n, v, ldv, iwork )
1206 u(p,p) = conjg(u(p,p))
1207 DO 1112 q = p + 1, n
1208 ctmp = conjg(u(q,p))
1209 u(q,p) = conjg(u(p,q))
1214 IF ( ( n .LT. m ) .AND. .NOT.(wntuf))
THEN
1215 CALL claset(
'A',m-n,n,czero,czero,u(n+1,1),ldu)
1216 IF ( n .LT. n1 )
THEN
1217 CALL claset(
'A',n,n1-n,czero,czero,u(1,n+1),ldu)
1218 CALL claset(
'A',m-n,n1-n,czero,cone,
1227 u(q,nr+p) = conjg(a(p,q))
1231 $
CALL claset(
'U',nr-1,nr-1,czero,czero,u(1,nr+2),ldu)
1232 CALL cgeqrf( n, nr, u(1,nr+1), ldu, cwork(n+1),
1233 $ cwork(n+nr+1), lcwork-n-nr, ierr )
1236 v(q,p) = conjg(u(p,nr+q))
1239 CALL claset(
'U',nr-1,nr-1,czero,czero,v(1,2),ldv)
1240 CALL cgesvd(
'S',
'O', nr, nr, v, ldv, s, u, ldu,
1241 $ v,ldv, cwork(n+nr+1),lcwork-n-nr,rwork, info )
1242 CALL claset(
'A',n-nr,nr,czero,czero,v(nr+1,1),ldv)
1243 CALL claset(
'A',nr,n-nr,czero,czero,v(1,nr+1),ldv)
1244 CALL claset(
'A',n-nr,n-nr,czero,cone,v(nr+1,nr+1),ldv)
1245 CALL cunmqr(
'R',
'C', n, n, nr, u(1,nr+1), ldu,
1246 $ cwork(n+1),v,ldv,cwork(n+nr+1),lcwork-n-nr,ierr)
1247 CALL clapmt( .false., n, n, v, ldv, iwork )
1250 IF ( ( nr .LT. m ) .AND. .NOT.(wntuf))
THEN
1251 CALL claset(
'A',m-nr,nr,czero,czero,u(nr+1,1),ldu)
1252 IF ( nr .LT. n1 )
THEN
1253 CALL claset(
'A',nr,n1-nr,czero,czero,u(1,nr+1),ldu)
1254 CALL claset(
'A',m-nr,n1-nr,czero,cone,
1265 IF ( wntvr .OR. ( nr .EQ. n ) )
THEN
1267 CALL clacpy(
'U', nr, n, a, lda, v, ldv )
1269 $
CALL claset(
'L', nr-1,nr-1, czero,czero, v(2,1), ldv )
1272 CALL cgesvd(
'S',
'O', nr, n, v, ldv, s, u, ldu,
1273 $ v, ldv, cwork(n+1), lcwork-n, rwork, info )
1274 CALL clapmt( .false., nr, n, v, ldv, iwork )
1278 IF ( ( nr .LT. m ) .AND. .NOT.(wntuf))
THEN
1279 CALL claset(
'A', m-nr,nr, czero,czero, u(nr+1,1), ldu)
1280 IF ( nr .LT. n1 )
THEN
1281 CALL claset(
'A',nr,n1-nr,czero,czero,u(1,nr+1),ldu)
1282 CALL claset(
'A',m-nr,n1-nr,czero,cone,
1283 $ u(nr+1,nr+1), ldu )
1297 IF ( optratio * nr .GT. n )
THEN
1298 CALL clacpy(
'U', nr, n, a, lda, v, ldv )
1300 $
CALL claset(
'L', nr-1,nr-1, czero,czero, v(2,1),ldv)
1303 CALL claset(
'A', n-nr,n, czero,czero, v(nr+1,1),ldv)
1304 CALL cgesvd(
'S',
'O', n, n, v, ldv, s, u, ldu,
1305 $ v, ldv, cwork(n+1), lcwork-n, rwork, info )
1306 CALL clapmt( .false., n, n, v, ldv, iwork )
1312 IF ( ( n .LT. m ) .AND. .NOT.(wntuf))
THEN
1313 CALL claset(
'A',m-n,n,czero,czero,u(n+1,1),ldu)
1314 IF ( n .LT. n1 )
THEN
1315 CALL claset(
'A',n,n1-n,czero,czero,u(1,n+1),ldu)
1316 CALL claset(
'A',m-n,n1-n,czero,cone,
1321 CALL clacpy(
'U', nr, n, a, lda, u(nr+1,1), ldu )
1323 $
CALL claset(
'L',nr-1,nr-1,czero,czero,u(nr+2,1),ldu)
1324 CALL cgelqf( nr, n, u(nr+1,1), ldu, cwork(n+1),
1325 $ cwork(n+nr+1), lcwork-n-nr, ierr )
1326 CALL clacpy(
'L',nr,nr,u(nr+1,1),ldu,v,ldv)
1328 $
CALL claset(
'U',nr-1,nr-1,czero,czero,v(1,2),ldv)
1329 CALL cgesvd(
'S',
'O', nr, nr, v, ldv, s, u, ldu,
1330 $ v, ldv, cwork(n+nr+1), lcwork-n-nr, rwork, info )
1331 CALL claset(
'A',n-nr,nr,czero,czero,v(nr+1,1),ldv)
1332 CALL claset(
'A',nr,n-nr,czero,czero,v(1,nr+1),ldv)
1333 CALL claset(
'A',n-nr,n-nr,czero,cone,v(nr+1,nr+1),ldv)
1334 CALL cunmlq(
'R',
'N',n,n,nr,u(nr+1,1),ldu,cwork(n+1),
1335 $ v, ldv, cwork(n+nr+1),lcwork-n-nr,ierr)
1336 CALL clapmt( .false., n, n, v, ldv, iwork )
1339 IF ( ( nr .LT. m ) .AND. .NOT.(wntuf))
THEN
1340 CALL claset(
'A',m-nr,nr,czero,czero,u(nr+1,1),ldu)
1341 IF ( nr .LT. n1 )
THEN
1342 CALL claset(
'A',nr,n1-nr,czero,czero,u(1,nr+1),ldu)
1343 CALL claset(
'A',m-nr,n1-nr,czero,cone,
1344 $ u(nr+1,nr+1), ldu )
1356 $
CALL cunmqr(
'L',
'N', m, n1, n, a, lda, cwork, u,
1357 $ ldu, cwork(n+1), lcwork-n, ierr )
1358 IF ( rowprm .AND. .NOT.wntuf )
1359 $
CALL claswp( n1, u, ldu, 1, m-1, iwork(n+1), -1 )
1367 DO 4001 q = p, 1, -1
1368 IF ( s(q) .GT. zero )
GO TO 4002
1375 IF ( nr .LT. n )
CALL slaset(
'G', n-nr,1, zero,zero, s(nr+1), n )
1379 $
CALL slascl(
'G',0,0, one,sqrt(real(m)), nr,1, s, n, ierr )
1380 IF ( conda ) rwork(1) = sconda