1       SUBROUTINE ZTGEVC( SIDE, HOWMNY, SELECT, N, S, LDS, P, LDP, VL,
  2      $                   LDVL, VR, LDVR, MM, M, WORK, RWORK, INFO )
  3 *
  4 *  -- LAPACK routine (version 3.2) --
  5 *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
  6 *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
  7 *     November 2006
  8 *
  9 *     .. Scalar Arguments ..
 10       CHARACTER          HOWMNY, SIDE
 11       INTEGER            INFO, LDP, LDS, LDVL, LDVR, M, MM, N
 12 *     ..
 13 *     .. Array Arguments ..
 14       LOGICAL            SELECT* )
 15       DOUBLE PRECISION   RWORK( * )
 16       COMPLEX*16         P( LDP, * ), S( LDS, * ), VL( LDVL, * ),
 17      $                   VR( LDVR, * ), WORK( * )
 18 *     ..
 19 *
 20 *
 21 *  Purpose
 22 *  =======
 23 *
 24 *  ZTGEVC computes some or all of the right and/or left eigenvectors of
 25 *  a pair of complex matrices (S,P), where S and P are upper triangular.
 26 *  Matrix pairs of this type are produced by the generalized Schur
 27 *  factorization of a complex matrix pair (A,B):
 28 *  
 29 *     A = Q*S*Z**H,  B = Q*P*Z**H
 30 *  
 31 *  as computed by ZGGHRD + ZHGEQZ.
 32 *  
 33 *  The right eigenvector x and the left eigenvector y of (S,P)
 34 *  corresponding to an eigenvalue w are defined by:
 35 *  
 36 *     S*x = w*P*x,  (y**H)*S = w*(y**H)*P,
 37 *  
 38 *  where y**H denotes the conjugate tranpose of y.
 39 *  The eigenvalues are not input to this routine, but are computed
 40 *  directly from the diagonal elements of S and P.
 41 *  
 42 *  This routine returns the matrices X and/or Y of right and left
 43 *  eigenvectors of (S,P), or the products Z*X and/or Q*Y,
 44 *  where Z and Q are input matrices.
 45 *  If Q and Z are the unitary factors from the generalized Schur
 46 *  factorization of a matrix pair (A,B), then Z*X and Q*Y
 47 *  are the matrices of right and left eigenvectors of (A,B).
 48 *
 49 *  Arguments
 50 *  =========
 51 *
 52 *  SIDE    (input) CHARACTER*1
 53 *          = 'R': compute right eigenvectors only;
 54 *          = 'L': compute left eigenvectors only;
 55 *          = 'B': compute both right and left eigenvectors.
 56 *
 57 *  HOWMNY  (input) CHARACTER*1
 58 *          = 'A': compute all right and/or left eigenvectors;
 59 *          = 'B': compute all right and/or left eigenvectors,
 60 *                 backtransformed by the matrices in VR and/or VL;
 61 *          = 'S': compute selected right and/or left eigenvectors,
 62 *                 specified by the logical array SELECT.
 63 *
 64 *  SELECT  (input) LOGICAL array, dimension (N)
 65 *          If HOWMNY='S', SELECT specifies the eigenvectors to be
 66 *          computed.  The eigenvector corresponding to the j-th
 67 *          eigenvalue is computed if SELECT(j) = .TRUE..
 68 *          Not referenced if HOWMNY = 'A' or 'B'.
 69 *
 70 *  N       (input) INTEGER
 71 *          The order of the matrices S and P.  N >= 0.
 72 *
 73 *  S       (input) COMPLEX*16 array, dimension (LDS,N)
 74 *          The upper triangular matrix S from a generalized Schur
 75 *          factorization, as computed by ZHGEQZ.
 76 *
 77 *  LDS     (input) INTEGER
 78 *          The leading dimension of array S.  LDS >= max(1,N).
 79 *
 80 *  P       (input) COMPLEX*16 array, dimension (LDP,N)
 81 *          The upper triangular matrix P from a generalized Schur
 82 *          factorization, as computed by ZHGEQZ.  P must have real
 83 *          diagonal elements.
 84 *
 85 *  LDP     (input) INTEGER
 86 *          The leading dimension of array P.  LDP >= max(1,N).
 87 *
 88 *  VL      (input/output) COMPLEX*16 array, dimension (LDVL,MM)
 89 *          On entry, if SIDE = 'L' or 'B' and HOWMNY = 'B', VL must
 90 *          contain an N-by-N matrix Q (usually the unitary matrix Q
 91 *          of left Schur vectors returned by ZHGEQZ).
 92 *          On exit, if SIDE = 'L' or 'B', VL contains:
 93 *          if HOWMNY = 'A', the matrix Y of left eigenvectors of (S,P);
 94 *          if HOWMNY = 'B', the matrix Q*Y;
 95 *          if HOWMNY = 'S', the left eigenvectors of (S,P) specified by
 96 *                      SELECT, stored consecutively in the columns of
 97 *                      VL, in the same order as their eigenvalues.
 98 *          Not referenced if SIDE = 'R'.
 99 *
