308 SUBROUTINE ctgsna( 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, , MM, N
323 REAL DIF( * ), S( * )
324 COMPLEX ( LDA, * ), B( LDB, * ), VL( LDVL, * ),
325 $ vr( ldvr, * ), work( * )
333 parameter( zero = 0.0e+0, one = 1.0e+0, idifjb = 3 )
336 LOGICAL LQUERY, SOMCON, WANTBH, WANTDF, WANTS
337 INTEGER I, IERR, , ILST, K, , LWMIN, N1, N2
338 REAL BIGNUM, COND, EPS, LNRM, RNRM, SCALE,
342 COMPLEX DUMMY( 1 ), DUMMY1( 1 )
346 REAL SCNRM2, SLAMCH, SLAPY2
348 EXTERNAL lsame, scnrm2, slamch, slapy2, cdotc
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(
'CTGSNA', -info )
417 ELSE IF( lquery )
THEN
429 smlnum = slamch(
'S' ) / eps
430 bignum = one / smlnum
431 CALL slabad( smlnum, bignum )
439 IF( .NOT.
SELECT( k ) )
450 rnrm = scnrm2( n, vr( 1, ks ), 1 )
451 lnrm = scnrm2( n, vl( 1, ks ), 1 )
452 CALL cgemv(
'N', n, n,
cmplx( one, zero ), a, lda,
453 $ vr( 1, ks ), 1,
cmplx( zero, zero ), work, 1 )
454 yhax = cdotc( n, work, 1, vl( 1, ks ), 1 )
455 CALL cgemv(
'N', n, n,
cmplx( one, zero ), b, ldb,
456 $ vr( 1, ks ), 1,
cmplx( zero, zero ), work, 1 )
457 yhbx = cdotc( n, work, 1, vl( 1, ks ), 1 )
458 cond = slapy2( abs( yhax ), abs( yhbx ) )
459 IF( cond.EQ.zero )
THEN
462 s( ks ) = cond / ( rnrm*lnrm )
468 dif( ks ) = slapy2( abs( a( 1, 1 ) ), abs( b( 1, 1 ) ) )
477 CALL clacpy(
'Full', n, n, a, lda, work, n )
478 CALL clacpy(
'Full', n, n, b, ldb, work( n*n+1 ), n )
482 CALL ctgexc( .false., .false., n, work, n, work( n*n+1 ),
483 $ n, dummy, 1, dummy1, 1, ifst, ilst, ierr )
501 CALL ctgsyl(
'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 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