227 INTEGER INFO, LDA, LDV, LWORK, M, MV, N, NSWEEP
232 REAL A( LDA, * ), SVA( N ), D( N ), V( LDV, * ),
240 parameter( zero = 0.0e0, half = 0.5e0, one = 1.0e0)
243 REAL AAPP, AAPP0, AAPQ, AAQQ, APOAQ, AQOAP, BIG,
244 $ BIGTHETA, CS, MXAAPQ, MXSINJ, ROOTBIG, ROOTEPS,
245 $ ROOTSFMIN, ROOTTOL, SMALL, SN, T, TEMP1, THETA,
247 INTEGER BLSKIP, EMPTSW, i, ibr, IERR, igl, IJBLSK, ir1,
248 $ ISWROT, jbc, jgl, KBL, LKAHEAD, MVL, NBL,
249 $ NOTROT, p, PSKIPPED, q, ROWSKIP, SWBAND
250 LOGICAL APPLV, ROTOK, RSVEC
256 INTRINSIC abs, max, float, min, sign, sqrt
272 applv =
lsame( jobv,
'A' )
273 rsvec =
lsame( jobv,
'V' )
274 IF( .NOT.( rsvec .OR. applv .OR.
lsame( jobv,
'N' ) ) )
THEN
276 ELSE IF( m.LT.0 )
THEN
278 ELSE IF( ( n.LT.0 ) .OR. ( n.GT.m ) )
THEN
280 ELSE IF( lda.LT.m )
THEN
282 ELSE IF( ( rsvec.OR.applv ) .AND. ( mv.LT.0 ) )
THEN
284 ELSE IF( ( rsvec.AND.( ldv.LT.n ) ).OR.
285 $ ( applv.AND.( ldv.LT.mv ) ) )
THEN
287 ELSE IF( tol.LE.eps )
THEN
289 ELSE IF( nsweep.LT.0 )
THEN
291 ELSE IF( lwork.LT.m )
THEN
299 CALL xerbla(
'SGSVJ0', -info )
305 ELSE IF( applv )
THEN
308 rsvec = rsvec .OR. applv
310 rooteps = sqrt( eps )
311 rootsfmin = sqrt( sfmin )
314 rootbig = one / rootsfmin
315 bigtheta = one / rooteps
316 roottol = sqrt( tol )
320 emptsw = ( n*( n-1 ) ) / 2
340 IF( ( nbl*kbl ).NE.n )nbl = nbl + 1
342 blskip = ( kbl**2 ) + 1
345 rowskip = min( 5, kbl )
353 DO 1993 i = 1, nsweep
365 igl = ( ibr-1 )*kbl + 1
367 DO 1002 ir1 = 0, min( lkahead, nbl-ibr )
371 DO 2001 p = igl, min( igl+kbl-1, n-1 )
374 q =
isamax( n-p+1, sva( p ), 1 ) + p - 1
376 CALL sswap( m, a( 1, p ), 1, a( 1, q ), 1 )
377 IF( rsvec )
CALL sswap( mvl, v( 1, p ), 1,
401 IF( ( sva( p ).LT.rootbig ) .AND.
402 $ ( sva( p ).GT.rootsfmin ) )
THEN
403 sva( p ) =
snrm2( m, a( 1, p ), 1 )*d( p )
407 CALL slassq( m, a( 1, p ), 1, temp1, aapp )
408 sva( p ) = temp1*sqrt( aapp )*d( p )
416 IF( aapp.GT.zero )
THEN
420 DO 2002 q = p + 1, min( igl+kbl-1, n )
424 IF( aaqq.GT.zero )
THEN
427 IF( aaqq.GE.one )
THEN
428 rotok = ( small*aapp ).LE.aaqq
429 IF( aapp.LT.( big / aaqq ) )
THEN
430 aapq = (
sdot( m, a( 1, p ), 1, a( 1,
431 $ q ), 1 )*d( p )*d( q ) / aaqq )
434 CALL scopy( m, a( 1, p ), 1, work, 1 )
435 CALL slascl(
'G', 0, 0, aapp, d( p ),
436 $ m, 1, work, lda, ierr )
437 aapq =
sdot( m, work, 1, a( 1, q ),
441 rotok = aapp.LE.( aaqq / small )
442 IF( aapp.GT.( small / aaqq ) )
THEN
443 aapq = (
sdot( m, a( 1, p ), 1, a( 1,
444 $ q ), 1 )*d( p )*d( q ) / aaqq )
447 CALL scopy( m, a( 1, q ), 1, work, 1 )
448 CALL slascl(
'G', 0, 0, aaqq, d( q ),
449 $ m, 1, work, lda, ierr )
450 aapq =
sdot( m, work, 1, a( 1, p ),
455 mxaapq = max( mxaapq, abs( aapq ) )
459 IF( abs( aapq ).GT.tol )
THEN
474 theta = -half*abs( aqoap-apoaq ) / aapq
476 IF( abs( theta ).GT.bigtheta )
THEN
479 fastr( 3 ) = t*d( p ) / d( q )
480 fastr( 4 ) = -t*d( q ) / d( p )
481 CALL srotm( m, a( 1, p ), 1,
482 $ a( 1, q ), 1, fastr )
483 IF( rsvec )
CALL srotm( mvl,
487 sva( q ) = aaqq*sqrt( max( zero,
488 $ one+t*apoaq*aapq ) )
489 aapp = aapp*sqrt( max( zero,
490 $ one-t*aqoap*aapq ) )
491 mxsinj = max( mxsinj, abs( t ) )
497 thsign = -sign( one, aapq )
498 t = one / ( theta+thsign*
499 $ sqrt( one+theta*theta ) )
500 cs = sqrt( one / ( one+t*t ) )
503 mxsinj = max( mxsinj, abs( sn ) )
504 sva( q ) = aaqq*sqrt( max( zero,
505 $ one+t*apoaq*aapq ) )
506 aapp = aapp*sqrt( max( zero,
507 $ one-t*aqoap*aapq ) )
509 apoaq = d( p ) / d( q )
510 aqoap = d( q ) / d( p )
511 IF( d( p ).GE.one )
THEN
512 IF( d( q ).GE.one )
THEN
514 fastr( 4 ) = -t*aqoap
517 CALL srotm( m, a( 1, p ), 1,
520 IF( rsvec )
CALL srotm( mvl,
521 $ v( 1, p ), 1, v( 1, q ),
524 CALL saxpy( m, -t*aqoap,
527 CALL saxpy( m, cs*sn*apoaq,
533 CALL saxpy( mvl, -t*aqoap,
543 IF( d( q ).GE.one )
THEN
544 CALL saxpy( m, t*apoaq,
547 CALL saxpy( m, -cs*sn*aqoap,
553 CALL saxpy( mvl, t*apoaq,
562 IF( d( p ).GE.d( q ) )
THEN
563 CALL saxpy( m, -t*aqoap,
566 CALL saxpy( m, cs*sn*apoaq,
582 CALL saxpy( m, t*apoaq,
593 $ t*apoaq, v( 1, p ),
607 CALL scopy( m, a( 1, p ), 1, work, 1 )
608 CALL slascl(
'G', 0, 0, aapp, one, m,
609 $ 1, work, lda, ierr )
610 CALL slascl(
'G', 0, 0, aaqq, one, m,
611 $ 1, a( 1, q ), lda, ierr )
612 temp1 = -aapq*d( p ) / d( q )
613 CALL saxpy( m, temp1, work, 1,
615 CALL slascl(
'G', 0, 0, one, aaqq, m,
616 $ 1, a( 1, q ), lda, ierr )
617 sva( q ) = aaqq*sqrt( max( zero,
619 mxsinj = max( mxsinj, sfmin )
625 IF( ( sva( q ) / aaqq )**2.LE.rooteps )
627 IF( ( aaqq.LT.rootbig ) .AND.
628 $ ( aaqq.GT.rootsfmin ) )
THEN
629 sva( q ) =
snrm2( m, a( 1, q ), 1 )*
634 CALL slassq( m, a( 1, q ), 1, t,
636 sva( q ) = t*sqrt( aaqq )*d( q )
639 IF( ( aapp / aapp0 ).LE.rooteps )
THEN
640 IF( ( aapp.LT.rootbig ) .AND.
641 $ ( aapp.GT.rootsfmin ) )
THEN
642 aapp =
snrm2( m, a( 1, p ), 1 )*
647 CALL slassq( m, a( 1, p ), 1, t,
649 aapp = t*sqrt( aapp )*d( p )
656 IF( ir1.EQ.0 )notrot = notrot + 1
657 pskipped = pskipped + 1
661 IF( ir1.EQ.0 )notrot = notrot + 1
662 pskipped = pskipped + 1
665 IF( ( i.LE.swband ) .AND.
666 $ ( pskipped.GT.rowskip ) )
THEN
667 IF( ir1.EQ.0 )aapp = -aapp
682 IF( ( ir1.EQ.0 ) .AND. ( aapp.EQ.zero ) )
683 $ notrot = notrot + min( igl+kbl-1, n ) - p
695 igl = ( ibr-1 )*kbl + 1
697 DO 2010 jbc = ibr + 1, nbl
699 jgl = ( jbc-1 )*kbl + 1
704 DO 2100 p = igl, min( igl+kbl-1, n )
708 IF( aapp.GT.zero )
THEN
712 DO 2200 q = jgl, min( jgl+kbl-1, n )
716 IF( aaqq.GT.zero )
THEN
723 IF( aaqq.GE.one )
THEN
724 IF( aapp.GE.aaqq )
THEN
725 rotok = ( small*aapp ).LE.aaqq
727 rotok = ( small*aaqq ).LE.aapp
729 IF( aapp.LT.( big / aaqq ) )
THEN
730 aapq = (
sdot( m, a( 1, p ), 1, a( 1,
731 $ q ), 1 )*d( p )*d( q ) / aaqq )
734 CALL scopy( m, a( 1, p ), 1, work, 1 )
735 CALL slascl(
'G', 0, 0, aapp, d( p ),
736 $ m, 1, work, lda, ierr )
737 aapq =
sdot( m, work, 1, a( 1, q ),
741 IF( aapp.GE.aaqq )
THEN
742 rotok = aapp.LE.( aaqq / small )
744 rotok = aaqq.LE.( aapp / small )
746 IF( aapp.GT.( small / aaqq ) )
THEN
747 aapq = (
sdot( m, a( 1, p ), 1, a( 1,
748 $ q ), 1 )*d( p )*d( q ) / aaqq )
751 CALL scopy( m, a( 1, q ), 1, work, 1 )
752 CALL slascl(
'G', 0, 0, aaqq, d( q ),
753 $ m, 1, work, lda, ierr )
754 aapq =
sdot( m, work, 1, a( 1, p ),
759 mxaapq = max( mxaapq, abs( aapq ) )
763 IF( abs( aapq ).GT.tol )
THEN
773 theta = -half*abs( aqoap-apoaq ) / aapq
774 IF( aaqq.GT.aapp0 )theta = -theta
776 IF( abs( theta ).GT.bigtheta )
THEN
778 fastr( 3 ) = t*d( p ) / d( q )
779 fastr( 4 ) = -t*d( q ) / d( p )
780 CALL srotm( m, a( 1, p ), 1,
781 $ a( 1, q ), 1, fastr )
782 IF( rsvec )
CALL srotm( mvl,
786 sva( q ) = aaqq*sqrt( max( zero,
787 $ one+t*apoaq*aapq ) )
788 aapp = aapp*sqrt( max( zero,
789 $ one-t*aqoap*aapq ) )
790 mxsinj = max( mxsinj, abs( t ) )
795 thsign = -sign( one, aapq )
796 IF( aaqq.GT.aapp0 )thsign = -thsign
797 t = one / ( theta+thsign*
798 $ sqrt( one+theta*theta ) )
799 cs = sqrt( one / ( one+t*t ) )
801 mxsinj = max( mxsinj, abs( sn ) )
802 sva( q ) = aaqq*sqrt( max( zero,
803 $ one+t*apoaq*aapq ) )
804 aapp = aapp*sqrt( max( zero,
805 $ one-t*aqoap*aapq ) )
807 apoaq = d( p ) / d( q )
808 aqoap = d( q ) / d( p )
809 IF( d( p ).GE.one )
THEN
811 IF( d( q ).GE.one )
THEN
813 fastr( 4 ) = -t*aqoap
816 CALL srotm( m, a( 1, p ), 1,
819 IF( rsvec )
CALL srotm( mvl,
820 $ v( 1, p ), 1, v( 1, q ),
823 CALL saxpy( m, -t*aqoap,
826 CALL saxpy( m, cs*sn*apoaq,
830 CALL saxpy( mvl, -t*aqoap,
842 IF( d( q ).GE.one )
THEN
843 CALL saxpy( m, t*apoaq,
846 CALL saxpy( m, -cs*sn*aqoap,
850 CALL saxpy( mvl, t*apoaq,
861 IF( d( p ).GE.d( q ) )
THEN
862 CALL saxpy( m, -t*aqoap,
865 CALL saxpy( m, cs*sn*apoaq,
881 CALL saxpy( m, t*apoaq,
892 $ t*apoaq, v( 1, p ),
905 IF( aapp.GT.aaqq )
THEN
906 CALL scopy( m, a( 1, p ), 1, work,
908 CALL slascl(
'G', 0, 0, aapp, one,
909 $ m, 1, work, lda, ierr )
910 CALL slascl(
'G', 0, 0, aaqq, one,
911 $ m, 1, a( 1, q ), lda,
913 temp1 = -aapq*d( p ) / d( q )
914 CALL saxpy( m, temp1, work, 1,
916 CALL slascl(
'G', 0, 0, one, aaqq,
917 $ m, 1, a( 1, q ), lda,
919 sva( q ) = aaqq*sqrt( max( zero,
921 mxsinj = max( mxsinj, sfmin )
923 CALL scopy( m, a( 1, q ), 1, work,
925 CALL slascl(
'G', 0, 0, aaqq, one,
926 $ m, 1, work, lda, ierr )
927 CALL slascl(
'G', 0, 0, aapp, one,
928 $ m, 1, a( 1, p ), lda,
930 temp1 = -aapq*d( q ) / d( p )
931 CALL saxpy( m, temp1, work, 1,
933 CALL slascl(
'G', 0, 0, one, aapp,
934 $ m, 1, a( 1, p ), lda,
936 sva( p ) = aapp*sqrt( max( zero,
938 mxsinj = max( mxsinj, sfmin )
945 IF( ( sva( q ) / aaqq )**2.LE.rooteps )
947 IF( ( aaqq.LT.rootbig ) .AND.
948 $ ( aaqq.GT.rootsfmin ) )
THEN
949 sva( q ) =
snrm2( m, a( 1, q ), 1 )*
954 CALL slassq( m, a( 1, q ), 1, t,
956 sva( q ) = t*sqrt( aaqq )*d( q )
959 IF( ( aapp / aapp0 )**2.LE.rooteps )
THEN
960 IF( ( aapp.LT.rootbig ) .AND.
961 $ ( aapp.GT.rootsfmin ) )
THEN
962 aapp =
snrm2( m, a( 1, p ), 1 )*
967 CALL slassq( m, a( 1, p ), 1, t,
969 aapp = t*sqrt( aapp )*d( p )
976 pskipped = pskipped + 1
981 pskipped = pskipped + 1
985 IF( ( i.LE.swband ) .AND. ( ijblsk.GE.blskip ) )
991 IF( ( i.LE.swband ) .AND.
992 $ ( pskipped.GT.rowskip ) )
THEN
1005 IF( aapp.EQ.zero )notrot = notrot +
1006 $ min( jgl+kbl-1, n ) - jgl + 1
1007 IF( aapp.LT.zero )notrot = 0
1016 DO 2012 p = igl, min( igl+kbl-1, n )
1017 sva( p ) = abs( sva( p ) )
1024 IF( ( sva( n ).LT.rootbig ) .AND. ( sva( n ).GT.rootsfmin ) )
1026 sva( n ) =
snrm2( m, a( 1, n ), 1 )*d( n )
1030 CALL slassq( m, a( 1, n ), 1, t, aapp )
1031 sva( n ) = t*sqrt( aapp )*d( n )
1036 IF( ( i.LT.swband ) .AND. ( ( mxaapq.LE.roottol ) .OR.
1037 $ ( iswrot.LE.n ) ) )swband = i
1039 IF( ( i.GT.swband+1 ) .AND. ( mxaapq.LT.float( n )*tol ) .AND.
1040 $ ( float( n )*mxaapq*mxsinj.LT.tol ) )
THEN
1044 IF( notrot.GE.emptsw )
GO TO 1994
1061 DO 5991 p = 1, n - 1
1062 q =
isamax( n-p+1, sva( p ), 1 ) + p - 1
1070 CALL sswap( m, a( 1, p ), 1, a( 1, q ), 1 )
1071 IF( rsvec )
CALL sswap( mvl, v( 1, p ), 1, v( 1, q ), 1 )