310 SUBROUTINE ztgsna( JOB, HOWMNY, SELECT, N, A, LDA, B, LDB, VL,
311 $ LDVL, VR, LDVR, S, DIF, MM, M, WORK, LWORK,
320 CHARACTER HOWMNY, JOB
321 INTEGER INFO, LDA, LDB, LDVL, LDVR, LWORK, M, MM, N
326 DOUBLE PRECISION DIF( * ), S( * )
327 COMPLEX*16 A( LDA, * ), B( LDB, * ), VL( LDVL, * ),
328 $ vr( ldvr, * ), work( * )
334 DOUBLE PRECISION ZERO, ONE
336 parameter( zero = 0.0d+0, one = 1.0d+0, idifjb = 3 )
339 LOGICAL LQUERY, SOMCON, WANTBH, WANTDF, WANTS
340 INTEGER I, IERR, IFST, ILST, K, KS, LWMIN, N1, N2
341 DOUBLE PRECISION BIGNUM, COND, EPS, LNRM, RNRM, SCALE, SMLNUM
342 COMPLEX*16 YHAX, YHBX
345 COMPLEX*16 DUMMY( 1 ), DUMMY1( 1 )
349 DOUBLE PRECISION DLAMCH, DLAPY2, DZNRM2
351 EXTERNAL lsame, dlamch, dlapy2, dznrm2, zdotc
357 INTRINSIC abs, dcmplx, max
363 wantbh = lsame( job,
'B' )
364 wants = lsame( job,
'E' ) .OR. wantbh
365 wantdf = lsame( job,
'V' ) .OR. wantbh
367 somcon = lsame( howmny,
'S' )
370 lquery = ( lwork.EQ.-1 )
372 IF( .NOT.wants .AND. .NOT.wantdf )
THEN
374 ELSE IF( .NOT.lsame( howmny,
'A' ) .AND. .NOT.somcon )
THEN
376 ELSE IF( n.LT.0 )
THEN
378 ELSE IF( lda.LT.max( 1, n ) )
THEN
380 ELSE IF( ldb.LT.max( 1, n ) )
THEN
382 ELSE IF( wants .AND. ldvl.LT.n )
THEN
384 ELSE IF( wants .AND. ldvr.LT.n )
THEN
403 ELSE IF( lsame( job,
'V' ) .OR. lsame( job,
'B' ) )
THEN
412 ELSE IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN
418 CALL xerbla(
'ZTGSNA', -info )
420 ELSE IF( lquery )
THEN
432 smlnum = dlamch(
'S' ) / eps
433 bignum = one / smlnum
434 CALL dlabad( smlnum, bignum )
442 IF( .NOT.
SELECT( k ) )
453 rnrm = dznrm2( n, vr( 1, ks ), 1 )
454 lnrm = dznrm2( n, vl( 1, ks ), 1 )
455 CALL zgemv(
'N', n, n, dcmplx( one, zero ), a, lda,
456 $ vr( 1, ks ), 1, dcmplx( zero, zero ), work, 1 )
457 yhax = zdotc( n, work, 1, vl( 1, ks ), 1 )
458 CALL zgemv(
'N', n, n, dcmplx( one, zero ), b, ldb,
459 $ vr( 1, ks ), 1, dcmplx( zero, zero ), work, 1 )
460 yhbx = zdotc( n, work, 1, vl( 1, ks ), 1 )
461 cond = dlapy2( abs( yhax ), abs( yhbx ) )
462 IF( cond.EQ.zero )
THEN
465 s( ks ) = cond / ( rnrm*lnrm )
471 dif( ks ) = dlapy2( abs( a( 1, 1 ) ), abs( b( 1, 1 ) ) )
480 CALL zlacpy(
'Full', n, n, a, lda, work, n )
481 CALL zlacpy(
'Full', n, n, b, ldb, work( n*n+1 ), n )
485 CALL ztgexc( .false., .false., n, work, n, work( n*n+1 ),
486 $ n, dummy, 1, dummy1, 1, ifst, ilst, ierr )
504 CALL ztgsyl(
'N', idifjb, n2, n1, work( n*n1+n1+1 ),
505 $ n, work, n, work( n1+1 ), n,
506 $ work( n*n1+n1+i ), n, work( i ), n,
507 $ work( n1+i ), n, scale, dif( ks ), dummy,