414 SUBROUTINE dgesvdq( JOBA, JOBP, JOBR, JOBU, JOBV, M, N, A, LDA,
415 $ S, U, LDU, V, LDV, NUMRANK, IWORK, LIWORK,
416 $ WORK, LWORK, RWORK, LRWORK, INFO )
419 CHARACTER JOBA, JOBP, JOBR, JOBU, JOBV
420 INTEGER M, N, LDA, LDU, LDV, NUMRANK, LIWORK, LWORK, LRWORK,
424 DOUBLE PRECISION A( LDA, * ), U( LDU, * ), V( LDV, * ), WORK( * )
425 DOUBLE PRECISION S( * ), RWORK( * )
431 DOUBLE PRECISION ZERO, ONE
432 PARAMETER ( ZERO = 0.0d0, one = 1.0d0 )
434 INTEGER IERR, IWOFF, NR, N1, OPTRATIO, p, q
435 INTEGER LWCON, LWQP3, LWRK_DGELQF, LWRK_DGESVD, LWRK_DGESVD2,
436 $ lwrk_dgeqp3, lwrk_dgeqrf, lwrk_dormlq, lwrk_dormqr,
437 $ lwrk_dormqr2, lwlqf, lwqrf, lwsvd, lwsvd2, lworq,
438 $ lworq2, lworlq, minwrk, minwrk2, optwrk, optwrk2,
440 LOGICAL ACCLA, ACCLM, ACCLH, ASCALED, CONDA, DNTWU, DNTWV,
441 $ LQUERY, LSVC0, LSVEC, ROWPRM, RSVEC, RTRANS, WNTUA,
442 $ wntuf, wntur, wntus, wntva, wntvr
443 DOUBLE PRECISION BIG, EPSLN, RTMP, SCONDA, SFMIN
445 DOUBLE PRECISION RDUMMY(1)
455 DOUBLE PRECISION DLANGE, DNRM2, DLAMCH
456 EXTERNAL dlange, lsame, idamax, dnrm2, dlamch
460 INTRINSIC abs, max, min, dble, sqrt
464 wntus = lsame( jobu,
'S' ) .OR. lsame( jobu,
'U' )
465 wntur = lsame( jobu,
'R' )
466 wntua = lsame( jobu,
'A' )
467 wntuf = lsame( jobu,
'F' )
468 lsvc0 = wntus .OR. wntur .OR. wntua
469 lsvec = lsvc0 .OR. wntuf
470 dntwu = lsame( jobu,
'N' )
472 wntvr = lsame( jobv,
'R' )
473 wntva = lsame( jobv,
'A' ) .OR. lsame( jobv,
'V' )
474 rsvec = wntvr .OR. wntva
475 dntwv = lsame( jobv,
'N' )
477 accla = lsame( joba,
'A' )
478 acclm = lsame( joba,
'M' )
479 conda = lsame( joba,
'E' )
480 acclh = lsame( joba,
'H' ) .OR. conda
482 rowprm = lsame( jobp,
'P' )
483 rtrans = lsame( jobr,
'T' )
487 iminwrk = max( 1, n + m - 1 + n )
489 iminwrk = max( 1, n + m - 1 )
491 rminwrk = max( 2, m )
494 iminwrk = max( 1, n + n )
496 iminwrk = max( 1, n )
500 lquery = (liwork .EQ. -1 .OR. lwork .EQ. -1 .OR. lrwork .EQ. -1)
502 IF ( .NOT. ( accla .OR. acclm .OR. acclh ) )
THEN
504 ELSE IF ( .NOT.( rowprm .OR. lsame( jobp,
'N' ) ) )
THEN
506 ELSE IF ( .NOT.( rtrans .OR. lsame( jobr,
'N' ) ) )
THEN
508 ELSE IF ( .NOT.( lsvec .OR. dntwu ) )
THEN
510 ELSE IF ( wntur .AND. wntva )
THEN
512 ELSE IF ( .NOT.( rsvec .OR. dntwv ))
THEN
514 ELSE IF ( m.LT.0 )
THEN
516 ELSE IF ( ( n.LT.0 ) .OR. ( n.GT.m ) )
THEN
518 ELSE IF ( lda.LT.max( 1, m ) )
THEN
520 ELSE IF ( ldu.LT.1 .OR. ( lsvc0 .AND. ldu.LT.m ) .OR.
521 $ ( wntuf .AND. ldu.LT.n ) )
THEN
523 ELSE IF ( ldv.LT.1 .OR. ( rsvec .AND. ldv.LT.n ) .OR.
524 $ ( conda .AND. ldv.LT.n ) )
THEN
526 ELSE IF ( liwork .LT. iminwrk .AND. .NOT. lquery )
THEN
531 IF ( info .EQ. 0 )
THEN
541 IF ( wntus .OR. wntur )
THEN
543 ELSE IF ( wntua )
THEN
549 lwsvd = max( 5 * n, 1 )
551 CALL dgeqp3( m, n, a, lda, iwork, rdummy, rdummy, -1,
553 lwrk_dgeqp3 = int( rdummy(1) )
554 IF ( wntus .OR. wntur )
THEN
555 CALL dormqr(
'L',
'N', m, n, n, a, lda, rdummy, u,
556 $ ldu, rdummy, -1, ierr )
557 lwrk_dormqr = int( rdummy(1) )
558 ELSE IF ( wntua )
THEN
559 CALL dormqr(
'L',
'N', m, m, n, a, lda, rdummy, u,
560 $ ldu, rdummy, -1, ierr )
561 lwrk_dormqr = int( rdummy(1) )
568 IF ( .NOT. (lsvec .OR. rsvec ))
THEN
572 minwrk = max( n+lwqp3, lwcon, lwsvd )
574 minwrk = max( n+lwqp3, lwsvd )
577 CALL dgesvd(
'N',
'N', n, n, a, lda, s, u, ldu,
578 $ v, ldv, rdummy, -1, ierr )
579 lwrk_dgesvd = int( rdummy(1) )
581 optwrk = max( n+lwrk_dgeqp3, n+lwcon, lwrk_dgesvd )
583 optwrk = max( n+lwrk_dgeqp3, lwrk_dgesvd )
586 ELSE IF ( lsvec .AND. (.NOT.rsvec) )
THEN
590 minwrk = n + max( lwqp3, lwcon, lwsvd, lworq )
592 minwrk = n + max( lwqp3, lwsvd, lworq )
596 CALL dgesvd(
'N',
'O', n, n, a, lda, s, u, ldu,
597 $ v, ldv, rdummy, -1, ierr )
599 CALL dgesvd(
'O',
'N', n, n, a, lda, s, u, ldu,
600 $ v, ldv, rdummy, -1, ierr )
602 lwrk_dgesvd = int( rdummy(1) )
604 optwrk = n + max( lwrk_dgeqp3, lwcon, lwrk_dgesvd,
607 optwrk = n + max( lwrk_dgeqp3, lwrk_dgesvd,
611 ELSE IF ( rsvec .AND. (.NOT.lsvec) )
THEN
615 minwrk = n + max( lwqp3, lwcon, lwsvd )
617 minwrk = n + max( lwqp3, lwsvd )
621 CALL dgesvd(
'O',
'N', n, n, a, lda, s, u, ldu,
622 $ v, ldv, rdummy, -1, ierr )
624 CALL dgesvd(
'N',
'O', n, n, a, lda, s, u, ldu,
625 $ v, ldv, rdummy, -1, ierr )
627 lwrk_dgesvd = int( rdummy(1) )
629 optwrk = n + max( lwrk_dgeqp3, lwcon, lwrk_dgesvd )
631 optwrk = n + max( lwrk_dgeqp3, lwrk_dgesvd )
638 minwrk = max( lwqp3, lwsvd, lworq )
639 IF ( conda ) minwrk = max( minwrk, lwcon )
643 lwqrf = max( n/2, 1 )
645 lwsvd2 = max( 5 * (n/2), 1 )
647 minwrk2 = max( lwqp3, n/2+lwqrf, n/2+lwsvd2,
648 $ n/2+lworq2, lworq )
649 IF ( conda ) minwrk2 = max( minwrk2, lwcon )
650 minwrk2 = n + minwrk2
651 minwrk = max( minwrk, minwrk2 )
654 minwrk = max( lwqp3, lwsvd, lworq )
655 IF ( conda ) minwrk = max( minwrk, lwcon )
659 lwlqf = max( n/2, 1 )
660 lwsvd2 = max( 5 * (n/2), 1 )
661 lworlq = max( n , 1 )
662 minwrk2 = max( lwqp3, n/2+lwlqf, n/2+lwsvd2,
663 $ n/2+lworlq, lworq )
664 IF ( conda ) minwrk2 = max( minwrk2, lwcon )
665 minwrk2 = n + minwrk2
666 minwrk = max( minwrk, minwrk2 )
671 CALL dgesvd(
'O',
'A', n, n, a, lda, s, u, ldu,
672 $ v, ldv, rdummy, -1, ierr )
673 lwrk_dgesvd = int( rdummy(1) )
674 optwrk = max(lwrk_dgeqp3,lwrk_dgesvd,lwrk_dormqr)
675 IF ( conda ) optwrk = max( optwrk, lwcon )
678 CALL dgeqrf(n,n/2,u,ldu,rdummy,rdummy,-1,ierr)
679 lwrk_dgeqrf = int( rdummy(1) )
680 CALL dgesvd(
'S',
'O', n/2,n/2, v,ldv, s, u,ldu,
681 $ v, ldv, rdummy, -1, ierr )
682 lwrk_dgesvd2 = int( rdummy(1) )
683 CALL dormqr(
'R',
'C', n, n, n/2, u, ldu, rdummy,
684 $ v, ldv, rdummy, -1, ierr )
685 lwrk_dormqr2 = int( rdummy(1) )
686 optwrk2 = max( lwrk_dgeqp3, n/2+lwrk_dgeqrf,
687 $ n/2+lwrk_dgesvd2, n/2+lwrk_dormqr2 )
688 IF ( conda ) optwrk2 = max( optwrk2, lwcon )
689 optwrk2 = n + optwrk2
690 optwrk = max( optwrk, optwrk2 )
693 CALL dgesvd(
'S',
'O', n, n, a, lda, s, u, ldu,
694 $ v, ldv, rdummy, -1, ierr )
695 lwrk_dgesvd = int( rdummy(1) )
696 optwrk = max(lwrk_dgeqp3,lwrk_dgesvd,lwrk_dormqr)
697 IF ( conda ) optwrk = max( optwrk, lwcon )
700 CALL dgelqf(n/2,n,u,ldu,rdummy,rdummy,-1,ierr)
701 lwrk_dgelqf = int( rdummy(1) )
702 CALL dgesvd(
'S',
'O', n/2,n/2, v, ldv, s, u, ldu,
703 $ v, ldv, rdummy, -1, ierr )
704 lwrk_dgesvd2 = int( rdummy(1) )
705 CALL dormlq(
'R',
'N', n, n, n/2, u, ldu, rdummy,
706 $ v, ldv, rdummy,-1,ierr )
707 lwrk_dormlq = int( rdummy(1) )
708 optwrk2 = max( lwrk_dgeqp3, n/2+lwrk_dgelqf,
709 $ n/2+lwrk_dgesvd2, n/2+lwrk_dormlq )
710 IF ( conda ) optwrk2 = max( optwrk2, lwcon )
711 optwrk2 = n + optwrk2
712 optwrk = max( optwrk, optwrk2 )
718 minwrk = max( 2, minwrk )
719 optwrk = max( 2, optwrk )
720 IF ( lwork .LT. minwrk .AND. (.NOT.lquery) ) info = -19
724 IF (info .EQ. 0 .AND. lrwork .LT. rminwrk .AND. .NOT. lquery)
THEN
728 CALL xerbla(
'DGESVDQ', -info )
730 ELSE IF ( lquery )
THEN
743 IF( ( m.EQ.0 ) .OR. ( n.EQ.0 ) )
THEN
759 rwork(p) = dlange(
'M', 1, n, a(p,1), lda, rdummy )
761 IF ( ( rwork(p) .NE. rwork(p) ) .OR.
762 $ ( (rwork(p)*zero) .NE. zero ) )
THEN
764 CALL xerbla(
'DGESVDQ', -info )
769 q = idamax( m-p+1, rwork(p), 1 ) + p - 1
778 IF ( rwork(1) .EQ. zero )
THEN
781 CALL dlaset(
'G', n, 1, zero, zero, s, n )
782 IF ( wntus )
CALL dlaset(
'G', m, n, zero, one, u, ldu)
783 IF ( wntua )
CALL dlaset(
'G', m, m, zero, one, u, ldu)
784 IF ( wntva )
CALL dlaset(
'G', n, n, zero, one, v, ldv)
786 CALL dlaset(
'G', n, 1, zero, zero, work, n )
787 CALL dlaset(
'G', m, n, zero, one, u, ldu )
793 DO 5002 p = n + 1, n + m - 1
797 IF ( conda ) rwork(1) = -1
802 IF ( rwork(1) .GT. big / sqrt(dble(m)) )
THEN
805 CALL dlascl(
'G',0,0,sqrt(dble(m)),one, m,n, a,lda, ierr)
808 CALL dlaswp( n, a, lda, 1, m-1, iwork(n+1), 1 )
816 IF ( .NOT.rowprm )
THEN
817 rtmp = dlange(
'M', m, n, a, lda, rdummy )
818 IF ( ( rtmp .NE. rtmp ) .OR.
819 $ ( (rtmp*zero) .NE. zero ) )
THEN
821 CALL xerbla(
'DGESVDQ', -info )
824 IF ( rtmp .GT. big / sqrt(dble(m)) )
THEN
827 CALL dlascl(
'G',0,0, sqrt(dble(m)),one, m,n, a,lda, ierr)
841 CALL dgeqp3( m, n, a, lda, iwork, work, work(n+1), lwork-n,
860 rtmp = sqrt(dble(n))*epsln
862 IF ( abs(a(p,p)) .LT. (rtmp*abs(a(1,1))) )
GO TO 3002
867 ELSEIF ( acclm )
THEN
876 IF ( ( abs(a(p,p)) .LT. (epsln*abs(a(p-1,p-1))) ) .OR.
877 $ ( abs(a(p,p)) .LT. sfmin ) )
GO TO 3402
889 IF ( abs(a(p,p)) .EQ. zero )
GO TO 3502
898 CALL dlacpy(
'U', n, n, a, lda, v, ldv )
905 rtmp = dnrm2( p, v(1,p), 1 )
906 CALL dscal( p, one/rtmp, v(1,p), 1 )
908 IF ( .NOT. ( lsvec .OR. rsvec ) )
THEN
909 CALL dpocon(
'U', nr, v, ldv, one, rtmp,
910 $ work, iwork(n+iwoff), ierr )
912 CALL dpocon(
'U', nr, v, ldv, one, rtmp,
913 $ work(n+1), iwork(n+iwoff), ierr )
915 sconda = one / sqrt(rtmp)
925 ELSE IF ( wntus .OR. wntuf)
THEN
927 ELSE IF ( wntua )
THEN
931 IF ( .NOT. ( rsvec .OR. lsvec ) )
THEN
940 DO 1146 p = 1, min( n, nr )
943 IF ( q .LE. nr ) a(p,q) = zero
947 CALL dgesvd(
'N',
'N', n, nr, a, lda, s, u, ldu,
948 $ v, ldv, work, lwork, info )
955 $
CALL dlaset(
'L', nr-1,nr-1, zero,zero, a(2,1), lda )
956 CALL dgesvd(
'N',
'N', nr, n, a, lda, s, u, ldu,
957 $ v, ldv, work, lwork, info )
961 ELSE IF ( lsvec .AND. ( .NOT. rsvec) )
THEN
975 $
CALL dlaset(
'U', nr-1,nr-1, zero,zero, u(1,2), ldu )
979 CALL dgesvd(
'N',
'O', n, nr, u, ldu, s, u, ldu,
980 $ u, ldu, work(n+1), lwork-n, info )
983 DO 1120 q = p + 1, nr
993 CALL dlacpy(
'U', nr, n, a, lda, u, ldu )
995 $
CALL dlaset(
'L', nr-1, nr-1, zero, zero, u(2,1), ldu )
998 CALL dgesvd(
'O',
'N', nr, n, u, ldu, s, u, ldu,
999 $ v, ldv, work(n+1), lwork-n, info )
1007 IF ( ( nr .LT. m ) .AND. ( .NOT.wntuf ) )
THEN
1008 CALL dlaset(
'A', m-nr, nr, zero, zero, u(nr+1,1), ldu)
1009 IF ( nr .LT. n1 )
THEN
1010 CALL dlaset(
'A',nr,n1-nr,zero,zero,u(1,nr+1), ldu )
1011 CALL dlaset(
'A',m-nr,n1-nr,zero,one,
1012 $ u(nr+1,nr+1), ldu )
1020 $
CALL dormqr(
'L',
'N', m, n1, n, a, lda, work, u,
1021 $ ldu, work(n+1), lwork-n, ierr )
1022 IF ( rowprm .AND. .NOT.wntuf )
1023 $
CALL dlaswp( n1, u, ldu, 1, m-1, iwork(n+1), -1 )
1025 ELSE IF ( rsvec .AND. ( .NOT. lsvec ) )
THEN
1038 $
CALL dlaset(
'U', nr-1,nr-1, zero,zero, v(1,2), ldv )
1041 IF ( wntvr .OR. ( nr .EQ. n ) )
THEN
1042 CALL dgesvd(
'O',
'N', n, nr, v, ldv, s, u, ldu,
1043 $ u, ldu, work(n+1), lwork-n, info )
1046 DO 1122 q = p + 1, nr
1053 IF ( nr .LT. n )
THEN
1055 DO 1104 q = nr + 1, n
1060 CALL dlapmt( .false., nr, n, v, ldv, iwork )
1067 CALL dlaset(
'G', n, n-nr, zero, zero, v(1,nr+1), ldv)
1068 CALL dgesvd(
'O',
'N', n, n, v, ldv, s, u, ldu,
1069 $ u, ldu, work(n+1), lwork-n, info )
1072 DO 1124 q = p + 1, n
1078 CALL dlapmt( .false., n, n, v, ldv, iwork )
1084 CALL dlacpy(
'U', nr, n, a, lda, v, ldv )
1086 $
CALL dlaset(
'L', nr-1, nr-1, zero, zero, v(2,1), ldv )
1089 IF ( wntvr .OR. ( nr .EQ. n ) )
THEN
1090 CALL dgesvd(
'N',
'O', nr, n, v, ldv, s, u, ldu,
1091 $ v, ldv, work(n+1), lwork-n, info )
1092 CALL dlapmt( .false., nr, n, v, ldv, iwork )
1100 CALL dlaset(
'G', n-nr, n, zero,zero, v(nr+1,1), ldv)
1101 CALL dgesvd(
'N',
'O', n, n, v, ldv, s, u, ldu,
1102 $ v, ldv, work(n+1), lwork-n, info )
1103 CALL dlapmt( .false., n, n, v, ldv, iwork )
1117 IF ( wntvr .OR. ( nr .EQ. n ) )
THEN
1126 $
CALL dlaset(
'U', nr-1,nr-1, zero,zero, v(1,2), ldv )
1130 CALL dgesvd(
'O',
'A', n, nr, v, ldv, s, v, ldv,
1131 $ u, ldu, work(n+1), lwork-n, info )
1134 DO 1116 q = p + 1, nr
1140 IF ( nr .LT. n )
THEN
1147 CALL dlapmt( .false., nr, n, v, ldv, iwork )
1150 DO 1118 q = p + 1, nr
1157 IF ( ( nr .LT. m ) .AND. .NOT.(wntuf))
THEN
1158 CALL dlaset(
'A', m-nr,nr, zero,zero, u(nr+1,1), ldu)
1159 IF ( nr .LT. n1 )
THEN
1160 CALL dlaset(
'A',nr,n1-nr,zero,zero,u(1,nr+1),ldu)
1161 CALL dlaset(
'A',m-nr,n1-nr,zero,one,
1162 $ u(nr+1,nr+1), ldu )
1176 IF ( optratio*nr .GT. n )
THEN
1183 $
CALL dlaset(
'U',nr-1,nr-1, zero,zero, v(1,2),ldv)
1185 CALL dlaset(
'A',n,n-nr,zero,zero,v(1,nr+1),ldv)
1186 CALL dgesvd(
'O',
'A', n, n, v, ldv, s, v, ldv,
1187 $ u, ldu, work(n+1), lwork-n, info )
1190 DO 1114 q = p + 1, n
1196 CALL dlapmt( .false., n, n, v, ldv, iwork )
1201 DO 1112 q = p + 1, n
1208 IF ( ( n .LT. m ) .AND. .NOT.(wntuf))
THEN
1209 CALL dlaset(
'A',m-n,n,zero,zero,u(n+1,1),ldu)
1210 IF ( n .LT. n1 )
THEN
1211 CALL dlaset(
'A',n,n1-n,zero,zero,u(1,n+1),ldu)
1212 CALL dlaset(
'A',m-n,n1-n,zero,one,
1225 $
CALL dlaset(
'U',nr-1,nr-1,zero,zero,u(1,nr+2),ldu)
1226 CALL dgeqrf( n, nr, u(1,nr+1), ldu, work(n+1),
1227 $ work(n+nr+1), lwork-n-nr, ierr )
1233 CALL dlaset(
'U',nr-1,nr-1,zero,zero,v(1,2),ldv)
1234 CALL dgesvd(
'S',
'O', nr, nr, v, ldv, s, u, ldu,
1235 $ v,ldv, work(n+nr+1),lwork-n-nr, info )
1236 CALL dlaset(
'A',n-nr,nr,zero,zero,v(nr+1,1),ldv)
1237 CALL dlaset(
'A',nr,n-nr,zero,zero,v(1,nr+1),ldv)
1238 CALL dlaset(
'A',n-nr,n-nr,zero,one,v(nr+1,nr+1),ldv)
1239 CALL dormqr(
'R',
'C', n, n, nr, u(1,nr+1), ldu,
1240 $ work(n+1),v,ldv,work(n+nr+1),lwork-n-nr,ierr)
1241 CALL dlapmt( .false., n, n, v, ldv, iwork )
1244 IF ( ( nr .LT. m ) .AND. .NOT.(wntuf))
THEN
1245 CALL dlaset(
'A',m-nr,nr,zero,zero,u(nr+1,1),ldu)
1246 IF ( nr .LT. n1 )
THEN
1247 CALL dlaset(
'A',nr,n1-nr,zero,zero,u(1,nr+1),ldu)
1248 CALL dlaset(
'A',m-nr,n1-nr,zero,one,
1259 IF ( wntvr .OR. ( nr .EQ. n ) )
THEN
1261 CALL dlacpy(
'U', nr, n, a, lda, v, ldv )
1263 $
CALL dlaset(
'L', nr-1,nr-1, zero,zero, v(2,1), ldv )
1266 CALL dgesvd(
'S',
'O', nr, n, v, ldv, s, u, ldu,
1267 $ v, ldv, work(n+1), lwork-n, info )
1268 CALL dlapmt( .false., nr, n, v, ldv, iwork )
1272 IF ( ( nr .LT. m ) .AND. .NOT.(wntuf))
THEN
1273 CALL dlaset(
'A', m-nr,nr, zero,zero, u(nr+1,1), ldu)
1274 IF ( nr .LT. n1 )
THEN
1275 CALL dlaset(
'A',nr,n1-nr,zero,zero,u(1,nr+1),ldu)
1276 CALL dlaset(
'A',m-nr,n1-nr,zero,one,
1277 $ u(nr+1,nr+1), ldu )
1291 IF ( optratio * nr .GT. n )
THEN
1292 CALL dlacpy(
'U', nr, n, a, lda, v, ldv )
1294 $
CALL dlaset(
'L', nr-1,nr-1, zero,zero, v(2,1),ldv)
1297 CALL dlaset(
'A', n-nr,n, zero,zero, v(nr+1,1),ldv)
1298 CALL dgesvd(
'S',
'O', n, n, v, ldv, s, u, ldu,
1299 $ v, ldv, work(n+1), lwork-n, info )
1300 CALL dlapmt( .false., n, n, v, ldv, iwork )
1306 IF ( ( n .LT. m ) .AND. .NOT.(wntuf))
THEN
1307 CALL dlaset(
'A',m-n,n,zero,zero,u(n+1,1),ldu)
1308 IF ( n .LT. n1 )
THEN
1309 CALL dlaset(
'A',n,n1-n,zero,zero,u(1,n+1),ldu)
1310 CALL dlaset(
'A',m-n,n1-n,zero,one,
1315 CALL dlacpy(
'U', nr, n, a, lda, u(nr+1,1), ldu )
1317 $
CALL dlaset(
'L',nr-1,nr-1,zero,zero,u(nr+2,1),ldu)
1318 CALL dgelqf( nr, n, u(nr+1,1), ldu, work(n+1),
1319 $ work(n+nr+1), lwork-n-nr, ierr )
1320 CALL dlacpy(
'L',nr,nr,u(nr+1,1),ldu,v,ldv)
1322 $
CALL dlaset(
'U',nr-1,nr-1,zero,zero,v(1,2),ldv)
1323 CALL dgesvd(
'S',
'O', nr, nr, v, ldv, s, u, ldu,
1324 $ v, ldv, work(n+nr+1), lwork-n-nr, info )
1325 CALL dlaset(
'A',n-nr,nr,zero,zero,v(nr+1,1),ldv)
1326 CALL dlaset(
'A',nr,n-nr,zero,zero,v(1,nr+1),ldv)
1327 CALL dlaset(
'A',n-nr,n-nr,zero,one,v(nr+1,nr+1),ldv)
1328 CALL dormlq(
'R',
'N',n,n,nr,u(nr+1,1),ldu,work(n+1),
1329 $ v, ldv, work(n+nr+1),lwork-n-nr,ierr)
1330 CALL dlapmt( .false., n, n, v, ldv, iwork )
1333 IF ( ( nr .LT. m ) .AND. .NOT.(wntuf))
THEN
1334 CALL dlaset(
'A',m-nr,nr,zero,zero,u(nr+1,1),ldu)
1335 IF ( nr .LT. n1 )
THEN
1336 CALL dlaset(
'A',nr,n1-nr,zero,zero,u(1,nr+1),ldu)
1337 CALL dlaset(
'A',m-nr,n1-nr,zero,one,
1338 $ u(nr+1,nr+1), ldu )
1350 $
CALL dormqr(
'L',
'N', m, n1, n, a, lda, work, u,
1351 $ ldu, work(n+1), lwork-n, ierr )
1352 IF ( rowprm .AND. .NOT.wntuf )
1353 $
CALL dlaswp( n1, u, ldu, 1, m-1, iwork(n+1), -1 )
1361 DO 4001 q = p, 1, -1
1362 IF ( s(q) .GT. zero )
GO TO 4002
1369 IF ( nr .LT. n )
CALL dlaset(
'G', n-nr,1, zero,zero, s(nr+1), n )
1373 $
CALL dlascl(
'G',0,0, one,sqrt(dble(m)), nr,1, s, n, ierr )
1374 IF ( conda ) rwork(1) = sconda