100 *  LDVL    (input) INTEGER
101 *          The leading dimension of array VL.  LDVL >= 1, and if
102 *          SIDE = 'L' or 'l' or 'B' or 'b', LDVL >= N.
103 *
104 *  VR      (input/output) COMPLEX*16 array, dimension (LDVR,MM)
105 *          On entry, if SIDE = 'R' or 'B' and HOWMNY = 'B', VR must
106 *          contain an N-by-N matrix Q (usually the unitary matrix Z
107 *          of right Schur vectors returned by ZHGEQZ).
108 *          On exit, if SIDE = 'R' or 'B', VR contains:
109 *          if HOWMNY = 'A', the matrix X of right eigenvectors of (S,P);
110 *          if HOWMNY = 'B', the matrix Z*X;
111 *          if HOWMNY = 'S', the right eigenvectors of (S,P) specified by
112 *                      SELECT, stored consecutively in the columns of
113 *                      VR, in the same order as their eigenvalues.
114 *          Not referenced if SIDE = 'L'.
115 *
116 *  LDVR    (input) INTEGER
117 *          The leading dimension of the array VR.  LDVR >= 1, and if
118 *          SIDE = 'R' or 'B', LDVR >= N.
119 *
120 *  MM      (input) INTEGER
121 *          The number of columns in the arrays VL and/or VR. MM >= M.
122 *
123 *  M       (output) INTEGER
124 *          The number of columns in the arrays VL and/or VR actually
125 *          used to store the eigenvectors.  If HOWMNY = 'A' or 'B', M
126 *          is set to N.  Each selected eigenvector occupies one column.
127 *
128 *  WORK    (workspace) COMPLEX*16 array, dimension (2*N)
129 *
130 *  RWORK   (workspace) DOUBLE PRECISION array, dimension (2*N)
131 *
132 *  INFO    (output) INTEGER
133 *          = 0:  successful exit.
134 *          < 0:  if INFO = -i, the i-th argument had an illegal value.
135 *
136 *  =====================================================================
137 *
138 *     .. Parameters ..
139       DOUBLE PRECISION   ZERO, ONE
140       PARAMETER          ( ZERO = 0.0D+0, ONE = 1.0D+0 )
141       COMPLEX*16         CZERO, CONE
142       PARAMETER          ( CZERO = ( 0.0D+00.0D+0 ),
143      $                   CONE = ( 1.0D+00.0D+0 ) )
144 *     ..
145 *     .. Local Scalars ..
146       LOGICAL            COMPL, COMPR, ILALL, ILBACK, ILBBAD, ILCOMP,
147      $                   LSA, LSB
148       INTEGER            I, IBEG, IEIG, IEND, IHWMNY, IM, ISIDE, ISRC,
149      $                   J, JE, JR
150       DOUBLE PRECISION   ACOEFA, ACOEFF, ANORM, ASCALE, BCOEFA, BIG,
151      $                   BIGNUM, BNORM, BSCALE, DMIN, SAFMIN, SBETA,
152      $                   SCALE, SMALL, TEMP, ULP, XMAX
153       COMPLEX*16         BCOEFF, CA, CB, D, SALPHA, SUM, SUMA, SUMB, X
154 *     ..
155 *     .. External Functions ..
156       LOGICAL            LSAME
157       DOUBLE PRECISION   DLAMCH
158       COMPLEX*16         ZLADIV
159       EXTERNAL           LSAME, DLAMCH, ZLADIV
160 *     ..
161 *     .. External Subroutines ..
162       EXTERNAL           DLABAD, XERBLA, ZGEMV
163 *     ..
164 *     .. Intrinsic Functions ..
165       INTRINSIC          ABSDBLEDCMPLXDCONJGDIMAGMAXMIN
166 *     ..
167 *     .. Statement Functions ..
168       DOUBLE PRECISION   ABS1
169 *     ..
170 *     .. Statement Function definitions ..
171       ABS1( X ) = ABSDBLE( X ) ) + ABSDIMAG( X ) )
172 *     ..
173 *     .. Executable Statements ..
174 *
175 *     Decode and Test the input parameters
176 *
177       IF( LSAME( HOWMNY, 'A' ) ) THEN
178          IHWMNY = 1
179          ILALL = .TRUE.
180          ILBACK = .FALSE.
181       ELSE IF( LSAME( HOWMNY, 'S' ) ) THEN
182          IHWMNY = 2
183          ILALL = .FALSE.
184          ILBACK = .FALSE.
185       ELSE IF( LSAME( HOWMNY, 'B' ) ) THEN
186          IHWMNY = 3
187          ILALL = .TRUE.
188          ILBACK = .TRUE.
189       ELSE
190          IHWMNY = -1
191       END IF
192 *
193       IF( LSAME( SIDE, 'R' ) ) THEN
194          ISIDE = 1
195          COMPL = .FALSE.
196          COMPR = .TRUE.
197       ELSE IF( LSAME( SIDE, 'L' ) ) THEN
198          ISIDE = 2
199          COMPL = .TRUE.
200          COMPR = .FALSE.
201       ELSE IF( LSAME( SIDE, 'B' ) ) THEN
202          ISIDE = 3
203          COMPL = .TRUE.
204          COMPR = .TRUE.
205       ELSE
206          ISIDE = -1
207       END IF
208 *
209       INFO = 0
210       IF( ISIDE.LT.0 ) THEN
211          INFO = -1
212       ELSE IF( IHWMNY.LT.0 ) THEN
213          INFO = -2
214       ELSE IF( N.LT.0 ) THEN
215          INFO = -4
216       ELSE IF( LDS.LT.MAX1, N ) ) THEN
217          INFO = -6
218       ELSE IF( LDP.LT.MAX1, N ) ) THEN
219          INFO = -8
220       END IF
221       IF( INFO.NE.0 ) THEN
222          CALL XERBLA( 'ZTGEVC'-INFO )
223          RETURN
224       END IF
225 *
226 *     Count the number of eigenvectors
227 *
228       IF.NOT.ILALL ) THEN
229          IM = 0
230          DO 10 J = 1, N
231             IFSELECT( J ) )
232      $         IM = IM + 1
233    10    CONTINUE
234       ELSE
235          IM = N
236       END IF
237 *
238 *     Check diagonal of B
239 *
240       ILBBAD = .FALSE.
241       DO 20 J = 1, N
242          IFDIMAG( P( J, J ) ).NE.ZERO )
243      $      ILBBAD = .TRUE.
244    20 CONTINUE
245 *
246       IF( ILBBAD ) THEN
247          INFO = -7
248       ELSE IF( COMPL .AND. LDVL.LT..OR. LDVL.LT.1 ) THEN
249          INFO = -10
250       ELSE IF( COMPR .AND. LDVR.LT..OR. LDVR.LT.1 ) THEN
251          INFO = -12
252       ELSE IF( MM.LT.IM ) THEN
253          INFO = -13
254       END IF
255       IF( INFO.NE.0 ) THEN
256          CALL XERBLA( 'ZTGEVC'-INFO )
257          RETURN
258       END IF
259 *
260 *     Quick return if possible
261 *
262       M = IM
263       IF( N.EQ.0 )
264      $   RETURN
265 *
266 *     Machine Constants
267 *
268       SAFMIN = DLAMCH( 'Safe minimum' )
269       BIG = ONE / SAFMIN
270       CALL DLABAD( SAFMIN, BIG )
271       ULP = DLAMCH( 'Epsilon' )*DLAMCH( 'Base' )
272       SMALL = SAFMIN*/ ULP
273       BIG = ONE / SMALL
274       BIGNUM = ONE / ( SAFMIN*N )
275 *
276 *     Compute the 1-norm of each column of the strictly upper triangular
277 *     part of A and B to check for possible overflow in the triangular
278 *     solver.
279 *
280       ANORM = ABS1( S( 11 ) )
281       BNORM = ABS1( P( 11 ) )
282       RWORK( 1 ) = ZERO
283       RWORK( N+1 ) = ZERO
284       DO 40 J = 2, N
285          RWORK( J ) = ZERO
286          RWORK( N+J ) = ZERO
287          DO 30 I = 1, J - 1
288             RWORK( J ) = RWORK( J ) + ABS1( S( I, J ) )
289             RWORK( N+J ) = RWORK( N+J ) + ABS1( P( I, J ) )
290    30    CONTINUE
291          ANORM = MAX( ANORM, RWORK( J )+ABS1( S( J, J ) ) )
292          BNORM = MAX( BNORM, RWORK( N+J )+ABS1( P( J, J ) ) )
293    40 CONTINUE
294 *
295       ASCALE = ONE / MAX( ANORM, SAFMIN )
296       BSCALE = ONE / MAX( BNORM, SAFMIN )
297 *
298 *     Left eigenvectors
299 *
300       IF( COMPL ) THEN
301          IEIG = 0
302 *
303 *        Main loop over eigenvalues
304 *
305          DO 140 JE = 1, N
306             IF( ILALL ) THEN
307                ILCOMP = .TRUE.
308             ELSE
309                ILCOMP = SELECT( JE )
310             END IF
311             IF( ILCOMP ) THEN
312                IEIG = IEIG + 1
313 *
314                IF( ABS1( S( JE, JE ) ).LE.SAFMIN .AND.
315      $             ABSDBLE( P( JE, JE ) ) ).LE.SAFMIN ) THEN
316 *
317 *                 Singular matrix pencil -- return unit eigenvector
318 *
319                   DO 50 JR = 1, N
320                      VL( JR, IEIG ) = CZERO
321    50             CONTINUE
322                   VL( IEIG, IEIG ) = CONE
323                   GO TO 140
324                END IF
325 *
326 *              Non-singular eigenvalue:
327 *              Compute coefficients  a  and  b  in
328 *                   H
329 *                 y  ( a A - b B ) = 0
330 *
331                TEMP = ONE / MAX( ABS1( S( JE, JE ) )*ASCALE,
332      $                ABSDBLE( P( JE, JE ) ) )*BSCALE, SAFMIN )
333                SALPHA = ( TEMP*S( JE, JE ) )*ASCALE
334                SBETA = ( TEMP*DBLE( P( JE, JE ) ) )*BSCALE
335                ACOEFF = SBETA*ASCALE
336                BCOEFF = SALPHA*BSCALE
337 *
338 *              Scale to avoid underflow
339 *
340                LSA = ABS( SBETA ).GE.SAFMIN .AND. ABS( ACOEFF ).LT.SMALL
341                LSB = ABS1( SALPHA ).GE.SAFMIN .AND. ABS1( BCOEFF ).LT.
342      $               SMALL
343 *
344                SCALE = ONE
345                IF( LSA )
346      $            SCALE = ( SMALL / ABS( SBETA ) )*MIN( ANORM, BIG )
347                IF( LSB )
348      $            SCALE = MAXSCALE, ( SMALL / ABS1( SALPHA ) )*
349      $                    MIN( BNORM, BIG ) )
350                IF( LSA .OR. LSB ) THEN
351                   SCALE = MINSCALE, ONE /
352      $                    ( SAFMIN*MAX( ONE, ABS( ACOEFF ),
353      $                    ABS1( BCOEFF ) ) ) )
354                   IF( LSA ) THEN
355                      ACOEFF = ASCALE*SCALE*SBETA )
356                   ELSE
357                      ACOEFF = SCALE*ACOEFF
358                   END IF
359                   IF( LSB ) THEN
360                      BCOEFF = BSCALE*SCALE*SALPHA )
361                   ELSE
362                      BCOEFF = SCALE*BCOEFF
363                   END IF
364                END IF
365 *
366                ACOEFA = ABS( ACOEFF )
367                BCOEFA = ABS1( BCOEFF )
368                XMAX = ONE
369                DO 60 JR = 1, N
370                   WORK( JR ) = CZERO
371    60          CONTINUE
372                WORK( JE ) = CONE
373                DMIN = MAX( ULP*ACOEFA*ANORM, ULP*BCOEFA*BNORM, SAFMIN )
374 *
375 *                                              H
376 *              Triangular solve of  (a A - b B)  y = 0
377 *
378 *                                      H
379 *              (rowwise in  (a A - b B) , or columnwise in a A - b B)
380 *
381                DO 100 J = JE + 1, N
382 *
383 *                 Compute
384 *                       j-1
385 *                 SUM = sum  conjg( a*S(k,j) - b*P(k,j) )*x(k)
386 *                       k=je
387 *                 (Scale if necessary)
388 *
389                   TEMP = ONE / XMAX
390                   IF( ACOEFA*RWORK( J )+BCOEFA*RWORK( N+J ).GT.BIGNUM*
391      $                TEMP ) THEN
392                      DO 70 JR = JE, J - 1
393                         WORK( JR ) = TEMP*WORK( JR )
394    70                CONTINUE
395                      XMAX = ONE
396                   END IF
397                   SUMA = CZERO
398                   SUMB = CZERO
399 *
400                   DO 80 JR = JE, J - 1
401                      SUMA = SUMA + DCONJG( S( JR, J ) )*WORK( JR )
402                      SUMB = SUMB + DCONJG( P( JR, J ) )*WORK( JR )
403    80             CONTINUE
404                   SUM = ACOEFF*SUMA - DCONJG( BCOEFF )*SUMB
405 *
406 *                 Form x(j) = - SUM / conjg( a*S(j,j) - b*P(j,j) )
407 *
408 *                 with scaling and perturbation of the denominator
409 *
410                   D = DCONJG( ACOEFF*S( J, J )-BCOEFF*P( J, J ) )
411                   IF( ABS1( D ).LE.DMIN )
412      $               D = DCMPLX( DMIN )
413 *
414                   IF( ABS1( D ).LT.ONE ) THEN
415                      IF( ABS1( SUM ).GE.BIGNUM*ABS1( D ) ) THEN
416                         TEMP = ONE / ABS1( SUM )
417                         DO 90 JR = JE, J - 1
418                            WORK( JR ) = TEMP*WORK( JR )
419    90                   CONTINUE
420                         XMAX = TEMP*XMAX
421                         SUM = TEMP*SUM
422                      END IF
423                   END IF
424                   WORK( J ) = ZLADIV( -SUM, D )
425                   XMAX = MAX( XMAX, ABS1( WORK( J ) ) )
426   100          CONTINUE
427 *
428 *              Back transform eigenvector if HOWMNY='B'.
429 *
430                IF( ILBACK ) THEN
431                   CALL ZGEMV( 'N', N, N+1-JE, CONE, VL( 1, JE ), LDVL,
432      $                        WORK( JE ), 1, CZERO, WORK( N+1 ), 1 )
433                   ISRC = 2
434                   IBEG = 1
435                ELSE
436                   ISRC = 1
437                   IBEG = JE
438                END IF
439 *
440 *              Copy and scale eigenvector into column of VL
441 *
442                XMAX = ZERO
443                DO 110 JR = IBEG, N
444                   XMAX = MAX( XMAX, ABS1( WORK( ( ISRC-1 )*N+JR ) ) )
445   110          CONTINUE
446 *
447                IF( XMAX.GT.SAFMIN ) THEN
448                   TEMP = ONE / XMAX
449                   DO 120 JR = IBEG, N
450                      VL( JR, IEIG ) = TEMP*WORK( ( ISRC-1 )*N+JR )
451   120             CONTINUE
452                ELSE
453                   IBEG = N + 1
454                END IF
455 *
456                DO 130 JR = 1, IBEG - 1
457                   VL( JR, IEIG ) = CZERO
458   130          CONTINUE
459 *
460             END IF
461   140    CONTINUE
462       END IF
463 *
464 *     Right eigenvectors
465 *
466       IF( COMPR ) THEN
467          IEIG = IM + 1
468 *
469 *        Main loop over eigenvalues
470 *
471          DO 250 JE = N, 1-1
472             IF( ILALL ) THEN
473                ILCOMP = .TRUE.
474             ELSE
475                ILCOMP = SELECT( JE )
476             END IF
477             IF( ILCOMP ) THEN
478                IEIG = IEIG - 1
479 *
480                IF( ABS1( S( JE, JE ) ).LE.SAFMIN .AND.
481      $             ABSDBLE( P( JE, JE ) ) ).LE.SAFMIN ) THEN
482 *
483 *                 Singular matrix pencil -- return unit eigenvector
484 *
485                   DO 150 JR = 1, N
486                      VR( JR, IEIG ) = CZERO
487   150             CONTINUE
488                   VR( IEIG, IEIG ) = CONE
489                   GO TO 250
490                END IF
491 *
492 *              Non-singular eigenvalue:
493 *              Compute coefficients  a  and  b  in
494 *
495 *              ( a A - b B ) x  = 0
496 *
497                TEMP = ONE / MAX( ABS1( S( JE, JE ) )*ASCALE,
498      $                ABSDBLE( P( JE, JE ) ) )*BSCALE, SAFMIN )
499                SALPHA = ( TEMP*S( JE, JE ) )*ASCALE
500                SBETA = ( TEMP*DBLE( P( JE, JE ) ) )*BSCALE
501                ACOEFF = SBETA*ASCALE
502                BCOEFF = SALPHA*BSCALE
503 *
504 *              Scale to avoid underflow
505 *
506                LSA = ABS( SBETA ).GE.SAFMIN .AND. ABS( ACOEFF ).LT.SMALL
507                LSB = ABS1( SALPHA ).GE.SAFMIN .AND. ABS1( BCOEFF ).LT.
508      $               SMALL
509 *
510                SCALE = ONE
511                IF( LSA )
512      $            SCALE = ( SMALL / ABS( SBETA ) )*MIN( ANORM, BIG )
513                IF( LSB )
514      $            SCALE = MAXSCALE, ( SMALL / ABS1( SALPHA ) )*
515      $                    MIN( BNORM, BIG ) )
516                IF( LSA .OR. LSB ) THEN
517                   SCALE = MINSCALE, ONE /
518      $                    ( SAFMIN*MAX( ONE, ABS( ACOEFF ),
519      $                    ABS1( BCOEFF ) ) ) )
520                   IF( LSA ) THEN
521                      ACOEFF = ASCALE*SCALE*SBETA )
522                   ELSE
523                      ACOEFF = SCALE*ACOEFF
524                   END IF
525                   IF( LSB ) THEN
526                      BCOEFF = BSCALE*SCALE*SALPHA )
527                   ELSE
528                      BCOEFF = SCALE*BCOEFF
529                   END IF
530                END IF
531 *
532                ACOEFA = ABS( ACOEFF )
533                BCOEFA = ABS1( BCOEFF )
534                XMAX = ONE
535                DO 160 JR = 1, N
536                   WORK( JR ) = CZERO
537   160          CONTINUE
538                WORK( JE ) = CONE
539                DMIN = MAX( ULP*ACOEFA*ANORM, ULP*BCOEFA*BNORM, SAFMIN )
540 *
541 *              Triangular solve of  (a A - b B) x = 0  (columnwise)
542 *
543 *              WORK(1:j-1) contains sums w,
544 *              WORK(j+1:JE) contains x
545 *
546                DO 170 JR = 1, JE - 1
547                   WORK( JR ) = ACOEFF*S( JR, JE ) - BCOEFF*P( JR, JE )
548   170          CONTINUE
549                WORK( JE ) = CONE
550 *
551                DO 210 J = JE - 11-1
552 *
553 *                 Form x(j) := - w(j) / d
554 *                 with scaling and perturbation of the denominator
555 *
556                   D = ACOEFF*S( J, J ) - BCOEFF*P( J, J )
557                   IF( ABS1( D ).LE.DMIN )
558      $               D = DCMPLX( DMIN )
559 *
560                   IF( ABS1( D ).LT.ONE ) THEN
561                      IF( ABS1( WORK( J ) ).GE.BIGNUM*ABS1( D ) ) THEN
562                         TEMP = ONE / ABS1( WORK( J ) )
563                         DO 180 JR = 1, JE
564                            WORK( JR ) = TEMP*WORK( JR )
565   180                   CONTINUE
566                      END IF
567                   END IF
568 *
569                   WORK( J ) = ZLADIV( -WORK( J ), D )
570 *
571                   IF( J.GT.1 ) THEN
572 *
573 *                    w = w + x(j)*(a S(*,j) - b P(*,j) ) with scaling
574 *
575                      IF( ABS1( WORK( J ) ).GT.ONE ) THEN
576                         TEMP = ONE / ABS1( WORK( J ) )
577                         IF( ACOEFA*RWORK( J )+BCOEFA*RWORK( N+J ).GE.
578      $                      BIGNUM*TEMP ) THEN
579                            DO 190 JR = 1, JE
580                               WORK( JR ) = TEMP*WORK( JR )
581   190                      CONTINUE
582                         END IF
583                      END IF
584 *
585                      CA = ACOEFF*WORK( J )
586                      CB = BCOEFF*WORK( J )
587                      DO 200 JR = 1, J - 1
588                         WORK( JR ) = WORK( JR ) + CA*S( JR, J ) -
589      $                               CB*P( JR, J )
590   200                CONTINUE
591                   END IF
592   210          CONTINUE
593 *
594 *              Back transform eigenvector if HOWMNY='B'.
595 *
596                IF( ILBACK ) THEN
597                   CALL ZGEMV( 'N', N, JE, CONE, VR, LDVR, WORK, 1,
598      $                        CZERO, WORK( N+1 ), 1 )
599                   ISRC = 2
600                   IEND = N
601                ELSE
602                   ISRC = 1
603                   IEND = JE
604                END IF
605 *
606 *              Copy and scale eigenvector into column of VR
607 *
608                XMAX = ZERO
609                DO 220 JR = 1, IEND
610                   XMAX = MAX( XMAX, ABS1( WORK( ( ISRC-1 )*N+JR ) ) )
611   220          CONTINUE
612 *
613                IF( XMAX.GT.SAFMIN ) THEN
614                   TEMP = ONE / XMAX
615                   DO 230 JR = 1, IEND
616                      VR( JR, IEIG ) = TEMP*WORK( ( ISRC-1 )*N+JR )
617   230             CONTINUE
618                ELSE
619                   IEND = 0
620                END IF
621 *
622                DO 240 JR = IEND + 1, N
623                   VR( JR, IEIG ) = CZERO
624   240          CONTINUE
625 *
626             END IF
627   250    CONTINUE
628       END IF
629 *
630       RETURN
631 *
632 *     End of ZTGEVC
633 *
634       END