306 SUBROUTINE ctgsna( JOB, HOWMNY, SELECT, N, A, LDA, B, LDB, VL,
307 $ LDVL, VR, LDVR, S, DIF, MM, M, WORK, LWORK,
315 CHARACTER HOWMNY, JOB
316 INTEGER INFO, LDA, LDB, LDVL, LDVR, LWORK, M, MM, N
321 REAL DIF( * ), S( * )
322 COMPLEX A( LDA, * ), B( LDB, * ), VL( LDVL, * ),
323 $ vr( ldvr, * ), work( * )
331 parameter( zero = 0.0e+0, one = 1.0e+0, idifjb = 3 )
334 LOGICAL LQUERY, SOMCON, WANTBH, WANTDF, WANTS
335 INTEGER I, IERR, IFST, ILST, K, KS, LWMIN, N1, N2
336 REAL BIGNUM, COND, EPS, LNRM, RNRM, SCALE, SMLNUM
340 COMPLEX DUMMY( 1 ), DUMMY1( 1 )
344 REAL SCNRM2, SLAMCH, SLAPY2,
347 EXTERNAL LSAME, SCNRM2, SLAMCH,
356 INTRINSIC abs, cmplx, max
362 wantbh = lsame( job,
'B' )
363 wants = lsame( job,
'E' ) .OR. wantbh
364 wantdf = lsame( job,
'V' ) .OR. wantbh
366 somcon = lsame( howmny,
'S' )
369 lquery = ( lwork.EQ.-1 )
371 IF( .NOT.wants .AND. .NOT.wantdf )
THEN
373 ELSE IF( .NOT.lsame( howmny,
'A' ) .AND. .NOT.somcon )
THEN
375 ELSE IF( n.LT.0 )
THEN
377 ELSE IF( lda.LT.max( 1, n ) )
THEN
379 ELSE IF( ldb.LT.max( 1, n ) )
THEN
381 ELSE IF( wants .AND. ldvl.LT.n )
THEN
383 ELSE IF( wants .AND. ldvr.LT.n )
THEN
402 ELSE IF( lsame( job,
'V' ) .OR. lsame( job,
'B' ) )
THEN
411 ELSE IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN
417 CALL xerbla(
'CTGSNA', -info )
419 ELSE IF( lquery )
THEN
431 smlnum = slamch(
'S' ) / eps
432 bignum = one / smlnum
440 IF( .NOT.
SELECT( k ) )
451 rnrm = scnrm2( n, vr( 1, ks ), 1 )
452 lnrm = scnrm2( n, vl( 1, ks ), 1 )
453 CALL cgemv(
'N', n, n, cmplx( one, zero ), a, lda,
454 $ vr( 1, ks ), 1, cmplx( zero, zero ), work, 1 )
455 yhax = cdotc( n, work, 1, vl( 1, ks ), 1 )
456 CALL cgemv(
'N', n, n, cmplx( one, zero ), b, ldb,
457 $ vr( 1, ks ), 1, cmplx( zero, zero ), work, 1 )
458 yhbx = cdotc( n, work, 1, vl( 1, ks ), 1 )
459 cond = slapy2( abs( yhax ), abs( yhbx ) )
460 IF( cond.EQ.zero )
THEN
463 s( ks ) = cond / ( rnrm*lnrm )
469 dif( ks ) = slapy2( abs( a( 1, 1 ) ), abs( b( 1,
479 CALL clacpy(
'Full', n, n, a, lda, work, n )
480 CALL clacpy(
'Full', n, n, b, ldb, work( n*n+1 ), n )
484 CALL ctgexc( .false., .false., n, work, n,
486 $ n, dummy, 1, dummy1, 1, ifst, ilst, ierr )
504 CALL ctgsyl(
'N', idifjb, n2, n1,
506 $ n, work, n, work( n1+1 ), n,
507 $ work( n*n1+n1+i ), n, work( i ), n,
508 $ work( n1+i ), n, scale, dif( ks ), dummy,
subroutine ctgsna(job, howmny, select, n, a, lda, b, ldb, vl, ldvl, vr, ldvr, s, dif, mm, m, work, lwork, iwork, info)
CTGSNA
subroutine ctgsyl(trans, ijob, m, n, a, lda, b, ldb, c, ldc, d, ldd, e, lde, f, ldf, scale, dif, work, lwork, iwork, info)
CTGSYL