414 SUBROUTINE sgesvdq( 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 REAL A( LDA, * ), U( LDU, * ), V( LDV, * ), WORK( * )
425 REAL S( * ), RWORK( * )
432 PARAMETER ( ZERO = 0.0e0, one = 1.0e0 )
435 INTEGER IERR, IWOFF, NR, N1, OPTRATIO, p, q
436 INTEGER LWCON, LWQP3, LWRK_SGELQF, LWRK_SGESVD, LWRK_SGESVD2,
437 $ lwrk_sgeqp3, lwrk_sgeqrf, lwrk_sormlq, lwrk_sormqr,
438 $ lwrk_sormqr2, lwlqf, lwqrf, lwsvd, lwsvd2, lworq,
439 $ lworq2, 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
457 REAL SLANGE, SNRM2, SLAMCH
458 EXTERNAL slange, lsame, isamax, snrm2, slamch
461 INTRINSIC abs, 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' )
490 iminwrk = max( 1, n + m - 1 + n )
492 iminwrk = max( 1, n + m - 1 )
494 rminwrk = max( 2, m )
497 iminwrk = max( 1, n + n )
499 iminwrk = max( 1, n )
503 lquery = (liwork .EQ. -1 .OR. lwork .EQ. -1 .OR. lrwork .EQ. -1)
505 IF ( .NOT. ( accla .OR. acclm .OR. acclh ) )
THEN
507 ELSE IF ( .NOT.( rowprm .OR. lsame( jobp,
'N' ) ) )
THEN
509 ELSE IF ( .NOT.( rtrans .OR. lsame( jobr,
'N' ) ) )
THEN
511 ELSE IF ( .NOT.( lsvec .OR. dntwu ) )
THEN
513 ELSE IF ( wntur .AND. wntva )
THEN
515 ELSE IF ( .NOT.( rsvec .OR. dntwv ))
THEN
517 ELSE IF ( m.LT.0 )
THEN
519 ELSE IF ( ( n.LT.0 ) .OR. ( n.GT.m ) )
THEN
521 ELSE IF ( lda.LT.max( 1, m ) )
THEN
523 ELSE IF ( ldu.LT.1 .OR. ( lsvc0 .AND. ldu.LT.m ) .OR.
524 $ ( wntuf .AND. ldu.LT.n ) )
THEN
526 ELSE IF ( ldv.LT.1 .OR. ( rsvec .AND. ldv.LT.n ) .OR.
527 $ ( conda .AND. ldv.LT.n ) )
THEN
529 ELSE IF ( liwork .LT. iminwrk .AND. .NOT. lquery )
THEN
534 IF ( info .EQ. 0 )
THEN
544 IF ( wntus .OR. wntur )
THEN
546 ELSE IF ( wntua )
THEN
552 lwsvd = max( 5 * n, 1 )
554 CALL sgeqp3( m, n, a, lda, iwork, rdummy, rdummy, -1,
556 lwrk_sgeqp3 = int( rdummy(1) )
557 IF ( wntus .OR. wntur )
THEN
558 CALL sormqr(
'L',
'N', m, n, n, a, lda, rdummy, u,
559 $ ldu, rdummy, -1, ierr )
560 lwrk_sormqr = int( rdummy(1) )
561 ELSE IF ( wntua )
THEN
562 CALL sormqr(
'L',
'N', m, m, n, a, lda, rdummy, u,
563 $ ldu, rdummy, -1, ierr )
564 lwrk_sormqr = int( rdummy(1) )
571 IF ( .NOT. (lsvec .OR. rsvec ))
THEN
575 minwrk = max( n+lwqp3, lwcon, lwsvd )
577 minwrk = max( n+lwqp3, lwsvd )
580 CALL sgesvd(
'N',
'N', n, n, a, lda, s, u, ldu,
581 $ v, ldv, rdummy, -1, ierr )
582 lwrk_sgesvd = int( rdummy(1) )
584 optwrk = max( n+lwrk_sgeqp3, n+lwcon, lwrk_sgesvd )
586 optwrk = max( n+lwrk_sgeqp3, lwrk_sgesvd )
589 ELSE IF ( lsvec .AND. (.NOT.rsvec) )
THEN
593 minwrk = n + max( lwqp3, lwcon, lwsvd, lworq )
595 minwrk = n + max( lwqp3, lwsvd, lworq )
599 CALL sgesvd(
'N',
'O', n, n, a, lda, s, u, ldu,
600 $ v, ldv, rdummy, -1, ierr )
602 CALL sgesvd(
'O',
'N', n, n, a, lda, s, u, ldu,
603 $ v, ldv, rdummy, -1, ierr )
605 lwrk_sgesvd = int( rdummy(1) )
607 optwrk = n + max( lwrk_sgeqp3, lwcon, lwrk_sgesvd,
610 optwrk = n + max( lwrk_sgeqp3, lwrk_sgesvd,
614 ELSE IF ( rsvec .AND. (.NOT.lsvec) )
THEN
618 minwrk = n + max( lwqp3, lwcon, lwsvd )
620 minwrk = n + max( lwqp3, lwsvd )
624 CALL sgesvd(
'O',
'N', n, n, a, lda, s, u, ldu,
625 $ v, ldv, rdummy, -1, ierr )
627 CALL sgesvd(
'N',
'O', n, n, a, lda, s, u, ldu,
628 $ v, ldv, rdummy, -1, ierr )
630 lwrk_sgesvd = int( rdummy(1) )
632 optwrk = n + max( lwrk_sgeqp3, lwcon, lwrk_sgesvd )
634 optwrk = n + max( lwrk_sgeqp3, lwrk_sgesvd )
641 minwrk = max( lwqp3, lwsvd, lworq )
642 IF ( conda ) minwrk = max( minwrk, lwcon )
646 lwqrf = max( n/2, 1 )
648 lwsvd2 = max( 5 * (n/2), 1 )
650 minwrk2 = max( lwqp3, n/2+lwqrf, n/2+lwsvd2,
651 $ n/2+lworq2, lworq )
652 IF ( conda ) minwrk2 = max( minwrk2, lwcon )
653 minwrk2 = n + minwrk2
654 minwrk = max( minwrk, minwrk2 )
657 minwrk = max( lwqp3, lwsvd, lworq )
658 IF ( conda ) minwrk = max( minwrk, lwcon )
662 lwlqf = max( n/2, 1 )
663 lwsvd2 = max( 5 * (n/2), 1 )
664 lwunlq = max( n , 1 )
665 minwrk2 = max( lwqp3, n/2+lwlqf, n/2+lwsvd2,
666 $ n/2+lwunlq, lworq )
667 IF ( conda ) minwrk2 = max( minwrk2, lwcon )
668 minwrk2 = n + minwrk2
669 minwrk = max( minwrk, minwrk2 )
674 CALL sgesvd(
'O',
'A', n, n, a, lda, s, u, ldu,
675 $ v, ldv, rdummy, -1, ierr )
676 lwrk_sgesvd = int( rdummy(1) )
677 optwrk = max(lwrk_sgeqp3,lwrk_sgesvd,lwrk_sormqr)
678 IF ( conda ) optwrk = max( optwrk, lwcon )
681 CALL sgeqrf(n,n/2,u,ldu,rdummy,rdummy,-1,ierr)
682 lwrk_sgeqrf = int( rdummy(1) )
683 CALL sgesvd(
'S',
'O', n/2,n/2, v,ldv, s, u,ldu,
684 $ v, ldv, rdummy, -1, ierr )
685 lwrk_sgesvd2 = int( rdummy(1) )
686 CALL sormqr(
'R',
'C', n, n, n/2, u, ldu, rdummy,
687 $ v, ldv, rdummy, -1, ierr )
688 lwrk_sormqr2 = int( rdummy(1) )
689 optwrk2 = max( lwrk_sgeqp3, n/2+lwrk_sgeqrf,
690 $ n/2+lwrk_sgesvd2, n/2+lwrk_sormqr2 )
691 IF ( conda ) optwrk2 = max( optwrk2, lwcon )
692 optwrk2 = n + optwrk2
693 optwrk = max( optwrk, optwrk2 )
696 CALL sgesvd(
'S',
'O', n, n, a, lda, s, u, ldu,
697 $ v, ldv, rdummy, -1, ierr )
698 lwrk_sgesvd = int( rdummy(1) )
699 optwrk = max(lwrk_sgeqp3,lwrk_sgesvd,lwrk_sormqr)
700 IF ( conda ) optwrk = max( optwrk, lwcon )
703 CALL sgelqf(n/2,n,u,ldu,rdummy,rdummy,-1,ierr)
704 lwrk_sgelqf = int( rdummy(1) )
705 CALL sgesvd(
'S',
'O', n/2,n/2, v, ldv, s, u, ldu,
706 $ v, ldv, rdummy, -1, ierr )
707 lwrk_sgesvd2 = int( rdummy(1) )
708 CALL sormlq(
'R',
'N', n, n, n/2, u, ldu, rdummy,
709 $ v, ldv, rdummy,-1,ierr )
710 lwrk_sormlq = int( rdummy(1) )
711 optwrk2 = max( lwrk_sgeqp3, n/2+lwrk_sgelqf,
712 $ n/2+lwrk_sgesvd2, n/2+lwrk_sormlq )
713 IF ( conda ) optwrk2 = max( optwrk2, lwcon )
714 optwrk2 = n + optwrk2
715 optwrk = max( optwrk, optwrk2 )
721 minwrk = max( 2, minwrk )
722 optwrk = max( 2, optwrk )
723 IF ( lwork .LT. minwrk .AND. (.NOT.lquery) ) info = -19
727 IF (info .EQ. 0 .AND. lrwork .LT. rminwrk .AND. .NOT. lquery)
THEN
731 CALL xerbla(
'SGESVDQ', -info )
733 ELSE IF ( lquery )
THEN
746 IF( ( m.EQ.0 ) .OR. ( n.EQ.0 ) )
THEN
762 rwork(p) = slange(
'M', 1, n, a(p,1), lda, rdummy )
764 IF ( ( rwork(p) .NE. rwork(p) ) .OR.
765 $ ( (rwork(p)*zero) .NE. zero ) )
THEN
767 CALL xerbla(
'SGESVDQ', -info )
772 q = isamax( m-p+1, rwork(p), 1 ) + p - 1
781 IF ( rwork(1) .EQ. zero )
THEN
784 CALL slaset(
'G', n, 1, zero, zero, s, n )
785 IF ( wntus )
CALL slaset(
'G', m, n, zero, one, u, ldu)
786 IF ( wntua )
CALL slaset(
'G', m, m, zero, one, u, ldu)
787 IF ( wntva )
CALL slaset(
'G', n, n, zero, one, v, ldv)
789 CALL slaset(
'G', n, 1, zero, zero, work, n )
790 CALL slaset(
'G', m, n, zero, one, u, ldu )
796 DO 5002 p = n + 1, n + m - 1
800 IF ( conda ) rwork(1) = -1
805 IF ( rwork(1) .GT. big / sqrt(real(m)) )
THEN
808 CALL slascl(
'G',0,0,sqrt(real(m)),one, m,n, a,lda, ierr)
811 CALL slaswp( n, a, lda, 1, m-1, iwork(n+1), 1 )
819 IF ( .NOT.rowprm )
THEN
820 rtmp = slange(
'M', m, n, a, lda, rdummy )
821 IF ( ( rtmp .NE. rtmp ) .OR.
822 $ ( (rtmp*zero) .NE. zero ) )
THEN
824 CALL xerbla(
'SGESVDQ', -info )
827 IF ( rtmp .GT. big / sqrt(real(m)) )
THEN
830 CALL slascl(
'G',0,0, sqrt(real(m)),one, m,n, a,lda, ierr)
844 CALL sgeqp3( m, n, a, lda, iwork, work, work(n+1), lwork-n,
863 rtmp = sqrt(real(n))*epsln
865 IF ( abs(a(p,p)) .LT. (rtmp*abs(a(1,1))) )
GO TO 3002
870 ELSEIF ( acclm )
THEN
879 IF ( ( abs(a(p,p)) .LT. (epsln*abs(a(p-1,p-1))) ) .OR.
880 $ ( abs(a(p,p)) .LT. sfmin ) )
GO TO 3402
892 IF ( abs(a(p,p)) .EQ. zero )
GO TO 3502
901 CALL slacpy(
'U', n, n, a, lda, v, ldv )
908 rtmp = snrm2( p, v(1,p), 1 )
909 CALL sscal( p, one/rtmp, v(1,p), 1 )
911 IF ( .NOT. ( lsvec .OR. rsvec ) )
THEN
912 CALL spocon(
'U', nr, v, ldv, one, rtmp,
913 $ work, iwork(n+iwoff), ierr )
915 CALL spocon(
'U', nr, v, ldv, one, rtmp,
916 $ work(n+1), iwork(n+iwoff), ierr )
918 sconda = one / sqrt(rtmp)
928 ELSE IF ( wntus .OR. wntuf)
THEN
930 ELSE IF ( wntua )
THEN
934 IF ( .NOT. ( rsvec .OR. lsvec ) )
THEN
943 DO 1146 p = 1, min( n, nr )
946 IF ( q .LE. nr ) a(p,q) = zero
950 CALL sgesvd(
'N',
'N', n, nr, a, lda, s, u, ldu,
951 $ v, ldv, work, lwork, info )
958 $
CALL slaset(
'L', nr-1,nr-1, zero,zero, a(2,1), lda )
959 CALL sgesvd(
'N',
'N', nr, n, a, lda, s, u, ldu,
960 $ v, ldv, work, lwork, info )
964 ELSE IF ( lsvec .AND. ( .NOT. rsvec) )
THEN
978 $
CALL slaset(
'U', nr-1,nr-1, zero,zero, u(1,2), ldu )
982 CALL sgesvd(
'N',
'O', n, nr, u, ldu, s, u, ldu,
983 $ u, ldu, work(n+1), lwork-n, info )
986 DO 1120 q = p + 1, nr
996 CALL slacpy(
'U', nr, n, a, lda, u, ldu )
998 $
CALL slaset(
'L', nr-1, nr-1, zero, zero, u(2,1), ldu )
1001 CALL sgesvd(
'O',
'N', nr, n, u, ldu, s, u, ldu,
1002 $ v, ldv, work(n+1), lwork-n, info )
1010 IF ( ( nr .LT. m ) .AND. ( .NOT.wntuf ) )
THEN
1011 CALL slaset(
'A', m-nr, nr, zero, zero, u(nr+1,1), ldu)
1012 IF ( nr .LT. n1 )
THEN
1013 CALL slaset(
'A',nr,n1-nr,zero,zero,u(1,nr+1), ldu )
1014 CALL slaset(
'A',m-nr,n1-nr,zero,one,
1015 $ u(nr+1,nr+1), ldu )
1023 $
CALL sormqr(
'L',
'N', m, n1, n, a, lda, work, u,
1024 $ ldu, work(n+1), lwork-n, ierr )
1025 IF ( rowprm .AND. .NOT.wntuf )
1026 $
CALL slaswp( n1, u, ldu, 1, m-1, iwork(n+1), -1 )
1028 ELSE IF ( rsvec .AND. ( .NOT. lsvec ) )
THEN
1041 $
CALL slaset(
'U', nr-1,nr-1, zero,zero, v(1,2), ldv )
1044 IF ( wntvr .OR. ( nr .EQ. n ) )
THEN
1045 CALL sgesvd(
'O',
'N', n, nr, v, ldv, s, u, ldu,
1046 $ u, ldu, work(n+1), lwork-n, info )
1049 DO 1122 q = p + 1, nr
1056 IF ( nr .LT. n )
THEN
1058 DO 1104 q = nr + 1, n
1063 CALL slapmt( .false., nr, n, v, ldv, iwork )
1070 CALL slaset(
'G', n, n-nr, zero, zero, v(1,nr+1), ldv)
1071 CALL sgesvd(
'O',
'N', n, n, v, ldv, s, u, ldu,
1072 $ u, ldu, work(n+1), lwork-n, info )
1075 DO 1124 q = p + 1, n
1081 CALL slapmt( .false., n, n, v, ldv, iwork )
1087 CALL slacpy(
'U', nr, n, a, lda, v, ldv )
1089 $
CALL slaset(
'L', nr-1, nr-1, zero, zero, v(2,1), ldv )
1092 IF ( wntvr .OR. ( nr .EQ. n ) )
THEN
1093 CALL sgesvd(
'N',
'O', nr, n, v, ldv, s, u, ldu,
1094 $ v, ldv, work(n+1), lwork-n, info )
1095 CALL slapmt( .false., nr, n, v, ldv, iwork )
1103 CALL slaset(
'G', n-nr, n, zero,zero, v(nr+1,1), ldv)
1104 CALL sgesvd(
'N',
'O', n, n, v, ldv, s, u, ldu,
1105 $ v, ldv, work(n+1), lwork-n, info )
1106 CALL slapmt( .false., n, n, v, ldv, iwork )
1120 IF ( wntvr .OR. ( nr .EQ. n ) )
THEN
1129 $
CALL slaset(
'U', nr-1,nr-1, zero,zero, v(1,2), ldv )
1133 CALL sgesvd(
'O',
'A', n, nr, v, ldv, s, v, ldv,
1134 $ u, ldu, work(n+1), lwork-n, info )
1137 DO 1116 q = p + 1, nr
1143 IF ( nr .LT. n )
THEN
1150 CALL slapmt( .false., nr, n, v, ldv, iwork )
1153 DO 1118 q = p + 1, nr
1160 IF ( ( nr .LT. m ) .AND. .NOT.(wntuf))
THEN
1161 CALL slaset(
'A', m-nr,nr, zero,zero, u(nr+1,1), ldu)
1162 IF ( nr .LT. n1 )
THEN
1163 CALL slaset(
'A',nr,n1-nr,zero,zero,u(1,nr+1),ldu)
1164 CALL slaset(
'A',m-nr,n1-nr,zero,one,
1165 $ u(nr+1,nr+1), ldu )
1179 IF ( optratio*nr .GT. n )
THEN
1186 $
CALL slaset(
'U',nr-1,nr-1, zero,zero, v(1,2),ldv)
1188 CALL slaset(
'A',n,n-nr,zero,zero,v(1,nr+1),ldv)
1189 CALL sgesvd(
'O',
'A', n, n, v, ldv, s, v, ldv,
1190 $ u, ldu, work(n+1), lwork-n, info )
1193 DO 1114 q = p + 1, n
1199 CALL slapmt( .false., n, n, v, ldv, iwork )
1204 DO 1112 q = p + 1, n
1211 IF ( ( n .LT. m ) .AND. .NOT.(wntuf))
THEN
1212 CALL slaset(
'A',m-n,n,zero,zero,u(n+1,1),ldu)
1213 IF ( n .LT. n1 )
THEN
1214 CALL slaset(
'A',n,n1-n,zero,zero,u(1,n+1),ldu)
1215 CALL slaset(
'A',m-n,n1-n,zero,one,
1228 $
CALL slaset(
'U',nr-1,nr-1,zero,zero,u(1,nr+2),ldu)
1229 CALL sgeqrf( n, nr, u(1,nr+1), ldu, work(n+1),
1230 $ work(n+nr+1), lwork-n-nr, ierr )
1236 CALL slaset(
'U',nr-1,nr-1,zero,zero,v(1,2),ldv)
1237 CALL sgesvd(
'S',
'O', nr, nr, v, ldv, s, u, ldu,
1238 $ v,ldv, work(n+nr+1),lwork-n-nr, info )
1239 CALL slaset(
'A',n-nr,nr,zero,zero,v(nr+1,1),ldv)
1240 CALL slaset(
'A',nr,n-nr,zero,zero,v(1,nr+1),ldv)
1241 CALL slaset(
'A',n-nr,n-nr,zero,one,v(nr+1,nr+1),ldv)
1242 CALL sormqr(
'R',
'C', n, n, nr, u(1,nr+1), ldu,
1243 $ work(n+1),v,ldv,work(n+nr+1),lwork-n-nr,ierr)
1244 CALL slapmt( .false., n, n, v, ldv, iwork )
1247 IF ( ( nr .LT. m ) .AND. .NOT.(wntuf))
THEN
1248 CALL slaset(
'A',m-nr,nr,zero,zero,u(nr+1,1),ldu)
1249 IF ( nr .LT. n1 )
THEN
1250 CALL slaset(
'A',nr,n1-nr,zero,zero,u(1,nr+1),ldu)
1251 CALL slaset(
'A',m-nr,n1-nr,zero,one,
1262 IF ( wntvr .OR. ( nr .EQ. n ) )
THEN
1264 CALL slacpy(
'U', nr, n, a, lda, v, ldv )
1266 $
CALL slaset(
'L', nr-1,nr-1, zero,zero, v(2,1), ldv )
1269 CALL sgesvd(
'S',
'O', nr, n, v, ldv, s, u, ldu,
1270 $ v, ldv, work(n+1), lwork-n, info )
1271 CALL slapmt( .false., nr, n, v, ldv, iwork )
1275 IF ( ( nr .LT. m ) .AND. .NOT.(wntuf))
THEN
1276 CALL slaset(
'A', m-nr,nr, zero,zero, u(nr+1,1), ldu)
1277 IF ( nr .LT. n1 )
THEN
1278 CALL slaset(
'A',nr,n1-nr,zero,zero,u(1,nr+1),ldu)
1279 CALL slaset(
'A',m-nr,n1-nr,zero,one,
1280 $ u(nr+1,nr+1), ldu )
1294 IF ( optratio * nr .GT. n )
THEN
1295 CALL slacpy(
'U', nr, n, a, lda, v, ldv )
1297 $
CALL slaset(
'L', nr-1,nr-1, zero,zero, v(2,1),ldv)
1300 CALL slaset(
'A', n-nr,n, zero,zero, v(nr+1,1),ldv)
1301 CALL sgesvd(
'S',
'O', n, n, v, ldv, s, u, ldu,
1302 $ v, ldv, work(n+1), lwork-n, info )
1303 CALL slapmt( .false., n, n, v, ldv, iwork )
1309 IF ( ( n .LT. m ) .AND. .NOT.(wntuf))
THEN
1310 CALL slaset(
'A',m-n,n,zero,zero,u(n+1,1),ldu)
1311 IF ( n .LT. n1 )
THEN
1312 CALL slaset(
'A',n,n1-n,zero,zero,u(1,n+1),ldu)
1313 CALL slaset(
'A',m-n,n1-n,zero,one,
1318 CALL slacpy(
'U', nr, n, a, lda, u(nr+1,1), ldu )
1320 $
CALL slaset(
'L',nr-1,nr-1,zero,zero,u(nr+2,1),ldu)
1321 CALL sgelqf( nr, n, u(nr+1,1), ldu, work(n+1),
1322 $ work(n+nr+1), lwork-n-nr, ierr )
1323 CALL slacpy(
'L',nr,nr,u(nr+1,1),ldu,v,ldv)
1325 $
CALL slaset(
'U',nr-1,nr-1,zero,zero,v(1,2),ldv)
1326 CALL sgesvd(
'S',
'O', nr, nr, v, ldv, s, u, ldu,
1327 $ v, ldv, work(n+nr+1), lwork-n-nr, info )
1328 CALL slaset(
'A',n-nr,nr,zero,zero,v(nr+1,1),ldv)
1329 CALL slaset(
'A',nr,n-nr,zero,zero,v(1,nr+1),ldv)
1330 CALL slaset(
'A',n-nr,n-nr,zero,one,v(nr+1,nr+1),ldv)
1331 CALL sormlq(
'R',
'N',n,n,nr,u(nr+1,1),ldu,work(n+1),
1332 $ v, ldv, work(n+nr+1),lwork-n-nr,ierr)
1333 CALL slapmt( .false., n, n, v, ldv, iwork )
1336 IF ( ( nr .LT. m ) .AND. .NOT.(wntuf))
THEN
1337 CALL slaset(
'A',m-nr,nr,zero,zero,u(nr+1,1),ldu)
1338 IF ( nr .LT. n1 )
THEN
1339 CALL slaset(
'A',nr,n1-nr,zero,zero,u(1,nr+1),ldu)
1340 CALL slaset(
'A',m-nr,n1-nr,zero,one,
1341 $ u(nr+1,nr+1), ldu )
1353 $
CALL sormqr(
'L',
'N', m, n1, n, a, lda, work, u,
1354 $ ldu, work(n+1), lwork-n, ierr )
1355 IF ( rowprm .AND. .NOT.wntuf )
1356 $
CALL slaswp( n1, u, ldu, 1, m-1, iwork(n+1), -1 )
1364 DO 4001 q = p, 1, -1
1365 IF ( s(q) .GT. zero )
GO TO 4002
1372 IF ( nr .LT. n )
CALL slaset(
'G', n-nr,1, zero,zero, s(nr+1), n )
1376 $
CALL slascl(
'G',0,0, one,sqrt(real(m)), nr,1, s, n, ierr )
1377 IF ( conda ) rwork(1) = sconda