262 SUBROUTINE strsna( JOB, HOWMNY, SELECT, N, T, LDT, VL, LDVL, VR,
263 $ LDVR, S, SEP, MM, M, WORK, LDWORK, IWORK,
271 CHARACTER HOWMNY, JOB
272 INTEGER INFO, LDT, LDVL, LDVR, LDWORK, M, MM, N
277 REAL S( * ), SEP( * ), T( ldt, * ), VL( ldvl, * ),
278 $ vr( ldvr, * ), work( ldwork, * )
285 parameter( zero = 0.0e+0, one = 1.0e+0, two = 2.0e+0 )
288 LOGICAL PAIR, SOMCON, WANTBH, WANTS, WANTSP
289 INTEGER I, IERR, IFST, ILST, J, K, KASE, KS, N2, NN
290 REAL BIGNUM, COND, CS, DELTA, DUMM, EPS, EST, LNRM,
291 $ mu, prod, prod1, prod2, rnrm, scale, smlnum, sn
299 REAL SDOT, SLAMCH, SLAPY2, SNRM2
300 EXTERNAL lsame, sdot, slamch, slapy2, snrm2
306 INTRINSIC abs, max, sqrt
312 wantbh = lsame( job,
'B' )
313 wants = lsame( job,
'E' ) .OR. wantbh
314 wantsp = lsame( job,
'V' ) .OR. wantbh
316 somcon = lsame( howmny,
'S' )
319 IF( .NOT.wants .AND. .NOT.wantsp )
THEN 321 ELSE IF( .NOT.lsame( howmny,
'A' ) .AND. .NOT.somcon )
THEN 323 ELSE IF( n.LT.0 )
THEN 325 ELSE IF( ldt.LT.max( 1, n ) )
THEN 327 ELSE IF( ldvl.LT.1 .OR. ( wants .AND. ldvl.LT.n ) )
THEN 329 ELSE IF( ldvr.LT.1 .OR. ( wants .AND. ldvr.LT.n ) )
THEN 344 IF( t( k+1, k ).EQ.zero )
THEN 349 IF(
SELECT( k ) .OR.
SELECT( k+1 ) )
364 ELSE IF( ldwork.LT.1 .OR. ( wantsp .AND. ldwork.LT.n ) )
THEN 369 CALL xerbla(
'STRSNA', -info )
380 IF( .NOT.
SELECT( 1 ) )
386 $ sep( 1 ) = abs( t( 1, 1 ) )
393 smlnum = slamch(
'S' ) / eps
394 bignum = one / smlnum
395 CALL slabad( smlnum, bignum )
408 $ pair = t( k+1, k ).NE.zero
416 IF( .NOT.
SELECT( k ) .AND. .NOT.
SELECT( k+1 ) )
419 IF( .NOT.
SELECT( k ) )
435 prod = sdot( n, vr( 1, ks ), 1, vl( 1, ks ), 1 )
436 rnrm = snrm2( n, vr( 1, ks ), 1 )
437 lnrm = snrm2( n, vl( 1, ks ), 1 )
438 s( ks ) = abs( prod ) / ( rnrm*lnrm )
443 prod1 = sdot( n, vr( 1, ks ), 1, vl( 1, ks ), 1 )
444 prod1 = prod1 + sdot( n, vr( 1, ks+1 ), 1, vl( 1, ks+1 ),
446 prod2 = sdot( n, vl( 1, ks ), 1, vr( 1, ks+1 ), 1 )
447 prod2 = prod2 - sdot( n, vl( 1, ks+1 ), 1, vr( 1, ks ),
449 rnrm = slapy2( snrm2( n, vr( 1, ks ), 1 ),
450 $ snrm2( n, vr( 1, ks+1 ), 1 ) )
451 lnrm = slapy2( snrm2( n, vl( 1, ks ), 1 ),
452 $ snrm2( n, vl( 1, ks+1 ), 1 ) )
453 cond = slapy2( prod1, prod2 ) / ( rnrm*lnrm )
467 CALL slacpy(
'Full', n, n, t, ldt, work, ldwork )
470 CALL strexc(
'No Q', n, work, ldwork, dummy, 1, ifst, ilst,
471 $ work( 1, n+1 ), ierr )
473 IF( ierr.EQ.1 .OR. ierr.EQ.2 )
THEN 483 IF( work( 2, 1 ).EQ.zero )
THEN 488 work( i, i ) = work( i, i ) - work( 1, 1 )
502 mu = sqrt( abs( work( 1, 2 ) ) )*
503 $ sqrt( abs( work( 2, 1 ) ) )
504 delta = slapy2( mu, work( 2, 1 ) )
506 sn = -work( 2, 1 ) / delta
520 work( 2, j ) = cs*work( 2, j )
521 work( j, j ) = work( j, j ) - work( 1, 1 )
525 work( 1, n+1 ) = two*mu
527 work( i, n+1 ) = sn*work( 1, i+1 )
538 CALL slacn2( nn, work( 1, n+2 ), work( 1, n+4 ), iwork,
546 CALL slaqtr( .true., .true., n-1, work( 2, 2 ),
547 $ ldwork, dummy, dumm, scale,
548 $ work( 1, n+4 ), work( 1, n+6 ),
555 CALL slaqtr( .true., .false., n-1, work( 2, 2 ),
556 $ ldwork, work( 1, n+1 ), mu, scale,
557 $ work( 1, n+4 ), work( 1, n+6 ),
565 CALL slaqtr( .false., .true., n-1, work( 2, 2 ),
566 $ ldwork, dummy, dumm, scale,
567 $ work( 1, n+4 ), work( 1, n+6 ),
574 CALL slaqtr( .false., .false., n-1,
575 $ work( 2, 2 ), ldwork,
576 $ work( 1, n+1 ), mu, scale,
577 $ work( 1, n+4 ), work( 1, n+6 ),
587 sep( ks ) = scale / max( est, smlnum )
589 $ sep( ks+1 ) = sep( ks )
subroutine slaqtr(LTRAN, LREAL, N, T, LDT, B, W, SCALE, X, WORK, INFO)
SLAQTR solves a real quasi-triangular system of equations, or a complex quasi-triangular system of sp...
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine slabad(SMALL, LARGE)
SLABAD
subroutine slacn2(N, V, X, ISGN, EST, KASE, ISAVE)
SLACN2 estimates the 1-norm of a square matrix, using reverse communication for evaluating matrix-vec...
subroutine strsna(JOB, HOWMNY, SELECT, N, T, LDT, VL, LDVL, VR, LDVR, S, SEP, MM, M, WORK, LDWORK, IWORK, INFO)
STRSNA
subroutine strexc(COMPQ, N, T, LDT, Q, LDQ, IFST, ILST, WORK, INFO)
STREXC
subroutine slacpy(UPLO, M, N, A, LDA, B, LDB)
SLACPY copies all or part of one two-dimensional array to another.