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 , 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, , KASE, KS
275 DOUBLE PRECISION BIGNUM, EPS, EST, LNRM, RNRM, SCALE, SMLNUM,
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 )
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 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 ztrsna(job, howmny, select, n, t, ldt, vl, ldvl, vr, ldvr, s, sep, mm, m, work, ldwork, rwork, info)
ZTRSNA