LAPACK 3.3.0

ztgevc.f

Go to the documentation of this file.
00001       SUBROUTINE ZTGEVC( SIDE, HOWMNY, SELECT, N, S, LDS, P, LDP, VL,
00002      $                   LDVL, VR, LDVR, MM, M, WORK, RWORK, INFO )
00003 *
00004 *  -- LAPACK routine (version 3.2) --
00005 *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
00006 *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
00007 *     November 2006
00008 *
00009 *     .. Scalar Arguments ..
00010       CHARACTER          HOWMNY, SIDE
00011       INTEGER            INFO, LDP, LDS, LDVL, LDVR, M, MM, N
00012 *     ..
00013 *     .. Array Arguments ..
00014       LOGICAL            SELECT( * )
00015       DOUBLE PRECISION   RWORK( * )
00016       COMPLEX*16         P( LDP, * ), S( LDS, * ), VL( LDVL, * ),
00017      $                   VR( LDVR, * ), WORK( * )
00018 *     ..
00019 *
00020 *
00021 *  Purpose
00022 *  =======
00023 *
00024 *  ZTGEVC computes some or all of the right and/or left eigenvectors of
00025 *  a pair of complex matrices (S,P), where S and P are upper triangular.
00026 *  Matrix pairs of this type are produced by the generalized Schur
00027 *  factorization of a complex matrix pair (A,B):
00028 *  
00029 *     A = Q*S*Z**H,  B = Q*P*Z**H
00030 *  
00031 *  as computed by ZGGHRD + ZHGEQZ.
00032 *  
00033 *  The right eigenvector x and the left eigenvector y of (S,P)
00034 *  corresponding to an eigenvalue w are defined by:
00035 *  
00036 *     S*x = w*P*x,  (y**H)*S = w*(y**H)*P,
00037 *  
00038 *  where y**H denotes the conjugate tranpose of y.
00039 *  The eigenvalues are not input to this routine, but are computed
00040 *  directly from the diagonal elements of S and P.
00041 *  
00042 *  This routine returns the matrices X and/or Y of right and left
00043 *  eigenvectors of (S,P), or the products Z*X and/or Q*Y,
00044 *  where Z and Q are input matrices.
00045 *  If Q and Z are the unitary factors from the generalized Schur
00046 *  factorization of a matrix pair (A,B), then Z*X and Q*Y
00047 *  are the matrices of right and left eigenvectors of (A,B).
00048 *
00049 *  Arguments
00050 *  =========
00051 *
00052 *  SIDE    (input) CHARACTER*1
00053 *          = 'R': compute right eigenvectors only;
00054 *          = 'L': compute left eigenvectors only;
00055 *          = 'B': compute both right and left eigenvectors.
00056 *
00057 *  HOWMNY  (input) CHARACTER*1
00058 *          = 'A': compute all right and/or left eigenvectors;
00059 *          = 'B': compute all right and/or left eigenvectors,
00060 *                 backtransformed by the matrices in VR and/or VL;
00061 *          = 'S': compute selected right and/or left eigenvectors,
00062 *                 specified by the logical array SELECT.
00063 *
00064 *  SELECT  (input) LOGICAL array, dimension (N)
00065 *          If HOWMNY='S', SELECT specifies the eigenvectors to be
00066 *          computed.  The eigenvector corresponding to the j-th
00067 *          eigenvalue is computed if SELECT(j) = .TRUE..
00068 *          Not referenced if HOWMNY = 'A' or 'B'.
00069 *
00070 *  N       (input) INTEGER
00071 *          The order of the matrices S and P.  N >= 0.
00072 *
00073 *  S       (input) COMPLEX*16 array, dimension (LDS,N)
00074 *          The upper triangular matrix S from a generalized Schur
00075 *          factorization, as computed by ZHGEQZ.
00076 *
00077 *  LDS     (input) INTEGER
00078 *          The leading dimension of array S.  LDS >= max(1,N).
00079 *
00080 *  P       (input) COMPLEX*16 array, dimension (LDP,N)
00081 *          The upper triangular matrix P from a generalized Schur
00082 *          factorization, as computed by ZHGEQZ.  P must have real
00083 *          diagonal elements.
00084 *
00085 *  LDP     (input) INTEGER
00086 *          The leading dimension of array P.  LDP >= max(1,N).
00087 *
00088 *  VL      (input/output) COMPLEX*16 array, dimension (LDVL,MM)
00089 *          On entry, if SIDE = 'L' or 'B' and HOWMNY = 'B', VL must
00090 *          contain an N-by-N matrix Q (usually the unitary matrix Q
00091 *          of left Schur vectors returned by ZHGEQZ).
00092 *          On exit, if SIDE = 'L' or 'B', VL contains:
00093 *          if HOWMNY = 'A', the matrix Y of left eigenvectors of (S,P);
00094 *          if HOWMNY = 'B', the matrix Q*Y;
00095 *          if HOWMNY = 'S', the left eigenvectors of (S,P) specified by
00096 *                      SELECT, stored consecutively in the columns of
00097 *                      VL, in the same order as their eigenvalues.
00098 *          Not referenced if SIDE = 'R'.
00099 *
00100 *  LDVL    (input) INTEGER
00101 *          The leading dimension of array VL.  LDVL >= 1, and if
00102 *          SIDE = 'L' or 'l' or 'B' or 'b', LDVL >= N.
00103 *
00104 *  VR      (input/output) COMPLEX*16 array, dimension (LDVR,MM)
00105 *          On entry, if SIDE = 'R' or 'B' and HOWMNY = 'B', VR must
00106 *          contain an N-by-N matrix Q (usually the unitary matrix Z
00107 *          of right Schur vectors returned by ZHGEQZ).
00108 *          On exit, if SIDE = 'R' or 'B', VR contains:
00109 *          if HOWMNY = 'A', the matrix X of right eigenvectors of (S,P);
00110 *          if HOWMNY = 'B', the matrix Z*X;
00111 *          if HOWMNY = 'S', the right eigenvectors of (S,P) specified by
00112 *                      SELECT, stored consecutively in the columns of
00113 *                      VR, in the same order as their eigenvalues.
00114 *          Not referenced if SIDE = 'L'.
00115 *
00116 *  LDVR    (input) INTEGER
00117 *          The leading dimension of the array VR.  LDVR >= 1, and if
00118 *          SIDE = 'R' or 'B', LDVR >= N.
00119 *
00120 *  MM      (input) INTEGER
00121 *          The number of columns in the arrays VL and/or VR. MM >= M.
00122 *
00123 *  M       (output) INTEGER
00124 *          The number of columns in the arrays VL and/or VR actually
00125 *          used to store the eigenvectors.  If HOWMNY = 'A' or 'B', M
00126 *          is set to N.  Each selected eigenvector occupies one column.
00127 *
00128 *  WORK    (workspace) COMPLEX*16 array, dimension (2*N)
00129 *
00130 *  RWORK   (workspace) DOUBLE PRECISION array, dimension (2*N)
00131 *
00132 *  INFO    (output) INTEGER
00133 *          = 0:  successful exit.
00134 *          < 0:  if INFO = -i, the i-th argument had an illegal value.
00135 *
00136 *  =====================================================================
00137 *
00138 *     .. Parameters ..
00139       DOUBLE PRECISION   ZERO, ONE
00140       PARAMETER          ( ZERO = 0.0D+0, ONE = 1.0D+0 )
00141       COMPLEX*16         CZERO, CONE
00142       PARAMETER          ( CZERO = ( 0.0D+0, 0.0D+0 ),
00143      $                   CONE = ( 1.0D+0, 0.0D+0 ) )
00144 *     ..
00145 *     .. Local Scalars ..
00146       LOGICAL            COMPL, COMPR, ILALL, ILBACK, ILBBAD, ILCOMP,
00147      $                   LSA, LSB
00148       INTEGER            I, IBEG, IEIG, IEND, IHWMNY, IM, ISIDE, ISRC,
00149      $                   J, JE, JR
00150       DOUBLE PRECISION   ACOEFA, ACOEFF, ANORM, ASCALE, BCOEFA, BIG,
00151      $                   BIGNUM, BNORM, BSCALE, DMIN, SAFMIN, SBETA,
00152      $                   SCALE, SMALL, TEMP, ULP, XMAX
00153       COMPLEX*16         BCOEFF, CA, CB, D, SALPHA, SUM, SUMA, SUMB, X
00154 *     ..
00155 *     .. External Functions ..
00156       LOGICAL            LSAME
00157       DOUBLE PRECISION   DLAMCH
00158       COMPLEX*16         ZLADIV
00159       EXTERNAL           LSAME, DLAMCH, ZLADIV
00160 *     ..
00161 *     .. External Subroutines ..
00162       EXTERNAL           DLABAD, XERBLA, ZGEMV
00163 *     ..
00164 *     .. Intrinsic Functions ..
00165       INTRINSIC          ABS, DBLE, DCMPLX, DCONJG, DIMAG, MAX, MIN
00166 *     ..
00167 *     .. Statement Functions ..
00168       DOUBLE PRECISION   ABS1
00169 *     ..
00170 *     .. Statement Function definitions ..
00171       ABS1( X ) = ABS( DBLE( X ) ) + ABS( DIMAG( X ) )
00172 *     ..
00173 *     .. Executable Statements ..
00174 *
00175 *     Decode and Test the input parameters
00176 *
00177       IF( LSAME( HOWMNY, 'A' ) ) THEN
00178          IHWMNY = 1
00179          ILALL = .TRUE.
00180          ILBACK = .FALSE.
00181       ELSE IF( LSAME( HOWMNY, 'S' ) ) THEN
00182          IHWMNY = 2
00183          ILALL = .FALSE.
00184          ILBACK = .FALSE.
00185       ELSE IF( LSAME( HOWMNY, 'B' ) ) THEN
00186          IHWMNY = 3
00187          ILALL = .TRUE.
00188          ILBACK = .TRUE.
00189       ELSE
00190          IHWMNY = -1
00191       END IF
00192 *
00193       IF( LSAME( SIDE, 'R' ) ) THEN
00194          ISIDE = 1
00195          COMPL = .FALSE.
00196          COMPR = .TRUE.
00197       ELSE IF( LSAME( SIDE, 'L' ) ) THEN
00198          ISIDE = 2
00199          COMPL = .TRUE.
00200          COMPR = .FALSE.
00201       ELSE IF( LSAME( SIDE, 'B' ) ) THEN
00202          ISIDE = 3
00203          COMPL = .TRUE.
00204          COMPR = .TRUE.
00205       ELSE
00206          ISIDE = -1
00207       END IF
00208 *
00209       INFO = 0
00210       IF( ISIDE.LT.0 ) THEN
00211          INFO = -1
00212       ELSE IF( IHWMNY.LT.0 ) THEN
00213          INFO = -2
00214       ELSE IF( N.LT.0 ) THEN
00215          INFO = -4
00216       ELSE IF( LDS.LT.MAX( 1, N ) ) THEN
00217          INFO = -6
00218       ELSE IF( LDP.LT.MAX( 1, N ) ) THEN
00219          INFO = -8
00220       END IF
00221       IF( INFO.NE.0 ) THEN
00222          CALL XERBLA( 'ZTGEVC', -INFO )
00223          RETURN
00224       END IF
00225 *
00226 *     Count the number of eigenvectors
00227 *
00228       IF( .NOT.ILALL ) THEN
00229          IM = 0
00230          DO 10 J = 1, N
00231             IF( SELECT( J ) )
00232      $         IM = IM + 1
00233    10    CONTINUE
00234       ELSE
00235          IM = N
00236       END IF
00237 *
00238 *     Check diagonal of B
00239 *
00240       ILBBAD = .FALSE.
00241       DO 20 J = 1, N
00242          IF( DIMAG( P( J, J ) ).NE.ZERO )
00243      $      ILBBAD = .TRUE.
00244    20 CONTINUE
00245 *
00246       IF( ILBBAD ) THEN
00247          INFO = -7
00248       ELSE IF( COMPL .AND. LDVL.LT.N .OR. LDVL.LT.1 ) THEN
00249          INFO = -10
00250       ELSE IF( COMPR .AND. LDVR.LT.N .OR. LDVR.LT.1 ) THEN
00251          INFO = -12
00252       ELSE IF( MM.LT.IM ) THEN
00253          INFO = -13
00254       END IF
00255       IF( INFO.NE.0 ) THEN
00256          CALL XERBLA( 'ZTGEVC', -INFO )
00257          RETURN
00258       END IF
00259 *
00260 *     Quick return if possible
00261 *
00262       M = IM
00263       IF( N.EQ.0 )
00264      $   RETURN
00265 *
00266 *     Machine Constants
00267 *
00268       SAFMIN = DLAMCH( 'Safe minimum' )
00269       BIG = ONE / SAFMIN
00270       CALL DLABAD( SAFMIN, BIG )
00271       ULP = DLAMCH( 'Epsilon' )*DLAMCH( 'Base' )
00272       SMALL = SAFMIN*N / ULP
00273       BIG = ONE / SMALL
00274       BIGNUM = ONE / ( SAFMIN*N )
00275 *
00276 *     Compute the 1-norm of each column of the strictly upper triangular
00277 *     part of A and B to check for possible overflow in the triangular
00278 *     solver.
00279 *
00280       ANORM = ABS1( S( 1, 1 ) )
00281       BNORM = ABS1( P( 1, 1 ) )
00282       RWORK( 1 ) = ZERO
00283       RWORK( N+1 ) = ZERO
00284       DO 40 J = 2, N
00285          RWORK( J ) = ZERO
00286          RWORK( N+J ) = ZERO
00287          DO 30 I = 1, J - 1
00288             RWORK( J ) = RWORK( J ) + ABS1( S( I, J ) )
00289             RWORK( N+J ) = RWORK( N+J ) + ABS1( P( I, J ) )
00290    30    CONTINUE
00291          ANORM = MAX( ANORM, RWORK( J )+ABS1( S( J, J ) ) )
00292          BNORM = MAX( BNORM, RWORK( N+J )+ABS1( P( J, J ) ) )
00293    40 CONTINUE
00294 *
00295       ASCALE = ONE / MAX( ANORM, SAFMIN )
00296       BSCALE = ONE / MAX( BNORM, SAFMIN )
00297 *
00298 *     Left eigenvectors
00299 *
00300       IF( COMPL ) THEN
00301          IEIG = 0
00302 *
00303 *        Main loop over eigenvalues
00304 *
00305          DO 140 JE = 1, N
00306             IF( ILALL ) THEN
00307                ILCOMP = .TRUE.
00308             ELSE
00309                ILCOMP = SELECT( JE )
00310             END IF
00311             IF( ILCOMP ) THEN
00312                IEIG = IEIG + 1
00313 *
00314                IF( ABS1( S( JE, JE ) ).LE.SAFMIN .AND.
00315      $             ABS( DBLE( P( JE, JE ) ) ).LE.SAFMIN ) THEN
00316 *
00317 *                 Singular matrix pencil -- return unit eigenvector
00318 *
00319                   DO 50 JR = 1, N
00320                      VL( JR, IEIG ) = CZERO
00321    50             CONTINUE
00322                   VL( IEIG, IEIG ) = CONE
00323                   GO TO 140
00324                END IF
00325 *
00326 *              Non-singular eigenvalue:
00327 *              Compute coefficients  a  and  b  in
00328 *                   H
00329 *                 y  ( a A - b B ) = 0
00330 *
00331                TEMP = ONE / MAX( ABS1( S( JE, JE ) )*ASCALE,
00332      $                ABS( DBLE( P( JE, JE ) ) )*BSCALE, SAFMIN )
00333                SALPHA = ( TEMP*S( JE, JE ) )*ASCALE
00334                SBETA = ( TEMP*DBLE( P( JE, JE ) ) )*BSCALE
00335                ACOEFF = SBETA*ASCALE
00336                BCOEFF = SALPHA*BSCALE
00337 *
00338 *              Scale to avoid underflow
00339 *
00340                LSA = ABS( SBETA ).GE.SAFMIN .AND. ABS( ACOEFF ).LT.SMALL
00341                LSB = ABS1( SALPHA ).GE.SAFMIN .AND. ABS1( BCOEFF ).LT.
00342      $               SMALL
00343 *
00344                SCALE = ONE
00345                IF( LSA )
00346      $            SCALE = ( SMALL / ABS( SBETA ) )*MIN( ANORM, BIG )
00347                IF( LSB )
00348      $            SCALE = MAX( SCALE, ( SMALL / ABS1( SALPHA ) )*
00349      $                    MIN( BNORM, BIG ) )
00350                IF( LSA .OR. LSB ) THEN
00351                   SCALE = MIN( SCALE, ONE /
00352      $                    ( SAFMIN*MAX( ONE, ABS( ACOEFF ),
00353      $                    ABS1( BCOEFF ) ) ) )
00354                   IF( LSA ) THEN
00355                      ACOEFF = ASCALE*( SCALE*SBETA )
00356                   ELSE
00357                      ACOEFF = SCALE*ACOEFF
00358                   END IF
00359                   IF( LSB ) THEN
00360                      BCOEFF = BSCALE*( SCALE*SALPHA )
00361                   ELSE
00362                      BCOEFF = SCALE*BCOEFF
00363                   END IF
00364                END IF
00365 *
00366                ACOEFA = ABS( ACOEFF )
00367                BCOEFA = ABS1( BCOEFF )
00368                XMAX = ONE
00369                DO 60 JR = 1, N
00370                   WORK( JR ) = CZERO
00371    60          CONTINUE
00372                WORK( JE ) = CONE
00373                DMIN = MAX( ULP*ACOEFA*ANORM, ULP*BCOEFA*BNORM, SAFMIN )
00374 *
00375 *                                              H
00376 *              Triangular solve of  (a A - b B)  y = 0
00377 *
00378 *                                      H
00379 *              (rowwise in  (a A - b B) , or columnwise in a A - b B)
00380 *
00381                DO 100 J = JE + 1, N
00382 *
00383 *                 Compute
00384 *                       j-1
00385 *                 SUM = sum  conjg( a*S(k,j) - b*P(k,j) )*x(k)
00386 *                       k=je
00387 *                 (Scale if necessary)
00388 *
00389                   TEMP = ONE / XMAX
00390                   IF( ACOEFA*RWORK( J )+BCOEFA*RWORK( N+J ).GT.BIGNUM*
00391      $                TEMP ) THEN
00392                      DO 70 JR = JE, J - 1
00393                         WORK( JR ) = TEMP*WORK( JR )
00394    70                CONTINUE
00395                      XMAX = ONE
00396                   END IF
00397                   SUMA = CZERO
00398                   SUMB = CZERO
00399 *
00400                   DO 80 JR = JE, J - 1
00401                      SUMA = SUMA + DCONJG( S( JR, J ) )*WORK( JR )
00402                      SUMB = SUMB + DCONJG( P( JR, J ) )*WORK( JR )
00403    80             CONTINUE
00404                   SUM = ACOEFF*SUMA - DCONJG( BCOEFF )*SUMB
00405 *
00406 *                 Form x(j) = - SUM / conjg( a*S(j,j) - b*P(j,j) )
00407 *
00408 *                 with scaling and perturbation of the denominator
00409 *
00410                   D = DCONJG( ACOEFF*S( J, J )-BCOEFF*P( J, J ) )
00411                   IF( ABS1( D ).LE.DMIN )
00412      $               D = DCMPLX( DMIN )
00413 *
00414                   IF( ABS1( D ).LT.ONE ) THEN
00415                      IF( ABS1( SUM ).GE.BIGNUM*ABS1( D ) ) THEN
00416                         TEMP = ONE / ABS1( SUM )
00417                         DO 90 JR = JE, J - 1
00418                            WORK( JR ) = TEMP*WORK( JR )
00419    90                   CONTINUE
00420                         XMAX = TEMP*XMAX
00421                         SUM = TEMP*SUM
00422                      END IF
00423                   END IF
00424                   WORK( J ) = ZLADIV( -SUM, D )
00425                   XMAX = MAX( XMAX, ABS1( WORK( J ) ) )
00426   100          CONTINUE
00427 *
00428 *              Back transform eigenvector if HOWMNY='B'.
00429 *
00430                IF( ILBACK ) THEN
00431                   CALL ZGEMV( 'N', N, N+1-JE, CONE, VL( 1, JE ), LDVL,
00432      $                        WORK( JE ), 1, CZERO, WORK( N+1 ), 1 )
00433                   ISRC = 2
00434                   IBEG = 1
00435                ELSE
00436                   ISRC = 1
00437                   IBEG = JE
00438                END IF
00439 *
00440 *              Copy and scale eigenvector into column of VL
00441 *
00442                XMAX = ZERO
00443                DO 110 JR = IBEG, N
00444                   XMAX = MAX( XMAX, ABS1( WORK( ( ISRC-1 )*N+JR ) ) )
00445   110          CONTINUE
00446 *
00447                IF( XMAX.GT.SAFMIN ) THEN
00448                   TEMP = ONE / XMAX
00449                   DO 120 JR = IBEG, N
00450                      VL( JR, IEIG ) = TEMP*WORK( ( ISRC-1 )*N+JR )
00451   120             CONTINUE
00452                ELSE
00453                   IBEG = N + 1
00454                END IF
00455 *
00456                DO 130 JR = 1, IBEG - 1
00457                   VL( JR, IEIG ) = CZERO
00458   130          CONTINUE
00459 *
00460             END IF
00461   140    CONTINUE
00462       END IF
00463 *
00464 *     Right eigenvectors
00465 *
00466       IF( COMPR ) THEN
00467          IEIG = IM + 1
00468 *
00469 *        Main loop over eigenvalues
00470 *
00471          DO 250 JE = N, 1, -1
00472             IF( ILALL ) THEN
00473                ILCOMP = .TRUE.
00474             ELSE
00475                ILCOMP = SELECT( JE )
00476             END IF
00477             IF( ILCOMP ) THEN
00478                IEIG = IEIG - 1
00479 *
00480                IF( ABS1( S( JE, JE ) ).LE.SAFMIN .AND.
00481      $             ABS( DBLE( P( JE, JE ) ) ).LE.SAFMIN ) THEN
00482 *
00483 *                 Singular matrix pencil -- return unit eigenvector
00484 *
00485                   DO 150 JR = 1, N
00486                      VR( JR, IEIG ) = CZERO
00487   150             CONTINUE
00488                   VR( IEIG, IEIG ) = CONE
00489                   GO TO 250
00490                END IF
00491 *
00492 *              Non-singular eigenvalue:
00493 *              Compute coefficients  a  and  b  in
00494 *
00495 *              ( a A - b B ) x  = 0
00496 *
00497                TEMP = ONE / MAX( ABS1( S( JE, JE ) )*ASCALE,
00498      $                ABS( DBLE( P( JE, JE ) ) )*BSCALE, SAFMIN )
00499                SALPHA = ( TEMP*S( JE, JE ) )*ASCALE
00500                SBETA = ( TEMP*DBLE( P( JE, JE ) ) )*BSCALE
00501                ACOEFF = SBETA*ASCALE
00502                BCOEFF = SALPHA*BSCALE
00503 *
00504 *              Scale to avoid underflow
00505 *
00506                LSA = ABS( SBETA ).GE.SAFMIN .AND. ABS( ACOEFF ).LT.SMALL
00507                LSB = ABS1( SALPHA ).GE.SAFMIN .AND. ABS1( BCOEFF ).LT.
00508      $               SMALL
00509 *
00510                SCALE = ONE
00511                IF( LSA )
00512      $            SCALE = ( SMALL / ABS( SBETA ) )*MIN( ANORM, BIG )
00513                IF( LSB )
00514      $            SCALE = MAX( SCALE, ( SMALL / ABS1( SALPHA ) )*
00515      $                    MIN( BNORM, BIG ) )
00516                IF( LSA .OR. LSB ) THEN
00517                   SCALE = MIN( SCALE, ONE /
00518      $                    ( SAFMIN*MAX( ONE, ABS( ACOEFF ),
00519      $                    ABS1( BCOEFF ) ) ) )
00520                   IF( LSA ) THEN
00521                      ACOEFF = ASCALE*( SCALE*SBETA )
00522                   ELSE
00523                      ACOEFF = SCALE*ACOEFF
00524                   END IF
00525                   IF( LSB ) THEN
00526                      BCOEFF = BSCALE*( SCALE*SALPHA )
00527                   ELSE
00528                      BCOEFF = SCALE*BCOEFF
00529                   END IF
00530                END IF
00531 *
00532                ACOEFA = ABS( ACOEFF )
00533                BCOEFA = ABS1( BCOEFF )
00534                XMAX = ONE
00535                DO 160 JR = 1, N
00536                   WORK( JR ) = CZERO
00537   160          CONTINUE
00538                WORK( JE ) = CONE
00539                DMIN = MAX( ULP*ACOEFA*ANORM, ULP*BCOEFA*BNORM, SAFMIN )
00540 *
00541 *              Triangular solve of  (a A - b B) x = 0  (columnwise)
00542 *
00543 *              WORK(1:j-1) contains sums w,
00544 *              WORK(j+1:JE) contains x
00545 *
00546                DO 170 JR = 1, JE - 1
00547                   WORK( JR ) = ACOEFF*S( JR, JE ) - BCOEFF*P( JR, JE )
00548   170          CONTINUE
00549                WORK( JE ) = CONE
00550 *
00551                DO 210 J = JE - 1, 1, -1
00552 *
00553 *                 Form x(j) := - w(j) / d
00554 *                 with scaling and perturbation of the denominator
00555 *
00556                   D = ACOEFF*S( J, J ) - BCOEFF*P( J, J )
00557                   IF( ABS1( D ).LE.DMIN )
00558      $               D = DCMPLX( DMIN )
00559 *
00560                   IF( ABS1( D ).LT.ONE ) THEN
00561                      IF( ABS1( WORK( J ) ).GE.BIGNUM*ABS1( D ) ) THEN
00562                         TEMP = ONE / ABS1( WORK( J ) )
00563                         DO 180 JR = 1, JE
00564                            WORK( JR ) = TEMP*WORK( JR )
00565   180                   CONTINUE
00566                      END IF
00567                   END IF
00568 *
00569                   WORK( J ) = ZLADIV( -WORK( J ), D )
00570 *
00571                   IF( J.GT.1 ) THEN
00572 *
00573 *                    w = w + x(j)*(a S(*,j) - b P(*,j) ) with scaling
00574 *
00575                      IF( ABS1( WORK( J ) ).GT.ONE ) THEN
00576                         TEMP = ONE / ABS1( WORK( J ) )
00577                         IF( ACOEFA*RWORK( J )+BCOEFA*RWORK( N+J ).GE.
00578      $                      BIGNUM*TEMP ) THEN
00579                            DO 190 JR = 1, JE
00580                               WORK( JR ) = TEMP*WORK( JR )
00581   190                      CONTINUE
00582                         END IF
00583                      END IF
00584 *
00585                      CA = ACOEFF*WORK( J )
00586                      CB = BCOEFF*WORK( J )
00587                      DO 200 JR = 1, J - 1
00588                         WORK( JR ) = WORK( JR ) + CA*S( JR, J ) -
00589      $                               CB*P( JR, J )
00590   200                CONTINUE
00591                   END IF
00592   210          CONTINUE
00593 *
00594 *              Back transform eigenvector if HOWMNY='B'.
00595 *
00596                IF( ILBACK ) THEN
00597                   CALL ZGEMV( 'N', N, JE, CONE, VR, LDVR, WORK, 1,
00598      $                        CZERO, WORK( N+1 ), 1 )
00599                   ISRC = 2
00600                   IEND = N
00601                ELSE
00602                   ISRC = 1
00603                   IEND = JE
00604                END IF
00605 *
00606 *              Copy and scale eigenvector into column of VR
00607 *
00608                XMAX = ZERO
00609                DO 220 JR = 1, IEND
00610                   XMAX = MAX( XMAX, ABS1( WORK( ( ISRC-1 )*N+JR ) ) )
00611   220          CONTINUE
00612 *
00613                IF( XMAX.GT.SAFMIN ) THEN
00614                   TEMP = ONE / XMAX
00615                   DO 230 JR = 1, IEND
00616                      VR( JR, IEIG ) = TEMP*WORK( ( ISRC-1 )*N+JR )
00617   230             CONTINUE
00618                ELSE
00619                   IEND = 0
00620                END IF
00621 *
00622                DO 240 JR = IEND + 1, N
00623                   VR( JR, IEIG ) = CZERO
00624   240          CONTINUE
00625 *
00626             END IF
00627   250    CONTINUE
00628       END IF
00629 *
00630       RETURN
00631 *
00632 *     End of ZTGEVC
00633 *
00634       END
 All Files Functions