246 SUBROUTINE ztrsna( JOB, HOWMNY, SELECT, N, T, LDT, VL, LDVL, VR,
247 $ LDVR, S, SEP, MM, M, WORK, LDWORK, RWORK,
255 CHARACTER HOWMNY, JOB
256 INTEGER INFO, LDT, LDVL, LDVR, LDWORK, M, MM, N
260 DOUBLE PRECISION RWORK( * ), S( * ), SEP( * )
261 COMPLEX*16 T( ldt, * ), VL( ldvl, * ), VR( ldvr, * ),
268 DOUBLE PRECISION ZERO, ONE
269 parameter( zero = 0.0d+0, one = 1.0d0+0 )
272 LOGICAL SOMCON, WANTBH, WANTS, WANTSP
274 INTEGER I, IERR, IX, J, K, KASE, KS
275 DOUBLE PRECISION BIGNUM, EPS, EST, LNRM, RNRM, SCALE, SMLNUM,
277 COMPLEX*16 CDUM, PROD
281 COMPLEX*16 DUMMY( 1 )
286 DOUBLE PRECISION DLAMCH, DZNRM2
288 EXTERNAL lsame, izamax, dlamch, dznrm2, zdotc
295 INTRINSIC abs, dble, dimag, max
298 DOUBLE PRECISION CABS1
301 cabs1( cdum ) = abs( dble( cdum ) ) + abs( dimag( cdum ) )
307 wantbh = lsame( job,
'B' )
308 wants = lsame( job,
'E' ) .OR. wantbh
309 wantsp = lsame( job,
'V' ) .OR. wantbh
311 somcon = lsame( howmny,
'S' )
327 IF( .NOT.wants .AND. .NOT.wantsp )
THEN 329 ELSE IF( .NOT.lsame( howmny,
'A' ) .AND. .NOT.somcon )
THEN 331 ELSE IF( n.LT.0 )
THEN 333 ELSE IF( ldt.LT.max( 1, n ) )
THEN 335 ELSE IF( ldvl.LT.1 .OR. ( wants .AND. ldvl.LT.n ) )
THEN 337 ELSE IF( ldvr.LT.1 .OR. ( wants .AND. ldvr.LT.n ) )
THEN 339 ELSE IF( mm.LT.m )
THEN 341 ELSE IF( ldwork.LT.1 .OR. ( wantsp .AND. ldwork.LT.n ) )
THEN 345 CALL xerbla(
'ZTRSNA', -info )
356 IF( .NOT.
SELECT( 1 ) )
362 $ sep( 1 ) = abs( t( 1, 1 ) )
369 smlnum = dlamch(
'S' ) / eps
370 bignum = one / smlnum
371 CALL dlabad( smlnum, bignum )
377 IF( .NOT.
SELECT( k ) )
386 prod = zdotc( n, vr( 1, ks ), 1, vl( 1, ks ), 1 )
387 rnrm = dznrm2( n, vr( 1, ks ), 1 )
388 lnrm = dznrm2( n, vl( 1, ks ), 1 )
389 s( ks ) = abs( prod ) / ( rnrm*lnrm )
401 CALL zlacpy(
'Full', n, n, t, ldt, work, ldwork )
402 CALL ztrexc(
'No Q', n, work, ldwork, dummy, 1, k, 1, ierr )
407 work( i, i ) = work( i, i ) - work( 1, 1 )
418 CALL zlacn2( n-1, work( 1, n+1 ), work, est, kase, isave )
425 CALL zlatrs(
'Upper',
'Conjugate transpose',
426 $
'Nonunit', normin, n-1, work( 2, 2 ),
427 $ ldwork, work, scale, rwork, ierr )
432 CALL zlatrs(
'Upper',
'No transpose',
'Nonunit',
433 $ normin, n-1, work( 2, 2 ), ldwork, work,
434 $ scale, rwork, ierr )
437 IF( scale.NE.one )
THEN 442 ix = izamax( n-1, work, 1 )
443 xnorm = cabs1( work( ix, 1 ) )
444 IF( scale.LT.xnorm*smlnum .OR. scale.EQ.zero )
446 CALL zdrscl( n, scale, work, 1 )
451 sep( ks ) = one / max( est, smlnum )
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine zlatrs(UPLO, TRANS, DIAG, NORMIN, N, A, LDA, X, SCALE, CNORM, INFO)
ZLATRS solves a triangular system of equations with the scale factor set to prevent overflow...
subroutine zlacpy(UPLO, M, N, A, LDA, B, LDB)
ZLACPY copies all or part of one two-dimensional array to another.
subroutine ztrexc(COMPQ, N, T, LDT, Q, LDQ, IFST, ILST, INFO)
ZTREXC
subroutine ztrsna(JOB, HOWMNY, SELECT, N, T, LDT, VL, LDVL, VR, LDVR, S, SEP, MM, M, WORK, LDWORK, RWORK, INFO)
ZTRSNA
subroutine zlacn2(N, V, X, EST, KASE, ISAVE)
ZLACN2 estimates the 1-norm of a square matrix, using reverse communication for evaluating matrix-vec...
subroutine dlabad(SMALL, LARGE)
DLABAD
subroutine zdrscl(N, SA, SX, INCX)
ZDRSCL multiplies a vector by the reciprocal of a real scalar.