361 SUBROUTINE dggesx( JOBVSL, JOBVSR, SORT, SELCTG, SENSE, N, A, LDA,
362 $ B, LDB, SDIM, ALPHAR, ALPHAI, BETA, VSL, LDVSL,
363 $ VSR, LDVSR, RCONDE, RCONDV, WORK, LWORK, IWORK,
364 $ LIWORK, BWORK, INFO )
371 CHARACTER JOBVSL, JOBVSR, SENSE, SORT
372 INTEGER INFO, LDA, LDB, LDVSL, LDVSR, LIWORK, LWORK, N,
378 DOUBLE PRECISION A( lda, * ), ALPHAI( * ), ALPHAR( * ),
379 $ b( ldb, * ), beta( * ), rconde( 2 ),
380 $ rcondv( 2 ), vsl( ldvsl, * ), vsr( ldvsr, * ),
391 DOUBLE PRECISION ZERO, ONE
392 parameter( zero = 0.0d+0, one = 1.0d+0 )
395 LOGICAL CURSL, ILASCL, ILBSCL, ILVSL, ILVSR, LASTSL,
396 $ lquery, lst2sl, wantsb, wantse, wantsn, wantst,
398 INTEGER I, ICOLS, IERR, IHI, IJOB, IJOBVL, IJOBVR,
399 $ ileft, ilo, ip, iright, irows, itau, iwrk,
400 $ liwmin, lwrk, maxwrk, minwrk
401 DOUBLE PRECISION ANRM, ANRMTO, BIGNUM, BNRM, BNRMTO, EPS, PL,
402 $ pr, safmax, safmin, smlnum
405 DOUBLE PRECISION DIF( 2 )
415 DOUBLE PRECISION DLAMCH, DLANGE
416 EXTERNAL lsame, ilaenv, dlamch, dlange
419 INTRINSIC abs, max, sqrt
425 IF( lsame( jobvsl,
'N' ) )
THEN 428 ELSE IF( lsame( jobvsl,
'V' ) )
THEN 436 IF( lsame( jobvsr,
'N' ) )
THEN 439 ELSE IF( lsame( jobvsr,
'V' ) )
THEN 447 wantst = lsame( sort,
'S' )
448 wantsn = lsame( sense,
'N' )
449 wantse = lsame( sense,
'E' )
450 wantsv = lsame( sense,
'V' )
451 wantsb = lsame( sense,
'B' )
452 lquery = ( lwork.EQ.-1 .OR. liwork.EQ.-1 )
455 ELSE IF( wantse )
THEN 457 ELSE IF( wantsv )
THEN 459 ELSE IF( wantsb )
THEN 466 IF( ijobvl.LE.0 )
THEN 468 ELSE IF( ijobvr.LE.0 )
THEN 470 ELSE IF( ( .NOT.wantst ) .AND. ( .NOT.lsame( sort,
'N' ) ) )
THEN 472 ELSE IF( .NOT.( wantsn .OR. wantse .OR. wantsv .OR. wantsb ) .OR.
473 $ ( .NOT.wantst .AND. .NOT.wantsn ) )
THEN 475 ELSE IF( n.LT.0 )
THEN 477 ELSE IF( lda.LT.max( 1, n ) )
THEN 479 ELSE IF( ldb.LT.max( 1, n ) )
THEN 481 ELSE IF( ldvsl.LT.1 .OR. ( ilvsl .AND. ldvsl.LT.n ) )
THEN 483 ELSE IF( ldvsr.LT.1 .OR. ( ilvsr .AND. ldvsr.LT.n ) )
THEN 496 minwrk = max( 8*n, 6*n + 16 )
497 maxwrk = minwrk - n +
498 $ n*ilaenv( 1,
'DGEQRF',
' ', n, 1, n, 0 )
499 maxwrk = max( maxwrk, minwrk - n +
500 $ n*ilaenv( 1,
'DORMQR',
' ', n, 1, n, -1 ) )
502 maxwrk = max( maxwrk, minwrk - n +
503 $ n*ilaenv( 1,
'DORGQR',
' ', n, 1, n, -1 ) )
507 $ lwrk = max( lwrk, n*n/2 )
514 IF( wantsn .OR. n.EQ.0 )
THEN 521 IF( lwork.LT.minwrk .AND. .NOT.lquery )
THEN 523 ELSE IF( liwork.LT.liwmin .AND. .NOT.lquery )
THEN 529 CALL xerbla(
'DGGESX', -info )
531 ELSE IF (lquery)
THEN 545 safmin = dlamch(
'S' )
546 safmax = one / safmin
547 CALL dlabad( safmin, safmax )
548 smlnum = sqrt( safmin ) / eps
549 bignum = one / smlnum
553 anrm = dlange(
'M', n, n, a, lda, work )
555 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN 558 ELSE IF( anrm.GT.bignum )
THEN 563 $
CALL dlascl(
'G', 0, 0, anrm, anrmto, n, n, a, lda, ierr )
567 bnrm = dlange(
'M', n, n, b, ldb, work )
569 IF( bnrm.GT.zero .AND. bnrm.LT.smlnum )
THEN 572 ELSE IF( bnrm.GT.bignum )
THEN 577 $
CALL dlascl(
'G', 0, 0, bnrm, bnrmto, n, n, b, ldb, ierr )
585 CALL dggbal(
'P', n, a, lda, b, ldb, ilo, ihi, work( ileft ),
586 $ work( iright ), work( iwrk ), ierr )
591 irows = ihi + 1 - ilo
595 CALL dgeqrf( irows, icols, b( ilo, ilo ), ldb, work( itau ),
596 $ work( iwrk ), lwork+1-iwrk, ierr )
601 CALL dormqr(
'L',
'T', irows, icols, irows, b( ilo, ilo ), ldb,
602 $ work( itau ), a( ilo, ilo ), lda, work( iwrk ),
603 $ lwork+1-iwrk, ierr )
609 CALL dlaset(
'Full', n, n, zero, one, vsl, ldvsl )
610 IF( irows.GT.1 )
THEN 611 CALL dlacpy(
'L', irows-1, irows-1, b( ilo+1, ilo ), ldb,
612 $ vsl( ilo+1, ilo ), ldvsl )
614 CALL dorgqr( irows, irows, irows, vsl( ilo, ilo ), ldvsl,
615 $ work( itau ), work( iwrk ), lwork+1-iwrk, ierr )
621 $
CALL dlaset(
'Full', n, n, zero, one, vsr, ldvsr )
626 CALL dgghrd( jobvsl, jobvsr, n, ilo, ihi, a, lda, b, ldb, vsl,
627 $ ldvsl, vsr, ldvsr, ierr )
635 CALL dhgeqz(
'S', jobvsl, jobvsr, n, ilo, ihi, a, lda, b, ldb,
636 $ alphar, alphai, beta, vsl, ldvsl, vsr, ldvsr,
637 $ work( iwrk ), lwork+1-iwrk, ierr )
639 IF( ierr.GT.0 .AND. ierr.LE.n )
THEN 641 ELSE IF( ierr.GT.n .AND. ierr.LE.2*n )
THEN 659 CALL dlascl(
'G', 0, 0, anrmto, anrm, n, 1, alphar, n,
661 CALL dlascl(
'G', 0, 0, anrmto, anrm, n, 1, alphai, n,
665 $
CALL dlascl(
'G', 0, 0, bnrmto, bnrm, n, 1, beta, n, ierr )
670 bwork( i ) = selctg( alphar( i ), alphai( i ), beta( i ) )
676 CALL dtgsen( ijob, ilvsl, ilvsr, bwork, n, a, lda, b, ldb,
677 $ alphar, alphai, beta, vsl, ldvsl, vsr, ldvsr,
678 $ sdim, pl, pr, dif, work( iwrk ), lwork-iwrk+1,
679 $ iwork, liwork, ierr )
682 $ maxwrk = max( maxwrk, 2*sdim*( n-sdim ) )
683 IF( ierr.EQ.-22 )
THEN 689 IF( ijob.EQ.1 .OR. ijob.EQ.4 )
THEN 693 IF( ijob.EQ.2 .OR. ijob.EQ.4 )
THEN 694 rcondv( 1 ) = dif( 1 )
695 rcondv( 2 ) = dif( 2 )
707 $
CALL dggbak(
'P',
'L', n, ilo, ihi, work( ileft ),
708 $ work( iright ), n, vsl, ldvsl, ierr )
711 $
CALL dggbak(
'P',
'R', n, ilo, ihi, work( ileft ),
712 $ work( iright ), n, vsr, ldvsr, ierr )
720 IF( alphai( i ).NE.zero )
THEN 721 IF( ( alphar( i ) / safmax ).GT.( anrmto / anrm ) .OR.
722 $ ( safmin / alphar( i ) ).GT.( anrm / anrmto ) )
THEN 723 work( 1 ) = abs( a( i, i ) / alphar( i ) )
724 beta( i ) = beta( i )*work( 1 )
725 alphar( i ) = alphar( i )*work( 1 )
726 alphai( i ) = alphai( i )*work( 1 )
727 ELSE IF( ( alphai( i ) / safmax ).GT.
728 $ ( anrmto / anrm ) .OR.
729 $ ( safmin / alphai( i ) ).GT.( anrm / anrmto ) )
731 work( 1 ) = abs( a( i, i+1 ) / alphai( i ) )
732 beta( i ) = beta( i )*work( 1 )
733 alphar( i ) = alphar( i )*work( 1 )
734 alphai( i ) = alphai( i )*work( 1 )
742 IF( alphai( i ).NE.zero )
THEN 743 IF( ( beta( i ) / safmax ).GT.( bnrmto / bnrm ) .OR.
744 $ ( safmin / beta( i ) ).GT.( bnrm / bnrmto ) )
THEN 745 work( 1 ) = abs( b( i, i ) / beta( i ) )
746 beta( i ) = beta( i )*work( 1 )
747 alphar( i ) = alphar( i )*work( 1 )
748 alphai( i ) = alphai( i )*work( 1 )
757 CALL dlascl(
'H', 0, 0, anrmto, anrm, n, n, a, lda, ierr )
758 CALL dlascl(
'G', 0, 0, anrmto, anrm, n, 1, alphar, n, ierr )
759 CALL dlascl(
'G', 0, 0, anrmto, anrm, n, 1, alphai, n, ierr )
763 CALL dlascl(
'U', 0, 0, bnrmto, bnrm, n, n, b, ldb, ierr )
764 CALL dlascl(
'G', 0, 0, bnrmto, bnrm, n, 1, beta, n, ierr )
776 cursl = selctg( alphar( i ), alphai( i ), beta( i ) )
777 IF( alphai( i ).EQ.zero )
THEN 781 IF( cursl .AND. .NOT.lastsl )
788 cursl = cursl .OR. lastsl
793 IF( cursl .AND. .NOT.lst2sl )
subroutine dtgsen(IJOB, WANTQ, WANTZ, SELECT, N, A, LDA, B, LDB, ALPHAR, ALPHAI, BETA, Q, LDQ, Z, LDZ, M, PL, PR, DIF, WORK, LWORK, IWORK, LIWORK, INFO)
DTGSEN
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine dlacpy(UPLO, M, N, A, LDA, B, LDB)
DLACPY copies all or part of one two-dimensional array to another.
subroutine dormqr(SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
DORMQR
subroutine dggbal(JOB, N, A, LDA, B, LDB, ILO, IHI, LSCALE, RSCALE, WORK, INFO)
DGGBAL
subroutine dggbak(JOB, SIDE, N, ILO, IHI, LSCALE, RSCALE, M, V, LDV, INFO)
DGGBAK
subroutine dorgqr(M, N, K, A, LDA, TAU, WORK, LWORK, INFO)
DORGQR
subroutine dgghrd(COMPQ, COMPZ, N, ILO, IHI, A, LDA, B, LDB, Q, LDQ, Z, LDZ, INFO)
DGGHRD
subroutine dhgeqz(JOB, COMPQ, COMPZ, N, ILO, IHI, H, LDH, T, LDT, ALPHAR, ALPHAI, BETA, Q, LDQ, Z, LDZ, WORK, LWORK, INFO)
DHGEQZ
subroutine dlascl(TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO)
DLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
subroutine dlaset(UPLO, M, N, ALPHA, BETA, A, LDA)
DLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values...
subroutine dgeqrf(M, N, A, LDA, TAU, WORK, LWORK, INFO)
DGEQRF
subroutine dlabad(SMALL, LARGE)
DLABAD
subroutine dggesx(JOBVSL, JOBVSR, SORT, SELCTG, SENSE, N, A, LDA, B, LDB, SDIM, ALPHAR, ALPHAI, BETA, VSL, LDVSL, VSR, LDVSR, RCONDE, RCONDV, WORK, LWORK, IWORK, LIWORK, BWORK, INFO)
DGGESX computes the eigenvalues, the Schur form, and, optionally, the matrix of Schur vectors for GE...