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 dlabad(SMALL, LARGE)
DLABAD
subroutine xerbla(SRNAME, INFO)
XERBLA
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 zlacpy(UPLO, M, N, A, LDA, B, LDB)
ZLACPY copies all or part of one two-dimensional array to another.
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 zdrscl(N, SA, SX, INCX)
ZDRSCL multiplies a vector by the reciprocal of a real scalar.
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