450       SUBROUTINE dtgsen( IJOB, WANTQ, WANTZ, SELECT, N, A, LDA, B, LDB,
 
  451      $                   ALPHAR, ALPHAI, BETA, Q, LDQ, Z, LDZ, M, PL,
 
  452      $                   PR, DIF, WORK, LWORK, IWORK, LIWORK, INFO )
 
  461       INTEGER            IJOB, INFO, LDA, LDB, LDQ, LDZ, LIWORK, LWORK,
 
  463       DOUBLE PRECISION   PL, PR
 
  468       DOUBLE PRECISION   A( LDA, * ), ALPHAI( * ), ALPHAR( * ),
 
  469      $                   b( ldb, * ), beta( * ), dif( * ), q( ldq, * ),
 
  470      $                   work( * ), z( ldz, * )
 
  477       PARAMETER          ( IDIFJB = 3 )
 
  478       DOUBLE PRECISION   ZERO, ONE
 
  479       parameter( zero = 0.0d+0, one = 1.0d+0 )
 
  482       LOGICAL            LQUERY, PAIR, SWAP, WANTD, WANTD1, WANTD2,
 
  484       INTEGER            I, IERR, IJB, K, KASE, KK, KS, LIWMIN, LWMIN,
 
  486       DOUBLE PRECISION   DSCALE, DSUM, EPS, RDSCAL, SMLNUM
 
  496       DOUBLE PRECISION   DLAMCH
 
  500       INTRINSIC          max, sign, sqrt
 
  507       lquery = ( lwork.EQ.-1 .OR. liwork.EQ.-1 )
 
  509       IF( ijob.LT.0 .OR. ijob.GT.5 ) 
THEN 
  511       ELSE IF( n.LT.0 ) 
THEN 
  513       ELSE IF( lda.LT.max( 1, n ) ) 
THEN 
  515       ELSE IF( ldb.LT.max( 1, n ) ) 
THEN 
  517       ELSE IF( ldq.LT.1 .OR. ( wantq .AND. ldq.LT.n ) ) 
THEN 
  519       ELSE IF( ldz.LT.1 .OR. ( wantz .AND. ldz.LT.n ) ) 
THEN 
  524          CALL xerbla( 
'DTGSEN', -info )
 
  531       smlnum = dlamch( 
'S' ) / eps
 
  534       wantp = ijob.EQ.1 .OR. ijob.GE.4
 
  535       wantd1 = ijob.EQ.2 .OR. ijob.EQ.4
 
  536       wantd2 = ijob.EQ.3 .OR. ijob.EQ.5
 
  537       wantd = wantd1 .OR. wantd2
 
  544       IF( .NOT.lquery .OR. ijob.NE.0 ) 
THEN 
  550                IF( a( k+1, k ).EQ.zero ) 
THEN 
  555                   IF( 
SELECT( k ) .OR. 
SELECT( k+1 ) )
 
  566       IF( ijob.EQ.1 .OR. ijob.EQ.2 .OR. ijob.EQ.4 ) 
THEN 
  567          lwmin = max( 1, 4*n+16, 2*m*( n-m ) )
 
  568          liwmin = max( 1, n+6 )
 
  569       ELSE IF( ijob.EQ.3 .OR. ijob.EQ.5 ) 
THEN 
  570          lwmin = max( 1, 4*n+16, 4*m*( n-m ) )
 
  571          liwmin = max( 1, 2*m*( n-m ), n+6 )
 
  573          lwmin = max( 1, 4*n+16 )
 
  580       IF( lwork.LT.lwmin .AND. .NOT.lquery ) 
THEN 
  582       ELSE IF( liwork.LT.liwmin .AND. .NOT.lquery ) 
THEN 
  587          CALL xerbla( 
'DTGSEN', -info )
 
  589       ELSE IF( lquery ) 
THEN 
  595       IF( m.EQ.n .OR. m.EQ.0 ) 
THEN 
  604                CALL dlassq( n, a( 1, i ), 1, dscale, dsum )
 
  605                CALL dlassq( n, b( 1, i ), 1, dscale, dsum )
 
  607             dif( 1 ) = dscale*sqrt( dsum )
 
  624                IF( a( k+1, k ).NE.zero ) 
THEN 
  626                   swap = swap .OR. 
SELECT( k+1 )
 
  640      $            
