220 SUBROUTINE strevc( SIDE, HOWMNY, SELECT, N, T, LDT, VL, LDVL, VR,
221 $ LDVR, MM, M, WORK, INFO )
228 CHARACTER HOWMNY, SIDE
229 INTEGER INFO, LDT, LDVL, LDVR, M, , N
233 REAL ( LDVL, * ), ( LDVR, * ),
241 parameter( zero = 0.0e+0, one = 1.0e+0 )
244 LOGICAL ALLV, BOTHV, LEFTV, OVER
245INTEGER I, IERR, II, IP, IS, J, J1, J2, JNXT, K, KI, N2
246 REAL BETA, BIGNUM, EMAX, OVFL, REC, REMAX, SCALE,
247 $ smin, smlnum, ulp, unfl, vcrit, vmax, wi, wr,
254 EXTERNAL lsame, isamax
261 INTRINSIC abs,
max, sqrt
270 bothv = lsame( side,
'B' )
271 rightv = lsame( side,
'R' ) .OR. bothv
272 leftv = lsame( side,
'L' ) .OR. bothv
274 allv = lsame( howmny,
'A' )
275 over = lsame( howmny,
'B' )
276 somev = lsame( howmny,
'S' )
279 IF( .NOT.rightv .AND. .NOT.leftv )
THEN
281 ELSE IF( .NOT.allv .AND. .NOT.over .AND. .NOT.somev )
THEN
283 ELSE IF( n.LT.0 )
THEN
285 ELSE IF( ldt.LT.
max( 1, n ) )
THEN
287 ELSE IF( ldvl.LT.1 .OR. ( leftv .AND. ldvl.LT.n ) )
THEN
289 ELSE IF( ldvr.LT.1 .OR. ( rightv .AND. ldvr.LT.n ) )
THEN
303 SELECT( j ) = .false.
306 IF( t( j+1, j ).EQ.zero )
THEN
311 IF(
SELECT( j ) .OR.
SELECT( j+1 ) )
THEN
331 CALL xerbla(
'STREVC', -info )
342 unfl = slamch( 'safe minimum
' )
344 CALL SLABAD( UNFL, OVFL )
345 ULP = SLAMCH( 'precision
' )
346 SMLNUM = UNFL*( N / ULP )
347 BIGNUM = ( ONE-ULP ) / SMLNUM
356 WORK( J ) = WORK( J ) + ABS( T( I, J ) )
379.EQ.
IF( T( KI, KI-1 )ZERO )
386.NOT.
IF( SELECT( KI ) )
389.NOT.
IF( SELECT( KI-1 ) )
399 $ WI = SQRT( ABS( T( KI, KI-1 ) ) )*
400 $ SQRT( ABS( T( KI-1, KI ) ) )
401 SMIN = MAX( ULP*( ABS( WR )+ABS( WI ) ), SMLNUM )
412 WORK( K+N ) = -T( K, KI )
419 DO 60 J = KI - 1, 1, -1
426.NE.
IF( T( J, J-1 )ZERO ) THEN
436 CALL SLALN2( .FALSE., 1, 1, SMIN, ONE, T( J, J ),
437 $ LDT, ONE, ONE, WORK( J+N ), N, WR,
438 $ ZERO, X, 2, SCALE, XNORM, IERR )
443.GT.
IF( XNORMONE ) THEN
444.GT.
IF( WORK( J )BIGNUM / XNORM ) THEN
445 X( 1, 1 ) = X( 1, 1 ) / XNORM
446 SCALE = SCALE / XNORM
453 $ CALL SSCAL( KI, SCALE, WORK( 1+N ), 1 )
454 WORK( J+N ) = X( 1, 1 )
458 CALL SAXPY( J-1, -X( 1, 1 ), T( 1, J ), 1,
465 CALL SLALN2( .FALSE., 2, 1, SMIN, ONE,
466 $ T( J-1, J-1 ), LDT, ONE, ONE,
467 $ WORK( J-1+N ), N, WR, ZERO, X, 2,
468 $ SCALE, XNORM, IERR )
473.GT.
IF( XNORMONE ) THEN
474 BETA = MAX( WORK( J-1 ), WORK( J ) )
475.GT.
IF( BETABIGNUM / XNORM ) THEN
476 X( 1, 1 ) = X( 1, 1 ) / XNORM
477 X( 2, 1 ) = X( 2, 1 ) / XNORM
478 SCALE = SCALE / XNORM
485 $ CALL SSCAL( KI, SCALE, WORK( 1+N ), 1 )
486 WORK( J-1+N ) = X( 1, 1 )
487 WORK( J+N ) = X( 2, 1 )
491 CALL SAXPY( J-2, -X( 1, 1 ), T( 1, J-1 ), 1,
493 CALL SAXPY( J-2, -X( 2, 1 ), T( 1, J ), 1,
501 CALL SCOPY( KI, WORK( 1+N ), 1, VR( 1, IS ), 1 )
503 II = ISAMAX( KI, VR( 1, IS ), 1 )
504 REMAX = ONE / ABS( VR( II, IS ) )
505 CALL SSCAL( KI, REMAX, VR( 1, IS ), 1 )
512 $ CALL SGEMV( 'n
', N, KI-1, ONE, VR, LDVR,
513 $ WORK( 1+N ), 1, WORK( KI+N ),
516 II = ISAMAX( N, VR( 1, KI ), 1 )
517 REMAX = ONE / ABS( VR( II, KI ) )
518 CALL SSCAL( N, REMAX, VR( 1, KI ), 1 )
529.GE.
IF( ABS( T( KI-1, KI ) )ABS( T( KI, KI-1 ) ) ) THEN
531 WORK( KI+N2 ) = WI / T( KI-1, KI )
533 WORK( KI-1+N ) = -WI / T( KI, KI-1 )
537 WORK( KI-1+N2 ) = ZERO
542 WORK( K+N ) = -WORK( KI-1+N )*T( K, KI-1 )
543 WORK( K+N2 ) = -WORK( KI+N2 )*T( K, KI )
550 DO 90 J = KI - 2, 1, -1
557.NE.
IF( T( J, J-1 )ZERO ) THEN
567 CALL SLALN2( .FALSE., 1, 2, SMIN, ONE, T( J, J ),
568 $ LDT, ONE, ONE, WORK( J+N ), N, WR, WI,
569 $ X, 2, SCALE, XNORM, IERR )
574.GT.
IF( XNORMONE ) THEN
575.GT.
IF( WORK( J )BIGNUM / XNORM ) THEN
576 X( 1, 1 ) = X( 1, 1 ) / XNORM
577 X( 1, 2 ) = X( 1, 2 ) / XNORM
578 SCALE = SCALE / XNORM
584.NE.
IF( SCALEONE ) THEN
585 CALL SSCAL( KI, SCALE, WORK( 1+N ), 1 )
586 CALL SSCAL( KI, SCALE, WORK( 1+N2 ), 1 )
588 WORK( J+N ) = X( 1, 1 )
589 WORK( J+N2 ) = X( 1, 2 )
593 CALL SAXPY( J-1, -X( 1, 1 ), T( 1, J ), 1,
595 CALL SAXPY( J-1, -X( 1, 2 ), T( 1, J ), 1,
602 CALL SLALN2( .FALSE., 2, 2, SMIN, ONE,
603 $ T( J-1, J-1 ), LDT, ONE, ONE,
604 $ WORK( J-1+N ), N, WR, WI, X, 2, SCALE,
610.GT.
IF( XNORMONE ) THEN
611 BETA = MAX( WORK( J-1 ), WORK( J ) )
612.GT.
IF( BETABIGNUM / XNORM ) THEN
614 X( 1, 1 ) = X( 1, 1 )*REC
615 X( 1, 2 ) = X( 1, 2 )*REC
616 X( 2, 1 ) = X( 2, 1 )*REC
617 X( 2, 2 ) = X( 2, 2 )*REC
624.NE.
IF( SCALEONE ) THEN
625 CALL SSCAL( KI, SCALE, WORK( 1+N ), 1 )
626 CALL SSCAL( KI, SCALE, WORK( 1+N2 ), 1 )
628 WORK( J-1+N ) = X( 1, 1 )
629 WORK( J+N ) = X( 2, 1 )
630 WORK( J-1+N2 ) = X( 1, 2 )
631 WORK( J+N2 ) = X( 2, 2 )
635 CALL SAXPY( J-2, -X( 1, 1 ), T( 1, J-1 ), 1,
637 CALL SAXPY( J-2, -X( 2, 1 ), T( 1, J ), 1,
639 CALL SAXPY( J-2, -X( 1, 2 ), T( 1, J-1 ), 1,
641 CALL SAXPY( J-2, -X( 2, 2 ), T( 1, J ), 1,
649 CALL SCOPY( KI, WORK( 1+N ), 1, VR( 1, IS-1 ), 1 )
650 CALL SCOPY( KI, WORK( 1+N2 ), 1, VR( 1, IS ), 1 )
654 EMAX = MAX( EMAX, ABS( VR( K, IS-1 ) )+
655 $ ABS( VR( K, IS ) ) )
659 CALL SSCAL( KI, REMAX, VR( 1, IS-1 ), 1 )
660 CALL SSCAL( KI, REMAX, VR( 1, IS ), 1 )
670 CALL SGEMV( 'n
', N, KI-2, ONE, VR, LDVR,
671 $ WORK( 1+N ), 1, WORK( KI-1+N ),
673 CALL SGEMV( 'n
', N, KI-2, ONE, VR, LDVR,
674 $ WORK( 1+N2 ), 1, WORK( KI+N2 ),
677 CALL SSCAL( N, WORK( KI-1+N ), VR( 1, KI-1 ), 1 )
678 CALL SSCAL( N, WORK( KI+N2 ), VR( 1, KI ), 1 )
683 EMAX = MAX( EMAX, ABS( VR( K, KI-1 ) )+
684 $ ABS( VR( K, KI ) ) )
687 CALL SSCAL( N, REMAX, VR( 1, KI-1 ), 1 )
688 CALL SSCAL( N, REMAX, VR( 1, KI ), 1 )
715.EQ.
IF( T( KI+1, KI )ZERO )
721.NOT.
IF( SELECT( KI ) )
730 $ WI = SQRT( ABS( T( KI, KI+1 ) ) )*
731 $ SQRT( ABS( T( KI+1, KI ) ) )
732 SMIN = MAX( ULP*( ABS( WR )+ABS( WI ) ), SMLNUM )
743 WORK( K+N ) = -T( KI, K )
760.NE.
IF( T( J+1, J )ZERO ) THEN
773.GT.
IF( WORK( J )VCRIT ) THEN
775 CALL SSCAL( N-KI+1, REC, WORK( KI+N ), 1 )
780 WORK( J+N ) = WORK( J+N ) -
781 $ SDOT( J-KI-1, T( KI+1, J ), 1,
782 $ WORK( KI+1+N ), 1 )
786 CALL SLALN2( .FALSE., 1, 1, SMIN, ONE, T( J, J ),
787 $ LDT, ONE, ONE, WORK( J+N ), N, WR,
788 $ ZERO, X, 2, SCALE, XNORM, IERR )
793 $ CALL SSCAL( N-KI+1, SCALE, WORK( KI+N ), 1 )
794 WORK( J+N ) = X( 1, 1 )
795 VMAX = MAX( ABS( WORK( J+N ) ), VMAX )
796 VCRIT = BIGNUM / VMAX
805 BETA = MAX( WORK( J ), WORK( J+1 ) )
806.GT.
IF( BETAVCRIT ) THEN
808 CALL SSCAL( N-KI+1, REC, WORK( KI+N ), 1 )
813 WORK( J+N ) = WORK( J+N ) -
814 $ SDOT( J-KI-1, T( KI+1, J ), 1,
815 $ WORK( KI+1+N ), 1 )
817 WORK( J+1+N ) = WORK( J+1+N ) -
818 $ SDOT( J-KI-1, T( KI+1, J+1 ), 1,
819 $ WORK( KI+1+N ), 1 )
825 CALL SLALN2( .TRUE., 2, 1, SMIN, ONE, T( J, J ),
826 $ LDT, ONE, ONE, WORK( J+N ), N, WR,
827 $ ZERO, X, 2, SCALE, XNORM, IERR )
832 $ CALL SSCAL( N-KI+1, SCALE, WORK( KI+N ), 1 )
833 WORK( J+N ) = X( 1, 1 )
834 WORK( J+1+N ) = X( 2, 1 )
836 VMAX = MAX( ABS( WORK( J+N ) ),
837 $ ABS( WORK( J+1+N ) ), VMAX )
838 VCRIT = BIGNUM / VMAX
846 CALL SCOPY( N-KI+1, WORK( KI+N ), 1, VL( KI, IS ), 1 )
848 II = ISAMAX( N-KI+1, VL( KI, IS ), 1 ) + KI - 1
849 REMAX = ONE / ABS( VL( II, IS ) )
850 CALL SSCAL( N-KI+1, REMAX, VL( KI, IS ), 1 )
859 $ CALL SGEMV( 'n
', N, N-KI, ONE, VL( 1, KI+1 ), LDVL,
860 $ WORK( KI+1+N ), 1, WORK( KI+N ),
863 II = ISAMAX( N, VL( 1, KI ), 1 )
864 REMAX = ONE / ABS( VL( II, KI ) )
865 CALL SSCAL( N, REMAX, VL( 1, KI ), 1 )
877.GE.
IF( ABS( T( KI, KI+1 ) )ABS( T( KI+1, KI ) ) ) THEN
878 WORK( KI+N ) = WI / T( KI, KI+1 )
879 WORK( KI+1+N2 ) = ONE
882 WORK( KI+1+N2 ) = -WI / T( KI+1, KI )
884 WORK( KI+1+N ) = ZERO
890 WORK( K+N ) = -WORK( KI+N )*T( KI, K )
891 WORK( K+N2 ) = -WORK( KI+1+N2 )*T( KI+1, K )
908.NE.
IF( T( J+1, J )ZERO ) THEN
921.GT.
IF( WORK( J )VCRIT ) THEN
923 CALL SSCAL( N-KI+1, REC, WORK( KI+N ), 1 )
924 CALL SSCAL( N-KI+1, REC, WORK( KI+N2 ), 1 )
929 WORK( J+N ) = WORK( J+N ) -
930 $ SDOT( J-KI-2, T( KI+2, J ), 1,
931 $ WORK( KI+2+N ), 1 )
932 WORK( J+N2 ) = WORK( J+N2 ) -
933 $ SDOT( J-KI-2, T( KI+2, J ), 1,
934 $ WORK( KI+2+N2 ), 1 )
938 CALL SLALN2( .FALSE., 1, 2, SMIN, ONE, T( J, J ),
939 $ LDT, ONE, ONE, WORK( J+N ), N, WR,
940 $ -WI, X, 2, SCALE, XNORM, IERR )
944.NE.
IF( SCALEONE ) THEN
945 CALL SSCAL( N-KI+1, SCALE, WORK( KI+N ), 1 )
946 CALL SSCAL( N-KI+1, SCALE, WORK( KI+N2 ), 1 )
948 WORK( J+N ) = X( 1, 1 )
949 WORK( J+N2 ) = X( 1, 2 )
950 VMAX = MAX( ABS( WORK( J+N ) ),
951 $ ABS( WORK( J+N2 ) ), VMAX )
952 VCRIT = BIGNUM / VMAX
961 BETA = MAX( WORK( J ), WORK( J+1 ) )
962.GT.
IF( BETAVCRIT ) THEN
964 CALL SSCAL( N-KI+1, REC, WORK( KI+N ), 1 )
965 CALL SSCAL( N-KI+1, REC, WORK( KI+N2 ), 1 )
970 WORK( J+N ) = WORK( J+N ) -
971 $ SDOT( J-KI-2, T( KI+2, J ), 1,
972 $ WORK( KI+2+N ), 1 )
974 WORK( J+N2 ) = WORK( J+N2 ) -
975 $ SDOT( J-KI-2, T( KI+2, J ), 1,
976 $ WORK( KI+2+N2 ), 1 )
978 WORK( J+1+N ) = WORK( J+1+N ) -
979 $ SDOT( J-KI-2, T( KI+2, J+1 ), 1,
980 $ WORK( KI+2+N ), 1 )
982 WORK( J+1+N2 ) = WORK( J+1+N2 ) -
983 $ SDOT( J-KI-2, T( KI+2, J+1 ), 1,
984 $ WORK( KI+2+N2 ), 1 )
990 CALL SLALN2( .TRUE., 2, 2, SMIN, ONE, T( J, J ),
991 $ LDT, ONE, ONE, WORK( J+N ), N, WR,
992 $ -WI, X, 2, SCALE, XNORM, IERR )
996.NE.
IF( SCALEONE ) THEN
997 CALL SSCAL( N-KI+1, SCALE, WORK( KI+N ), 1 )
998 CALL SSCAL( N-KI+1, SCALE, WORK( KI+N2 ), 1 )
1000 WORK( J+N ) = X( 1, 1 )
1001 WORK( J+N2 ) = X( 1, 2 )
1002 WORK( J+1+N ) = X( 2, 1 )
1003 WORK( J+1+N2 ) = X( 2, 2 )
1004 VMAX = MAX( ABS( X( 1, 1 ) ), ABS( X( 1, 2 ) ),
1005 $ ABS( X( 2, 1 ) ), ABS( X( 2, 2 ) ), VMAX )
1006 VCRIT = BIGNUM / VMAX
1013.NOT.
IF( OVER ) THEN
1014 CALL SCOPY( N-KI+1, WORK( KI+N ), 1, VL( KI, IS ), 1 )
1015 CALL SCOPY( N-KI+1, WORK( KI+N2 ), 1, VL( KI, IS+1 ),
1020 EMAX = MAX( EMAX, ABS( VL( K, IS ) )+
1021 $ ABS( VL( K, IS+1 ) ) )
1024 CALL SSCAL( N-KI+1, REMAX, VL( KI, IS ), 1 )
1025 CALL SSCAL( N-KI+1, REMAX, VL( KI, IS+1 ), 1 )
1027 DO 230 K = 1, KI - 1
1029 VL( K, IS+1 ) = ZERO
1032.LT.
IF( KIN-1 ) THEN
1033 CALL SGEMV( 'n
', N, N-KI-1, ONE, VL( 1, KI+2 ),
1034 $ LDVL, WORK( KI+2+N ), 1, WORK( KI+N ),
1036 CALL SGEMV( 'n
', N, N-KI-1, ONE, VL( 1, KI+2 ),
1037 $ LDVL, WORK( KI+2+N2 ), 1,
1038 $ WORK( KI+1+N2 ), VL( 1, KI+1 ), 1 )
1040 CALL SSCAL( N, WORK( KI+N ), VL( 1, KI ), 1 )
1041 CALL SSCAL( N, WORK( KI+1+N2 ), VL( 1, KI+1 ), 1 )
1046 EMAX = MAX( EMAX, ABS( VL( K, KI ) )+
1047 $ ABS( VL( K, KI+1 ) ) )
1050 CALL SSCAL( N, REMAX, VL( 1, KI ), 1 )
1051 CALL SSCAL( N, REMAX, VL( 1, KI+1 ), 1 )
subroutine slaln2(ltrans, na, nw, smin, ca, a, lda, d1, d2, b, ldb, wr, wi, x, ldx, scale, xnorm, info)
SLALN2 solves a 1-by-1 or 2-by-2 linear system of equations of the specified form.
subroutine strevc(side, howmny, select, n, t, ldt, vl, ldvl, vr, ldvr, mm, m, work, info)
STREVC
subroutine sgemv(trans, m, n, alpha, a, lda, x, incx, beta, y, incy)
SGEMV