385 SUBROUTINE dggevx( BALANC, JOBVL, JOBVR, SENSE, N, A, LDA, B,
387 $ ALPHAR, ALPHAI, BETA, VL, LDVL, VR, LDVR, ILO,
388 $ IHI, LSCALE, RSCALE, ABNRM, BBNRM, RCONDE,
389 $ RCONDV, WORK, LWORK, IWORK, BWORK, INFO )
396 CHARACTER BALANC, JOBVL, JOBVR, SENSE
397 INTEGER IHI, ILO, INFO, LDA, LDB, LDVL, LDVR, LWORK, N
398 DOUBLE PRECISION ABNRM, BBNRM
403 DOUBLE PRECISION A( LDA, * ), ALPHAI( * ), ALPHAR( * ),
404 $ B( LDB, * ), BETA( * ), LSCALE( * ),
405 $ rconde( * ), rcondv( * ), rscale( * ),
406 $ vl( ldvl, * ), vr( ldvr, * ), work( * )
412 DOUBLE PRECISION ZERO, ONE
413 PARAMETER ( ZERO = 0.0d+0, one = 1.0d+0 )
416 LOGICAL ILASCL, ILBSCL, ILV, ILVL, ILVR, LQUERY, NOSCL,
417 $ pair, wantsb, wantse, wantsn, wantsv
419 INTEGER I, ICOLS, IERR, IJOBVL, IJOBVR, IN, IROWS,
420 $ itau, iwrk, iwrk1, j, jc, jr, m, maxwrk,
422 DOUBLE PRECISION ANRM, ANRMTO, BIGNUM, BNRM, BNRMTO, EPS,
429 EXTERNAL DGEQRF, DGGBAK, DGGBAL, DGGHRD, DHGEQZ,
437 DOUBLE PRECISION DLAMCH, DLANGE
438 EXTERNAL LSAME, ILAENV, DLAMCH, DLANGE
441 INTRINSIC abs, max, sqrt
447 IF( lsame( jobvl,
'N' ) )
THEN
450 ELSE IF( lsame( jobvl,
'V' ) )
THEN
458 IF( lsame( jobvr,
'N' ) )
THEN
461 ELSE IF( lsame( jobvr,
'V' ) )
THEN
470 noscl = lsame( balanc,
'N' ) .OR. lsame( balanc,
'P' )
471 wantsn = lsame( sense,
'N' )
472 wantse = lsame( sense,
'E' )
473 wantsv = lsame( sense,
'V' )
474 wantsb = lsame( sense,
'B' )
479 lquery = ( lwork.EQ.-1 )
480 IF( .NOT.( lsame( balanc,
'N' ) .OR. lsame( balanc,
482 $ lsame( balanc,
'P' ) .OR.
483 $ lsame( balanc,
'B' ) ) )
486 ELSE IF( ijobvl.LE.0 )
THEN
488 ELSE IF( ijobvr.LE.0 )
THEN
490 ELSE IF( .NOT.( wantsn .OR. wantse .OR. wantsb .OR. wantsv ) )
493 ELSE IF( n.LT.0 )
THEN
495 ELSE IF( lda.LT.max( 1, n ) )
THEN
497 ELSE IF( ldb.LT.max( 1, n ) )
THEN
499 ELSE IF( ldvl.LT.1 .OR. ( ilvl .AND. ldvl.LT.n ) )
THEN
501 ELSE IF( ldvr.LT.1 .OR. ( ilvr .AND. ldvr.LT.n ) )
THEN
518 IF( noscl .AND. .NOT.ilv )
THEN
523 IF( wantse .OR. wantsb )
THEN
526 IF( wantsv .OR. wantsb )
THEN
527 minwrk = max( minwrk, 2*n*( n + 4 ) + 16 )
530 maxwrk = max( maxwrk,
531 $ n + n*ilaenv( 1,
'DGEQRF',
' ', n, 1, n,
533 maxwrk = max( maxwrk,
534 $ n + n*ilaenv( 1,
'DORMQR',
' ', n, 1, n,
537 maxwrk = max( maxwrk, n +
538 $ n*ilaenv( 1,
'DORGQR',
' ', n, 1, n,
544 IF( lwork.LT.minwrk .AND. .NOT.lquery )
THEN
550 CALL xerbla(
'DGGEVX', -info )
552 ELSE IF( lquery )
THEN
565 smlnum = dlamch(
'S' )
566 bignum = one / smlnum
567 smlnum = sqrt( smlnum ) / eps
568 bignum = one / smlnum
572 anrm = dlange(
'M', n, n, a, lda, work )
574 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN
577 ELSE IF( anrm.GT.bignum )
THEN
582 $
CALL dlascl(
'G', 0, 0, anrm, anrmto, n, n, a, lda, ierr )
586 bnrm = dlange(
'M', n, n, b, ldb, work )
588 IF( bnrm.GT.zero .AND. bnrm.LT.smlnum )
THEN
591 ELSE IF( bnrm.GT.bignum )
THEN
596 $
CALL dlascl(
'G', 0, 0, bnrm, bnrmto, n, n, b, ldb, ierr )
601 CALL dggbal( balanc, n, a, lda, b, ldb, ilo, ihi, lscale,
607 abnrm = dlange(
'1', n, n, a, lda, work( 1 ) )
610 CALL dlascl(
'G', 0, 0, anrmto, anrm, 1, 1, work( 1 ), 1,
615 bbnrm = dlange(
'1', n, n, b, ldb, work( 1 ) )
618 CALL dlascl(
'G', 0, 0, bnrmto, bnrm, 1, 1, work( 1 ), 1,
626 irows = ihi + 1 - ilo
627 IF( ilv .OR. .NOT.wantsn )
THEN
634 CALL dgeqrf( irows, icols, b( ilo, ilo ), ldb, work( itau ),
635 $ work( iwrk ), lwork+1-iwrk, ierr )
640 CALL dormqr(
'L',
'T', irows, icols, irows, b( ilo, ilo ), ldb,
641 $ work( itau ), a( ilo, ilo ), lda, work( iwrk ),
642 $ lwork+1-iwrk, ierr )
648 CALL dlaset(
'Full', n, n, zero, one, vl, ldvl )
649 IF( irows.GT.1 )
THEN
650 CALL dlacpy(
'L', irows-1, irows-1, b( ilo+1, ilo ), ldb,
651 $ vl( ilo+1, ilo ), ldvl )
653 CALL dorgqr( irows, irows, irows, vl( ilo, ilo ), ldvl,
654 $ work( itau ), work( iwrk ), lwork+1-iwrk, ierr )
658 $
CALL dlaset(
'Full', n, n, zero, one, vr, ldvr )
663 IF( ilv .OR. .NOT.wantsn )
THEN
667 CALL dgghrd( jobvl, jobvr, n, ilo, ihi, a, lda, b, ldb, vl,
668 $ ldvl, vr, ldvr, ierr )
670 CALL dgghrd(
'N',
'N', irows, 1, irows, a( ilo, ilo ), lda,
671 $ b( ilo, ilo ), ldb, vl, ldvl, vr, ldvr, ierr )
678 IF( ilv .OR. .NOT.wantsn )
THEN
684 CALL dhgeqz( chtemp, jobvl, jobvr, n, ilo, ihi, a, lda, b, ldb,
685 $ alphar, alphai, beta, vl, ldvl, vr, ldvr, work,
688 IF( ierr.GT.0 .AND. ierr.LE.n )
THEN
690 ELSE IF( ierr.GT.n .AND. ierr.LE.2*n )
THEN
703 IF( ilv .OR. .NOT.wantsn )
THEN
715 CALL dtgevc( chtemp,
'B', ldumma, n, a, lda, b, ldb, vl,
716 $ ldvl, vr, ldvr, n, in, work, ierr )
723 IF( .NOT.wantsn )
THEN
742 IF( a( i+1, i ).NE.zero )
THEN
753 ELSE IF( mm.EQ.2 )
THEN
755 bwork( i+1 ) = .true.
764 IF( wantse .OR. wantsb )
THEN
765 CALL dtgevc(
'B',
'S', bwork, n, a, lda, b, ldb,
766 $ work( 1 ), n, work( iwrk ), n, mm, m,
767 $ work( iwrk1 ), ierr )
774 CALL dtgsna( sense,
'S', bwork, n, a, lda, b, ldb,
775 $ work( 1 ), n, work( iwrk ), n, rconde( i ),
776 $ rcondv( i ), mm, m, work( iwrk1 ),
777 $ lwork-iwrk1+1, iwork, ierr )
787 CALL dggbak( balanc,
'L', n, ilo, ihi, lscale, rscale, n,
792 IF( alphai( jc ).LT.zero )
795 IF( alphai( jc ).EQ.zero )
THEN
797 temp = max( temp, abs( vl( jr, jc ) ) )
801 temp = max( temp, abs( vl( jr, jc ) )+
802 $ abs( vl( jr, jc+1 ) ) )
808 IF( alphai( jc ).EQ.zero )
THEN
810 vl( jr, jc ) = vl( jr, jc )*temp
814 vl( jr, jc ) = vl( jr, jc )*temp
815 vl( jr, jc+1 ) = vl( jr, jc+1 )*temp
821 CALL dggbak( balanc,
'R', n, ilo, ihi, lscale, rscale, n,
825 IF( alphai( jc ).LT.zero )
828 IF( alphai( jc ).EQ.zero )
THEN
830 temp = max( temp, abs( vr( jr, jc ) ) )
834 temp = max( temp, abs( vr( jr, jc ) )+
835 $ abs( vr( jr, jc+1 ) ) )
841 IF( alphai( jc ).EQ.zero )
THEN
843 vr( jr, jc ) = vr( jr, jc )*temp
847 vr( jr, jc ) = vr( jr, jc )*temp
848 vr( jr, jc+1 ) = vr( jr, jc+1 )*temp
859 CALL dlascl(
'G', 0, 0, anrmto, anrm, n, 1, alphar, n,
861 CALL dlascl(
'G', 0, 0, anrmto, anrm, n, 1, alphai, n,
866 CALL dlascl(
'G', 0, 0, bnrmto, bnrm, n, 1, beta, n, ierr )