Annotation of rpl/lapack/lapack/zggevx.f, revision 1.1
1.1 ! bertrand 1: SUBROUTINE ZGGEVX( BALANC, JOBVL, JOBVR, SENSE, N, A, LDA, B, LDB,
! 2: $ ALPHA, BETA, VL, LDVL, VR, LDVR, ILO, IHI,
! 3: $ LSCALE, RSCALE, ABNRM, BBNRM, RCONDE, RCONDV,
! 4: $ WORK, LWORK, RWORK, IWORK, BWORK, INFO )
! 5: *
! 6: * -- LAPACK driver routine (version 3.2) --
! 7: * -- LAPACK is a software package provided by Univ. of Tennessee, --
! 8: * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
! 9: * November 2006
! 10: *
! 11: * .. Scalar Arguments ..
! 12: CHARACTER BALANC, JOBVL, JOBVR, SENSE
! 13: INTEGER IHI, ILO, INFO, LDA, LDB, LDVL, LDVR, LWORK, N
! 14: DOUBLE PRECISION ABNRM, BBNRM
! 15: * ..
! 16: * .. Array Arguments ..
! 17: LOGICAL BWORK( * )
! 18: INTEGER IWORK( * )
! 19: DOUBLE PRECISION LSCALE( * ), RCONDE( * ), RCONDV( * ),
! 20: $ RSCALE( * ), RWORK( * )
! 21: COMPLEX*16 A( LDA, * ), ALPHA( * ), B( LDB, * ),
! 22: $ BETA( * ), VL( LDVL, * ), VR( LDVR, * ),
! 23: $ WORK( * )
! 24: * ..
! 25: *
! 26: * Purpose
! 27: * =======
! 28: *
! 29: * ZGGEVX computes for a pair of N-by-N complex nonsymmetric matrices
! 30: * (A,B) the generalized eigenvalues, and optionally, the left and/or
! 31: * right generalized eigenvectors.
! 32: *
! 33: * Optionally, it also computes a balancing transformation to improve
! 34: * the conditioning of the eigenvalues and eigenvectors (ILO, IHI,
! 35: * LSCALE, RSCALE, ABNRM, and BBNRM), reciprocal condition numbers for
! 36: * the eigenvalues (RCONDE), and reciprocal condition numbers for the
! 37: * right eigenvectors (RCONDV).
! 38: *
! 39: * A generalized eigenvalue for a pair of matrices (A,B) is a scalar
! 40: * lambda or a ratio alpha/beta = lambda, such that A - lambda*B is
! 41: * singular. It is usually represented as the pair (alpha,beta), as
! 42: * there is a reasonable interpretation for beta=0, and even for both
! 43: * being zero.
! 44: *
! 45: * The right eigenvector v(j) corresponding to the eigenvalue lambda(j)
! 46: * of (A,B) satisfies
! 47: * A * v(j) = lambda(j) * B * v(j) .
! 48: * The left eigenvector u(j) corresponding to the eigenvalue lambda(j)
! 49: * of (A,B) satisfies
! 50: * u(j)**H * A = lambda(j) * u(j)**H * B.
! 51: * where u(j)**H is the conjugate-transpose of u(j).
! 52: *
! 53: *
! 54: * Arguments
! 55: * =========
! 56: *
! 57: * BALANC (input) CHARACTER*1
! 58: * Specifies the balance option to be performed:
! 59: * = 'N': do not diagonally scale or permute;
! 60: * = 'P': permute only;
! 61: * = 'S': scale only;
! 62: * = 'B': both permute and scale.
! 63: * Computed reciprocal condition numbers will be for the
! 64: * matrices after permuting and/or balancing. Permuting does
! 65: * not change condition numbers (in exact arithmetic), but
! 66: * balancing does.
! 67: *
! 68: * JOBVL (input) CHARACTER*1
! 69: * = 'N': do not compute the left generalized eigenvectors;
! 70: * = 'V': compute the left generalized eigenvectors.
! 71: *
! 72: * JOBVR (input) CHARACTER*1
! 73: * = 'N': do not compute the right generalized eigenvectors;
! 74: * = 'V': compute the right generalized eigenvectors.
! 75: *
! 76: * SENSE (input) CHARACTER*1
! 77: * Determines which reciprocal condition numbers are computed.
! 78: * = 'N': none are computed;
! 79: * = 'E': computed for eigenvalues only;
! 80: * = 'V': computed for eigenvectors only;
! 81: * = 'B': computed for eigenvalues and eigenvectors.
! 82: *
! 83: * N (input) INTEGER
! 84: * The order of the matrices A, B, VL, and VR. N >= 0.
! 85: *
! 86: * A (input/output) COMPLEX*16 array, dimension (LDA, N)
! 87: * On entry, the matrix A in the pair (A,B).
! 88: * On exit, A has been overwritten. If JOBVL='V' or JOBVR='V'
! 89: * or both, then A contains the first part of the complex Schur
! 90: * form of the "balanced" versions of the input A and B.
! 91: *
! 92: * LDA (input) INTEGER
! 93: * The leading dimension of A. LDA >= max(1,N).
! 94: *
! 95: * B (input/output) COMPLEX*16 array, dimension (LDB, N)
! 96: * On entry, the matrix B in the pair (A,B).
! 97: * On exit, B has been overwritten. If JOBVL='V' or JOBVR='V'
! 98: * or both, then B contains the second part of the complex
! 99: * Schur form of the "balanced" versions of the input A and B.
! 100: *
! 101: * LDB (input) INTEGER
! 102: * The leading dimension of B. LDB >= max(1,N).
! 103: *
! 104: * ALPHA (output) COMPLEX*16 array, dimension (N)
! 105: * BETA (output) COMPLEX*16 array, dimension (N)
! 106: * On exit, ALPHA(j)/BETA(j), j=1,...,N, will be the generalized
! 107: * eigenvalues.
! 108: *
! 109: * Note: the quotient ALPHA(j)/BETA(j) ) may easily over- or
! 110: * underflow, and BETA(j) may even be zero. Thus, the user
! 111: * should avoid naively computing the ratio ALPHA/BETA.
! 112: * However, ALPHA will be always less than and usually
! 113: * comparable with norm(A) in magnitude, and BETA always less
! 114: * than and usually comparable with norm(B).
! 115: *
! 116: * VL (output) COMPLEX*16 array, dimension (LDVL,N)
! 117: * If JOBVL = 'V', the left generalized eigenvectors u(j) are
! 118: * stored one after another in the columns of VL, in the same
! 119: * order as their eigenvalues.
! 120: * Each eigenvector will be scaled so the largest component
! 121: * will have abs(real part) + abs(imag. part) = 1.
! 122: * Not referenced if JOBVL = 'N'.
! 123: *
! 124: * LDVL (input) INTEGER
! 125: * The leading dimension of the matrix VL. LDVL >= 1, and
! 126: * if JOBVL = 'V', LDVL >= N.
! 127: *
! 128: * VR (output) COMPLEX*16 array, dimension (LDVR,N)
! 129: * If JOBVR = 'V', the right generalized eigenvectors v(j) are
! 130: * stored one after another in the columns of VR, in the same
! 131: * order as their eigenvalues.
! 132: * Each eigenvector will be scaled so the largest component
! 133: * will have abs(real part) + abs(imag. part) = 1.
! 134: * Not referenced if JOBVR = 'N'.
! 135: *
! 136: * LDVR (input) INTEGER
! 137: * The leading dimension of the matrix VR. LDVR >= 1, and
! 138: * if JOBVR = 'V', LDVR >= N.
! 139: *
! 140: * ILO (output) INTEGER
! 141: * IHI (output) INTEGER
! 142: * ILO and IHI are integer values such that on exit
! 143: * A(i,j) = 0 and B(i,j) = 0 if i > j and
! 144: * j = 1,...,ILO-1 or i = IHI+1,...,N.
! 145: * If BALANC = 'N' or 'S', ILO = 1 and IHI = N.
! 146: *
! 147: * LSCALE (output) DOUBLE PRECISION array, dimension (N)
! 148: * Details of the permutations and scaling factors applied
! 149: * to the left side of A and B. If PL(j) is the index of the
! 150: * row interchanged with row j, and DL(j) is the scaling
! 151: * factor applied to row j, then
! 152: * LSCALE(j) = PL(j) for j = 1,...,ILO-1
! 153: * = DL(j) for j = ILO,...,IHI
! 154: * = PL(j) for j = IHI+1,...,N.
! 155: * The order in which the interchanges are made is N to IHI+1,
! 156: * then 1 to ILO-1.
! 157: *
! 158: * RSCALE (output) DOUBLE PRECISION array, dimension (N)
! 159: * Details of the permutations and scaling factors applied
! 160: * to the right side of A and B. If PR(j) is the index of the
! 161: * column interchanged with column j, and DR(j) is the scaling
! 162: * factor applied to column j, then
! 163: * RSCALE(j) = PR(j) for j = 1,...,ILO-1
! 164: * = DR(j) for j = ILO,...,IHI
! 165: * = PR(j) for j = IHI+1,...,N
! 166: * The order in which the interchanges are made is N to IHI+1,
! 167: * then 1 to ILO-1.
! 168: *
! 169: * ABNRM (output) DOUBLE PRECISION
! 170: * The one-norm of the balanced matrix A.
! 171: *
! 172: * BBNRM (output) DOUBLE PRECISION
! 173: * The one-norm of the balanced matrix B.
! 174: *
! 175: * RCONDE (output) DOUBLE PRECISION array, dimension (N)
! 176: * If SENSE = 'E' or 'B', the reciprocal condition numbers of
! 177: * the eigenvalues, stored in consecutive elements of the array.
! 178: * If SENSE = 'N' or 'V', RCONDE is not referenced.
! 179: *
! 180: * RCONDV (output) DOUBLE PRECISION array, dimension (N)
! 181: * If JOB = 'V' or 'B', the estimated reciprocal condition
! 182: * numbers of the eigenvectors, stored in consecutive elements
! 183: * of the array. If the eigenvalues cannot be reordered to
! 184: * compute RCONDV(j), RCONDV(j) is set to 0; this can only occur
! 185: * when the true value would be very small anyway.
! 186: * If SENSE = 'N' or 'E', RCONDV is not referenced.
! 187: *
! 188: * WORK (workspace/output) COMPLEX*16 array, dimension (MAX(1,LWORK))
! 189: * On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
! 190: *
! 191: * LWORK (input) INTEGER
! 192: * The dimension of the array WORK. LWORK >= max(1,2*N).
! 193: * If SENSE = 'E', LWORK >= max(1,4*N).
! 194: * If SENSE = 'V' or 'B', LWORK >= max(1,2*N*N+2*N).
! 195: *
! 196: * If LWORK = -1, then a workspace query is assumed; the routine
! 197: * only calculates the optimal size of the WORK array, returns
! 198: * this value as the first entry of the WORK array, and no error
! 199: * message related to LWORK is issued by XERBLA.
! 200: *
! 201: * RWORK (workspace) REAL array, dimension (lrwork)
! 202: * lrwork must be at least max(1,6*N) if BALANC = 'S' or 'B',
! 203: * and at least max(1,2*N) otherwise.
! 204: * Real workspace.
! 205: *
! 206: * IWORK (workspace) INTEGER array, dimension (N+2)
! 207: * If SENSE = 'E', IWORK is not referenced.
! 208: *
! 209: * BWORK (workspace) LOGICAL array, dimension (N)
! 210: * If SENSE = 'N', BWORK is not referenced.
! 211: *
! 212: * INFO (output) INTEGER
! 213: * = 0: successful exit
! 214: * < 0: if INFO = -i, the i-th argument had an illegal value.
! 215: * = 1,...,N:
! 216: * The QZ iteration failed. No eigenvectors have been
! 217: * calculated, but ALPHA(j) and BETA(j) should be correct
! 218: * for j=INFO+1,...,N.
! 219: * > N: =N+1: other than QZ iteration failed in ZHGEQZ.
! 220: * =N+2: error return from ZTGEVC.
! 221: *
! 222: * Further Details
! 223: * ===============
! 224: *
! 225: * Balancing a matrix pair (A,B) includes, first, permuting rows and
! 226: * columns to isolate eigenvalues, second, applying diagonal similarity
! 227: * transformation to the rows and columns to make the rows and columns
! 228: * as close in norm as possible. The computed reciprocal condition
! 229: * numbers correspond to the balanced matrix. Permuting rows and columns
! 230: * will not change the condition numbers (in exact arithmetic) but
! 231: * diagonal scaling will. For further explanation of balancing, see
! 232: * section 4.11.1.2 of LAPACK Users' Guide.
! 233: *
! 234: * An approximate error bound on the chordal distance between the i-th
! 235: * computed generalized eigenvalue w and the corresponding exact
! 236: * eigenvalue lambda is
! 237: *
! 238: * chord(w, lambda) <= EPS * norm(ABNRM, BBNRM) / RCONDE(I)
! 239: *
! 240: * An approximate error bound for the angle between the i-th computed
! 241: * eigenvector VL(i) or VR(i) is given by
! 242: *
! 243: * EPS * norm(ABNRM, BBNRM) / DIF(i).
! 244: *
! 245: * For further explanation of the reciprocal condition numbers RCONDE
! 246: * and RCONDV, see section 4.11 of LAPACK User's Guide.
! 247: *
! 248: * .. Parameters ..
! 249: DOUBLE PRECISION ZERO, ONE
! 250: PARAMETER ( ZERO = 0.0D+0, ONE = 1.0D+0 )
! 251: COMPLEX*16 CZERO, CONE
! 252: PARAMETER ( CZERO = ( 0.0D+0, 0.0D+0 ),
! 253: $ CONE = ( 1.0D+0, 0.0D+0 ) )
! 254: * ..
! 255: * .. Local Scalars ..
! 256: LOGICAL ILASCL, ILBSCL, ILV, ILVL, ILVR, LQUERY, NOSCL,
! 257: $ WANTSB, WANTSE, WANTSN, WANTSV
! 258: CHARACTER CHTEMP
! 259: INTEGER I, ICOLS, IERR, IJOBVL, IJOBVR, IN, IROWS,
! 260: $ ITAU, IWRK, IWRK1, J, JC, JR, M, MAXWRK, MINWRK
! 261: DOUBLE PRECISION ANRM, ANRMTO, BIGNUM, BNRM, BNRMTO, EPS,
! 262: $ SMLNUM, TEMP
! 263: COMPLEX*16 X
! 264: * ..
! 265: * .. Local Arrays ..
! 266: LOGICAL LDUMMA( 1 )
! 267: * ..
! 268: * .. External Subroutines ..
! 269: EXTERNAL DLABAD, DLASCL, XERBLA, ZGEQRF, ZGGBAK, ZGGBAL,
! 270: $ ZGGHRD, ZHGEQZ, ZLACPY, ZLASCL, ZLASET, ZTGEVC,
! 271: $ ZTGSNA, ZUNGQR, ZUNMQR
! 272: * ..
! 273: * .. External Functions ..
! 274: LOGICAL LSAME
! 275: INTEGER ILAENV
! 276: DOUBLE PRECISION DLAMCH, ZLANGE
! 277: EXTERNAL LSAME, ILAENV, DLAMCH, ZLANGE
! 278: * ..
! 279: * .. Intrinsic Functions ..
! 280: INTRINSIC ABS, DBLE, DIMAG, MAX, SQRT
! 281: * ..
! 282: * .. Statement Functions ..
! 283: DOUBLE PRECISION ABS1
! 284: * ..
! 285: * .. Statement Function definitions ..
! 286: ABS1( X ) = ABS( DBLE( X ) ) + ABS( DIMAG( X ) )
! 287: * ..
! 288: * .. Executable Statements ..
! 289: *
! 290: * Decode the input arguments
! 291: *
! 292: IF( LSAME( JOBVL, 'N' ) ) THEN
! 293: IJOBVL = 1
! 294: ILVL = .FALSE.
! 295: ELSE IF( LSAME( JOBVL, 'V' ) ) THEN
! 296: IJOBVL = 2
! 297: ILVL = .TRUE.
! 298: ELSE
! 299: IJOBVL = -1
! 300: ILVL = .FALSE.
! 301: END IF
! 302: *
! 303: IF( LSAME( JOBVR, 'N' ) ) THEN
! 304: IJOBVR = 1
! 305: ILVR = .FALSE.
! 306: ELSE IF( LSAME( JOBVR, 'V' ) ) THEN
! 307: IJOBVR = 2
! 308: ILVR = .TRUE.
! 309: ELSE
! 310: IJOBVR = -1
! 311: ILVR = .FALSE.
! 312: END IF
! 313: ILV = ILVL .OR. ILVR
! 314: *
! 315: NOSCL = LSAME( BALANC, 'N' ) .OR. LSAME( BALANC, 'P' )
! 316: WANTSN = LSAME( SENSE, 'N' )
! 317: WANTSE = LSAME( SENSE, 'E' )
! 318: WANTSV = LSAME( SENSE, 'V' )
! 319: WANTSB = LSAME( SENSE, 'B' )
! 320: *
! 321: * Test the input arguments
! 322: *
! 323: INFO = 0
! 324: LQUERY = ( LWORK.EQ.-1 )
! 325: IF( .NOT.( NOSCL .OR. LSAME( BALANC,'S' ) .OR.
! 326: $ LSAME( BALANC, 'B' ) ) ) THEN
! 327: INFO = -1
! 328: ELSE IF( IJOBVL.LE.0 ) THEN
! 329: INFO = -2
! 330: ELSE IF( IJOBVR.LE.0 ) THEN
! 331: INFO = -3
! 332: ELSE IF( .NOT.( WANTSN .OR. WANTSE .OR. WANTSB .OR. WANTSV ) )
! 333: $ THEN
! 334: INFO = -4
! 335: ELSE IF( N.LT.0 ) THEN
! 336: INFO = -5
! 337: ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
! 338: INFO = -7
! 339: ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
! 340: INFO = -9
! 341: ELSE IF( LDVL.LT.1 .OR. ( ILVL .AND. LDVL.LT.N ) ) THEN
! 342: INFO = -13
! 343: ELSE IF( LDVR.LT.1 .OR. ( ILVR .AND. LDVR.LT.N ) ) THEN
! 344: INFO = -15
! 345: END IF
! 346: *
! 347: * Compute workspace
! 348: * (Note: Comments in the code beginning "Workspace:" describe the
! 349: * minimal amount of workspace needed at that point in the code,
! 350: * as well as the preferred amount for good performance.
! 351: * NB refers to the optimal block size for the immediately
! 352: * following subroutine, as returned by ILAENV. The workspace is
! 353: * computed assuming ILO = 1 and IHI = N, the worst case.)
! 354: *
! 355: IF( INFO.EQ.0 ) THEN
! 356: IF( N.EQ.0 ) THEN
! 357: MINWRK = 1
! 358: MAXWRK = 1
! 359: ELSE
! 360: MINWRK = 2*N
! 361: IF( WANTSE ) THEN
! 362: MINWRK = 4*N
! 363: ELSE IF( WANTSV .OR. WANTSB ) THEN
! 364: MINWRK = 2*N*( N + 1)
! 365: END IF
! 366: MAXWRK = MINWRK
! 367: MAXWRK = MAX( MAXWRK,
! 368: $ N + N*ILAENV( 1, 'ZGEQRF', ' ', N, 1, N, 0 ) )
! 369: MAXWRK = MAX( MAXWRK,
! 370: $ N + N*ILAENV( 1, 'ZUNMQR', ' ', N, 1, N, 0 ) )
! 371: IF( ILVL ) THEN
! 372: MAXWRK = MAX( MAXWRK, N +
! 373: $ N*ILAENV( 1, 'ZUNGQR', ' ', N, 1, N, 0 ) )
! 374: END IF
! 375: END IF
! 376: WORK( 1 ) = MAXWRK
! 377: *
! 378: IF( LWORK.LT.MINWRK .AND. .NOT.LQUERY ) THEN
! 379: INFO = -25
! 380: END IF
! 381: END IF
! 382: *
! 383: IF( INFO.NE.0 ) THEN
! 384: CALL XERBLA( 'ZGGEVX', -INFO )
! 385: RETURN
! 386: ELSE IF( LQUERY ) THEN
! 387: RETURN
! 388: END IF
! 389: *
! 390: * Quick return if possible
! 391: *
! 392: IF( N.EQ.0 )
! 393: $ RETURN
! 394: *
! 395: * Get machine constants
! 396: *
! 397: EPS = DLAMCH( 'P' )
! 398: SMLNUM = DLAMCH( 'S' )
! 399: BIGNUM = ONE / SMLNUM
! 400: CALL DLABAD( SMLNUM, BIGNUM )
! 401: SMLNUM = SQRT( SMLNUM ) / EPS
! 402: BIGNUM = ONE / SMLNUM
! 403: *
! 404: * Scale A if max element outside range [SMLNUM,BIGNUM]
! 405: *
! 406: ANRM = ZLANGE( 'M', N, N, A, LDA, RWORK )
! 407: ILASCL = .FALSE.
! 408: IF( ANRM.GT.ZERO .AND. ANRM.LT.SMLNUM ) THEN
! 409: ANRMTO = SMLNUM
! 410: ILASCL = .TRUE.
! 411: ELSE IF( ANRM.GT.BIGNUM ) THEN
! 412: ANRMTO = BIGNUM
! 413: ILASCL = .TRUE.
! 414: END IF
! 415: IF( ILASCL )
! 416: $ CALL ZLASCL( 'G', 0, 0, ANRM, ANRMTO, N, N, A, LDA, IERR )
! 417: *
! 418: * Scale B if max element outside range [SMLNUM,BIGNUM]
! 419: *
! 420: BNRM = ZLANGE( 'M', N, N, B, LDB, RWORK )
! 421: ILBSCL = .FALSE.
! 422: IF( BNRM.GT.ZERO .AND. BNRM.LT.SMLNUM ) THEN
! 423: BNRMTO = SMLNUM
! 424: ILBSCL = .TRUE.
! 425: ELSE IF( BNRM.GT.BIGNUM ) THEN
! 426: BNRMTO = BIGNUM
! 427: ILBSCL = .TRUE.
! 428: END IF
! 429: IF( ILBSCL )
! 430: $ CALL ZLASCL( 'G', 0, 0, BNRM, BNRMTO, N, N, B, LDB, IERR )
! 431: *
! 432: * Permute and/or balance the matrix pair (A,B)
! 433: * (Real Workspace: need 6*N if BALANC = 'S' or 'B', 1 otherwise)
! 434: *
! 435: CALL ZGGBAL( BALANC, N, A, LDA, B, LDB, ILO, IHI, LSCALE, RSCALE,
! 436: $ RWORK, IERR )
! 437: *
! 438: * Compute ABNRM and BBNRM
! 439: *
! 440: ABNRM = ZLANGE( '1', N, N, A, LDA, RWORK( 1 ) )
! 441: IF( ILASCL ) THEN
! 442: RWORK( 1 ) = ABNRM
! 443: CALL DLASCL( 'G', 0, 0, ANRMTO, ANRM, 1, 1, RWORK( 1 ), 1,
! 444: $ IERR )
! 445: ABNRM = RWORK( 1 )
! 446: END IF
! 447: *
! 448: BBNRM = ZLANGE( '1', N, N, B, LDB, RWORK( 1 ) )
! 449: IF( ILBSCL ) THEN
! 450: RWORK( 1 ) = BBNRM
! 451: CALL DLASCL( 'G', 0, 0, BNRMTO, BNRM, 1, 1, RWORK( 1 ), 1,
! 452: $ IERR )
! 453: BBNRM = RWORK( 1 )
! 454: END IF
! 455: *
! 456: * Reduce B to triangular form (QR decomposition of B)
! 457: * (Complex Workspace: need N, prefer N*NB )
! 458: *
! 459: IROWS = IHI + 1 - ILO
! 460: IF( ILV .OR. .NOT.WANTSN ) THEN
! 461: ICOLS = N + 1 - ILO
! 462: ELSE
! 463: ICOLS = IROWS
! 464: END IF
! 465: ITAU = 1
! 466: IWRK = ITAU + IROWS
! 467: CALL ZGEQRF( IROWS, ICOLS, B( ILO, ILO ), LDB, WORK( ITAU ),
! 468: $ WORK( IWRK ), LWORK+1-IWRK, IERR )
! 469: *
! 470: * Apply the unitary transformation to A
! 471: * (Complex Workspace: need N, prefer N*NB)
! 472: *
! 473: CALL ZUNMQR( 'L', 'C', IROWS, ICOLS, IROWS, B( ILO, ILO ), LDB,
! 474: $ WORK( ITAU ), A( ILO, ILO ), LDA, WORK( IWRK ),
! 475: $ LWORK+1-IWRK, IERR )
! 476: *
! 477: * Initialize VL and/or VR
! 478: * (Workspace: need N, prefer N*NB)
! 479: *
! 480: IF( ILVL ) THEN
! 481: CALL ZLASET( 'Full', N, N, CZERO, CONE, VL, LDVL )
! 482: IF( IROWS.GT.1 ) THEN
! 483: CALL ZLACPY( 'L', IROWS-1, IROWS-1, B( ILO+1, ILO ), LDB,
! 484: $ VL( ILO+1, ILO ), LDVL )
! 485: END IF
! 486: CALL ZUNGQR( IROWS, IROWS, IROWS, VL( ILO, ILO ), LDVL,
! 487: $ WORK( ITAU ), WORK( IWRK ), LWORK+1-IWRK, IERR )
! 488: END IF
! 489: *
! 490: IF( ILVR )
! 491: $ CALL ZLASET( 'Full', N, N, CZERO, CONE, VR, LDVR )
! 492: *
! 493: * Reduce to generalized Hessenberg form
! 494: * (Workspace: none needed)
! 495: *
! 496: IF( ILV .OR. .NOT.WANTSN ) THEN
! 497: *
! 498: * Eigenvectors requested -- work on whole matrix.
! 499: *
! 500: CALL ZGGHRD( JOBVL, JOBVR, N, ILO, IHI, A, LDA, B, LDB, VL,
! 501: $ LDVL, VR, LDVR, IERR )
! 502: ELSE
! 503: CALL ZGGHRD( 'N', 'N', IROWS, 1, IROWS, A( ILO, ILO ), LDA,
! 504: $ B( ILO, ILO ), LDB, VL, LDVL, VR, LDVR, IERR )
! 505: END IF
! 506: *
! 507: * Perform QZ algorithm (Compute eigenvalues, and optionally, the
! 508: * Schur forms and Schur vectors)
! 509: * (Complex Workspace: need N)
! 510: * (Real Workspace: need N)
! 511: *
! 512: IWRK = ITAU
! 513: IF( ILV .OR. .NOT.WANTSN ) THEN
! 514: CHTEMP = 'S'
! 515: ELSE
! 516: CHTEMP = 'E'
! 517: END IF
! 518: *
! 519: CALL ZHGEQZ( CHTEMP, JOBVL, JOBVR, N, ILO, IHI, A, LDA, B, LDB,
! 520: $ ALPHA, BETA, VL, LDVL, VR, LDVR, WORK( IWRK ),
! 521: $ LWORK+1-IWRK, RWORK, IERR )
! 522: IF( IERR.NE.0 ) THEN
! 523: IF( IERR.GT.0 .AND. IERR.LE.N ) THEN
! 524: INFO = IERR
! 525: ELSE IF( IERR.GT.N .AND. IERR.LE.2*N ) THEN
! 526: INFO = IERR - N
! 527: ELSE
! 528: INFO = N + 1
! 529: END IF
! 530: GO TO 90
! 531: END IF
! 532: *
! 533: * Compute Eigenvectors and estimate condition numbers if desired
! 534: * ZTGEVC: (Complex Workspace: need 2*N )
! 535: * (Real Workspace: need 2*N )
! 536: * ZTGSNA: (Complex Workspace: need 2*N*N if SENSE='V' or 'B')
! 537: * (Integer Workspace: need N+2 )
! 538: *
! 539: IF( ILV .OR. .NOT.WANTSN ) THEN
! 540: IF( ILV ) THEN
! 541: IF( ILVL ) THEN
! 542: IF( ILVR ) THEN
! 543: CHTEMP = 'B'
! 544: ELSE
! 545: CHTEMP = 'L'
! 546: END IF
! 547: ELSE
! 548: CHTEMP = 'R'
! 549: END IF
! 550: *
! 551: CALL ZTGEVC( CHTEMP, 'B', LDUMMA, N, A, LDA, B, LDB, VL,
! 552: $ LDVL, VR, LDVR, N, IN, WORK( IWRK ), RWORK,
! 553: $ IERR )
! 554: IF( IERR.NE.0 ) THEN
! 555: INFO = N + 2
! 556: GO TO 90
! 557: END IF
! 558: END IF
! 559: *
! 560: IF( .NOT.WANTSN ) THEN
! 561: *
! 562: * compute eigenvectors (DTGEVC) and estimate condition
! 563: * numbers (DTGSNA). Note that the definition of the condition
! 564: * number is not invariant under transformation (u,v) to
! 565: * (Q*u, Z*v), where (u,v) are eigenvectors of the generalized
! 566: * Schur form (S,T), Q and Z are orthogonal matrices. In order
! 567: * to avoid using extra 2*N*N workspace, we have to
! 568: * re-calculate eigenvectors and estimate the condition numbers
! 569: * one at a time.
! 570: *
! 571: DO 20 I = 1, N
! 572: *
! 573: DO 10 J = 1, N
! 574: BWORK( J ) = .FALSE.
! 575: 10 CONTINUE
! 576: BWORK( I ) = .TRUE.
! 577: *
! 578: IWRK = N + 1
! 579: IWRK1 = IWRK + N
! 580: *
! 581: IF( WANTSE .OR. WANTSB ) THEN
! 582: CALL ZTGEVC( 'B', 'S', BWORK, N, A, LDA, B, LDB,
! 583: $ WORK( 1 ), N, WORK( IWRK ), N, 1, M,
! 584: $ WORK( IWRK1 ), RWORK, IERR )
! 585: IF( IERR.NE.0 ) THEN
! 586: INFO = N + 2
! 587: GO TO 90
! 588: END IF
! 589: END IF
! 590: *
! 591: CALL ZTGSNA( SENSE, 'S', BWORK, N, A, LDA, B, LDB,
! 592: $ WORK( 1 ), N, WORK( IWRK ), N, RCONDE( I ),
! 593: $ RCONDV( I ), 1, M, WORK( IWRK1 ),
! 594: $ LWORK-IWRK1+1, IWORK, IERR )
! 595: *
! 596: 20 CONTINUE
! 597: END IF
! 598: END IF
! 599: *
! 600: * Undo balancing on VL and VR and normalization
! 601: * (Workspace: none needed)
! 602: *
! 603: IF( ILVL ) THEN
! 604: CALL ZGGBAK( BALANC, 'L', N, ILO, IHI, LSCALE, RSCALE, N, VL,
! 605: $ LDVL, IERR )
! 606: *
! 607: DO 50 JC = 1, N
! 608: TEMP = ZERO
! 609: DO 30 JR = 1, N
! 610: TEMP = MAX( TEMP, ABS1( VL( JR, JC ) ) )
! 611: 30 CONTINUE
! 612: IF( TEMP.LT.SMLNUM )
! 613: $ GO TO 50
! 614: TEMP = ONE / TEMP
! 615: DO 40 JR = 1, N
! 616: VL( JR, JC ) = VL( JR, JC )*TEMP
! 617: 40 CONTINUE
! 618: 50 CONTINUE
! 619: END IF
! 620: *
! 621: IF( ILVR ) THEN
! 622: CALL ZGGBAK( BALANC, 'R', N, ILO, IHI, LSCALE, RSCALE, N, VR,
! 623: $ LDVR, IERR )
! 624: DO 80 JC = 1, N
! 625: TEMP = ZERO
! 626: DO 60 JR = 1, N
! 627: TEMP = MAX( TEMP, ABS1( VR( JR, JC ) ) )
! 628: 60 CONTINUE
! 629: IF( TEMP.LT.SMLNUM )
! 630: $ GO TO 80
! 631: TEMP = ONE / TEMP
! 632: DO 70 JR = 1, N
! 633: VR( JR, JC ) = VR( JR, JC )*TEMP
! 634: 70 CONTINUE
! 635: 80 CONTINUE
! 636: END IF
! 637: *
! 638: * Undo scaling if necessary
! 639: *
! 640: IF( ILASCL )
! 641: $ CALL ZLASCL( 'G', 0, 0, ANRMTO, ANRM, N, 1, ALPHA, N, IERR )
! 642: *
! 643: IF( ILBSCL )
! 644: $ CALL ZLASCL( 'G', 0, 0, BNRMTO, BNRM, N, 1, BETA, N, IERR )
! 645: *
! 646: 90 CONTINUE
! 647: WORK( 1 ) = MAXWRK
! 648: *
! 649: RETURN
! 650: *
! 651: * End of ZGGEVX
! 652: *
! 653: END
CVSweb interface <joel.bertrand@systella.fr>