CALL dtgexc( wantq, wantz, n, a, lda, b, ldb, q, ldq,
 
  641      $                         z, ldz, kk, ks, work, lwork, ierr )
 
  673          CALL dlacpy( 
'Full', n1, n2, a( 1, i ), lda, work, n1 )
 
  674          CALL dlacpy( 
'Full', n1, n2, b( 1, i ), ldb, work( n1*n2+1 ),
 
  676          CALL dtgsyl( 
'N', ijb, n1, n2, a, lda, a( i, i ), lda, work,
 
  677      $                n1, b, ldb, b( i, i ), ldb, work( n1*n2+1 ), n1,
 
  678      $                dscale, dif( 1 ), work( n1*n2*2+1 ),
 
  679      $                lwork-2*n1*n2, iwork, ierr )
 
  686          CALL dlassq( n1*n2, work, 1, rdscal, dsum )
 
  687          pl = rdscal*sqrt( dsum )
 
  688          IF( pl.EQ.zero ) 
THEN 
  691             pl = dscale / ( sqrt( dscale*dscale / pl+pl )*sqrt( pl ) )
 
  695          CALL dlassq( n1*n2, work( n1*n2+1 ), 1, rdscal, dsum )
 
  696          pr = rdscal*sqrt( dsum )
 
  697          IF( pr.EQ.zero ) 
THEN 
  700             pr = dscale / ( sqrt( dscale*dscale / pr+pr )*sqrt( pr ) )
 
  716             CALL dtgsyl( 
'N', ijb, n1, n2, a, lda, a( i, i ), lda, work,
 
  717      $                   n1, b, ldb, b( i, i ), ldb, work( n1*n2+1 ),
 
  718      $                   n1, dscale, dif( 1 ), work( 2*n1*n2+1 ),
 
  719      $                   lwork-2*n1*n2, iwork, ierr )
 
  723             CALL dtgsyl( 
'N', ijb, n2, n1, a( i, i ), lda, a, lda, work,
 
  724      $                   n2, b( i, i ), ldb, b, ldb, work( n1*n2+1 ),
 
  725      $                   n2, dscale, dif( 2 ), work( 2*n1*n2+1 ),
 
  726      $                   lwork-2*n1*n2, iwork, ierr )
 
  745             CALL dlacn2( mn2, work( mn2+1 ), work, iwork, dif( 1 ),
 
  752                   CALL dtgsyl( 
'N', ijb, n1, n2, a, lda, a( i, i ), lda,
 
  753      $                         work, n1, b, ldb, b( i, i ), ldb,
 
  754      $                         work( n1*n2+1 ), n1, dscale, dif( 1 ),
 
  755      $                         work( 2*n1*n2+1 ), lwork-2*n1*n2, iwork,
 
  761                   CALL dtgsyl( 
'T', ijb, n1, n2, a, lda, a( i, i ), lda,
 
  762      $                         work, n1, b, ldb, b( i, i ), ldb,
 
  763      $                         work( n1*n2+1 ), n1, dscale, dif( 1 ),
 
  764      $                         work( 2*n1*n2+1 ), lwork-2*n1*n2, iwork,
 
  769             dif( 1 ) = dscale / dif( 1 )
 
  774             CALL dlacn2( mn2, work( mn2+1 ), work, iwork, dif( 2 ),
 
  781                   CALL dtgsyl( 
'N', ijb, n2, n1, a( i, i ), lda, a, lda,
 
  782      $                         work, n2, b( i, i ), ldb, b, ldb,
 
  783      $                         work( n1*n2+1 ), n2, dscale, dif( 2 ),
 
  784      $                         work( 2*n1*n2+1 ), lwork-2*n1*n2, iwork,
 
  790                   CALL dtgsyl( 
'T', ijb, n2, n1, a( i, i ), lda, a, lda,
 
  791      $                         work, n2, b( i, i ), ldb, b, ldb,
 
  792      $                         work( n1*n2+1 ), n2, dscale, dif( 2 ),
 
  793      $                         work( 2*n1*n2+1 ), lwork-2*n1*n2, iwork,
 
  798             dif( 2 ) = dscale / dif( 2 )
 
  815                IF( a( k+1, k ).NE.zero ) 
THEN 
  824                work( 1 ) = a( k, k )
 
  825                work( 2 ) = a( k+1, k )
 
  826                work( 3 ) = a( k, k+1 )
 
  827                work( 4 ) = a( k+1, k+1 )
 
  828                work( 5 ) = b( k, k )
 
  829                work( 6 ) = b( k+1, k )
 
  830                work( 7 ) = b( k, k+1 )
 
  831                work( 8 ) = b( k+1, k+1 )
 
  832                CALL dlag2( work, 2, work( 5 ), 2, smlnum*eps, beta( k ),
 
  833      $                     beta( k+1 ), alphar( k ), alphar( k+1 ),
 
  835                alphai( k+1 ) = -alphai( k )
 
  839                IF( sign( one, b( k, k ) ).LT.zero ) 
THEN 
  844                      a( k, i ) = -a( k, i )
 
  845                      b( k, i ) = -b( k, i )
 
  846                      IF( wantq ) q( i, k ) = -q( i, k )
 
  850                alphar( k ) = a( k, k )
 
  852                beta( k ) = b( k, k )