308 SUBROUTINE ztgsna( JOB, HOWMNY, SELECT, N, A, LDA, B, LDB, VL,
309 $ LDVL, VR, LDVR, S, DIF, MM, M, WORK, LWORK,
317 CHARACTER HOWMNY, JOB
318 INTEGER INFO, LDA, LDB, LDVL, LDVR, LWORK, M, MM, N
323 DOUBLE PRECISION DIF( * ), S( * )
324 COMPLEX*16 A( lda, * ), B( ldb, * ), VL( ldvl, * ),
325 $ vr( ldvr, * ), work( * )
331 DOUBLE PRECISION ZERO, ONE
333 parameter( zero = 0.0d+0, one = 1.0d+0, idifjb = 3 )
336 LOGICAL LQUERY, SOMCON, WANTBH, WANTDF, WANTS
337 INTEGER I, IERR, IFST, ILST, K, KS, LWMIN, N1, N2
338 DOUBLE PRECISION BIGNUM, COND, EPS, LNRM, RNRM, SCALE, SMLNUM
339 COMPLEX*16 YHAX, YHBX
342 COMPLEX*16 DUMMY( 1 ), DUMMY1( 1 )
346 DOUBLE PRECISION DLAMCH, DLAPY2, DZNRM2
348 EXTERNAL lsame, dlamch, dlapy2, dznrm2, zdotc
354 INTRINSIC abs, dcmplx, max
360 wantbh = lsame( job,
'B' )
361 wants = lsame( job,
'E' ) .OR. wantbh
362 wantdf = lsame( job,
'V' ) .OR. wantbh
364 somcon = lsame( howmny,
'S' )
367 lquery = ( lwork.EQ.-1 )
369 IF( .NOT.wants .AND. .NOT.wantdf )
THEN 371 ELSE IF( .NOT.lsame( howmny,
'A' ) .AND. .NOT.somcon )
THEN 373 ELSE IF( n.LT.0 )
THEN 375 ELSE IF( lda.LT.max( 1, n ) )
THEN 377 ELSE IF( ldb.LT.max( 1, n ) )
THEN 379 ELSE IF( wants .AND. ldvl.LT.n )
THEN 381 ELSE IF( wants .AND. ldvr.LT.n )
THEN 400 ELSE IF( lsame( job,
'V' ) .OR. lsame( job,
'B' ) )
THEN 409 ELSE IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN 415 CALL xerbla(
'ZTGSNA', -info )
417 ELSE IF( lquery )
THEN 429 smlnum = dlamch(
'S' ) / eps
430 bignum = one / smlnum
431 CALL dlabad( smlnum, bignum )
439 IF( .NOT.
SELECT( k ) )
450 rnrm = dznrm2( n, vr( 1, ks ), 1 )
451 lnrm = dznrm2( n, vl( 1, ks ), 1 )
452 CALL zgemv(
'N', n, n, dcmplx( one, zero ), a, lda,
453 $ vr( 1, ks ), 1, dcmplx( zero, zero ), work, 1 )
454 yhax = zdotc( n, work, 1, vl( 1, ks ), 1 )
455 CALL zgemv(
'N', n, n, dcmplx( one, zero ), b, ldb,
456 $ vr( 1, ks ), 1, dcmplx( zero, zero ), work, 1 )
457 yhbx = zdotc( n, work, 1, vl( 1, ks ), 1 )
458 cond = dlapy2( abs( yhax ), abs( yhbx ) )
459 IF( cond.EQ.zero )
THEN 462 s( ks ) = cond / ( rnrm*lnrm )
468 dif( ks ) = dlapy2( abs( a( 1, 1 ) ), abs( b( 1, 1 ) ) )
477 CALL zlacpy(
'Full', n, n, a, lda, work, n )
478 CALL zlacpy(
'Full', n, n, b, ldb, work( n*n+1 ), n )
482 CALL ztgexc( .false., .false., n, work, n, work( n*n+1 ),
483 $ n, dummy, 1, dummy1, 1, ifst, ilst, ierr )
501 CALL ztgsyl(
'N', idifjb, n2, n1, work( n*n1+n1+1 ),
502 $ n, work, n, work( n1+1 ), n,
503 $ work( n*n1+n1+i ), n, work( i ), n,
504 $ work( n1+i ), n, scale, dif( ks ), dummy,
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine zlacpy(UPLO, M, N, A, LDA, B, LDB)
ZLACPY copies all or part of one two-dimensional array to another.
subroutine ztgsyl(TRANS, IJOB, M, N, A, LDA, B, LDB, C, LDC, D, LDD, E, LDE, F, LDF, SCALE, DIF, WORK, LWORK, IWORK, INFO)
ZTGSYL
subroutine ztgsna(JOB, HOWMNY, SELECT, N, A, LDA, B, LDB, VL, LDVL, VR, LDVR, S, DIF, MM, M, WORK, LWORK, IWORK, INFO)
ZTGSNA
subroutine ztgexc(WANTQ, WANTZ, N, A, LDA, B, LDB, Q, LDQ, Z, LDZ, IFST, ILST, INFO)
ZTGEXC
subroutine dlabad(SMALL, LARGE)
DLABAD
subroutine zgemv(TRANS, M, N, ALPHA, A, LDA, X, INCX, BETA, Y, INCY)
ZGEMV