258 SUBROUTINE shsein( SIDE, EIGSRC, INITV, SELECT, N, H, LDH, WR,
260 $ VL, LDVL, VR, LDVR, MM, M, WORK, IFAILL,
268 CHARACTER EIGSRC, INITV, SIDE
269 INTEGER INFO, LDH, LDVL, LDVR, M, MM, N
273 INTEGER IFAILL( * ), IFAILR( * )
274 REAL H( LDH, * ), VL( LDVL, * ), VR( LDVR, * ),
275 $ wi( * ), work( * ), wr( * )
282 PARAMETER ( ZERO = 0.0e+0, one = 1.0e+0 )
285 LOGICAL BOTHV, FROMQR, LEFTV, NOINIT, PAIR, RIGHTV
286 INTEGER I, IINFO, K, KL, KLN, KR, KSI, KSR, LDWORK
287 REAL BIGNUM, EPS3, HNORM, SMLNUM, ULP, UNFL, WKI,
291 LOGICAL LSAME, SISNAN
293 EXTERNAL LSAME, SLAMCH, SLANHS, SISNAN
305 bothv = lsame( side,
'B' )
306 rightv = lsame( side,
'R' ) .OR. bothv
307 leftv = lsame( side,
'L' ) .OR. bothv
309 fromqr = lsame( eigsrc,
'Q' )
311 noinit = lsame( initv,
'N' )
321 SELECT( k ) = .false.
323 IF( wi( k ).EQ.zero )
THEN
328 IF(
SELECT( k ) .OR.
SELECT( k+1 ) )
THEN
337 IF( .NOT.rightv .AND. .NOT.leftv )
THEN
339 ELSE IF( .NOT.fromqr .AND. .NOT.lsame( eigsrc,
'N' ) )
THEN
341 ELSE IF( .NOT.noinit .AND. .NOT.lsame( initv,
'U' ) )
THEN
343 ELSE IF( n.LT.0 )
THEN
345 ELSE IF( ldh.LT.max( 1, n ) )
THEN
347 ELSE IF( ldvl.LT.1 .OR. ( leftv .AND. ldvl.LT.n ) )
THEN
349 ELSE IF( ldvr.LT.1 .OR. ( rightv .AND. ldvr.LT.n ) )
THEN
351 ELSE IF( mm.LT.m )
THEN
355 CALL xerbla(
'SHSEIN', -info )
366 unfl = slamch(
'Safe minimum' )
367 ulp = slamch(
'Precision' )
368 smlnum = unfl*( real( n ) / ulp )
369 bignum = ( one-ulp ) / smlnum
383 IF(
SELECT( k ) )
THEN
400 DO 20 i = k, kl + 1, -1
401 IF( h( i, i-1 ).EQ.zero )
408 IF( h( i+1, i ).EQ.zero )
422 hnorm = slanhs(
'I', kr-kl+1, h( kl, kl ), ldh, work )
423 IF( sisnan( hnorm ) )
THEN
426 ELSE IF( hnorm.GT.zero )
THEN
440 DO 70 i = k - 1, kl, -1
441 IF(
SELECT( i ) .AND. abs( wr( i )-wkr )+
442 $ abs( wi( i )-wki ).LT.eps3 )
THEN
459 CALL slaein( .false., noinit, n-kl+1, h( kl, kl ),
461 $ wkr, wki, vl( kl, ksr ), vl( kl, ksi ),
462 $ work, ldwork, work( n*n+n+1 ), eps3, smlnum,
464 IF( iinfo.GT.0 )
THEN
489 CALL slaein( .true., noinit, kr, h, ldh, wkr, wki,
490 $ vr( 1, ksr ), vr( 1, ksi ), work, ldwork,
491 $ work( n*n+n+1 ), eps3, smlnum, bignum,
493 IF( iinfo.GT.0 )
THEN
subroutine shsein(side, eigsrc, initv, select, n, h, ldh, wr, wi, vl, ldvl, vr, ldvr, mm, m, work, ifaill, ifailr, info)
SHSEIN
subroutine slaein(rightv, noinit, n, h, ldh, wr, wi, vr, vi, b, ldb, work, eps3, smlnum, bignum, info)
SLAEIN computes a specified right or left eigenvector of an upper Hessenberg matrix by inverse iterat...