248 SUBROUTINE ztrsna( JOB, HOWMNY, SELECT, N, T, LDT, VL, LDVL, VR,
249 $ LDVR, S, SEP, MM, M, WORK, LDWORK, RWORK,
258 CHARACTER HOWMNY, JOB
259 INTEGER INFO, LDT, LDVL, LDVR, LDWORK, M, MM, N
263 DOUBLE PRECISION RWORK( * ), S( * ), SEP( * )
264 COMPLEX*16 T( LDT, * ), VL( LDVL, * ), VR( LDVR, * ),
271 DOUBLE PRECISION ZERO, ONE
272 PARAMETER ( ZERO = 0.0d+0, one = 1.0d0+0 )
275 LOGICAL SOMCON, WANTBH, WANTS, WANTSP
277 INTEGER I, IERR, IX, J, K, KASE, KS
278 DOUBLE PRECISION BIGNUM, EPS, EST, LNRM, RNRM, SCALE, SMLNUM,
280 COMPLEX*16 CDUM, PROD
284 COMPLEX*16 DUMMY( 1 )
289 DOUBLE PRECISION DLAMCH, DZNRM2
291 EXTERNAL lsame, izamax, dlamch, dznrm2, zdotc
298 INTRINSIC abs, dble, dimag, max
301 DOUBLE PRECISION CABS1
304 cabs1( cdum ) = abs( dble( cdum ) ) + abs( dimag( cdum ) )
310 wantbh = lsame( job,
'B' )
311 wants = lsame( job,
'E' ) .OR. wantbh
312 wantsp = lsame( job,
'V' ) .OR. wantbh
314 somcon = lsame( howmny,
'S' )
330 IF( .NOT.wants .AND. .NOT.wantsp )
THEN
332 ELSE IF( .NOT.lsame( howmny,
'A' ) .AND. .NOT.somcon )
THEN
334 ELSE IF( n.LT.0 )
THEN
336 ELSE IF( ldt.LT.max( 1, n ) )
THEN
338 ELSE IF( ldvl.LT.1 .OR. ( wants .AND. ldvl.LT.n ) )
THEN
340 ELSE IF( ldvr.LT.1 .OR. ( wants .AND. ldvr.LT.n ) )
THEN
342 ELSE IF( mm.LT.m )
THEN
344 ELSE IF( ldwork.LT.1 .OR. ( wantsp .AND. ldwork.LT.n ) )
THEN
348 CALL xerbla(
'ZTRSNA', -info )
359 IF( .NOT.
SELECT( 1 ) )
365 $ sep( 1 ) = abs( t( 1, 1 ) )
372 smlnum = dlamch(
'S' ) / eps
373 bignum = one / smlnum
374 CALL dlabad( smlnum, bignum )
380 IF( .NOT.
SELECT( k ) )
389 prod = zdotc( n, vr( 1, ks ), 1, vl( 1, ks ), 1 )
390 rnrm = dznrm2( n, vr( 1, ks ), 1 )
391 lnrm = dznrm2( n, vl( 1, ks ), 1 )
392 s( ks ) = abs( prod ) / ( rnrm*lnrm )
404 CALL zlacpy(
'Full', n, n, t, ldt, work, ldwork )
405 CALL ztrexc(
'No Q', n, work, ldwork, dummy, 1, k, 1, ierr )
410 work( i, i ) = work( i, i ) - work( 1, 1 )
421 CALL zlacn2( n-1, work( 1, n+1 ), work, est, kase, isave )
428 CALL zlatrs(
'Upper',
'Conjugate transpose',
429 $
'Nonunit', normin, n-1, work( 2, 2 ),
430 $ ldwork, work, scale, rwork, ierr )
435 CALL zlatrs(
'Upper',
'No transpose',
'Nonunit',
436 $ normin, n-1, work( 2, 2 ), ldwork, work,
437 $ scale, rwork, ierr )
440 IF( scale.NE.one )
THEN
445 ix = izamax( n-1, work, 1 )
446 xnorm = cabs1( work( ix, 1 ) )
447 IF( scale.LT.xnorm*smlnum .OR. scale.EQ.zero )
449 CALL zdrscl( n, scale, work, 1 )
454 sep( ks ) = one / max( est, smlnum )