260 SUBROUTINE shsein( SIDE, EIGSRC, INITV, SELECT, N, H, LDH, WR, WI,
261 $ VL, LDVL, VR, LDVR, MM, M, WORK, IFAILL,
269 CHARACTER EIGSRC, INITV, SIDE
270 INTEGER INFO, LDH, LDVL, LDVR, M, MM, N
274 INTEGER IFAILL( * ), IFAILR( * )
275 REAL H( ldh, * ), VL( ldvl, * ), VR( ldvr, * ),
276 $ wi( * ), work( * ), wr( * )
283 parameter( zero = 0.0e+0, one = 1.0e+0 )
286 LOGICAL BOTHV, FROMQR, LEFTV, NOINIT, PAIR, RIGHTV
287 INTEGER I, IINFO, K, KL, KLN, KR, KSI, KSR, LDWORK
288 REAL BIGNUM, EPS3, HNORM, SMLNUM, ULP, UNFL, WKI,
292 LOGICAL LSAME, SISNAN
294 EXTERNAL lsame, slamch, slanhs, sisnan
306 bothv = lsame( side,
'B' )
307 rightv = lsame( side,
'R' ) .OR. bothv
308 leftv = lsame( side,
'L' ) .OR. bothv
310 fromqr = lsame( eigsrc,
'Q' )
312 noinit = lsame( initv,
'N' )
322 SELECT( k ) = .false.
324 IF( wi( k ).EQ.zero )
THEN 329 IF(
SELECT( k ) .OR.
SELECT( k+1 ) )
THEN 338 IF( .NOT.rightv .AND. .NOT.leftv )
THEN 340 ELSE IF( .NOT.fromqr .AND. .NOT.lsame( eigsrc,
'N' ) )
THEN 342 ELSE IF( .NOT.noinit .AND. .NOT.lsame( initv,
'U' ) )
THEN 344 ELSE IF( n.LT.0 )
THEN 346 ELSE IF( ldh.LT.max( 1, n ) )
THEN 348 ELSE IF( ldvl.LT.1 .OR. ( leftv .AND. ldvl.LT.n ) )
THEN 350 ELSE IF( ldvr.LT.1 .OR. ( rightv .AND. ldvr.LT.n ) )
THEN 352 ELSE IF( mm.LT.m )
THEN 356 CALL xerbla(
'SHSEIN', -info )
367 unfl = slamch(
'Safe minimum' )
368 ulp = slamch(
'Precision' )
369 smlnum = unfl*( n / ulp )
370 bignum = ( one-ulp ) / smlnum
384 IF(
SELECT( k ) )
THEN 401 DO 20 i = k, kl + 1, -1
402 IF( h( i, i-1 ).EQ.zero )
409 IF( h( i+1, i ).EQ.zero )
423 hnorm = slanhs(
'I', kr-kl+1, h( kl, kl ), ldh, work )
424 IF( sisnan( hnorm ) )
THEN 427 ELSE IF( hnorm.GT.zero )
THEN 441 DO 70 i = k - 1, kl, -1
442 IF(
SELECT( i ) .AND. abs( wr( i )-wkr )+
443 $ abs( wi( i )-wki ).LT.eps3 )
THEN 460 CALL slaein( .false., noinit, n-kl+1, h( kl, kl ), ldh,
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 xerbla(SRNAME, INFO)
XERBLA
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...