214 SUBROUTINE sgsvj0( JOBV, M, N, A, LDA, D, SVA, MV, V, LDV, EPS,
215 $ SFMIN, TOL, NSWEEP, WORK, LWORK, INFO )
222 INTEGER INFO, LDA, LDV, LWORK, M, MV, N, NSWEEP
227 REAL A( LDA, * ), SVA( N ), D( N ), V( LDV, * ),
235 parameter( zero = 0.0e0, half = 0.5e0, one = 1.0e0)
238 REAL AAPP, AAPP0, AAPQ, AAQQ, APOAQ, AQOAP, BIG,
239 $ bigtheta, cs, mxaapq, mxsinj, rootbig, rooteps,
240 $ rootsfmin, roottol, small, sn, t, temp1, theta,
242 INTEGER BLSKIP, EMPTSW, i, ibr, IERR, igl, IJBLSK, ir1,
243 $ iswrot, jbc, jgl, kbl, lkahead, mvl, nbl,
244 $ notrot, p, pskipped, q, rowskip, swband
245 LOGICAL APPLV, ROTOK, RSVEC
251 INTRINSIC abs, max, float, min, sign, sqrt
257 EXTERNAL isamax, lsame, sdot, snrm2
268 applv = lsame( jobv,
'A' )
269 rsvec = lsame( jobv,
'V' )
270 IF( .NOT.( rsvec .OR. applv .OR. lsame( jobv,
'N' ) ) )
THEN
272 ELSE IF( m.LT.0 )
THEN
274 ELSE IF( ( n.LT.0 ) .OR. ( n.GT.m ) )
THEN
276 ELSE IF( lda.LT.m )
THEN
278 ELSE IF( ( rsvec.OR.applv ) .AND. ( mv.LT.0 ) )
THEN
280 ELSE IF( ( rsvec.AND.( ldv.LT.n ) ).OR.
281 $ ( applv.AND.( ldv.LT.mv ) ) )
THEN
283 ELSE IF( tol.LE.eps )
THEN
285 ELSE IF( nsweep.LT.0 )
THEN
287 ELSE IF( lwork.LT.m )
THEN
295 CALL xerbla(
'SGSVJ0', -info )
301 ELSE IF( applv )
THEN
304 rsvec = rsvec .OR. applv
306 rooteps = sqrt( eps )
307 rootsfmin = sqrt( sfmin )
310 rootbig = one / rootsfmin
311 bigtheta = one / rooteps
312 roottol = sqrt( tol )
316 emptsw = ( n*( n-1 ) ) / 2
336 IF( ( nbl*kbl ).NE.n )nbl = nbl + 1
338 blskip = ( kbl**2 ) + 1
341 rowskip = min( 5, kbl )
349 DO 1993 i = 1, nsweep
361 igl = ( ibr-1 )*kbl + 1
363 DO 1002 ir1 = 0, min( lkahead, nbl-ibr )
367 DO 2001 p = igl, min( igl+kbl-1, n-1 )
370 q = isamax( n-p+1, sva( p ), 1 ) + p - 1
372 CALL sswap( m, a( 1, p ), 1, a( 1, q ), 1 )
373 IF( rsvec )
CALL sswap( mvl, v( 1, p ), 1,
397 IF( ( sva( p ).LT.rootbig ) .AND.
398 $ ( sva( p ).GT.rootsfmin ) )
THEN
399 sva( p ) = snrm2( m, a( 1, p ), 1 )*d( p )
403 CALL slassq( m, a( 1, p ), 1, temp1, aapp )
404 sva( p ) = temp1*sqrt( aapp )*d( p )
412 IF( aapp.GT.zero )
THEN
416 DO 2002 q = p + 1, min( igl+kbl-1, n )
420 IF( aaqq.GT.zero )
THEN
423 IF( aaqq.GE.one )
THEN
424 rotok = ( small*aapp ).LE.aaqq
425 IF( aapp.LT.( big / aaqq ) )
THEN
426 aapq = ( sdot( m, a( 1, p ), 1,
428 $ q ), 1 )*d( p )*d( q ) / aaqq )
431 CALL scopy( m, a( 1, p ), 1, work,
433 CALL slascl(
'G', 0, 0, aapp,
435 $ m, 1, work, lda, ierr )
436 aapq = sdot( m, work, 1, a( 1, q ),
440 rotok = aapp.LE.( aaqq / small )
441 IF( aapp.GT.( small / aaqq ) )
THEN
442 aapq = ( sdot( m, a( 1, p ), 1,
444 $ q ), 1 )*d( p )*d( q ) / aaqq )
447 CALL scopy( m, a( 1, q ), 1, work,
449 CALL slascl(
'G', 0, 0, aaqq,
451 $ m, 1, work, lda, ierr )
452 aapq = sdot( m, work, 1, a( 1, p ),
457 mxaapq = max( mxaapq, abs( aapq ) )
461 IF( abs( aapq ).GT.tol )
THEN
476 theta = -half*abs( aqoap-apoaq ) / aapq
478 IF( abs( theta ).GT.bigtheta )
THEN
481 fastr( 3 ) = t*d( p ) / d( q )
482 fastr( 4 ) = -t*d( q ) / d( p )
483 CALL srotm( m, a( 1, p ), 1,
484 $ a( 1, q ), 1, fastr )
485 IF( rsvec )
CALL srotm( mvl,
489 sva( q ) = aaqq*sqrt( max( zero,
490 $ one+t*apoaq*aapq ) )
491 aapp = aapp*sqrt( max( zero,
492 $ one-t*aqoap*aapq ) )
493 mxsinj = max( mxsinj, abs( t ) )
499 thsign = -sign( one, aapq )
500 t = one / ( theta+thsign*
501 $ sqrt( one+theta*theta ) )
502 cs = sqrt( one / ( one+t*t ) )
505 mxsinj = max( mxsinj, abs( sn ) )
506 sva( q ) = aaqq*sqrt( max( zero,
507 $ one+t*apoaq*aapq ) )
508 aapp = aapp*sqrt( max( zero,
509 $ one-t*aqoap*aapq ) )
511 apoaq = d( p ) / d( q )
512 aqoap = d( q ) / d( p )
513 IF( d( p ).GE.one )
THEN
514 IF( d( q ).GE.one )
THEN
516 fastr( 4 ) = -t*aqoap
519 CALL srotm( m, a( 1, p ),
523 IF( rsvec )
CALL srotm( mvl,
524 $ v( 1, p ), 1, v( 1, q ),
527 CALL saxpy( m, -t*aqoap,
530 CALL saxpy( m, cs*sn*apoaq,
547 IF( d( q ).GE.one )
THEN
548 CALL saxpy( m, t*apoaq,
568 IF( d( p ).GE.d( q ) )
THEN
569 CALL saxpy( m, -t*aqoap,
589 CALL saxpy( m, t*apoaq,
600 $ t*apoaq, v( 1, p ),
614 CALL scopy( m, a( 1, p ), 1, work,
616 CALL slascl(
'G', 0, 0, aapp, one,
618 $ 1, work, lda, ierr )
619 CALL slascl(
'G', 0, 0, aaqq, one,
621 $ 1, a( 1, q ), lda, ierr )
622 temp1 = -aapq*d( p ) / d( q )
623 CALL saxpy( m, temp1, work, 1,
625 CALL slascl(
'G', 0, 0, one, aaqq,
627 $ 1, a( 1, q ), lda, ierr )
628 sva( q ) = aaqq*sqrt( max( zero,
630 mxsinj = max( mxsinj, sfmin )
636 IF( ( sva( q ) / aaqq )**2.LE.rooteps )
638 IF( ( aaqq.LT.rootbig ) .AND.
639 $ ( aaqq.GT.rootsfmin ) )
THEN
640 sva( q ) = snrm2( m, a( 1, q ),
646 CALL slassq( m, a( 1, q ), 1, t,
648 sva( q ) = t*sqrt( aaqq )*d( q )
651 IF( ( aapp / aapp0 ).LE.rooteps )
THEN
652 IF( ( aapp.LT.rootbig ) .AND.
653 $ ( aapp.GT.rootsfmin ) )
THEN
654 aapp = snrm2( m, a( 1, p ), 1 )*
659 CALL slassq( m, a( 1, p ), 1, t,
661 aapp = t*sqrt( aapp )*d( p )
668 IF( ir1.EQ.0 )notrot = notrot + 1
669 pskipped = pskipped + 1
673 IF( ir1.EQ.0 )notrot = notrot + 1
674 pskipped = pskipped + 1
677 IF( ( i.LE.swband ) .AND.
678 $ ( pskipped.GT.rowskip ) )
THEN
679 IF( ir1.EQ.0 )aapp = -aapp
694 IF( ( ir1.EQ.0 ) .AND. ( aapp.EQ.zero ) )
695 $ notrot = notrot + min( igl+kbl-1, n ) - p
707 igl = ( ibr-1 )*kbl + 1
709 DO 2010 jbc = ibr + 1, nbl
711 jgl = ( jbc-1 )*kbl + 1
716 DO 2100 p = igl, min( igl+kbl-1, n )
720 IF( aapp.GT.zero )
THEN
724 DO 2200 q = jgl, min( jgl+kbl-1, n )
728 IF( aaqq.GT.zero )
THEN
735 IF( aaqq.GE.one )
THEN
736 IF( aapp.GE.aaqq )
THEN
737 rotok = ( small*aapp ).LE.aaqq
739 rotok = ( small*aaqq ).LE.aapp
741 IF( aapp.LT.( big / aaqq ) )
THEN
742 aapq = ( sdot( m, a( 1, p ), 1,
744 $ q ), 1 )*d( p )*d( q ) / aaqq )
747 CALL scopy( m, a( 1, p ), 1, work,
749 CALL slascl(
'G', 0, 0, aapp,
751 $ m, 1, work, lda, ierr )
752 aapq = sdot( m, work, 1, a( 1, q ),
756 IF( aapp.GE.aaqq )
THEN
757 rotok = aapp.LE.( aaqq / small )
759 rotok = aaqq.LE.( aapp / small )
761 IF( aapp.GT.( small / aaqq ) )
THEN
762 aapq = ( sdot( m, a( 1, p ), 1,
764 $ q ), 1 )*d( p )*d( q ) / aaqq )
767 CALL scopy( m, a( 1, q ), 1, work,
769 CALL slascl(
'G', 0, 0, aaqq,
771 $ m, 1, work, lda, ierr )
772 aapq = sdot( m, work, 1, a( 1, p ),
777 mxaapq = max( mxaapq, abs( aapq ) )
781 IF( abs( aapq ).GT.tol )
THEN
791 theta = -half*abs( aqoap-apoaq ) / aapq
792 IF( aaqq.GT.aapp0 )theta = -theta
794 IF( abs( theta ).GT.bigtheta )
THEN
796 fastr( 3 ) = t*d( p ) / d( q )
797 fastr( 4 ) = -t*d( q ) / d( p )
798 CALL srotm( m, a( 1, p ), 1,
799 $ a( 1, q ), 1, fastr )
800 IF( rsvec )
CALL srotm( mvl,
804 sva( q ) = aaqq*sqrt( max( zero,
805 $ one+t*apoaq*aapq ) )
806 aapp = aapp*sqrt( max( zero,
807 $ one-t*aqoap*aapq ) )
808 mxsinj = max( mxsinj, abs( t ) )
813 thsign = -sign( one, aapq )
814 IF( aaqq.GT.aapp0 )thsign = -thsign
815 t = one / ( theta+thsign*
816 $ sqrt( one+theta*theta ) )
817 cs = sqrt( one / ( one+t*t ) )
819 mxsinj = max( mxsinj, abs( sn ) )
820 sva( q ) = aaqq*sqrt( max( zero,
821 $ one+t*apoaq*aapq ) )
822 aapp = aapp*sqrt( max( zero,
823 $ one-t*aqoap*aapq ) )
825 apoaq = d( p ) / d( q )
826 aqoap = d( q ) / d( p )
827 IF( d( p ).GE.one )
THEN
829 IF( d( q ).GE.one )
THEN
831 fastr( 4 ) = -t*aqoap
834 CALL srotm( m, a( 1, p ),
838 IF( rsvec )
CALL srotm( mvl,
839 $ v( 1, p ), 1, v( 1, q ),
842 CALL saxpy( m, -t*aqoap,
845 CALL saxpy( m, cs*sn*apoaq,
862 IF( d( q ).GE.one )
THEN
863 CALL saxpy( m, t*apoaq,
883 IF( d( p ).GE.d( q ) )
THEN
884 CALL saxpy( m, -t*aqoap,
904 CALL saxpy( m, t*apoaq,
915 $ t*apoaq, v( 1, p ),
928 IF( aapp.GT.aaqq )
THEN
929 CALL scopy( m, a( 1, p ), 1,
932 CALL slascl(
'G', 0, 0, aapp,
934 $ m, 1, work, lda, ierr )
935 CALL slascl(
'G', 0, 0, aaqq,
937 $ m, 1, a( 1, q ), lda,
939 temp1 = -aapq*d( p ) / d( q )
940 CALL saxpy( m, temp1, work, 1,
942 CALL slascl(
'G', 0, 0, one,
944 $ m, 1, a( 1, q ), lda,
946 sva( q ) = aaqq*sqrt( max( zero,
948 mxsinj = max( mxsinj, sfmin )
950 CALL scopy( m, a( 1, q ), 1,
953 CALL slascl(
'G', 0, 0, aaqq,
955 $ m, 1, work, lda, ierr )
956 CALL slascl(
'G', 0, 0, aapp,
958 $ m, 1, a( 1, p ), lda,
960 temp1 = -aapq*d( q ) / d( p )
961 CALL saxpy( m, temp1, work, 1,
963 CALL slascl(
'G', 0, 0, one,
965 $ m, 1, a( 1, p ), lda,
967 sva( p ) = aapp*sqrt( max( zero,
969 mxsinj = max( mxsinj, sfmin )
976 IF( ( sva( q ) / aaqq )**2.LE.rooteps )
978 IF( ( aaqq.LT.rootbig ) .AND.
979 $ ( aaqq.GT.rootsfmin ) )
THEN
980 sva( q ) = snrm2( m, a( 1, q ),
986 CALL slassq( m, a( 1, q ), 1, t,
988 sva( q ) = t*sqrt( aaqq )*d( q )
991 IF( ( aapp / aapp0 )**2.LE.rooteps )
THEN
992 IF( ( aapp.LT.rootbig ) .AND.
993 $ ( aapp.GT.rootsfmin ) )
THEN
994 aapp = snrm2( m, a( 1, p ), 1 )*
999 CALL slassq( m, a( 1, p ), 1, t,
1001 aapp = t*sqrt( aapp )*d( p )
1008 pskipped = pskipped + 1
1013 pskipped = pskipped + 1
1017 IF( ( i.LE.swband ) .AND. ( ijblsk.GE.blskip ) )
1023 IF( ( i.LE.swband ) .AND.
1024 $ ( pskipped.GT.rowskip ) )
THEN
1037 IF( aapp.EQ.zero )notrot = notrot +
1038 $ min( jgl+kbl-1, n ) - jgl + 1
1039 IF( aapp.LT.zero )notrot = 0
1048 DO 2012 p = igl, min( igl+kbl-1, n )
1049 sva( p ) = abs( sva( p ) )
1056 IF( ( sva( n ).LT.rootbig ) .AND. ( sva( n ).GT.rootsfmin ) )
1058 sva( n ) = snrm2( m, a( 1, n ), 1 )*d( n )
1062 CALL slassq( m, a( 1, n ), 1, t, aapp )
1063 sva( n ) = t*sqrt( aapp )*d( n )
1068 IF( ( i.LT.swband ) .AND. ( ( mxaapq.LE.roottol ) .OR.
1069 $ ( iswrot.LE.n ) ) )swband = i
1071 IF( ( i.GT.swband+1 ) .AND. ( mxaapq.LT.float( n )*tol ) .AND.
1072 $ ( float( n )*mxaapq*mxsinj.LT.tol ) )
THEN
1076 IF( notrot.GE.emptsw )
GO TO 1994
1093 DO 5991 p = 1, n - 1
1094 q = isamax( n-p+1, sva( p ), 1 ) + p - 1
1102 CALL sswap( m, a( 1, p ), 1, a( 1, q ), 1 )
1103 IF( rsvec )
CALL sswap( mvl, v( 1, p ), 1, v( 1, q ), 1 )