55* Online html documentation available at
66* http://www.netlib.org/lapack/explore-html/
77*
8- * > \htmlonly
98* > Download SGEJSV + dependencies
109* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/sgejsv.f">
1110* > [TGZ]</a>
1211* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/sgejsv.f">
1312* > [ZIP]</a>
1413* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/sgejsv.f">
1514* > [TXT]</a>
16- * > \endhtmlonly
1715*
1816* Definition:
1917* ===========
2018*
2119* SUBROUTINE SGEJSV( JOBA, JOBU, JOBV, JOBR, JOBT, JOBP,
2220* M, N, A, LDA, SVA, U, LDU, V, LDV,
2321* WORK, LWORK, IWORK, INFO )
22+ * IMPLICIT NONE
2423*
2524* .. Scalar Arguments ..
26- * IMPLICIT NONE
2725* INTEGER INFO, LDA, LDU, LDV, LWORK, M, N
2826* ..
2927* .. Array Arguments ..
391389* > \author Univ. of Colorado Denver
392390* > \author NAG Ltd.
393391*
394- * > \ingroup realGEsing
392+ * > \ingroup gejsv
395393*
396394* > \par Further Details:
397395* =====================
473471 SUBROUTINE SGEJSV ( JOBA , JOBU , JOBV , JOBR , JOBT , JOBP ,
474472 $ M , N , A , LDA , SVA , U , LDU , V , LDV ,
475473 $ WORK , LWORK , IWORK , INFO )
474+ IMPLICIT NONE
476475*
477476* -- LAPACK computational routine --
478477* -- LAPACK is a software package provided by Univ. of Tennessee, --
479478* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
480479*
481480* .. Scalar Arguments ..
482- IMPLICIT NONE
483481 INTEGER INFO, LDA, LDU, LDV, LWORK, M, N
484482* ..
485483* .. Array Arguments ..
@@ -498,7 +496,7 @@ SUBROUTINE SGEJSV( JOBA, JOBU, JOBV, JOBR, JOBT, JOBP,
498496* .. Local Scalars ..
499497 REAL AAPP, AAQQ, AATMAX, AATMIN, BIG, BIG1, COND_OK,
500498 $ CONDR1, CONDR2, ENTRA, ENTRAT, EPSLN, MAXPRJ, SCALEM,
501- $ SCONDA, SFMIN, SMALL, TEMP1, USCAL1, USCAL2, XSC
499+ $ SCONDA, SFMIN, SMALL, TEMP1, USCAL1, USCAL2, XSC, TBIG
502500 INTEGER IERR, N1, NR, NUMRANK, p, q, WARNING
503501 LOGICAL ALMORT, DEFR, ERREST, GOSCAL, JRACC, KILL, LSVEC,
504502 $ L2ABER, L2KILL, L2PERT, L2RANK, L2TRAN,
@@ -514,7 +512,8 @@ SUBROUTINE SGEJSV( JOBA, JOBU, JOBV, JOBR, JOBT, JOBP,
514512 EXTERNAL ISAMAX, LSAME, SLAMCH, SNRM2
515513* ..
516514* .. External Subroutines ..
517- EXTERNAL SCOPY, SGELQF, SGEQP3, SGEQRF, SLACPY, SLASCL,
515+ EXTERNAL SCOPY, SGELQF, SGEQP3, SGEQRF, SLACPY,
516+ $ SLASCL,
518517 $ SLASET, SLASSQ, SLASWP, SORGQR, SORMLQ,
519518 $ SORMQR, SPOCON, SSCAL, SSWAP, STRSM, XERBLA
520519*
@@ -629,7 +628,9 @@ SUBROUTINE SGEJSV( JOBA, JOBU, JOBV, JOBR, JOBT, JOBP,
629628 RETURN
630629 END IF
631630 AAQQ = SQRT (AAQQ)
632- IF ( ( AAPP .LT. (BIG / AAQQ) ) .AND. NOSCAL ) THEN
631+ TBIG = BIG
632+ IF ( AAQQ.GT. ONE ) TBIG = BIG / AAQQ
633+ IF ( ( AAPP .LT. TBIG ) .AND. NOSCAL ) THEN
633634 SVA(p) = AAPP * AAQQ
634635 ELSE
635636 NOSCAL = .FALSE.
@@ -692,15 +693,20 @@ SUBROUTINE SGEJSV( JOBA, JOBU, JOBV, JOBR, JOBT, JOBP,
692693 CALL SLACPY( ' A' , M, 1 , A, LDA, U, LDU )
693694* computing all M left singular vectors of the M x 1 matrix
694695 IF ( N1 .NE. N ) THEN
695- CALL SGEQRF( M, N, U,LDU, WORK, WORK(N+1 ),LWORK- N,IERR )
696- CALL SORGQR( M,N1,1 , U,LDU,WORK,WORK(N+1 ),LWORK- N,IERR )
696+ CALL SGEQRF( M, N, U,LDU, WORK, WORK(N+1 ),LWORK- N,
697+ $ IERR )
698+ CALL SORGQR( M,N1,1 , U,LDU,WORK,WORK(N+1 ),LWORK- N,
699+ $ IERR )
697700 CALL SCOPY( M, A(1 ,1 ), 1 , U(1 ,1 ), 1 )
698701 END IF
699702 END IF
700703 IF ( RSVEC ) THEN
701704 V(1 ,1 ) = ONE
702705 END IF
703- IF ( SVA(1 ) .LT. (BIG* SCALEM) ) THEN
706+ TBIG = BIG
707+ IF ( SCALEM .EQ. ZERO ) SCALEM = ONE
708+ IF ( SCALEM .LT. ONE) TBIG = BIG* SCALEM
709+ IF ( SVA(1 ) .LT. TBIG ) THEN
704710 SVA(1 ) = SVA(1 ) / SCALEM
705711 SCALEM = ONE
706712 END IF
@@ -1115,7 +1121,8 @@ SUBROUTINE SGEJSV( JOBA, JOBU, JOBV, JOBR, JOBT, JOBP,
11151121 1949 CONTINUE
11161122 1947 CONTINUE
11171123 ELSE
1118- CALL SLASET( ' U' , NR-1 , NR-1 , ZERO, ZERO, A(1 ,2 ), LDA )
1124+ CALL SLASET( ' U' , NR-1 , NR-1 , ZERO, ZERO, A(1 ,2 ),
1125+ $ LDA )
11191126 END IF
11201127*
11211128* .. and one-sided Jacobi rotations are started on a lower
@@ -1139,7 +1146,8 @@ SUBROUTINE SGEJSV( JOBA, JOBU, JOBV, JOBR, JOBT, JOBP,
11391146 DO 1998 p = 1 , NR
11401147 CALL SCOPY( N- p+1 , A(p,p), LDA, V(p,p), 1 )
11411148 1998 CONTINUE
1142- CALL SLASET( ' Upper' , NR-1 , NR-1 , ZERO, ZERO, V(1 ,2 ), LDV )
1149+ CALL SLASET( ' Upper' , NR-1 , NR-1 , ZERO, ZERO, V(1 ,2 ),
1150+ $ LDV )
11431151*
11441152 CALL SGESVJ( ' L' ,' U' ,' N' , N, NR, V,LDV, SVA, NR, A,LDA,
11451153 $ WORK, LWORK, INFO )
@@ -1151,25 +1159,32 @@ SUBROUTINE SGEJSV( JOBA, JOBU, JOBV, JOBR, JOBT, JOBP,
11511159* .. two more QR factorizations ( one QRF is not enough, two require
11521160* accumulated product of Jacobi rotations, three are perfect )
11531161*
1154- CALL SLASET( ' Lower' , NR-1 , NR-1 , ZERO, ZERO, A(2 ,1 ), LDA )
1155- CALL SGELQF( NR, N, A, LDA, WORK, WORK(N+1 ), LWORK- N, IERR)
1162+ CALL SLASET( ' Lower' , NR-1 , NR-1 , ZERO, ZERO, A(2 ,1 ),
1163+ $ LDA )
1164+ CALL SGELQF( NR, N, A, LDA, WORK, WORK(N+1 ), LWORK- N,
1165+ $ IERR)
11561166 CALL SLACPY( ' Lower' , NR, NR, A, LDA, V, LDV )
1157- CALL SLASET( ' Upper' , NR-1 , NR-1 , ZERO, ZERO, V(1 ,2 ), LDV )
1167+ CALL SLASET( ' Upper' , NR-1 , NR-1 , ZERO, ZERO, V(1 ,2 ),
1168+ $ LDV )
11581169 CALL SGEQRF( NR, NR, V, LDV, WORK(N+1 ), WORK(2 * N+1 ),
11591170 $ LWORK-2 * N, IERR )
11601171 DO 8998 p = 1 , NR
11611172 CALL SCOPY( NR- p+1 , V(p,p), LDV, V(p,p), 1 )
11621173 8998 CONTINUE
1163- CALL SLASET( ' Upper' , NR-1 , NR-1 , ZERO, ZERO, V(1 ,2 ), LDV )
1174+ CALL SLASET( ' Upper' , NR-1 , NR-1 , ZERO, ZERO, V(1 ,2 ),
1175+ $ LDV )
11641176*
11651177 CALL SGESVJ( ' Lower' , ' U' ,' N' , NR, NR, V,LDV, SVA, NR, U,
11661178 $ LDU, WORK(N+1 ), LWORK- N, INFO )
11671179 SCALEM = WORK(N+1 )
11681180 NUMRANK = NINT (WORK(N+2 ))
11691181 IF ( NR .LT. N ) THEN
1170- CALL SLASET( ' A' ,N- NR, NR, ZERO,ZERO, V(NR+1 ,1 ), LDV )
1171- CALL SLASET( ' A' ,NR, N- NR, ZERO,ZERO, V(1 ,NR+1 ), LDV )
1172- CALL SLASET( ' A' ,N- NR,N- NR,ZERO,ONE, V(NR+1 ,NR+1 ), LDV )
1182+ CALL SLASET( ' A' ,N- NR, NR, ZERO,ZERO, V(NR+1 ,1 ),
1183+ $ LDV )
1184+ CALL SLASET( ' A' ,NR, N- NR, ZERO,ZERO, V(1 ,NR+1 ),
1185+ $ LDV )
1186+ CALL SLASET( ' A' ,N- NR,N- NR,ZERO,ONE, V(NR+1 ,NR+1 ),
1187+ $ LDV )
11731188 END IF
11741189*
11751190 CALL SORMLQ( ' Left' , ' Transpose' , N, N, NR, A, LDA, WORK,
@@ -1213,8 +1228,10 @@ SUBROUTINE SGEJSV( JOBA, JOBU, JOBV, JOBR, JOBT, JOBP,
12131228 IF ( NR .LT. M ) THEN
12141229 CALL SLASET( ' A' , M- NR, NR,ZERO, ZERO, U(NR+1 ,1 ), LDU )
12151230 IF ( NR .LT. N1 ) THEN
1216- CALL SLASET( ' A' ,NR, N1- NR, ZERO, ZERO, U(1 ,NR+1 ), LDU )
1217- CALL SLASET( ' A' ,M- NR,N1- NR,ZERO,ONE,U(NR+1 ,NR+1 ), LDU )
1231+ CALL SLASET( ' A' ,NR, N1- NR, ZERO, ZERO, U(1 ,NR+1 ),
1232+ $ LDU )
1233+ CALL SLASET( ' A' ,M- NR,N1- NR,ZERO,ONE,U(NR+1 ,NR+1 ),
1234+ $ LDU )
12181235 END IF
12191236 END IF
12201237*
@@ -1276,7 +1293,8 @@ SUBROUTINE SGEJSV( JOBA, JOBU, JOBV, JOBR, JOBT, JOBP,
12761293 2968 CONTINUE
12771294 2969 CONTINUE
12781295 ELSE
1279- CALL SLASET( ' U' , NR-1 , NR-1 , ZERO, ZERO, V(1 ,2 ), LDV )
1296+ CALL SLASET( ' U' , NR-1 , NR-1 , ZERO, ZERO, V(1 ,2 ),
1297+ $ LDV )
12801298 END IF
12811299*
12821300* Estimate the row scaled condition number of R1
@@ -1432,7 +1450,8 @@ SUBROUTINE SGEJSV( JOBA, JOBU, JOBV, JOBR, JOBT, JOBP,
14321450* equation is Q2*V2 = the product of the Jacobi rotations
14331451* used in SGESVJ, premultiplied with the orthogonal matrix
14341452* from the second QR factorization.
1435- CALL STRSM( ' L' ,' U' ,' N' ,' N' , NR,NR,ONE, A,LDA, V,LDV )
1453+ CALL STRSM( ' L' ,' U' ,' N' ,' N' , NR,NR,ONE, A,LDA, V,
1454+ $ LDV )
14361455 ELSE
14371456* .. R1 is well conditioned, but non-square. Transpose(R2)
14381457* is inverted to get the product of the Jacobi rotations
@@ -1443,7 +1462,8 @@ SUBROUTINE SGEJSV( JOBA, JOBU, JOBV, JOBR, JOBT, JOBP,
14431462 IF ( NR .LT. N ) THEN
14441463 CALL SLASET(' A' ,N- NR,NR,ZERO,ZERO,V(NR+1 ,1 ),LDV)
14451464 CALL SLASET(' A' ,NR,N- NR,ZERO,ZERO,V(1 ,NR+1 ),LDV)
1446- CALL SLASET(' A' ,N- NR,N- NR,ZERO,ONE,V(NR+1 ,NR+1 ),LDV)
1465+ CALL SLASET(' A' ,N- NR,N- NR,ZERO,ONE,V(NR+1 ,NR+1 ),
1466+ $ LDV)
14471467 END IF
14481468 CALL SORMQR(' L' ,' N' ,N,N,NR,WORK(2 * N+1 ),N,WORK(N+1 ),
14491469 $ V,LDV,WORK(2 * N+ N* NR+ NR+1 ),LWORK-2 * N- N* NR- NR,IERR)
@@ -1457,15 +1477,17 @@ SUBROUTINE SGEJSV( JOBA, JOBU, JOBV, JOBR, JOBT, JOBP,
14571477* is Q3^T*V3 = the product of the Jacobi rotations (applied to
14581478* the lower triangular L3 from the LQ factorization of
14591479* R2=L3*Q3), pre-multiplied with the transposed Q3.
1460- CALL SGESVJ( ' L' , ' U' , ' N' , NR, NR, V, LDV, SVA, NR, U,
1480+ CALL SGESVJ( ' L' , ' U' , ' N' , NR, NR, V, LDV, SVA, NR,
1481+ $ U,
14611482 $ LDU, WORK(2 * N+ N* NR+ NR+1 ), LWORK-2 * N- N* NR- NR, INFO )
14621483 SCALEM = WORK(2 * N+ N* NR+ NR+1 )
14631484 NUMRANK = NINT (WORK(2 * N+ N* NR+ NR+2 ))
14641485 DO 3870 p = 1 , NR
14651486 CALL SCOPY( NR, V(1 ,p), 1 , U(1 ,p), 1 )
14661487 CALL SSCAL( NR, SVA(p), U(1 ,p), 1 )
14671488 3870 CONTINUE
1468- CALL STRSM(' L' ,' U' ,' N' ,' N' ,NR,NR,ONE,WORK(2 * N+1 ),N,U,LDU)
1489+ CALL STRSM(' L' ,' U' ,' N' ,' N' ,NR,NR,ONE,WORK(2 * N+1 ),N,U,
1490+ $ LDU)
14691491* .. apply the permutation from the second QR factorization
14701492 DO 873 q = 1 , NR
14711493 DO 872 p = 1 , NR
@@ -1478,7 +1500,8 @@ SUBROUTINE SGEJSV( JOBA, JOBU, JOBV, JOBR, JOBT, JOBP,
14781500 IF ( NR .LT. N ) THEN
14791501 CALL SLASET( ' A' ,N- NR,NR,ZERO,ZERO,V(NR+1 ,1 ),LDV )
14801502 CALL SLASET( ' A' ,NR,N- NR,ZERO,ZERO,V(1 ,NR+1 ),LDV )
1481- CALL SLASET( ' A' ,N- NR,N- NR,ZERO,ONE,V(NR+1 ,NR+1 ),LDV )
1503+ CALL SLASET( ' A' ,N- NR,N- NR,ZERO,ONE,V(NR+1 ,NR+1 ),
1504+ $ LDV )
14821505 END IF
14831506 CALL SORMQR( ' L' ,' N' ,N,N,NR,WORK(2 * N+1 ),N,WORK(N+1 ),
14841507 $ V,LDV,WORK(2 * N+ N* NR+ NR+1 ),LWORK-2 * N- N* NR- NR,IERR )
@@ -1494,14 +1517,16 @@ SUBROUTINE SGEJSV( JOBA, JOBU, JOBV, JOBR, JOBT, JOBP,
14941517* defense ensures that SGEJSV completes the task.
14951518* Compute the full SVD of L3 using SGESVJ with explicit
14961519* accumulation of Jacobi rotations.
1497- CALL SGESVJ( ' L' , ' U' , ' V' , NR, NR, V, LDV, SVA, NR, U,
1520+ CALL SGESVJ( ' L' , ' U' , ' V' , NR, NR, V, LDV, SVA, NR,
1521+ $ U,
14981522 $ LDU, WORK(2 * N+ N* NR+ NR+1 ), LWORK-2 * N- N* NR- NR, INFO )
14991523 SCALEM = WORK(2 * N+ N* NR+ NR+1 )
15001524 NUMRANK = NINT (WORK(2 * N+ N* NR+ NR+2 ))
15011525 IF ( NR .LT. N ) THEN
15021526 CALL SLASET( ' A' ,N- NR,NR,ZERO,ZERO,V(NR+1 ,1 ),LDV )
15031527 CALL SLASET( ' A' ,NR,N- NR,ZERO,ZERO,V(1 ,NR+1 ),LDV )
1504- CALL SLASET( ' A' ,N- NR,N- NR,ZERO,ONE,V(NR+1 ,NR+1 ),LDV )
1528+ CALL SLASET( ' A' ,N- NR,N- NR,ZERO,ONE,V(NR+1 ,NR+1 ),
1529+ $ LDV )
15051530 END IF
15061531 CALL SORMQR( ' L' ,' N' ,N,N,NR,WORK(2 * N+1 ),N,WORK(N+1 ),
15071532 $ V,LDV,WORK(2 * N+ N* NR+ NR+1 ),LWORK-2 * N- N* NR- NR,IERR )
@@ -1539,10 +1564,12 @@ SUBROUTINE SGEJSV( JOBA, JOBU, JOBV, JOBR, JOBT, JOBP,
15391564* At this moment, V contains the right singular vectors of A.
15401565* Next, assemble the left singular vector matrix U (M x N).
15411566 IF ( NR .LT. M ) THEN
1542- CALL SLASET( ' A' , M- NR, NR, ZERO, ZERO, U(NR+1 ,1 ), LDU )
1567+ CALL SLASET( ' A' , M- NR, NR, ZERO, ZERO, U(NR+1 ,1 ),
1568+ $ LDU )
15431569 IF ( NR .LT. N1 ) THEN
15441570 CALL SLASET(' A' ,NR,N1- NR,ZERO,ZERO,U(1 ,NR+1 ),LDU)
1545- CALL SLASET(' A' ,M- NR,N1- NR,ZERO,ONE,U(NR+1 ,NR+1 ),LDU)
1571+ CALL SLASET(' A' ,M- NR,N1- NR,ZERO,ONE,U(NR+1 ,NR+1 ),
1572+ $ LDU)
15461573 END IF
15471574 END IF
15481575*
@@ -1611,8 +1638,10 @@ SUBROUTINE SGEJSV( JOBA, JOBU, JOBV, JOBR, JOBT, JOBP,
16111638 IF ( N .LT. M ) THEN
16121639 CALL SLASET( ' A' , M- N, N, ZERO, ZERO, U(N+1 ,1 ), LDU )
16131640 IF ( N .LT. N1 ) THEN
1614- CALL SLASET( ' A' ,N, N1- N, ZERO, ZERO, U(1 ,N+1 ),LDU )
1615- CALL SLASET( ' A' ,M- N,N1- N, ZERO, ONE,U(N+1 ,N+1 ),LDU )
1641+ CALL SLASET( ' A' ,N, N1- N, ZERO, ZERO, U(1 ,N+1 ),
1642+ $ LDU )
1643+ CALL SLASET( ' A' ,M- N,N1- N, ZERO, ONE,U(N+1 ,N+1 ),
1644+ $ LDU )
16161645 END IF
16171646 END IF
16181647 CALL SORMQR( ' Left' , ' No Tr' , M, N1, N, A, LDA, WORK, U,
@@ -1682,7 +1711,7 @@ SUBROUTINE SGEJSV( JOBA, JOBU, JOBV, JOBR, JOBT, JOBP,
16821711 CALL SLASET(' U' , NR-1 , NR-1 , ZERO, ZERO, U(1 ,2 ), LDU )
16831712 END IF
16841713
1685- CALL SGESVJ( ' L ' , ' U' , ' V' , NR, NR, U, LDU, SVA,
1714+ CALL SGESVJ( ' G ' , ' U' , ' V' , NR, NR, U, LDU, SVA,
16861715 $ N, V, LDV, WORK(2 * N+ N* NR+1 ), LWORK-2 * N- N* NR, INFO )
16871716 SCALEM = WORK(2 * N+ N* NR+1 )
16881717 NUMRANK = NINT (WORK(2 * N+ N* NR+2 ))
@@ -1719,8 +1748,10 @@ SUBROUTINE SGEJSV( JOBA, JOBU, JOBV, JOBR, JOBT, JOBP,
17191748 IF ( NR .LT. M ) THEN
17201749 CALL SLASET( ' A' , M- NR, NR, ZERO, ZERO, U(NR+1 ,1 ), LDU )
17211750 IF ( NR .LT. N1 ) THEN
1722- CALL SLASET( ' A' ,NR, N1- NR, ZERO, ZERO, U(1 ,NR+1 ),LDU )
1723- CALL SLASET( ' A' ,M- NR,N1- NR, ZERO, ONE,U(NR+1 ,NR+1 ),LDU )
1751+ CALL SLASET( ' A' ,NR, N1- NR, ZERO, ZERO, U(1 ,NR+1 ),
1752+ $ LDU )
1753+ CALL SLASET( ' A' ,M- NR,N1- NR, ZERO, ONE,U(NR+1 ,NR+1 ),
1754+ $ LDU )
17241755 END IF
17251756 END IF
17261757*
@@ -1745,7 +1776,8 @@ SUBROUTINE SGEJSV( JOBA, JOBU, JOBV, JOBR, JOBT, JOBP,
17451776* Undo scaling, if necessary (and possible)
17461777*
17471778 IF ( USCAL2 .LE. (BIG/ SVA(1 ))* USCAL1 ) THEN
1748- CALL SLASCL( ' G' , 0 , 0 , USCAL1, USCAL2, NR, 1 , SVA, N, IERR )
1779+ CALL SLASCL( ' G' , 0 , 0 , USCAL1, USCAL2, NR, 1 , SVA, N,
1780+ $ IERR )
17491781 USCAL1 = ONE
17501782 USCAL2 = ONE
17511783 END IF
0 commit comments