323 SUBROUTINE sgesvj( JOBA, JOBU, JOBV, M, N, A, LDA, SVA, MV, V,
324 $ LDV, WORK, LWORK, INFO )
332 INTEGER INFO, LDA, LDV, LWORK, M, MV, N
333 CHARACTER*1 JOBA, JOBU, JOBV
336 REAL A( lda, * ), SVA( n ), V( ldv, * ),
344 parameter( zero = 0.0e0, half = 0.5e0, one = 1.0e0)
346 parameter( nsweep = 30 )
349 REAL AAPP, AAPP0, AAPQ, AAQQ, APOAQ, AQOAP, BIG,
350 $ bigtheta, cs, ctol, epsln, large, mxaapq,
351 $ mxsinj, rootbig, rooteps, rootsfmin, roottol,
352 $ skl, sfmin, small, sn, t, temp1, theta,
354 INTEGER BLSKIP, EMPTSW, i, ibr, IERR, igl, IJBLSK, ir1,
355 $ iswrot, jbc, jgl, kbl, lkahead, mvl, n2, n34,
356 $ n4, nbl, notrot, p, pskipped, q, rowskip,
358 LOGICAL APPLV, GOSCALE, LOWER, LSVEC, NOSCALE, ROTOK,
359 $ rsvec, uctol, upper
365 INTRINSIC abs, max, min, float, sign, sqrt
393 lsvec = lsame( jobu,
'U' )
394 uctol = lsame( jobu,
'C' )
395 rsvec = lsame( jobv,
'V' )
396 applv = lsame( jobv,
'A' )
397 upper = lsame( joba,
'U' )
398 lower = lsame( joba,
'L' )
400 IF( .NOT.( upper .OR. lower .OR. lsame( joba,
'G' ) ) )
THEN 402 ELSE IF( .NOT.( lsvec .OR. uctol .OR. lsame( jobu,
'N' ) ) )
THEN 404 ELSE IF( .NOT.( rsvec .OR. applv .OR. lsame( jobv,
'N' ) ) )
THEN 406 ELSE IF( m.LT.0 )
THEN 408 ELSE IF( ( n.LT.0 ) .OR. ( n.GT.m ) )
THEN 410 ELSE IF( lda.LT.m )
THEN 412 ELSE IF( mv.LT.0 )
THEN 414 ELSE IF( ( rsvec .AND. ( ldv.LT.n ) ) .OR.
415 $ ( applv .AND. ( ldv.LT.mv ) ) )
THEN 417 ELSE IF( uctol .AND. ( work( 1 ).LE.one ) )
THEN 419 ELSE IF( lwork.LT.max( m+n, 6 ) )
THEN 427 CALL xerbla(
'SGESVJ', -info )
433 IF( ( m.EQ.0 ) .OR. ( n.EQ.0 ) )
RETURN 447 IF( lsvec .OR. rsvec .OR. applv )
THEN 448 ctol = sqrt( float( m ) )
456 epsln = slamch(
'Epsilon' )
457 rooteps = sqrt( epsln )
458 sfmin = slamch(
'SafeMinimum' )
459 rootsfmin = sqrt( sfmin )
460 small = sfmin / epsln
461 big = slamch(
'Overflow' )
463 rootbig = one / rootsfmin
464 large = big / sqrt( float( m*n ) )
465 bigtheta = one / rooteps
468 roottol = sqrt( tol )
470 IF( float( m )*epsln.GE.one )
THEN 472 CALL xerbla(
'SGESVJ', -info )
480 CALL slaset(
'A', mvl, n, zero, one, v, ldv )
481 ELSE IF( applv )
THEN 484 rsvec = rsvec .OR. applv
495 skl = one / sqrt( float( m )*float( n ) )
504 CALL slassq( m-p+1, a( p, p ), 1, aapp, aaqq )
505 IF( aapp.GT.big )
THEN 507 CALL xerbla(
'SGESVJ', -info )
511 IF( ( aapp.LT.( big / aaqq ) ) .AND. noscale )
THEN 515 sva( p ) = aapp*( aaqq*skl )
519 sva( q ) = sva( q )*skl
524 ELSE IF( upper )
THEN 529 CALL slassq( p, a( 1, p ), 1, aapp, aaqq )
530 IF( aapp.GT.big )
THEN 532 CALL xerbla(
'SGESVJ', -info )
536 IF( ( aapp.LT.( big / aaqq ) ) .AND. noscale )
THEN 540 sva( p ) = aapp*( aaqq*skl )
544 sva( q ) = sva( q )*skl
554 CALL slassq( m, a( 1, p ), 1, aapp, aaqq )
555 IF( aapp.GT.big )
THEN 557 CALL xerbla(
'SGESVJ', -info )
561 IF( ( aapp.LT.( big / aaqq ) ) .AND. noscale )
THEN 565 sva( p ) = aapp*( aaqq*skl )
569 sva( q ) = sva( q )*skl
576 IF( noscale )skl = one
585 IF( sva( p ).NE.zero )aaqq = min( aaqq, sva( p ) )
586 aapp = max( aapp, sva( p ) )
591 IF( aapp.EQ.zero )
THEN 592 IF( lsvec )
CALL slaset(
'G', m, n, zero, one, a, lda )
605 IF( lsvec )
CALL slascl(
'G', 0, 0, sva( 1 ), skl, m, 1,
606 $ a( 1, 1 ), lda, ierr )
607 work( 1 ) = one / skl
608 IF( sva( 1 ).GE.sfmin )
THEN 623 sn = sqrt( sfmin / epsln )
624 temp1 = sqrt( big / float( n ) )
625 IF( ( aapp.LE.sn ) .OR. ( aaqq.GE.temp1 ) .OR.
626 $ ( ( sn.LE.aaqq ) .AND. ( aapp.LE.temp1 ) ) )
THEN 627 temp1 = min( big, temp1 / aapp )
630 ELSE IF( ( aaqq.LE.sn ) .AND. ( aapp.LE.temp1 ) )
THEN 631 temp1 = min( sn / aaqq, big / ( aapp*sqrt( float( n ) ) ) )
634 ELSE IF( ( aaqq.GE.sn ) .AND. ( aapp.GE.temp1 ) )
THEN 635 temp1 = max( sn / aaqq, temp1 / aapp )
638 ELSE IF( ( aaqq.LE.sn ) .AND. ( aapp.GE.temp1 ) )
THEN 639 temp1 = min( sn / aaqq, big / ( sqrt( float( n ) )*aapp ) )
648 IF( temp1.NE.one )
THEN 649 CALL slascl(
'G', 0, 0, one, temp1, n, 1, sva, n, ierr )
652 IF( skl.NE.one )
THEN 653 CALL slascl( joba, 0, 0, one, skl, m, n, a, lda, ierr )
659 emptsw = ( n*( n-1 ) ) / 2
687 IF( ( nbl*kbl ).NE.n )nbl = nbl + 1
692 rowskip = min( 5, kbl )
703 IF( ( lower .OR. upper ) .AND. ( n.GT.max( 64, 4*kbl ) ) )
THEN 725 CALL sgsvj0( jobv, m-n34, n-n34, a( n34+1, n34+1 ), lda,
726 $ work( n34+1 ), sva( n34+1 ), mvl,
727 $ v( n34*q+1, n34+1 ), ldv, epsln, sfmin, tol,
728 $ 2, work( n+1 ), lwork-n, ierr )
730 CALL sgsvj0( jobv, m-n2, n34-n2, a( n2+1, n2+1 ), lda,
731 $ work( n2+1 ), sva( n2+1 ), mvl,
732 $ v( n2*q+1, n2+1 ), ldv, epsln, sfmin, tol, 2,
733 $ work( n+1 ), lwork-n, ierr )
735 CALL sgsvj1( jobv, m-n2, n-n2, n4, a( n2+1, n2+1 ), lda,
736 $ work( n2+1 ), sva( n2+1 ), mvl,
737 $ v( n2*q+1, n2+1 ), ldv, epsln, sfmin, tol, 1,
738 $ work( n+1 ), lwork-n, ierr )
740 CALL sgsvj0( jobv, m-n4, n2-n4, a( n4+1, n4+1 ), lda,
741 $ work( n4+1 ), sva( n4+1 ), mvl,
742 $ v( n4*q+1, n4+1 ), ldv, epsln, sfmin, tol, 1,
743 $ work( n+1 ), lwork-n, ierr )
745 CALL sgsvj0( jobv, m, n4, a, lda, work, sva, mvl, v, ldv,
746 $ epsln, sfmin, tol, 1, work( n+1 ), lwork-n,
749 CALL sgsvj1( jobv, m, n2, n4, a, lda, work, sva, mvl, v,
750 $ ldv, epsln, sfmin, tol, 1, work( n+1 ),
754 ELSE IF( upper )
THEN 757 CALL sgsvj0( jobv, n4, n4, a, lda, work, sva, mvl, v, ldv,
758 $ epsln, sfmin, tol, 2, work( n+1 ), lwork-n,
761 CALL sgsvj0( jobv, n2, n4, a( 1, n4+1 ), lda, work( n4+1 ),
762 $ sva( n4+1 ), mvl, v( n4*q+1, n4+1 ), ldv,
763 $ epsln, sfmin, tol, 1, work( n+1 ), lwork-n,
766 CALL sgsvj1( jobv, n2, n2, n4, a, lda, work, sva, mvl, v,
767 $ ldv, epsln, sfmin, tol, 1, work( n+1 ),
770 CALL sgsvj0( jobv, n2+n4, n4, a( 1, n2+1 ), lda,
771 $ work( n2+1 ), sva( n2+1 ), mvl,
772 $ v( n2*q+1, n2+1 ), ldv, epsln, sfmin, tol, 1,
773 $ work( n+1 ), lwork-n, ierr )
781 DO 1993 i = 1, nsweep
799 igl = ( ibr-1 )*kbl + 1
801 DO 1002 ir1 = 0, min( lkahead, nbl-ibr )
805 DO 2001 p = igl, min( igl+kbl-1, n-1 )
809 q = isamax( n-p+1, sva( p ), 1 ) + p - 1
811 CALL sswap( m, a( 1, p ), 1, a( 1, q ), 1 )
812 IF( rsvec )
CALL sswap( mvl, v( 1, p ), 1,
818 work( p ) = work( q )
836 IF( ( sva( p ).LT.rootbig ) .AND.
837 $ ( sva( p ).GT.rootsfmin ) )
THEN 838 sva( p ) = snrm2( m, a( 1, p ), 1 )*work( p )
842 CALL slassq( m, a( 1, p ), 1, temp1, aapp )
843 sva( p ) = temp1*sqrt( aapp )*work( p )
850 IF( aapp.GT.zero )
THEN 854 DO 2002 q = p + 1, min( igl+kbl-1, n )
858 IF( aaqq.GT.zero )
THEN 861 IF( aaqq.GE.one )
THEN 862 rotok = ( small*aapp ).LE.aaqq
863 IF( aapp.LT.( big / aaqq ) )
THEN 864 aapq = ( sdot( m, a( 1, p ), 1, a( 1,
865 $ q ), 1 )*work( p )*work( q ) /
868 CALL scopy( m, a( 1, p ), 1,
870 CALL slascl(
'G', 0, 0, aapp,
872 $ work( n+1 ), lda, ierr )
873 aapq = sdot( m, work( n+1 ), 1,
874 $ a( 1, q ), 1 )*work( q ) / aaqq
877 rotok = aapp.LE.( aaqq / small )
878 IF( aapp.GT.( small / aaqq ) )
THEN 879 aapq = ( sdot( m, a( 1, p ), 1, a( 1,
880 $ q ), 1 )*work( p )*work( q ) /
883 CALL scopy( m, a( 1, q ), 1,
885 CALL slascl(
'G', 0, 0, aaqq,
887 $ work( n+1 ), lda, ierr )
888 aapq = sdot( m, work( n+1 ), 1,
889 $ a( 1, p ), 1 )*work( p ) / aapp
893 mxaapq = max( mxaapq, abs( aapq ) )
897 IF( abs( aapq ).GT.tol )
THEN 912 theta = -half*abs( aqoap-apoaq ) / aapq
914 IF( abs( theta ).GT.bigtheta )
THEN 917 fastr( 3 ) = t*work( p ) / work( q )
918 fastr( 4 ) = -t*work( q ) /
920 CALL srotm( m, a( 1, p ), 1,
921 $ a( 1, q ), 1, fastr )
922 IF( rsvec )
CALL srotm( mvl,
926 sva( q ) = aaqq*sqrt( max( zero,
927 $ one+t*apoaq*aapq ) )
928 aapp = aapp*sqrt( max( zero,
929 $ one-t*aqoap*aapq ) )
930 mxsinj = max( mxsinj, abs( t ) )
936 thsign = -sign( one, aapq )
937 t = one / ( theta+thsign*
938 $ sqrt( one+theta*theta ) )
939 cs = sqrt( one / ( one+t*t ) )
942 mxsinj = max( mxsinj, abs( sn ) )
943 sva( q ) = aaqq*sqrt( max( zero,
944 $ one+t*apoaq*aapq ) )
945 aapp = aapp*sqrt( max( zero,
946 $ one-t*aqoap*aapq ) )
948 apoaq = work( p ) / work( q )
949 aqoap = work( q ) / work( p )
950 IF( work( p ).GE.one )
THEN 951 IF( work( q ).GE.one )
THEN 953 fastr( 4 ) = -t*aqoap
954 work( p ) = work( p )*cs
955 work( q ) = work( q )*cs
956 CALL srotm( m, a( 1, p ), 1,
959 IF( rsvec )
CALL srotm( mvl,
960 $ v( 1, p ), 1, v( 1, q ),
963 CALL saxpy( m, -t*aqoap,
966 CALL saxpy( m, cs*sn*apoaq,
969 work( p ) = work( p )*cs
970 work( q ) = work( q ) / cs
972 CALL saxpy( mvl, -t*aqoap,
982 IF( work( q ).GE.one )
THEN 983 CALL saxpy( m, t*apoaq,
986 CALL saxpy( m, -cs*sn*aqoap,
989 work( p ) = work( p ) / cs
990 work( q ) = work( q )*cs
992 CALL saxpy( mvl, t*apoaq,
1001 IF( work( p ).GE.work( q ) )
1003 CALL saxpy( m, -t*aqoap,
1006 CALL saxpy( m, cs*sn*apoaq,
1009 work( p ) = work( p )*cs
1010 work( q ) = work( q ) / cs
1022 CALL saxpy( m, t*apoaq,
1029 work( p ) = work( p ) / cs
1030 work( q ) = work( q )*cs
1033 $ t*apoaq, v( 1, p ),
1047 CALL scopy( m, a( 1, p ), 1,
1049 CALL slascl(
'G', 0, 0, aapp, one, m,
1050 $ 1, work( n+1 ), lda,
1052 CALL slascl(
'G', 0, 0, aaqq, one, m,
1053 $ 1, a( 1, q ), lda, ierr )
1054 temp1 = -aapq*work( p ) / work( q )
1055 CALL saxpy( m, temp1, work( n+1 ), 1,
1057 CALL slascl(
'G', 0, 0, one, aaqq, m,
1058 $ 1, a( 1, q ), lda, ierr )
1059 sva( q ) = aaqq*sqrt( max( zero,
1061 mxsinj = max( mxsinj, sfmin )
1068 IF( ( sva( q ) / aaqq )**2.LE.rooteps )
1070 IF( ( aaqq.LT.rootbig ) .AND.
1071 $ ( aaqq.GT.rootsfmin ) )
THEN 1072 sva( q ) = snrm2( m, a( 1, q ), 1 )*
1077 CALL slassq( m, a( 1, q ), 1, t,
1079 sva( q ) = t*sqrt( aaqq )*work( q )
1082 IF( ( aapp / aapp0 ).LE.rooteps )
THEN 1083 IF( ( aapp.LT.rootbig ) .AND.
1084 $ ( aapp.GT.rootsfmin ) )
THEN 1085 aapp = snrm2( m, a( 1, p ), 1 )*
1090 CALL slassq( m, a( 1, p ), 1, t,
1092 aapp = t*sqrt( aapp )*work( p )
1099 IF( ir1.EQ.0 )notrot = notrot + 1
1101 pskipped = pskipped + 1
1105 IF( ir1.EQ.0 )notrot = notrot + 1
1106 pskipped = pskipped + 1
1109 IF( ( i.LE.swband ) .AND.
1110 $ ( pskipped.GT.rowskip ) )
THEN 1111 IF( ir1.EQ.0 )aapp = -aapp
1126 IF( ( ir1.EQ.0 ) .AND. ( aapp.EQ.zero ) )
1127 $ notrot = notrot + min( igl+kbl-1, n ) - p
1138 igl = ( ibr-1 )*kbl + 1
1140 DO 2010 jbc = ibr + 1, nbl
1142 jgl = ( jbc-1 )*kbl + 1
1147 DO 2100 p = igl, min( igl+kbl-1, n )
1150 IF( aapp.GT.zero )
THEN 1154 DO 2200 q = jgl, min( jgl+kbl-1, n )
1157 IF( aaqq.GT.zero )
THEN 1164 IF( aaqq.GE.one )
THEN 1165 IF( aapp.GE.aaqq )
THEN 1166 rotok = ( small*aapp ).LE.aaqq
1168 rotok = ( small*aaqq ).LE.aapp
1170 IF( aapp.LT.( big / aaqq ) )
THEN 1171 aapq = ( sdot( m, a( 1, p ), 1, a( 1,
1172 $ q ), 1 )*work( p )*work( q ) /
1175 CALL scopy( m, a( 1, p ), 1,
1177 CALL slascl(
'G', 0, 0, aapp,
1179 $ work( n+1 ), lda, ierr )
1180 aapq = sdot( m, work( n+1 ), 1,
1181 $ a( 1, q ), 1 )*work( q ) / aaqq
1184 IF( aapp.GE.aaqq )
THEN 1185 rotok = aapp.LE.( aaqq / small )
1187 rotok = aaqq.LE.( aapp / small )
1189 IF( aapp.GT.( small / aaqq ) )
THEN 1190 aapq = ( sdot( m, a( 1, p ), 1, a( 1,
1191 $ q ), 1 )*work( p )*work( q ) /
1194 CALL scopy( m, a( 1, q ), 1,
1196 CALL slascl(
'G', 0, 0, aaqq,
1198 $ work( n+1 ), lda, ierr )
1199 aapq = sdot( m, work( n+1 ), 1,
1200 $ a( 1, p ), 1 )*work( p ) / aapp
1204 mxaapq = max( mxaapq, abs( aapq ) )
1208 IF( abs( aapq ).GT.tol )
THEN 1218 theta = -half*abs( aqoap-apoaq ) / aapq
1219 IF( aaqq.GT.aapp0 )theta = -theta
1221 IF( abs( theta ).GT.bigtheta )
THEN 1223 fastr( 3 ) = t*work( p ) / work( q )
1224 fastr( 4 ) = -t*work( q ) /
1226 CALL srotm( m, a( 1, p ), 1,
1227 $ a( 1, q ), 1, fastr )
1228 IF( rsvec )
CALL srotm( mvl,
1232 sva( q ) = aaqq*sqrt( max( zero,
1233 $ one+t*apoaq*aapq ) )
1234 aapp = aapp*sqrt( max( zero,
1235 $ one-t*aqoap*aapq ) )
1236 mxsinj = max( mxsinj, abs( t ) )
1241 thsign = -sign( one, aapq )
1242 IF( aaqq.GT.aapp0 )thsign = -thsign
1243 t = one / ( theta+thsign*
1244 $ sqrt( one+theta*theta ) )
1245 cs = sqrt( one / ( one+t*t ) )
1247 mxsinj = max( mxsinj, abs( sn ) )
1248 sva( q ) = aaqq*sqrt( max( zero,
1249 $ one+t*apoaq*aapq ) )
1250 aapp = aapp*sqrt( max( zero,
1251 $ one-t*aqoap*aapq ) )
1253 apoaq = work( p ) / work( q )
1254 aqoap = work( q ) / work( p )
1255 IF( work( p ).GE.one )
THEN 1257 IF( work( q ).GE.one )
THEN 1258 fastr( 3 ) = t*apoaq
1259 fastr( 4 ) = -t*aqoap
1260 work( p ) = work( p )*cs
1261 work( q ) = work( q )*cs
1262 CALL srotm( m, a( 1, p ), 1,
1265 IF( rsvec )
CALL srotm( mvl,
1266 $ v( 1, p ), 1, v( 1, q ),
1269 CALL saxpy( m, -t*aqoap,
1272 CALL saxpy( m, cs*sn*apoaq,
1276 CALL saxpy( mvl, -t*aqoap,
1284 work( p ) = work( p )*cs
1285 work( q ) = work( q ) / cs
1288 IF( work( q ).GE.one )
THEN 1289 CALL saxpy( m, t*apoaq,
1292 CALL saxpy( m, -cs*sn*aqoap,
1296 CALL saxpy( mvl, t*apoaq,
1304 work( p ) = work( p ) / cs
1305 work( q ) = work( q )*cs
1307 IF( work( p ).GE.work( q ) )
1309 CALL saxpy( m, -t*aqoap,
1312 CALL saxpy( m, cs*sn*apoaq,
1315 work( p ) = work( p )*cs
1316 work( q ) = work( q ) / cs
1328 CALL saxpy( m, t*apoaq,
1335 work( p ) = work( p ) / cs
1336 work( q ) = work( q )*cs
1339 $ t*apoaq, v( 1, p ),
1352 IF( aapp.GT.aaqq )
THEN 1353 CALL scopy( m, a( 1, p ), 1,
1355 CALL slascl(
'G', 0, 0, aapp, one,
1356 $ m, 1, work( n+1 ), lda,
1358 CALL slascl(
'G', 0, 0, aaqq, one,
1359 $ m, 1, a( 1, q ), lda,
1361 temp1 = -aapq*work( p ) / work( q )
1362 CALL saxpy( m, temp1, work( n+1 ),
1364 CALL slascl(
'G', 0, 0, one, aaqq,
1365 $ m, 1, a( 1, q ), lda,
1367 sva( q ) = aaqq*sqrt( max( zero,
1369 mxsinj = max( mxsinj, sfmin )
1371 CALL scopy( m, a( 1, q ), 1,
1373 CALL slascl(
'G', 0, 0, aaqq, one,
1374 $ m, 1, work( n+1 ), lda,
1376 CALL slascl(
'G', 0, 0, aapp, one,
1377 $ m, 1, a( 1, p ), lda,
1379 temp1 = -aapq*work( q ) / work( p )
1380 CALL saxpy( m, temp1, work( n+1 ),
1382 CALL slascl(
'G', 0, 0, one, aapp,
1383 $ m, 1, a( 1, p ), lda,
1385 sva( p ) = aapp*sqrt( max( zero,
1387 mxsinj = max( mxsinj, sfmin )
1394 IF( ( sva( q ) / aaqq )**2.LE.rooteps )
1396 IF( ( aaqq.LT.rootbig ) .AND.
1397 $ ( aaqq.GT.rootsfmin ) )
THEN 1398 sva( q ) = snrm2( m, a( 1, q ), 1 )*
1403 CALL slassq( m, a( 1, q ), 1, t,
1405 sva( q ) = t*sqrt( aaqq )*work( q )
1408 IF( ( aapp / aapp0 )**2.LE.rooteps )
THEN 1409 IF( ( aapp.LT.rootbig ) .AND.
1410 $ ( aapp.GT.rootsfmin ) )
THEN 1411 aapp = snrm2( m, a( 1, p ), 1 )*
1416 CALL slassq( m, a( 1, p ), 1, t,
1418 aapp = t*sqrt( aapp )*work( p )
1426 pskipped = pskipped + 1
1431 pskipped = pskipped + 1
1435 IF( ( i.LE.swband ) .AND. ( ijblsk.GE.blskip ) )
1441 IF( ( i.LE.swband ) .AND.
1442 $ ( pskipped.GT.rowskip ) )
THEN 1456 IF( aapp.EQ.zero )notrot = notrot +
1457 $ min( jgl+kbl-1, n ) - jgl + 1
1458 IF( aapp.LT.zero )notrot = 0
1468 DO 2012 p = igl, min( igl+kbl-1, n )
1469 sva( p ) = abs( sva( p ) )
1476 IF( ( sva( n ).LT.rootbig ) .AND. ( sva( n ).GT.rootsfmin ) )
1478 sva( n ) = snrm2( m, a( 1, n ), 1 )*work( n )
1482 CALL slassq( m, a( 1, n ), 1, t, aapp )
1483 sva( n ) = t*sqrt( aapp )*work( n )
1488 IF( ( i.LT.swband ) .AND. ( ( mxaapq.LE.roottol ) .OR.
1489 $ ( iswrot.LE.n ) ) )swband = i
1491 IF( ( i.GT.swband+1 ) .AND. ( mxaapq.LT.sqrt( float( n ) )*
1492 $ tol ) .AND. ( float( n )*mxaapq*mxsinj.LT.tol ) )
THEN 1496 IF( notrot.GE.emptsw )
GO TO 1994
1518 DO 5991 p = 1, n - 1
1519 q = isamax( n-p+1, sva( p ), 1 ) + p - 1
1525 work( p ) = work( q )
1527 CALL sswap( m, a( 1, p ), 1, a( 1, q ), 1 )
1528 IF( rsvec )
CALL sswap( mvl, v( 1, p ), 1, v( 1, q ), 1 )
1530 IF( sva( p ).NE.zero )
THEN 1532 IF( sva( p )*skl.GT.sfmin )n2 = n2 + 1
1535 IF( sva( n ).NE.zero )
THEN 1537 IF( sva( n )*skl.GT.sfmin )n2 = n2 + 1
1542 IF( lsvec .OR. uctol )
THEN 1544 CALL sscal( m, work( p ) / sva( p ), a( 1, p ), 1 )
1553 CALL sscal( mvl, work( p ), v( 1, p ), 1 )
1557 temp1 = one / snrm2( mvl, v( 1, p ), 1 )
1558 CALL sscal( mvl, temp1, v( 1, p ), 1 )
1564 IF( ( ( skl.GT.one ) .AND. ( sva( 1 ).LT.( big / skl ) ) )
1565 $ .OR. ( ( skl.LT.one ) .AND. ( sva( max( n2, 1 ) ) .GT.
1566 $ ( sfmin / skl ) ) ) )
THEN 1568 sva( p ) = skl*sva( p )
1578 work( 2 ) = float( n4 )
1581 work( 3 ) = float( n2 )
1586 work( 4 ) = float( i )
subroutine sgesvj(JOBA, JOBU, JOBV, M, N, A, LDA, SVA, MV, V, LDV, WORK, LWORK, INFO)
SGESVJ
subroutine srotm(N, SX, INCX, SY, INCY, SPARAM)
SROTM
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine slaset(UPLO, M, N, ALPHA, BETA, A, LDA)
SLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values...
subroutine slascl(TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO)
SLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
subroutine saxpy(N, SA, SX, INCX, SY, INCY)
SAXPY
subroutine sscal(N, SA, SX, INCX)
SSCAL
subroutine sswap(N, SX, INCX, SY, INCY)
SSWAP
subroutine sgsvj1(JOBV, M, N, N1, A, LDA, D, SVA, MV, V, LDV, EPS, SFMIN, TOL, NSWEEP, WORK, LWORK, INFO)
SGSVJ1 pre-processor for the routine sgesvj, applies Jacobi rotations targeting only particular pivot...
subroutine scopy(N, SX, INCX, SY, INCY)
SCOPY
subroutine slassq(N, X, INCX, SCALE, SUMSQ)
SLASSQ updates a sum of squares represented in scaled form.
subroutine sgsvj0(JOBV, M, N, A, LDA, D, SVA, MV, V, LDV, EPS, SFMIN, TOL, NSWEEP, WORK, LWORK, INFO)
SGSVJ0 pre-processor for the routine sgesvj.