216 SUBROUTINE sgsvj0( JOBV, M, N, A, LDA, D, SVA, MV, V, LDV, EPS,
217 $ SFMIN, TOL, NSWEEP, WORK, LWORK, INFO )
224 INTEGER INFO, LDA, LDV, LWORK, M, MV, N, NSWEEP
229 REAL A( LDA, * ), SVA( N ), D( N ), V( LDV, * ),
237 parameter( zero = 0.0e0, half = 0.5e0, one = 1.0e0)
240 REAL AAPP, AAPP0, AAPQ, AAQQ, APOAQ, AQOAP, BIG,
241 $ bigtheta, cs, mxaapq, mxsinj, rootbig, rooteps,
242 $ rootsfmin, roottol, small, sn, t, temp1, theta,
244 INTEGER BLSKIP, EMPTSW, i, ibr, IERR, igl, IJBLSK, ir1,
245 $ iswrot, jbc, jgl, kbl, lkahead, mvl, nbl,
246 $ notrot, p, pskipped, q, rowskip, swband
247 LOGICAL APPLV, ROTOK, RSVEC
253 INTRINSIC abs,
max, float,
min, sign, sqrt
259 EXTERNAL isamax, lsame, sdot, snrm2
269 applv = lsame( jobv,
'A' )
270 rsvec = lsame( jobv,
'V' )
271 IF( .NOT.( rsvec .OR. applv .OR. lsame( jobv,
'N' ) ) )
THEN
273 ELSE IF( m.LT.0 )
THEN
275 ELSE IF( ( n.LT.0 ) .OR. ( n.GT.m ) )
THEN
277 ELSE IF( lda.LT.m )
THEN
279 ELSE IF( ( rsvec.OR.applv ) .AND. ( mv.LT.0 ) )
THEN
281 ELSE IF( ( rsvec.AND.( ldv.LT.n ) ).OR.
282 $ ( applv.AND.( ldv.LT.mv ) ) )
THEN
284 ELSE IF( tol.LE.eps )
THEN
286 ELSE IF( nsweep.LT.0 )
THEN
288 ELSE IF( lwork.LT.m )
THEN
296 CALL xerbla(
'SGSVJ0', -info )
302 ELSE IF( applv )
THEN
305 rsvec = rsvec .OR. applv
307 rooteps = sqrt( eps )
308 rootsfmin = sqrt( sfmin )
311 rootbig = one / rootsfmin
312 bigtheta = one / rooteps
313 roottol = sqrt( tol )
317 emptsw = ( n*( n-1 ) ) / 2
337 IF( ( nbl*kbl ).NE.n )nbl = nbl + 1
339 blskip = ( kbl**2 ) + 1
342 rowskip =
min( 5, kbl )
350 DO 1993 i = 1, nsweep
362 igl = ( ibr-1 )*kbl + 1
364 DO 1002 ir1 = 0,
min( lkahead, nbl-ibr )
368 DO 2001 p = igl,
min( igl+kbl-1, n-1 )
371 q = isamax( n-p+1, sva( p ), 1 ) + p - 1
373 CALL sswap( m, a( 1, p ), 1, a( 1, q ), 1 )
374 IF( rsvec )
CALL sswap( mvl, v( 1, p ), 1,
398 IF( ( sva( p ).LT.rootbig ) .AND.
399 $ ( sva( p ).GT.rootsfmin ) )
THEN
400 sva( p ) = snrm2( m, a( 1, p ), 1 )*d( p )
404 CALL slassq( m, a( 1, p ), 1, temp1, aapp )
405 sva( p ) = temp1*sqrt( aapp )*d( p )
413 IF( aapp.GT.zero )
THEN
417 DO 2002 q = p + 1,
min( igl+kbl-1, n )
421 IF( aaqq.GT.zero )
THEN
424 IF( aaqq.GE.one )
THEN
425 rotok = ( small*aapp ).LE.aaqq
426 IF( aapp.LT.( big / aaqq ) )
THEN
427 aapq = ( sdot( m, a( 1, p ), 1, a( 1,
431 CALL scopy( m, a( 1, p ), 1, work, 1 )
432 CALL slascl(
'G', 0, 0, aapp, d( p ),
433 $ m, 1, work, lda, ierr )
434 aapq = sdot( m, work, 1, a( 1, q ),
438 rotok = aapp.LE.( aaqq / small )
439 IF( aapp.GT.( small / aaqq ) )
THEN
440 aapq = ( sdot( m, a( 1, p ), 1, a( 1,
441 $ q ), 1 )*d( p )*d( q ) / aaqq )
444 CALL scopy( m, a( 1, q ), 1, work, 1 )
445 CALL slascl(
'G', 0, 0, aaqq, d( q ),
446 $ m, 1, work, lda, ierr )
447 aapq = sdot( m, work, 1, a( 1, p ),
452 mxaapq =
max( mxaapq, abs( aapq ) )
456 IF( abs( aapq ).GT.tol )
THEN
471 theta = -half*abs( aqoap-apoaq ) / aapq
473 IF( abs( theta ).GT.bigtheta )
THEN
476 fastr( 3 ) = t*d( p ) / d( q )
477 fastr( 4 ) = -t*d( q ) / d( p )
478 CALL srotm( m, a( 1, p ), 1,
479 $ a( 1, q ), 1, fastr )
480 IF( rsvec )
CALL srotm( mvl,
484 sva( q ) = aaqq*sqrt(
max( zero,
485 $ one+t*apoaq*aapq ) )
486 aapp = aapp*sqrt(
max( zero,
487 $ one-t*aqoap*aapq ) )
488 mxsinj =
max( mxsinj, abs( t ) )
494 thsign = -sign( one, aapq )
495 t = one / ( theta+thsign*
496 $ sqrt( one+theta*theta ) )
497 cs = sqrt( one / ( one+t*t ) )
500 mxsinj =
max( mxsinj, abs( sn ) )
501 sva( q ) = aaqq*sqrt(
max( zero,
502 $ one+t*apoaq*aapq ) )
503 aapp = aapp*sqrt(
max( zero,
504 $ one-t*aqoap*aapq ) )
506 apoaq = d( p ) / d( q )
507 aqoap = d( q ) / d( p )
508 IF( d( p ).GE.one )
THEN
509 IF( d( q ).GE.one )
THEN
511 fastr( 4 ) = -t*aqoap
514 CALL srotm( m, a( 1, p ), 1,
517 IF( rsvec )
CALL srotm( mvl,
518 $ v( 1, p ), 1, v( 1, q ),
521 CALL saxpy( m, -t*aqoap,
524 CALL saxpy( m, cs*sn*apoaq,
530 CALL saxpy( mvl, -t*aqoap,
540 IF( d( q ).GE.one )
THEN
541 CALL saxpy( m, t*apoaq,
544 CALL saxpy( m, -cs*sn*aqoap,
550 CALL saxpy( mvl, t*apoaq,
559 IF( d( p ).GE.d( q ) )
THEN
560 CALL saxpy( m, -t*aqoap,
563 CALL saxpy( m, cs*sn*apoaq,
579 CALL saxpy( m, t*apoaq,
590 $ t*apoaq, v( 1, p ),
604 CALL scopy( m, a( 1, p ), 1, work, 1 )
605 CALL slascl( 'g
', 0, 0, AAPP, ONE, M,
606 $ 1, WORK, LDA, IERR )
607 CALL SLASCL( 'g
', 0, 0, AAQQ, ONE, M,
608 $ 1, A( 1, q ), LDA, IERR )
609 TEMP1 = -AAPQ*D( p ) / D( q )
610 CALL SAXPY( M, TEMP1, WORK, 1,
612 CALL SLASCL( 'g
', 0, 0, ONE, AAQQ, M,
613 $ 1, A( 1, q ), LDA, IERR )
614 SVA( q ) = AAQQ*SQRT( MAX( ZERO,
616 MXSINJ = MAX( MXSINJ, SFMIN )
622.LE.
IF( ( SVA( q ) / AAQQ )**2ROOTEPS )
624.LT..AND.
IF( ( AAQQROOTBIG )
625.GT.
$ ( AAQQROOTSFMIN ) ) THEN
626 SVA( q ) = SNRM2( M, A( 1, q ), 1 )*
631 CALL SLASSQ( M, A( 1, q ), 1, T,
633 SVA( q ) = T*SQRT( AAQQ )*D( q )
636.LE.
IF( ( AAPP / AAPP0 )ROOTEPS ) THEN
637.LT..AND.
IF( ( AAPPROOTBIG )
638.GT.
$ ( AAPPROOTSFMIN ) ) THEN
639 AAPP = SNRM2( M, A( 1, p ), 1 )*
644 CALL SLASSQ( M, A( 1, p ), 1, T,
646 AAPP = T*SQRT( AAPP )*D( p )
653.EQ.
IF( ir10 )NOTROT = NOTROT + 1
654 PSKIPPED = PSKIPPED + 1
658.EQ.
IF( ir10 )NOTROT = NOTROT + 1
659 PSKIPPED = PSKIPPED + 1
662.LE..AND.
IF( ( iSWBAND )
663.GT.
$ ( PSKIPPEDROWSKIP ) ) THEN
664.EQ.
IF( ir10 )AAPP = -AAPP
679.EQ..AND..EQ.
IF( ( ir10 ) ( AAPPZERO ) )
680 $ NOTROT = NOTROT + MIN( igl+KBL-1, N ) - p
692 igl = ( ibr-1 )*KBL + 1
694 DO 2010 jbc = ibr + 1, NBL
696 jgl = ( jbc-1 )*KBL + 1
701 DO 2100 p = igl, MIN( igl+KBL-1, N )
705.GT.
IF( AAPPZERO ) THEN
709 DO 2200 q = jgl, MIN( jgl+KBL-1, N )
713.GT.
IF( AAQQZERO ) THEN
720.GE.
IF( AAQQONE ) THEN
721.GE.
IF( AAPPAAQQ ) THEN
722.LE.
ROTOK = ( SMALL*AAPP )AAQQ
724.LE.
ROTOK = ( SMALL*AAQQ )AAPP
726.LT.
IF( AAPP( BIG / AAQQ ) ) THEN
727 AAPQ = ( SDOT( M, A( 1, p ), 1, A( 1,
728 $ q ), 1 )*D( p )*D( q ) / AAQQ )
731 CALL SCOPY( M, A( 1, p ), 1, WORK, 1 )
732 CALL SLASCL( 'g
', 0, 0, AAPP, D( p ),
733 $ M, 1, WORK, LDA, IERR )
734 AAPQ = SDOT( M, WORK, 1, A( 1, q ),
738.GE.
IF( AAPPAAQQ ) THEN
739.LE.
ROTOK = AAPP( AAQQ / SMALL )
741.LE.
ROTOK = AAQQ( AAPP / SMALL )
743.GT.
IF( AAPP( SMALL / AAQQ ) ) THEN
744 AAPQ = ( SDOT( M, A( 1, p ), 1, A( 1,
745 $ q ), 1 )*D( p )*D( q ) / AAQQ )
748 CALL SCOPY( M, A( 1, q ), 1, WORK, 1 )
749 CALL SLASCL( 'g
', 0, 0, AAQQ, D( q ),
750 $ M, 1, WORK, LDA, IERR )
751 AAPQ = SDOT( M, WORK, 1, A( 1, p ),
756 MXAAPQ = MAX( MXAAPQ, ABS( AAPQ ) )
760.GT.
IF( ABS( AAPQ )TOL ) THEN
770 THETA = -HALF*ABS( AQOAP-APOAQ ) / AAPQ
771.GT.
IF( AAQQAAPP0 )THETA = -THETA
773.GT.
IF( ABS( THETA )BIGTHETA ) THEN
775 FASTR( 3 ) = T*D( p ) / D( q )
776 FASTR( 4 ) = -T*D( q ) / D( p )
777 CALL SROTM( M, A( 1, p ), 1,
778 $ A( 1, q ), 1, FASTR )
779 IF( RSVEC )CALL SROTM( MVL,
783 SVA( q ) = AAQQ*SQRT( MAX( ZERO,
784 $ ONE+T*APOAQ*AAPQ ) )
785 AAPP = AAPP*SQRT( MAX( ZERO,
786 $ ONE-T*AQOAP*AAPQ ) )
787 MXSINJ = MAX( MXSINJ, ABS( T ) )
792 THSIGN = -SIGN( ONE, AAPQ )
793.GT.
IF( AAQQAAPP0 )THSIGN = -THSIGN
794 T = ONE / ( THETA+THSIGN*
795 $ SQRT( ONE+THETA*THETA ) )
796 CS = SQRT( ONE / ( ONE+T*T ) )
798 MXSINJ = MAX( MXSINJ, ABS( SN ) )
799 SVA( q ) = AAQQ*SQRT( MAX( ZERO,
800 $ ONE+T*APOAQ*AAPQ ) )
801 AAPP = AAPP*SQRT( MAX( ZERO,
802 $ ONE-T*AQOAP*AAPQ ) )
804 APOAQ = D( p ) / D( q )
805 AQOAP = D( q ) / D( p )
806.GE.
IF( D( p )ONE ) THEN
808.GE.
IF( D( q )ONE ) THEN
810 FASTR( 4 ) = -T*AQOAP
813 CALL SROTM( M, A( 1, p ), 1,
816 IF( RSVEC )CALL SROTM( MVL,
817 $ V( 1, p ), 1, V( 1, q ),
820 CALL SAXPY( M, -T*AQOAP,
823 CALL SAXPY( M, CS*SN*APOAQ,
827 CALL SAXPY( MVL, -T*AQOAP,
839.GE.
IF( D( q )ONE ) THEN
840 CALL SAXPY( M, T*APOAQ,
843 CALL SAXPY( M, -CS*SN*AQOAP,
847 CALL SAXPY( MVL, T*APOAQ,
858.GE.
IF( D( p )D( q ) ) THEN
859 CALL SAXPY( M, -T*AQOAP,
862 CALL SAXPY( M, CS*SN*APOAQ,
878 CALL SAXPY( M, T*APOAQ,
889 $ T*APOAQ, V( 1, p ),
902.GT.
IF( AAPPAAQQ ) THEN
903 CALL SCOPY( M, A( 1, p ), 1, WORK,
905 CALL SLASCL( 'g
', 0, 0, AAPP, ONE,
906 $ M, 1, WORK, LDA, IERR )
907 CALL SLASCL( 'g
', 0, 0, AAQQ, ONE,
908 $ M, 1, A( 1, q ), LDA,
910 TEMP1 = -AAPQ*D( p ) / D( q )
911 CALL SAXPY( M, TEMP1, WORK, 1,
913 CALL SLASCL( 'g
', 0, 0, ONE, AAQQ,
914 $ M, 1, A( 1, q ), LDA,
916 SVA( q ) = AAQQ*SQRT( MAX( ZERO,
918 MXSINJ = MAX( MXSINJ, SFMIN )
920 CALL SCOPY( M, A( 1, q ), 1, WORK,
922 CALL SLASCL( 'g
', 0, 0, AAQQ, ONE,
923 $ M, 1, WORK, LDA, IERR )
924 CALL SLASCL( 'g
', 0, 0, AAPP, ONE,
925 $ M, 1, A( 1, p ), LDA,
927 TEMP1 = -AAPQ*D( q ) / D( p )
928 CALL SAXPY( M, TEMP1, WORK, 1,
930 CALL SLASCL( 'g
', 0, 0, ONE, AAPP,
931 $ M, 1, A( 1, p ), LDA,
933 SVA( p ) = AAPP*SQRT( MAX( ZERO,
935 MXSINJ = MAX( MXSINJ, SFMIN )
942.LE.
IF( ( SVA( q ) / AAQQ )**2ROOTEPS )
944.LT..AND.
IF( ( AAQQROOTBIG )
945.GT.
$ ( AAQQROOTSFMIN ) ) THEN
946 SVA( q ) = SNRM2( M, A( 1, q ), 1 )*
951 CALL SLASSQ( M, A( 1, q ), 1, T,
953 SVA( q ) = T*SQRT( AAQQ )*D( q )
956.LE.
IF( ( AAPP / AAPP0 )**2ROOTEPS ) THEN
957.LT..AND.
IF( ( AAPPROOTBIG )
958.GT.
$ ( AAPPROOTSFMIN ) ) THEN
959 AAPP = SNRM2( M, A( 1, p ), 1 )*
964 CALL SLASSQ( M, A( 1, p ), 1, T,
966 AAPP = T*SQRT( AAPP )*D( p )
973 PSKIPPED = PSKIPPED + 1
978 PSKIPPED = PSKIPPED + 1
982.LE..AND..GE.
IF( ( iSWBAND ) ( IJBLSKBLSKIP ) )
988.LE..AND.
IF( ( iSWBAND )
989.GT.
$ ( PSKIPPEDROWSKIP ) ) THEN
1002.EQ.
IF( AAPPZERO )NOTROT = NOTROT +
1003 $ MIN( jgl+KBL-1, N ) - jgl + 1
1004.LT.
IF( AAPPZERO )NOTROT = 0
1013 DO 2012 p = igl, MIN( igl+KBL-1, N )
1014 SVA( p ) = ABS( SVA( p ) )
1021.LT..AND..GT.
IF( ( SVA( N )ROOTBIG ) ( SVA( N )ROOTSFMIN ) )
1023 SVA( N ) = SNRM2( M, A( 1, N ), 1 )*D( N )
1027 CALL SLASSQ( M, A( 1, N ), 1, T, AAPP )
1028 SVA( N ) = T*SQRT( AAPP )*D( N )
1033.LT..AND..LE..OR.
IF( ( iSWBAND ) ( ( MXAAPQROOTTOL )
1034.LE.
$ ( ISWROTN ) ) )SWBAND = i
1036.GT..AND..LT..AND.
IF( ( iSWBAND+1 ) ( MXAAPQFLOAT( N )*TOL )
1037.LT.
$ ( FLOAT( N )*MXAAPQ*MXSINJTOL ) ) THEN
1041.GE.
IF( NOTROTEMPTSW )GO TO 1994
1058 DO 5991 p = 1, N - 1
1059 q = ISAMAX( N-p+1, SVA( p ), 1 ) + p - 1
1067 CALL SSWAP( M, A( 1, p ), 1, A( 1, q ), 1 )
1068 IF( RSVEC )CALL SSWAP( MVL, V( 1, p ), 1, V( 1, q ), 1 )