473 SUBROUTINE dgejsv( JOBA, JOBU, JOBV, JOBR, JOBT, JOBP,
474 $ M, N, A, LDA, SVA, U, LDU, V, LDV,
475 $ WORK, LWORK, IWORK, INFO )
483 INTEGER INFO, LDA, LDU, LDV, LWORK, M, N
486 DOUBLE PRECISION A( LDA, * ), SVA( N ), U( LDU, * ), V( LDV, * ),
489 CHARACTER*1 JOBA, JOBP, JOBR, JOBT, JOBU, JOBV
495 DOUBLE PRECISION , ONE
496 PARAMETER ( ZERO = 0.0d0, one = 1.0d0 )
499 DOUBLE PRECISION AAPP, AAQQ, AATMAX, AATMIN, BIG, BIG1, COND_OK,
500 $ CONDR1, CONDR2, ENTRA, ENTRAT, EPSLN, MAXPRJ, SCALEM,
501 $ sconda, sfmin, small, temp1, uscal1, uscal2, xsc
502 INTEGER IERR, N1, NR, NUMRANK, p, q, WARNING
503 LOGICAL ALMORT, DEFR, ERREST, GOSCAL, JRACC, KILL, LSVEC,
504 $ l2aber, l2kill, l2pert, l2rank, l2tran,
505 $ noscal, rowpiv, rsvec, transp
508 INTRINSIC dabs, dlog,
max,
min, dble, idnint, dsign, dsqrt
511 DOUBLE PRECISION DLAMCH, DNRM2
514 EXTERNAL idamax, lsame, dlamch, dnrm2
526 lsvec = lsame( jobu,
'U' ) .OR. lsame( jobu,
'F' )
527 jracc = lsame( jobv,
'J' )
528 rsvec = lsame( jobv,
'V' ) .OR. jracc
529 rowpiv = lsame( joba,
'F' ) .OR. lsame( joba,
'G' )
530 l2rank = lsame( joba,
'R' )
531 l2aber = lsame( joba,
'A' )
532 errest = lsame( joba,
'E' ) .OR. lsame( joba,
'G' )
533 l2tran = lsame( jobt,
'T' )
534 l2kill = lsame( jobr,
'R' )
535 defr = lsame( jobr,
'N' )
536 l2pert = lsame( jobp,
'P' )
538 IF ( .NOT.(rowpiv .OR. l2rank .OR. l2aber .OR.
539 $ errest .OR. lsame( joba,
'C' ) ))
THEN
541 ELSE IF ( .NOT.( lsvec .OR. lsame( jobu,
'N' ) .OR.
542 $ lsame( jobu,
'W' )) )
THEN
544 ELSE IF ( .NOT.( rsvec .OR. lsame( jobv,
'N' ) .OR.
545 $ lsame( jobv,
'W' )) .OR. ( jracc .AND. (.NOT.lsvec) ) )
THEN
547 ELSE IF ( .NOT. ( l2kill .OR. defr ) )
THEN
549 ELSE IF ( .NOT. ( l2tran .OR. lsame( jobt,
'N' ) ) )
THEN
551 ELSE IF ( .NOT. ( l2pert .OR. lsame( jobp,
'N' ) ) )
THEN
553 ELSE IF ( m .LT. 0 )
THEN
555 ELSE IF ( ( n .LT. 0 ) .OR. ( n .GT. m ) )
THEN
557 ELSE IF ( lda .LT. m )
THEN
559 ELSE IF ( lsvec .AND. ( ldu .LT. m ) )
THEN
561 ELSE IF ( rsvec .AND. ( ldv .LT. n ) )
THEN
563 ELSE IF ( (.NOT.(lsvec .OR. rsvec .OR. errest).AND.
564 & (lwork .LT.
max(7,4*n+1,2*m+n))) .OR.
565 & (.NOT.(lsvec .OR. rsvec) .AND. errest .AND.
566 & (lwork .LT.
max(7,4*n+n*n,2*m+n))) .OR.
567 & (lsvec .AND. (.NOT.rsvec) .AND. (lwork .LT.
max(7,2*m+n,4*n+1)))
569 & (rsvec .AND. (.NOT.lsvec) .AND. (lwork .LT.
max(7,2*m+n,4*n+1)))
571 & (lsvec .AND. rsvec .AND. (.NOT.jracc) .AND.
572 & (lwork.LT.
max(2*m+n,6*n+2*n*n)))
573 & .OR. (lsvec .AND. rsvec .AND. jracc .AND.
574 & lwork.LT.
max(2*m+n,4*n+n*n,2*n+n*n+6)))
582 IF ( info .NE. 0 )
THEN
584 CALL xerbla(
'DGEJSV', - info )
590 IF ( ( m .EQ. 0 ) .OR. ( n .EQ. 0 ) )
THEN
600 IF ( lsame( jobu,
'F' ) ) n1 = m
607 epsln = dlamch(
'Epsilon')
608 sfmin = dlamch(
'SafeMinimum')
609 small = sfmin / epsln
619 scalem = one / dsqrt(dble(m)*dble(n))
625 CALL dlassq( m, a(1,p), 1, aapp, aaqq )
626 IF ( aapp .GT. big )
THEN
628 CALL xerbla(
'DGEJSV', -info )
632 IF ( ( aapp .LT. (big / aaqq) ) .AND. noscal )
THEN
636 sva(p) = aapp * ( aaqq * scalem )
639 CALL dscal( p-1, scalem, sva, 1 )
644 IF ( noscal ) scalem = one
649 aapp =
max( aapp, sva(p) )
650 IF ( sva(p) .NE. zero ) aaqq =
min( aaqq, sva(p) )
655 IF ( aapp .EQ. zero )
THEN
656 IF ( lsvec )
CALL dlaset(
'G', m, n1, zero, one, u, ldu )
657 IF ( rsvec )
CALL dlaset(
'G', n, n, zero, one, v, ldv )
660 IF ( errest ) work(3) = one
661 IF ( lsvec .AND. rsvec )
THEN
680 IF ( aaqq .LE. sfmin )
THEN
691 CALL dlascl(
'G',0,0,sva(1),scalem, m,1,a(1,1),lda,ierr )
692 CALL dlacpy(
'A', m, 1, a, lda, u, ldu )
694 IF ( n1 .NE. n )
THEN
695 CALL dgeqrf( m, n, u,ldu, work, work(n+1),lwork-n,ierr )
696 CALL dorgqr( m,n1,1, u,ldu,work,work(n+1),lwork-n,ierr )
697 CALL dcopy( m, a(1,1), 1, u(1,1), 1 )
703 IF ( sva(1) .LT. (big*scalem) )
THEN
704 sva(1) = sva(1) / scalem
707 work(1) = one / scalem
709 IF ( sva(1) .NE. zero )
THEN
711 IF ( ( sva(1) / scalem) .GE. sfmin )
THEN
721 IF ( errest ) work(3) = one
722 IF ( lsvec .AND. rsvec )
THEN
735 l2tran = l2tran .AND. ( m .EQ. n )
739 IF ( rowpiv .OR. l2tran )
THEN
750 CALL dlassq( n, a(p,1), lda, xsc, temp1 )
753 work(m+n+p) = xsc * scalem
754 work(n+p) = xsc * (scalem*dsqrt(temp1))
755 aatmax =
max( aatmax, work(n+p) )
756 IF (work(n+p) .NE. zero) aatmin =
min(aatmin,work(n+p))
760 work(m+n+p) = scalem*dabs( a(p,idamax(n,a(p,1),lda)) )
761 aatmax =
max( aatmax, work(m+n+p) )
762 aatmin =
min( aatmin, work(m+n+p) )
781 CALL dlassq( n, sva, 1, xsc, temp1 )
786 big1 = ( ( sva(p) / xsc )**2 ) * temp1
787 IF ( big1 .NE. zero ) entra = entra + big1 * dlog(big1)
789 entra = - entra / dlog(dble(n))
799 big1 = ( ( work(p) / xsc )**2 ) * temp1
800 IF ( big1 .NE. zero ) entrat = entrat + big1 * dlog(big1)
802 entrat = - entrat / dlog(dble(m))
807 transp = ( entrat .LT. entra )
853 temp1 = dsqrt( big / dble(n) )
855 CALL dlascl(
'G', 0, 0, aapp, temp1, n, 1, sva, n, ierr )
856 IF ( aaqq .GT. (aapp * sfmin) )
THEN
857 aaqq = ( aaqq / aapp ) * temp1
859 aaqq = ( aaqq * temp1 ) / aapp
861 temp1 = temp1 * scalem
862 CALL dlascl(
'G', 0, 0, aapp, temp1, m, n, a, lda, ierr )
886 IF ( ( aaqq.LT.dsqrt(sfmin) ) .AND. lsvec .AND. rsvec )
THEN
891 IF ( aaqq .LT. xsc )
THEN
893 IF ( sva(p) .LT. xsc )
THEN
894 CALL dlaset(
'A', m, 1, zero, zero, a(1,p), lda )
909 q = idamax( m-p+1, work(m+n+p), 1 ) + p - 1
913 work(m+n+p) = work(m+n+q)
917 CALL dlaswp( n, a, lda, 1, m-1, iwork(2*n+1), 1 )
939 CALL dgeqp3( m,n,a,lda, iwork,work, work(n+1),lwork-n, ierr )
955 temp1 = dsqrt(dble(n))*epsln
957 IF ( dabs(a(p,p)) .GE. (temp1*dabs(a(1,1))) )
THEN
964 ELSE IF ( l2rank )
THEN
970 IF ( ( dabs(a(p,p)) .LT. (epsln*dabs(a(p-1,p-1))) ) .OR.
971 $ ( dabs(a(p,p)) .LT. small ) .OR.
972 $ ( l2kill .AND. (dabs(a(p,p)) .LT. temp1) ) )
GO TO 3402
987 IF ( ( dabs(a(p,p)) .LT. small ) .OR.
988 $ ( l2kill .AND. (dabs(a(p,p)) .LT. temp1) ) )
GO TO 3302
996 IF ( nr .EQ. n )
THEN
999 temp1 = dabs(a(p,p)) / sva(iwork(p))
1000 maxprj =
min( maxprj, temp1 )
1002 IF ( maxprj**2 .GE. one - dble(n)*epsln ) almort = .true.
1011 IF ( n .EQ. nr )
THEN
1014 CALL dlacpy(
'U', n, n, a, lda, v, ldv )
1016 temp1 = sva(iwork(p))
1017 CALL dscal( p, one/temp1, v(1,p), 1 )
1019 CALL dpocon(
'U', n, v, ldv, one, temp1,
1020 $ work(n+1), iwork(2*n+m+1), ierr )
1021 ELSE IF ( lsvec )
THEN
1023 CALL dlacpy(
'U', n, n, a, lda, u, ldu )
1025 temp1 = sva(iwork(p))
1026 CALL dscal( p, one/temp1, u(1,p), 1 )
1028 CALL dpocon(
'U', n, u, ldu, one, temp1,
1029 $ work(n+1), iwork(2*n+m+1), ierr )
1031 CALL dlacpy(
'U', n, n, a, lda, work(n+1), n )
1033 temp1 = sva(iwork(p))
1034 CALL dscal( p, one/temp1, work(n+(p-1)*n+1), 1 )
1037 CALL dpocon(
'U', n, work(n+1), n, one, temp1,
1038 $ work(n+n*n+1), iwork(2*n+m+1), ierr )
1040 sconda = one / dsqrt(temp1)
1048 l2pert = l2pert .AND. ( dabs( a(1,1)/a(nr,nr) ) .GT. dsqrt(big1) )
1053 IF ( .NOT. ( rsvec .OR. lsvec ) )
THEN
1058 DO 1946 p = 1,
min( n-1, nr )
1059 CALL dcopy( n-p, a(p,p+1), lda, a(p+1,p), 1 )
1074 IF ( .NOT. almort )
THEN
1078 xsc = epsln / dble(n)
1080 temp1 = xsc*dabs(a(q,q))
1082 IF ( ( (p.GT.q) .AND. (dabs(a(p,q)).LE.temp1) )
1083 $ .OR. ( p .LT. q ) )
1084 $ a(p,q) = dsign( temp1, a(p,q) )
1088 CALL dlaset(
'U', nr-1,nr-1, zero,zero, a(1,2),lda )
1093 CALL dgeqrf( n,nr, a,lda, work, work(n+1),lwork-n, ierr )
1096 DO 1948 p = 1, nr - 1
1097 CALL dcopy( nr-p, a(p,p+1), lda, a(p+1,p), 1 )
1108 xsc = epsln / dble(n)
1110 temp1 = xsc*dabs(a(q,q))
1112 IF ( ( (p.GT.q) .AND. (dabs(a(p,q)).LE.temp1) )
1113 $ .OR. ( p .LT. q ) )
1114 $ a(p,q) = dsign( temp1, a(p,q) )
1118 CALL dlaset(
'U', nr-1, nr-1, zero, zero, a(1,2), lda )
1125 CALL dgesvj(
'L',
'NoU',
'NoV', nr, nr, a, lda, sva,
1126 $ n, v, ldv, work, lwork, info )
1129 numrank = idnint(work(2))
1132 ELSE IF ( rsvec .AND. ( .NOT. lsvec ) )
THEN
1140 CALL dcopy( n-p+1, a(p,p), lda, v(p,p), 1 )
1142 CALL dlaset(
'Upper', nr-1, nr-1, zero, zero, v(1,2), ldv )
1144 CALL dgesvj(
'L',
'U',
'N', n, nr, v,ldv, sva, nr, a,lda,
1145 $ work, lwork, info )
1147 numrank = idnint(work(2))
1154 CALL dlaset(
'Lower', nr-1, nr-1, zero, zero, a(2,1), lda )
1155 CALL dgelqf( nr, n, a, lda, work, work(n+1), lwork-n, ierr)
1156 CALL dlacpy(
'Lower', nr, nr, a, lda, v, ldv )
1157 CALL dlaset(
'Upper', nr-1, nr-1, zero, zero, v(1,2), ldv )
1158 CALL dgeqrf( nr, nr, v, ldv, work(n+1), work(2*n+1),
1161 CALL dcopy( nr-p+1, v(p,p), ldv, v(p,p), 1 )
1163 CALL dlaset(
'Upper', nr-1, nr-1, zero, zero, v(1,2), ldv )
1165 CALL dgesvj(
'Lower',
'U',
'N', nr, nr, v,ldv, sva, nr, u,
1166 $ ldu, work(n+1), lwork, info )
1168 numrank = idnint(work(n+2))
1169 IF ( nr .LT. n )
THEN
1170 CALL dlaset( 'a
',N-NR, NR, ZERO,ZERO, V(NR+1,1), LDV )
1171 CALL DLASET( 'a
',NR, N-NR, ZERO,ZERO, V(1,NR+1), LDV )
1172 CALL DLASET( 'a
',N-NR,N-NR,ZERO,ONE, V(NR+1,NR+1), LDV )
1175 CALL DORMLQ( 'left
', 'transpose
', N, N, NR, A, LDA, WORK,
1176 $ V, LDV, WORK(N+1), LWORK-N, IERR )
1181 CALL DCOPY( N, V(p,1), LDV, A(IWORK(p),1), LDA )
1183 CALL DLACPY( 'all
', N, N, A, LDA, V, LDV )
1186 CALL DLACPY( 'all
', N, N, V, LDV, U, LDU )
1189.AND..NOT.
ELSE IF ( LSVEC ( RSVEC ) ) THEN
1196 CALL DCOPY( N-p+1, A(p,p), LDA, U(p,p), 1 )
1198 CALL DLASET( 'upper
', NR-1, NR-1, ZERO, ZERO, U(1,2), LDU )
1200 CALL DGEQRF( N, NR, U, LDU, WORK(N+1), WORK(2*N+1),
1203 DO 1967 p = 1, NR - 1
1204 CALL DCOPY( NR-p, U(p,p+1), LDU, U(p+1,p), 1 )
1206 CALL DLASET( 'upper
', NR-1, NR-1, ZERO, ZERO, U(1,2), LDU )
1208 CALL DGESVJ( 'lower
', 'u
', 'n
', NR,NR, U, LDU, SVA, NR, A,
1209 $ LDA, WORK(N+1), LWORK-N, INFO )
1211 NUMRANK = IDNINT(WORK(N+2))
1213.LT.
IF ( NR M ) THEN
1214 CALL DLASET( 'a
', M-NR, NR,ZERO, ZERO, U(NR+1,1), LDU )
1215.LT.
IF ( NR N1 ) THEN
1216 CALL DLASET( 'a
',NR, N1-NR, ZERO, ZERO, U(1,NR+1), LDU )
1217 CALL DLASET( 'a
',M-NR,N1-NR,ZERO,ONE,U(NR+1,NR+1), LDU )
1221 CALL DORMQR( 'left
', 'no tr
', M, N1, N, A, LDA, WORK, U,
1222 $ LDU, WORK(N+1), LWORK-N, IERR )
1225 $ CALL DLASWP( N1, U, LDU, 1, M-1, IWORK(2*N+1), -1 )
1228 XSC = ONE / DNRM2( M, U(1,p), 1 )
1229 CALL DSCAL( M, XSC, U(1,p), 1 )
1233 CALL DLACPY( 'all
', N, N, U, LDU, V, LDV )
1240.NOT.
IF ( JRACC ) THEN
1242.NOT.
IF ( ALMORT ) THEN
1252 CALL DCOPY( N-p+1, A(p,p), LDA, V(p,p), 1 )
1270 TEMP1 = XSC*DABS( V(q,q) )
1272.GT..AND..LE.
IF ( ( p q ) ( DABS(V(p,q)) TEMP1 )
1274 $ V(p,q) = DSIGN( TEMP1, V(p,q) )
1275.LT.
IF ( p q ) V(p,q) = - V(p,q)
1279 CALL DLASET( 'u
', NR-1, NR-1, ZERO, ZERO, V(1,2), LDV )
1286 CALL DLACPY( 'l
', NR, NR, V, LDV, WORK(2*N+1), NR )
1288 TEMP1 = DNRM2(NR-p+1,WORK(2*N+(p-1)*NR+p),1)
1289 CALL DSCAL(NR-p+1,ONE/TEMP1,WORK(2*N+(p-1)*NR+p),1)
1291 CALL DPOCON('lower
',NR,WORK(2*N+1),NR,ONE,TEMP1,
1292 $ WORK(2*N+NR*NR+1),IWORK(M+2*N+1),IERR)
1293 CONDR1 = ONE / DSQRT(TEMP1)
1299 COND_OK = DSQRT(DBLE(NR))
1302.LT.
IF ( CONDR1 COND_OK ) THEN
1307 CALL DGEQRF( N, NR, V, LDV, WORK(N+1), WORK(2*N+1),
1311 XSC = DSQRT(SMALL)/EPSLN
1313 DO 3958 q = 1, p - 1
1314 TEMP1 = XSC * MIN(DABS(V(p,p)),DABS(V(q,q)))
1315.LE.
IF ( DABS(V(q,p)) TEMP1 )
1316 $ V(q,p) = DSIGN( TEMP1, V(q,p) )
1322 $ CALL DLACPY( 'a
', N, NR, V, LDV, WORK(2*N+1), N )
1326 DO 1969 p = 1, NR - 1
1327 CALL DCOPY( NR-p, V(p,p+1), LDV, V(p+1,p), 1 )
1345 CALL DGEQP3( N, NR, V, LDV, IWORK(N+1), WORK(N+1),
1346 $ WORK(2*N+1), LWORK-2*N, IERR )
1352 DO 3968 q = 1, p - 1
1353 TEMP1 = XSC * MIN(DABS(V(p,p)),DABS(V(q,q)))
1354.LE.
IF ( DABS(V(q,p)) TEMP1 )
1355 $ V(q,p) = DSIGN( TEMP1, V(q,p) )
1360 CALL DLACPY( 'a
', N, NR, V, LDV, WORK(2*N+1), N )
1365 DO 8971 q = 1, p - 1
1366 TEMP1 = XSC * MIN(DABS(V(p,p)),DABS(V(q,q)))
1367 V(p,q) = - DSIGN( TEMP1, V(q,p) )
1371 CALL DLASET( 'l
',NR-1,NR-1,ZERO,ZERO,V(2,1),LDV )
1374 CALL DGELQF( NR, NR, V, LDV, WORK(2*N+N*NR+1),
1375 $ WORK(2*N+N*NR+NR+1), LWORK-2*N-N*NR-NR, IERR )
1377 CALL DLACPY( 'l
',NR,NR,V,LDV,WORK(2*N+N*NR+NR+1),NR )
1379 TEMP1 = DNRM2( p, WORK(2*N+N*NR+NR+p), NR )
1380 CALL DSCAL( p, ONE/TEMP1, WORK(2*N+N*NR+NR+p), NR )
1382 CALL DPOCON( 'l
',NR,WORK(2*N+N*NR+NR+1),NR,ONE,TEMP1,
1383 $ WORK(2*N+N*NR+NR+NR*NR+1),IWORK(M+2*N+1),IERR )
1384 CONDR2 = ONE / DSQRT(TEMP1)
1386.GE.
IF ( CONDR2 COND_OK ) THEN
1391 CALL DLACPY( 'u
', NR, NR, V, LDV, WORK(2*N+1), N )
1401 TEMP1 = XSC * V(q,q)
1402 DO 4969 p = 1, q - 1
1404 V(p,q) = - DSIGN( TEMP1, V(p,q) )
1408 CALL DLASET( 'u
', NR-1,NR-1, ZERO,ZERO, V(1,2), LDV )
1417.LT.
IF ( CONDR1 COND_OK ) THEN
1419 CALL DGESVJ( 'l
','u
','n
',NR,NR,V,LDV,SVA,NR,U,
1420 $ LDU,WORK(2*N+N*NR+NR+1),LWORK-2*N-N*NR-NR,INFO )
1421 SCALEM = WORK(2*N+N*NR+NR+1)
1422 NUMRANK = IDNINT(WORK(2*N+N*NR+NR+2))
1424 CALL DCOPY( NR, V(1,p), 1, U(1,p), 1 )
1425 CALL DSCAL( NR, SVA(p), V(1,p), 1 )
1430.EQ.
IF ( NR N ) THEN
1435 CALL DTRSM( 'l
','u
','n
','n
', NR,NR,ONE, A,LDA, V,LDV )
1441 CALL DTRSM('l
','u
','t
','n
',NR,NR,ONE,WORK(2*N+1),
1443.LT.
IF ( NR N ) THEN
1444 CALL DLASET('a
',N-NR,NR,ZERO,ZERO,V(NR+1,1),LDV)
1445 CALL DLASET('a
',NR,N-NR,ZERO,ZERO,V(1,NR+1),LDV)
1446 CALL DLASET('a
',N-NR,N-NR,ZERO,ONE,V(NR+1,NR+1),LDV)
1448 CALL DORMQR('l
','n
',N,N,NR,WORK(2*N+1),N,WORK(N+1),
1449 $ V,LDV,WORK(2*N+N*NR+NR+1),LWORK-2*N-N*NR-NR,IERR)
1452.LT.
ELSE IF ( CONDR2 COND_OK ) THEN
1460 CALL DGESVJ( 'l
', 'u
', 'n
', NR, NR, V, LDV, SVA, NR, U,
1461 $ LDU, WORK(2*N+N*NR+NR+1), LWORK-2*N-N*NR-NR, INFO )
1462 SCALEM = WORK(2*N+N*NR+NR+1)
1463 NUMRANK = IDNINT(WORK(2*N+N*NR+NR+2))
1465 CALL DCOPY( NR, V(1,p), 1, U(1,p), 1 )
1466 CALL DSCAL( NR, SVA(p), U(1,p), 1 )
1468 CALL DTRSM('l
','u
','n
','n
',NR,NR,ONE,WORK(2*N+1),N,U,LDU)
1472 WORK(2*N+N*NR+NR+IWORK(N+p)) = U(p,q)
1475 U(p,q) = WORK(2*N+N*NR+NR+p)
1478.LT.
IF ( NR N ) THEN
1479 CALL DLASET( 'a
',N-NR,NR,ZERO,ZERO,V(NR+1,1),LDV )
1480 CALL DLASET( 'a
',NR,N-NR,ZERO,ZERO,V(1,NR+1),LDV )
1481 CALL DLASET( 'a
',N-NR,N-NR,ZERO,ONE,V(NR+1,NR+1),LDV )
1483 CALL DORMQR( 'l
','n
',N,N,NR,WORK(2*N+1),N,WORK(N+1),
1484 $ V,LDV,WORK(2*N+N*NR+NR+1),LWORK-2*N-N*NR-NR,IERR )
1497 CALL DGESVJ( 'l
', 'u
', 'v
', NR, NR, V, LDV, SVA, NR, U,
1498 $ LDU, WORK(2*N+N*NR+NR+1), LWORK-2*N-N*NR-NR, INFO )
1499 SCALEM = WORK(2*N+N*NR+NR+1)
1500 NUMRANK = IDNINT(WORK(2*N+N*NR+NR+2))
1501.LT.
IF ( NR N ) THEN
1502 CALL DLASET( 'a
',N-NR,NR,ZERO,ZERO,V(NR+1,1),LDV )
1503 CALL DLASET( 'a
',NR,N-NR,ZERO,ZERO,V(1,NR+1),LDV )
1504 CALL DLASET( 'a
',N-NR,N-NR,ZERO,ONE,V(NR+1,NR+1),LDV )
1506 CALL DORMQR( 'l
','n
',N,N,NR,WORK(2*N+1),N,WORK(N+1),
1507 $ V,LDV,WORK(2*N+N*NR+NR+1),LWORK-2*N-N*NR-NR,IERR )
1509 CALL DORMLQ( 'l
', 't
', NR, NR, NR, WORK(2*N+1), N,
1510 $ WORK(2*N+N*NR+1), U, LDU, WORK(2*N+N*NR+NR+1),
1511 $ LWORK-2*N-N*NR-NR, IERR )
1514 WORK(2*N+N*NR+NR+IWORK(N+p)) = U(p,q)
1517 U(p,q) = WORK(2*N+N*NR+NR+p)
1527 TEMP1 = DSQRT(DBLE(N)) * EPSLN
1530 WORK(2*N+N*NR+NR+IWORK(p)) = V(p,q)
1533 V(p,q) = WORK(2*N+N*NR+NR+p)
1535 XSC = ONE / DNRM2( N, V(1,q), 1 )
1536.LT..OR..GT.
IF ( (XSC (ONE-TEMP1)) (XSC (ONE+TEMP1)) )
1537 $ CALL DSCAL( N, XSC, V(1,q), 1 )
1541.LT.
IF ( NR M ) THEN
1542 CALL DLASET( 'a
', M-NR, NR, ZERO, ZERO, U(NR+1,1), LDU )
1543.LT.
IF ( NR N1 ) THEN
1544 CALL DLASET('a
',NR,N1-NR,ZERO,ZERO,U(1,NR+1),LDU)
1545 CALL DLASET('a
',M-NR,N1-NR,ZERO,ONE,U(NR+1,NR+1),LDU)
1552 CALL DORMQR( 'left
', 'no_tr
', M, N1, N, A, LDA, WORK, U,
1553 $ LDU, WORK(N+1), LWORK-N, IERR )
1556 TEMP1 = DSQRT(DBLE(M)) * EPSLN
1558 XSC = ONE / DNRM2( M, U(1,p), 1 )
1559.LT..OR..GT.
IF ( (XSC (ONE-TEMP1)) (XSC (ONE+TEMP1)) )
1560 $ CALL DSCAL( M, XSC, U(1,p), 1 )
1567 $ CALL DLASWP( N1, U, LDU, 1, M-1, IWORK(2*N+1), -1 )
1574 CALL DLACPY( 'upper
', N, N, A, LDA, WORK(N+1), N )
1578 TEMP1 = XSC * WORK( N + (p-1)*N + p )
1579 DO 5971 q = 1, p - 1
1580 WORK(N+(q-1)*N+p)=-DSIGN(TEMP1,WORK(N+(p-1)*N+q))
1584 CALL DLASET( 'lower
',N-1,N-1,ZERO,ZERO,WORK(N+2),N )
1587 CALL DGESVJ( 'upper
', 'u
', 'n
', N, N, WORK(N+1), N, SVA,
1588 $ N, U, LDU, WORK(N+N*N+1), LWORK-N-N*N, INFO )
1590 SCALEM = WORK(N+N*N+1)
1591 NUMRANK = IDNINT(WORK(N+N*N+2))
1593 CALL DCOPY( N, WORK(N+(p-1)*N+1), 1, U(1,p), 1 )
1594 CALL DSCAL( N, SVA(p), WORK(N+(p-1)*N+1), 1 )
1597 CALL DTRSM( 'left
', 'upper
', 'notrans
', 'no ud
', N, N,
1598 $ ONE, A, LDA, WORK(N+1), N )
1600 CALL DCOPY( N, WORK(N+p), N, V(IWORK(p),1), LDV )
1602 TEMP1 = DSQRT(DBLE(N))*EPSLN
1604 XSC = ONE / DNRM2( N, V(1,p), 1 )
1605.LT..OR..GT.
IF ( (XSC (ONE-TEMP1)) (XSC (ONE+TEMP1)) )
1606 $ CALL DSCAL( N, XSC, V(1,p), 1 )
1612 CALL DLASET( 'a
', M-N, N, ZERO, ZERO, U(N+1,1), LDU )
1613.LT.
IF ( N N1 ) THEN
1614 CALL DLASET( 'a
',N, N1-N, ZERO, ZERO, U(1,N+1),LDU )
1615 CALL DLASET( 'a
',M-N,N1-N, ZERO, ONE,U(N+1,N+1),LDU )
1618 CALL DORMQR( 'left
', 'no tr
', M, N1, N, A, LDA, WORK, U,
1619 $ LDU, WORK(N+1), LWORK-N, IERR )
1620 TEMP1 = DSQRT(DBLE(M))*EPSLN
1622 XSC = ONE / DNRM2( M, U(1,p), 1 )
1623.LT..OR..GT.
IF ( (XSC (ONE-TEMP1)) (XSC (ONE+TEMP1)) )
1624 $ CALL DSCAL( M, XSC, U(1,p), 1 )
1628 $ CALL DLASWP( N1, U, LDU, 1, M-1, IWORK(2*N+1), -1 )
1647 CALL DCOPY( N-p+1, A(p,p), LDA, V(p,p), 1 )
1651 XSC = DSQRT(SMALL/EPSLN)
1653 TEMP1 = XSC*DABS( V(q,q) )
1655.GT..AND..LE.
IF ( ( p q ) ( DABS(V(p,q)) TEMP1 )
1657 $ V(p,q) = DSIGN( TEMP1, V(p,q) )
1658.LT.
IF ( p q ) V(p,q) = - V(p,q)
1662 CALL DLASET( 'u
', NR-1, NR-1, ZERO, ZERO, V(1,2), LDV )
1665 CALL DGEQRF( N, NR, V, LDV, WORK(N+1), WORK(2*N+1),
1667 CALL DLACPY( 'l
', N, NR, V, LDV, WORK(2*N+1), N )
1670 CALL DCOPY( NR-p+1, V(p,p), LDV, U(p,p), 1 )
1674 XSC = DSQRT(SMALL/EPSLN)
1676 DO 9971 p = 1, q - 1
1677 TEMP1 = XSC * MIN(DABS(U(p,p)),DABS(U(q,q)))
1678 U(p,q) = - DSIGN( TEMP1, U(q,p) )
1682 CALL DLASET('u
', NR-1, NR-1, ZERO, ZERO, U(1,2), LDU )
1685 CALL DGESVJ( 'g
', 'u
', 'v
', NR, NR, U, LDU, SVA,
1686 $ N, V, LDV, WORK(2*N+N*NR+1), LWORK-2*N-N*NR, INFO )
1687 SCALEM = WORK(2*N+N*NR+1)
1688 NUMRANK = IDNINT(WORK(2*N+N*NR+2))
1690.LT.
IF ( NR N ) THEN
1691 CALL DLASET( 'a
',N-NR,NR,ZERO,ZERO,V(NR+1,1),LDV )
1692 CALL DLASET( 'a
',NR,N-NR,ZERO,ZERO,V(1,NR+1),LDV )
1693 CALL DLASET( 'a
',N-NR,N-NR,ZERO,ONE,V(NR+1,NR+1),LDV )
1696 CALL DORMQR( 'l
','n
',N,N,NR,WORK(2*N+1),N,WORK(N+1),
1697 $ V,LDV,WORK(2*N+N*NR+NR+1),LWORK-2*N-N*NR-NR,IERR )
1703 TEMP1 = DSQRT(DBLE(N)) * EPSLN
1706 WORK(2*N+N*NR+NR+IWORK(p)) = V(p,q)
1709 V(p,q) = WORK(2*N+N*NR+NR+p)
1711 XSC = ONE / DNRM2( N, V(1,q), 1 )
1712.LT..OR..GT.
IF ( (XSC (ONE-TEMP1)) (XSC (ONE+TEMP1)) )
1713 $ CALL DSCAL( N, XSC, V(1,q), 1 )
1719.LT.
IF ( NR M ) THEN
1720 CALL DLASET( 'a
', M-NR, NR, ZERO, ZERO, U(NR+1,1), LDU )
1721.LT.
IF ( NR N1 ) THEN
1722 CALL DLASET( 'a
',NR, N1-NR, ZERO, ZERO, U(1,NR+1),LDU )
1723 CALL DLASET( 'a
',M-NR,N1-NR, ZERO, ONE,U(NR+1,NR+1),LDU )
1727 CALL DORMQR( 'left
', 'no tr
', M, N1, N, A, LDA, WORK, U,
1728 $ LDU, WORK(N+1), LWORK-N, IERR )
1731 $ CALL DLASWP( N1, U, LDU, 1, M-1, IWORK(2*N+1), -1 )
1738 CALL DSWAP( N, U(1,p), 1, V(1,p), 1 )
1747.LE.
IF ( USCAL2 (BIG/SVA(1))*USCAL1 ) THEN
1748 CALL DLASCL( 'g
', 0, 0, USCAL1, USCAL2, NR, 1, SVA, N, IERR )
1753.LT.
IF ( NR N ) THEN
1759 WORK(1) = USCAL2 * SCALEM
1761 IF ( ERREST ) WORK(3) = SCONDA
1762.AND.
IF ( LSVEC RSVEC ) THEN