      SUBROUTINE CTIM51( LINE, NSIZES, NN, NTYPES, DOTYPE, NPARMS, NNB,
     $                   NSHFTS, NEISPS, MINNBS, MINBKS, LDAS, TIMMIN,
     $                   NOUT, ISEED, A, AR, AI, B, BR, BI, H, HR, HI,
     $                   T, TR, TI, Q, QR, QI, Z, ZR, ZI, W, WR, WORK,
     $                   LWORK, RWORK, LLWORK, TIMES, LDT1, LDT2, LDT3,
     $                   OPCNTS, LDO1, LDO2, LDO3, INFO )
*
*  -- LAPACK timing routine (version 3.0) --
*     Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd.,
*     Courant Institute, Argonne National Lab, and Rice University
*     September 30, 1994
*
*     .. Scalar Arguments ..
      CHARACTER*80       LINE
      INTEGER            INFO, LDO1, LDO2, LDO3, LDT1, LDT2, LDT3,
     $                   LWORK, NOUT, NPARMS, NSIZES, NTYPES
      REAL               TIMMIN
*     ..
*     .. Array Arguments ..
      LOGICAL            DOTYPE( * ), LLWORK( * )
      INTEGER            ISEED( * ), LDAS( * ), MINBKS( * ),
     $                   MINNBS( * ), NEISPS( * ), NN( * ), NNB( * ),
     $                   NSHFTS( * )
      REAL               AI( * ), AR( * ), BI( * ), BR( * ), HI( * ),
     $                   HR( * ), OPCNTS( LDO1, LDO2, LDO3, * ),
     $                   QI( * ), QR( * ), RWORK( * ), TI( * ),
     $                   TIMES( LDT1, LDT2, LDT3, * ), TR( * ), WR( * ),
     $                   ZI( * ), ZR( * )
      COMPLEX            A( * ), B( * ), H( * ), Q( * ), T( * ), W( * ),
     $                   WORK( * ), Z( * )
*     ..
*
*  Purpose
*  =======
*
*  CTIM51 times the LAPACK routines for the COMPLEX non-symmetric
*  generalized eigenvalue problem   A x = w B x.
*
*  For each N value in NN(1:NSIZES) and .TRUE. value in
*  DOTYPE(1:NTYPES), a pair of matrices will be generated and used to
*  test the selected routines.  Thus, NSIZES*(number of .TRUE. values
*  in DOTYPE) matrices will be generated.
*
*  Arguments
*  =========
*
*  LINE    (input) CHARACTER*80
*          The input line which requested this routine.  This line may
*          contain a subroutine name, such as CGGHRD, indicating that
*          only routine CGGHRD will be timed, or it may contain a
*          generic name, such as CHG.  In this case, the rest of the
*          line is scanned for the first 18 non-blank characters,
*          corresponding to the eighteen combinations of subroutine and
*          options:
*          LAPACK:                                     Table Heading:
*           1: CGGHRD(no Q, no Z) (+CGEQRF, etc.)      'CGGHRD(N)'
*           2: CGGHRD(Q only)     (+CGEQRF, etc.)      'CGGHRD(Q)'
*           3: CGGHRD(Z only)     (+CGEQRF, etc.)      'CGGHRD(Z)'
*           4: CGGHRD(Q and Z)    (+CGEQRF, etc.)      'CGGHRD(Q,Z)'
*           5: CHGEQZ(Eigenvalues only)                'CHGEQZ(E)'
*           6: CHGEQZ(Schur form only)                 'CHGEQZ(S)'
*           7: CHGEQZ(Schur form and Q)                'CHGEQZ(Q)'
*           8: CHGEQZ(Schur form and Z)                'CHGEQZ(Z)'
*           9: CHGEQZ(Schur form, Q and Z)             'CHGEQZ(Q,Z)'
*          10: CTGEVC(SIDE='L', HOWMNY='A')            'CTGEVC(L,A)'
*          11: CTGEVC(SIDE='L', HOWMNY='B')            'CTGEVC(L,B)'
*          12: CTGEVC(SIDE='R', HOWMNY='A')            'CTGEVC(R,A)'
*          13: CTGEVC(SIDE='R', HOWMNY='B')            'CTGEVC(R,B)'
*          EISPACK:                       Compare w/:  Table Heading:
*          14: CQZHES w/ matz=.false.            1      'CQZHES(F)'
*          15: CQZHES w/ matz=.true.             3      'CQZHES(T)'
*          16: CQZVAL w/ matz=.false.            5      'CQZVAL(F)'
*          17: CQZVAL w/ matz=.true.             8      'CQZVAL(T)'
*          18: CQZVEC                           13      'CQZVEC'
*          If a character is 'T' or 't', the corresponding routine in
*          this path is timed.  If the entire line is blank, all the
*          routines in the path are timed.
*
*          Note that since QZHES does more than SGGHRD, the
*          "SGGHRD" timing also includes the time for the calls
*          to SGEQRF, SORMQR, and (if Q is computed) SORGQR
*          which are necessary to get the same functionality
*          as QZHES.
*
*  NSIZES  (input) INTEGER
*          The number of values of N contained in the vector NN.
*
*  NN      (input) INTEGER array, dimension (NSIZES)
*          The values of the matrix size N to be tested.  For each
*          N value in the array NN, and each .TRUE. value in DOTYPE,
*          a matrix A will be generated and used to test the routines.
*
*  NTYPES  (input) INTEGER
*          The number of types in DOTYPE.  Only the first MAXTYP
*          elements will be examined.  Exception: if NSIZES=1 and
*          NTYPES=MAXTYP+1, and DOTYPE=MAXTYP*f,t, then the input
*          value of A will be used.
*
*  DOTYPE  (input) LOGICAL
*          If DOTYPE(j) is .TRUE., then a pair of matrices (A,B) of
*          type j will be generated.  A and B have the form  U T1 V
*          and  U T2 V , resp., where U and V are orthogonal, T1 and
*          T2 are upper triangular.  T2 has random O(1) entries in the
*          strict upper triangle and ( 0, 1, 0, 1, 1, ..., 1, 0 ) on
*          the diagonal, while T1 has random O(1) entries in the strict
*          upper triangle, its diagonal will have the values:
*          (j=1)   0, 0, 1, 1, ULP,..., ULP, 0.
*          (j=2)   0, 0, 1, 1, 1-d, 1-2*d, ..., 1-(N-5)*d=ULP, 0.
*
*                                  2        N-5
*          (j=3)   0, 0, 1, 1, a, a , ..., a   =ULP, 0.
*          (j=4)   0, 0, 1, r1, r2, ..., r(N-4), 0, where r1, etc.
*                  are random numbers in (ULP,1).
*
*  NPARMS  (input) INTEGER
*          The number of values in each of the arrays NNB, NSHFTS,
*          NEISPS, and LDAS.  For each pair of matrices A,B generated
*          according to NN and DOTYPE, tests will be run with
*          (NB,NSHIFT,NEISP,LDA)= (NNB(1), NSHFTS(1), NEISPS(1),
*          LDAS(1)),..., (NNB(NPARMS), NSHFTS(NPARMS), NEISPS(NPARMS),
*          LDAS(NPARMS))
*
*  NNB     (input) INTEGER array, dimension (NPARMS)
*          The values of the blocksize ("NB") to be tested.  They must
*          be at least 1.  Currently, this is only used by CGEQRF,
*          etc., in the timing of CGGHRD.
*
*  NSHFTS  (input) INTEGER array, dimension (NPARMS)
*          The values of the number of shifts ("NSHIFT") to be tested.
*          (Currently not used.)
*
*  NEISPS  (input) INTEGER array, dimension (NPARMS)
*          The values of "NEISP", the size of largest submatrix to be
*          processed by CLAEQZ (EISPACK method), to be tested.
*          (Currently not used.)
*
*  MINNBS  (input) INTEGER array, dimension (NPARMS)
*          The values of "MINNB", the minimum size of a product of
*          transformations which may be applied as a blocked
*          transformation, to be tested.  (Currently not used.)
*
*  MINBKS  (input) INTEGER array, dimension (NPARMS)
*          The values of "MINBK", the minimum number of rows/columns
*          to be updated with a blocked transformation, to be tested.
*          (Currently not used.)
*
*  LDAS    (input) INTEGER array, dimension (NPARMS)
*          The values of LDA, the leading dimension of all matrices,
*          to be tested.
*
*  TIMMIN  (input) REAL
*          The minimum time a subroutine will be timed.
*
*  NOUT    (input) INTEGER
*          If NOUT > 0 then NOUT specifies the unit number
*          on which the output will be printed.  If NOUT <= 0, no
*          output is printed.
*
*  ISEED   (input/output) INTEGER array, dimension (4)
*          The random seed used by the random number generator, used
*          by the test matrix generator.  It is used and updated on
*          each call to CTIM51.
*
*  A       (workspace) COMPLEX array, dimension (max(NN)*max(LDAS))
*          (a) During the testing of CGGHRD, "A", the original
*              left-hand-side matrix to be tested.
*          (b) Later, "S", the Schur form of the original "A" matrix.
*
*  AR, AI  (workspace) REAL arrays, dimension
*                      (max(NN)*max(LDAS))
*          The real and imaginary parts of A, stored separately for
*          the benefit of CQZHES, CQZVAL, and CQZVEC.  These may be
*          equivalenced with A by the calling routine.
*
*  B       (workspace) COMPLEX array, dimension (max(NN)*max(LDAS))
*          (a) During the testing of CGGHRD, "B", the original
*              right-hand-side matrix to be tested.
*          (b) Later, "P", the Schur form of the original "B" matrix.
*
*  BR, BI  (workspace) REAL arrays, dimension
*                      (max(NN)*max(LDAS))
*          The real and imaginary parts of B, stored separately for
*          the benefit of CQZHES, CQZVAL, and CQZVEC.  These may be
*          equivalenced with B by the calling routine.
*
*  H       (workspace) COMPLEX array, dimension (max(NN)*max(LDAS))
*          (a) During the testing of CGGHRD and CHGEQZ, "H", the
*              Hessenberg form of the original "A" matrix.
*          (b) During the testing of CTGEVC, "L", the matrix of left
*              eigenvectors.
*
*  HR, HI  (workspace) REAL arrays, dimension
*                      (max(NN)*max(LDAS))
*          The real and imaginary parts of H, stored separately for
*          the benefit of CQZHES, CQZVAL, and CQZVEC.  These may be
*          equivalenced with H by the calling routine.
*
*  T       (workspace) COMPLEX array, dimension (max(NN)*max(LDAS))
*          (a) During the testing of CGGHRD and CHGEQZ, "T", the
*              triangular form of the original "B" matrix.
*          (b) During the testing of CTGEVC, "R", the matrix of right
*              eigenvectors.
*
*  TR, TI  (workspace) REAL arrays, dimension
*                      (max(NN)*max(LDAS))
*          The real and imaginary parts of T, stored separately for
*          the benefit of CQZHES, CQZVAL, and CQZVEC.  These may be
*          equivalenced with T by the calling routine.
*
*  Q       (workspace) COMPLEX array, dimension (max(NN)*max(LDAS))
*          The orthogonal matrix on the left generated by CGGHRD.  If
*          CHGEQZ computes only Q or Z, then that matrix is stored here.
*          If both Q and Z are computed, the Q matrix goes here.
*
*  QR, QI  (workspace) REAL arrays, dimension
*                      (max(NN)*max(LDAS))
*          The real and imaginary parts of Q, stored separately for
*          the benefit of CQZVAL.  These may be equivalenced with Q by
*          the calling routine.
*
*  Z       (workspace) COMPLEX array, dimension (max(NN)*max(LDAS))
*          The orthogonal matrix on the right generated by CGGHRD.
*          If CHGEQZ computes both Q and Z, the Z matrix is stored here.
*          Also used as scratch space for timing the CLACPY calls.
*
*  ZR, ZI  (workspace) REAL arrays, dimension
*                      (max(NN)*max(LDAS))
*          The real and imaginary parts of Z, stored separately for
*          the benefit of CQZHES, CQZVAL, and CQZVEC.  These may be
*          equivalenced with Z by the calling routine.
*
*  W       (workspace) COMPLEX array, dimension (2*max(LDAS))
*          Treated as an LDA x 2 matrix whose 1st column holds
*          ALPHA, the diagonal entries of "S", and whose 2nd column
*          holds BETA, the diagonal entries of "P".
*
*  WR      (workspace) REAL array, dimension (3*max(LDAS))
*          Treated as an LDA x 3 matrix whose 1st and 2nd columns hold
*          the real and imaginary parts of ALPHA (see the description
*          of W), and whose 3rd column holds BETA (real part only.)
*          This may be equivalenced to W by the calling routine.
*
*  WORK    (workspace) COMPLEX array, dimension (LWORK)
*
*  LWORK   (input) INTEGER [the following formulae are certainly wrong]
*          Number of elements in WORK.  LWORK >= 4*max(NN).
*
*  RWORK   (workspace) REAL array, dimension
*                      (max( 2*max(NN), NSIZES*NTYPES*NPARMS ))
*
*  LLWORK  (workspace) LOGICAL array, dimension (max( max(NN), NPARMS ))
*
*  TIMES   (output) REAL array, dimension
*                   (LDT1,LDT2,LDT3,NSUBS)
*          TIMES(i,j,k,l) will be set to the run time (in seconds) for
*          subroutine l, with N=NN(k), matrix type j, and LDA=LDAS(i),
*          NEISP=NEISPS(i), NBLOCK=NNB(i), NSHIFT=NSHFTS(i),
*          MINNB=MINNBS(i), and MINBLK=MINBKS(i).
*
*  LDT1    (input) INTEGER
*          The first dimension of TIMES.  LDT1 >= min( 1, NPARMS ).
*
*  LDT2    (input) INTEGER
*          The second dimension of TIMES.  LDT2 >= min( 1, NTYPES ).
*
*  LDT3    (input) INTEGER
*          The third dimension of TIMES.  LDT3 >= min( 1, NSIZES ).
*
*  OPCNTS  (output) REAL array, dimension
*                   (LDO1,LDO2,LDO3,NSUBS)
*          OPCNTS(i,j,k,l) will be set to the number of floating-point
*          operations executed by subroutine l, with N=NN(k), matrix
*          type j, and LDA=LDAS(i), NEISP=NEISPS(i), NBLOCK=NNB(i),
*          NSHIFT=NSHFTS(i), MINNB=MINNBS(i), and MINBLK=MINBKS(i).
*
*  LDO1    (input) INTEGER
*          The first dimension of OPCNTS.  LDO1 >= min( 1, NPARMS ).
*
*  LDO2    (input) INTEGER
*          The second dimension of OPCNTS.  LDO2 >= min( 1, NTYPES ).
*
*  LDO3    (input) INTEGER
*          The third dimension of OPCNTS.  LDO3 >= min( 1, NSIZES ).
*
*  INFO    (output) INTEGER
*          Error flag.  It will be set to zero if no error occurred.
*
*  =====================================================================
*
*     .. Parameters ..
      INTEGER            MAXTYP, NSUBS
      PARAMETER          ( MAXTYP = 4, NSUBS = 18 )
      REAL               ZERO, ONE
      PARAMETER          ( ZERO = 0.0E+0, ONE = 1.0E+0 )
      COMPLEX            CZERO, CONE
      PARAMETER          ( CZERO = ( 0.0E+0, 0.0E+0 ),
     $                   CONE = ( 1.0E+0, 0.0E+0 ) )
*     ..
*     .. Local Scalars ..
      LOGICAL            RUNEQ, RUNES, RUNHES, RUNHRD, RUNQZ
      INTEGER            IC, IINFO, IN, IPAR, ISUB, ITEMP, ITYPE, J, J1,
     $                   J2, J3, J4, JC, JR, LASTL, LDA, LDAMIN, LDH,
     $                   LDQ, LDS, LDW, MINBLK, MINNB, MTYPES, N, N1,
     $                   NB, NBSMAX, NEISP, NMAX, NSHIFT
      REAL               S1, S2, TIME, ULP, UNTIME
      COMPLEX            CTEMP
*     ..
*     .. Local Arrays ..
      LOGICAL            TIMSUB( NSUBS )
      CHARACTER*6        PNAMES( 6 )
      CHARACTER*11       SUBNAM( NSUBS )
      INTEGER            INPARM( NSUBS ), IOLDSD( 4 ), KATYPE( MAXTYP )
*     ..
*     .. External Functions ..
      REAL               SECOND, SLAMCH, SOPLA
      COMPLEX            CLARND
      EXTERNAL           SECOND, SLAMCH, SOPLA, CLARND
*     ..
*     .. External Subroutines ..
      EXTERNAL           ATIMIN, CHGEQZ, CLACPY, CLAQZH, CLARFG, CLATM4,
     $                   CQZHES, CQZVAL, CQZVEC, CTGEVC, CUNM2R, SLACPY,
     $                   SLASET, SPRTBG, XLAENV
*     ..
*     .. Intrinsic Functions ..
      INTRINSIC          ABS, AIMAG, CONJG, MAX, MIN, REAL, SIGN
*     ..
*     .. Common blocks ..
      COMMON             / LATIME / OPS, ITCNT
*     ..
*     .. Scalars in Common ..
      REAL               ITCNT, OPS
*     ..
*     .. Data statements ..
      DATA               SUBNAM / 'CGGHRD(N)', 'CGGHRD(Q)', 'CGGHRD(Z)',
     $                   'CGGHRD(Q,Z)', 'CHGEQZ(E)', 'CHGEQZ(S)',
     $                   'CHGEQZ(Q)', 'CHGEQZ(Z)', 'CHGEQZ(Q,Z)',
     $                   'CTGEVC(L,A)', 'CTGEVC(L,B)', 'CTGEVC(R,A)',
     $                   'CTGEVC(R,B)', 'CQZHES(F)', 'CQZHES(T)',
     $                   'CQZVAL(F)', 'CQZVAL(T)', 'CQZVEC' /
      DATA               INPARM / 4*2, 5*1, 4*1, 5*1 /
      DATA               PNAMES / '   LDA', '    NB', '    NS',
     $                   ' NEISP', ' MINNB', 'MINBLK' /
      DATA               KATYPE / 5, 8, 7, 9 /
*     ..
*     .. Executable Statements ..
*
*     Quick Return
*
      INFO = 0
      IF( NSIZES.LE.0 .OR. NTYPES.LE.0 .OR. NPARMS.LE.0 )
     $   RETURN
*
*     Extract the timing request from the input line.
*
      CALL ATIMIN( 'CHG', LINE, NSUBS, SUBNAM, TIMSUB, NOUT, INFO )
      IF( INFO.NE.0 )
     $   RETURN
*
*     Compute Maximum Values
*
      NMAX = 0
      DO 10 J1 = 1, NSIZES
         NMAX = MAX( NMAX, NN( J1 ) )
   10 CONTINUE
*
      LDAMIN = 2*MAX( 1, NMAX )
      NBSMAX = 0
      DO 20 J1 = 1, NPARMS
         LDAMIN = MIN( LDAMIN, LDAS( J1 ) )
         NBSMAX = MAX( NBSMAX, NNB( J1 )+NSHFTS( J1 ) )
   20 CONTINUE
*
*     Check that N <= LDA for the input values.
*
      IF( NMAX.GT.LDAMIN ) THEN
         INFO = -12
         WRITE( NOUT, FMT = 9999 )LINE( 1: 6 )
 9999    FORMAT( 1X, A, ' timing run not attempted -- N > LDA', / )
         RETURN
      END IF
*
*     Check LWORK
*
      IF( LWORK.LT.4*NMAX )
     $     THEN
         INFO = -24
         WRITE( NOUT, FMT = 9998 )LINE( 1: 6 )
 9998    FORMAT( 1X, A, ' timing run not attempted -- LWORK too small.',
     $         / )
         RETURN
      END IF
*
*     Check to see whether CGGHRD or CHGEQZ must be run.
*        RUNHRD -- if CGGHRD must be run.
*        RUNES  -- if CHGEQZ must be run to get Schur form.
*        RUNEQ  -- if CHGEQZ must be run to get Schur form and Q.
*
      RUNHRD = .FALSE.
      RUNES = .FALSE.
      RUNEQ = .FALSE.
*
      IF( TIMSUB( 10 ) .OR. TIMSUB( 12 ) )
     $   RUNES = .TRUE.
      IF( TIMSUB( 11 ) .OR. TIMSUB( 13 ) )
     $   RUNEQ = .TRUE.
      IF( TIMSUB( 5 ) .OR. TIMSUB( 6 ) .OR. TIMSUB( 7 ) .OR.
     $    TIMSUB( 8 ) .OR. TIMSUB( 9 ) .OR. RUNES .OR. RUNEQ )
     $    RUNHRD = .TRUE.
*
      IF( TIMSUB( 6 ) .OR. TIMSUB( 7 ) .OR. TIMSUB( 8 ) .OR.
     $    TIMSUB( 9 ) .OR. RUNEQ )RUNES = .FALSE.
      IF( TIMSUB( 7 ) .OR. TIMSUB( 8 ) .OR. TIMSUB( 9 ) )
     $   RUNEQ = .FALSE.
      IF( TIMSUB( 1 ) .OR. TIMSUB( 2 ) .OR. TIMSUB( 3 ) .OR.
     $    TIMSUB( 4 ) )RUNHRD = .FALSE.
*
*     Check to see whether CQZHES or CQZVAL must be run.
*
*     RUNHES -- if CQZHES must be run.
*     RUNQZ  -- if CQZVAL must be run (w/ MATZ=.TRUE.).
*
      RUNHES = .FALSE.
      RUNQZ = .FALSE.
*
      IF( TIMSUB( 18 ) )
     $   RUNQZ = .TRUE.
      IF( TIMSUB( 16 ) .OR. TIMSUB( 17 ) .OR. RUNQZ )
     $   RUNHES = .TRUE.
      IF( TIMSUB( 17 ) )
     $   RUNQZ = .FALSE.
      IF( TIMSUB( 14 ) .OR. TIMSUB( 15 ) )
     $   RUNHES = .FALSE.
*
*     Various Constants
*
      ULP = SLAMCH( 'Epsilon' )*SLAMCH( 'Base' )
*
*     Zero out OPCNTS, TIMES
*
      DO 60 J4 = 1, NSUBS
         DO 50 J3 = 1, NSIZES
            DO 40 J2 = 1, NTYPES
               DO 30 J1 = 1, NPARMS
                  OPCNTS( J1, J2, J3, J4 ) = ZERO
                  TIMES( J1, J2, J3, J4 ) = ZERO
   30          CONTINUE
   40       CONTINUE
   50    CONTINUE
   60 CONTINUE
*
*     Do for each value of N:
*
      DO 940 IN = 1, NSIZES
*
         N = NN( IN )
         N1 = MAX( 1, N )
*
*        Do for each .TRUE. value in DOTYPE:
*
         MTYPES = MIN( MAXTYP, NTYPES )
         IF( NTYPES.EQ.MAXTYP+1 .AND. NSIZES.EQ.1 )
     $      MTYPES = NTYPES
         DO 930 ITYPE = 1, MTYPES
            IF( .NOT.DOTYPE( ITYPE ) )
     $         GO TO 930
*
*           Save random number seed for error messages
*
            DO 70 J = 1, 4
               IOLDSD( J ) = ISEED( J )
   70       CONTINUE
*
*           Time the LAPACK Routines
*
*           Generate A and B
*
            IF( ITYPE.LE.MAXTYP ) THEN
*
*              Generate A (w/o rotation)
*
               CALL CLATM4( KATYPE( ITYPE ), N, 3, 1, .TRUE., ONE, ULP,
     $                      ONE, 2, ISEED, A, N1 )
               IF( 3.LE.N )
     $            A( 3+2*N1 ) = CONE
*
*              Generate B (w/o rotation)
*
               CALL CLATM4( 8, N, 3, 1, .FALSE., ONE, ONE, ONE, 2,
     $                      ISEED, B, N1 )
               IF( 2.LE.N )
     $            B( 2+N1 ) = CONE
*
               IF( N.GT.0 ) THEN
*
*                 Include rotations
*
*                 Generate U, V as Householder transformations times a
*                 diagonal matrix.  (Note that CLARFG makes Q(jc+ic)
*                 and Z(jc+ic) real.)
*
                  DO 90 JC = 1, N - 1
                     IC = ( JC-1 )*N1
                     DO 80 JR = JC, N
                        Q( JR+IC ) = CLARND( 3, ISEED )
                        Z( JR+IC ) = CLARND( 3, ISEED )
   80                CONTINUE
                     CALL CLARFG( N+1-JC, Q( JC+IC ), Q( JC+1+IC ), 1,
     $                            WORK( JC ) )
                     WORK( 2*N+JC ) = SIGN( ONE, REAL( Q( JC+IC ) ) )
                     Q( JC+IC ) = CONE
                     CALL CLARFG( N+1-JC, Z( JC+IC ), Z( JC+1+IC ), 1,
     $                            WORK( N+JC ) )
                     WORK( 3*N+JC ) = SIGN( ONE, REAL( Z( JC+IC ) ) )
                     Z( JC+IC ) = CONE
   90             CONTINUE
                  IC = ( N-1 )*N1
                  CTEMP = CLARND( 3, ISEED )
                  Q( N+IC ) = CONE
                  WORK( N ) = CZERO
                  WORK( 3*N ) = CTEMP / ABS( CTEMP )
                  CTEMP = CLARND( 3, ISEED )
                  Z( N+IC ) = CONE
                  WORK( 2*N ) = CZERO
                  WORK( 4*N ) = CTEMP / ABS( CTEMP )
*
*                 Apply the diagonal matrices
*
                  DO 110 JC = 1, N
                     DO 100 JR = 1, N
                        A( JR+IC ) = WORK( 2*N+JR )*
     $                               CONJG( WORK( 3*N+JC ) )*A( JR+IC )
                        B( JR+IC ) = WORK( 2*N+JR )*
     $                               CONJG( WORK( 3*N+JC ) )*B( JR+IC )
  100                CONTINUE
  110             CONTINUE
                  CALL CUNM2R( 'L', 'N', N, N, N-1, Q, N1, WORK, A, N1,
     $                         WORK( 2*N+1 ), IINFO )
                  IF( IINFO.NE.0 )
     $               GO TO 120
                  CALL CUNM2R( 'R', 'C', N, N, N-1, Z, N1, WORK( N+1 ),
     $                         A, N1, WORK( 2*N+1 ), IINFO )
                  IF( IINFO.NE.0 )
     $               GO TO 120
                  CALL CUNM2R( 'L', 'N', N, N, N-1, Q, N1, WORK, B, N1,
     $                         WORK( 2*N+1 ), IINFO )
                  IF( IINFO.NE.0 )
     $               GO TO 120
                  CALL CUNM2R( 'R', 'C', N, N, N-1, Z, N1, WORK( N+1 ),
     $                         B, N1, WORK( 2*N+1 ), IINFO )
                  IF( IINFO.NE.0 )
     $               GO TO 120
               END IF
  120          CONTINUE
            END IF
*
* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
*
*           Time CGGHRD
*
*           Time CGEQRF+CGGHRD('N','N',...) for each pair
*           (LDAS(j),NNB(j))
*
            IF( TIMSUB( 1 ) ) THEN
               DO 160 IPAR = 1, NPARMS
                  LDA = LDAS( IPAR )
                  NB = NNB( IPAR )
                  IF( LDA.LT.N1 ) THEN
                     TIMES( IPAR, ITYPE, IN, 1 ) = ZERO
                     OPCNTS( IPAR, ITYPE, IN, 1 ) = ZERO
                     GO TO 160
                  END IF
*
*                 If this value of (NB,LDA) has occurred before,
*                 just use that value.
*
                  LASTL = 0
                  DO 130 J = 1, IPAR - 1
                     IF( LDA.EQ.LDAS( J ) .AND. NB.EQ.NNB( J ) )
     $                  LASTL = J
  130             CONTINUE
*
                  IF( LASTL.EQ.0 ) THEN
*
*                    Time CGGHRD, computing neither Q nor Z
*                    (Actually, time CGEQRF + CUNMQR + CGGHRD.)
*
                     CALL XLAENV( 1, NB )
                     IC = 0
                     OPS = ZERO
                     S1 = SECOND( )
  140                CONTINUE
                     CALL CLACPY( 'Full', N, N, A, N1, H, LDA )
                     CALL CLACPY( 'Full', N, N, B, N1, T, LDA )
                     CALL CLAQZH( .FALSE., .FALSE., N, 1, N, H, LDA, T,
     $                            LDA, Q, LDA, Z, LDA, WORK, IINFO )
                     IF( IINFO.NE.0 ) THEN
                        WRITE( NOUT, FMT = 9997 )SUBNAM( 1 ), IINFO, N,
     $                     ITYPE, IPAR, IOLDSD
                        INFO = ABS( IINFO )
                        GO TO 930
                     END IF
*
                     S2 = SECOND( )
                     TIME = S2 - S1
                     IC = IC + 1
                     IF( TIME.LT.TIMMIN )
     $                  GO TO 140
*
*                    Subtract the time used in CLACPY.
*
                     S1 = SECOND( )
                     DO 150 J = 1, IC
                        CALL CLACPY( 'Full', N, N, A, N1, Z, LDA )
                        CALL CLACPY( 'Full', N, N, B, N1, Z, LDA )
  150                CONTINUE
                     S2 = SECOND( )
                     UNTIME = S2 - S1
*
                     TIMES( IPAR, ITYPE, IN, 1 ) = MAX( TIME-UNTIME,
     $                  ZERO ) / REAL( IC )
                     OPCNTS( IPAR, ITYPE, IN, 1 ) = OPS / REAL( IC ) +
     $                  SOPLA( 'CGEQRF', N, N, 0, 0, NB ) +
     $                  SOPLA( 'CUNMQR', N, N, 0, 0, NB )
                     LDH = LDA
                  ELSE
                     OPCNTS( IPAR, ITYPE, IN, 1 ) = OPCNTS( LASTL,
     $                  ITYPE, IN, 1 )
                     TIMES( IPAR, ITYPE, IN, 1 ) = TIMES( LASTL, ITYPE,
     $                  IN, 1 )
                  END IF
  160          CONTINUE
            ELSE IF( RUNHRD ) THEN
               CALL CLACPY( 'Full', N, N, A, N1, H, N1 )
               CALL CLACPY( 'Full', N, N, B, N1, T, N1 )
               CALL CLAQZH( .FALSE., .FALSE., N, 1, N, H, N1, T, N1, Q,
     $                      N1, Z, N1, WORK, IINFO )
               IF( IINFO.NE.0 ) THEN
                  WRITE( NOUT, FMT = 9997 )SUBNAM( 1 ), IINFO, N,
     $               ITYPE, 0, IOLDSD
                  INFO = ABS( IINFO )
                  GO TO 930
               END IF
               LDH = N
            END IF
*
*           Time CGGHRD('I','N',...) for each pair (LDAS(j),NNB(j))
*
            IF( TIMSUB( 2 ) ) THEN
               DO 200 IPAR = 1, NPARMS
                  LDA = LDAS( IPAR )
                  NB = NNB( IPAR )
                  IF( LDA.LT.N1 ) THEN
                     TIMES( IPAR, ITYPE, IN, 2 ) = ZERO
                     OPCNTS( IPAR, ITYPE, IN, 2 ) = ZERO
                     GO TO 200
                  END IF
*
*                 If this value of (NB,LDA) has occurred before,
*                 just use that value.
*
                  LASTL = 0
                  DO 170 J = 1, IPAR - 1
                     IF( LDA.EQ.LDAS( J ) .AND. NB.EQ.NNB( J ) )
     $                  LASTL = J
  170             CONTINUE
*
                  IF( LASTL.EQ.0 ) THEN
*
*                    Time CGGHRD, computing Q but not Z
*                    (Actually, CGEQRF + CUNMQR + CUNGQR + CGGHRD.)
*
                     CALL XLAENV( 1, NB )
                     IC = 0
                     OPS = ZERO
                     S1 = SECOND( )
  180                CONTINUE
                     CALL CLACPY( 'Full', N, N, A, N1, H, LDA )
                     CALL CLACPY( 'Full', N, N, B, N1, T, LDA )
                     CALL CLAQZH( .TRUE., .FALSE., N, 1, N, H, LDA, T,
     $                            LDA, Q, LDA, Z, LDA, WORK, IINFO )
                     IF( IINFO.NE.0 ) THEN
                        WRITE( NOUT, FMT = 9997 )SUBNAM( 2 ), IINFO, N,
     $                     ITYPE, IPAR, IOLDSD
                        INFO = ABS( IINFO )
                        GO TO 930
                     END IF
*
                     S2 = SECOND( )
                     TIME = S2 - S1
                     IC = IC + 1
                     IF( TIME.LT.TIMMIN )
     $                  GO TO 180
*
*                    Subtract the time used in CLACPY.
*
                     S1 = SECOND( )
                     DO 190 J = 1, IC
                        CALL CLACPY( 'Full', N, N, A, N1, Z, LDA )
                        CALL CLACPY( 'Full', N, N, B, N1, Z, LDA )
  190                CONTINUE
                     S2 = SECOND( )
                     UNTIME = S2 - S1
*
                     TIMES( IPAR, ITYPE, IN, 2 ) = MAX( TIME-UNTIME,
     $                  ZERO ) / REAL( IC )
                     OPCNTS( IPAR, ITYPE, IN, 2 ) = OPS / REAL( IC ) +
     $                  SOPLA( 'CGEQRF', N, N, 0, 0, NB ) +
     $                  SOPLA( 'CUNMQR', N, N, 0, 0, NB ) +
     $                  SOPLA( 'CUNGQR', N, N, 0, 0, NB )
                     LDH = LDA
                  ELSE
                     OPCNTS( IPAR, ITYPE, IN, 2 ) = OPCNTS( LASTL,
     $                  ITYPE, IN, 2 )
                     TIMES( IPAR, ITYPE, IN, 2 ) = TIMES( LASTL, ITYPE,
     $                  IN, 2 )
                  END IF
  200          CONTINUE
            END IF
*
*           Time CGGHRD('N','I',...) for each pair (LDAS(j),NNB(j))
*
            IF( TIMSUB( 3 ) ) THEN
               DO 240 IPAR = 1, NPARMS
                  LDA = LDAS( IPAR )
                  NB = NNB( IPAR )
                  IF( LDA.LT.N1 ) THEN
                     TIMES( IPAR, ITYPE, IN, 3 ) = ZERO
                     OPCNTS( IPAR, ITYPE, IN, 3 ) = ZERO
                     GO TO 240
                  END IF
*
*                 If this value of (NB,LDA) has occurred before,
*                 just use that value.
*
                  LASTL = 0
                  DO 210 J = 1, IPAR - 1
                     IF( LDA.EQ.LDAS( J ) .AND. NB.EQ.NNB( J ) )
     $                  LASTL = J
  210             CONTINUE
*
                  IF( LASTL.EQ.0 ) THEN
*
*                    Time CGGHRD, computing Z but not Q
*                    (Actually, CGEQRF + CUNMQR + CGGHRD.)
*
                     CALL XLAENV( 1, NB )
                     IC = 0
                     OPS = ZERO
                     S1 = SECOND( )
  220                CONTINUE
                     CALL CLACPY( 'Full', N, N, A, N1, H, LDA )
                     CALL CLACPY( 'Full', N, N, B, N1, T, LDA )
                     CALL CLAQZH( .FALSE., .TRUE., N, 1, N, H, LDA, T,
     $                            LDA, Q, LDA, Z, LDA, WORK, IINFO )
                     IF( IINFO.NE.0 ) THEN
                        WRITE( NOUT, FMT = 9997 )SUBNAM( 3 ), IINFO, N,
     $                     ITYPE, IPAR, IOLDSD
                        INFO = ABS( IINFO )
                        GO TO 930
                     END IF
*
                     S2 = SECOND( )
                     TIME = S2 - S1
                     IC = IC + 1
                     IF( TIME.LT.TIMMIN )
     $                  GO TO 220
*
*                    Subtract the time used in CLACPY.
*
                     S1 = SECOND( )
                     DO 230 J = 1, IC
                        CALL CLACPY( 'Full', N, N, A, N1, Z, LDA )
                        CALL CLACPY( 'Full', N, N, B, N1, Z, LDA )
  230                CONTINUE
                     S2 = SECOND( )
                     UNTIME = S2 - S1
*
                     TIMES( IPAR, ITYPE, IN, 3 ) = MAX( TIME-UNTIME,
     $                  ZERO ) / REAL( IC )
                     OPCNTS( IPAR, ITYPE, IN, 3 ) = OPS / REAL( IC ) +
     $                  SOPLA( 'CGEQRF', N, N, 0, 0, NB ) +
     $                  SOPLA( 'CUNMQR', N, N, 0, 0, NB )
                     LDH = LDA
                  ELSE
                     OPCNTS( IPAR, ITYPE, IN, 3 ) = OPCNTS( LASTL,
     $                  ITYPE, IN, 3 )
                     TIMES( IPAR, ITYPE, IN, 3 ) = TIMES( LASTL, ITYPE,
     $                  IN, 3 )
                  END IF
  240          CONTINUE
            END IF
*
*           Time CGGHRD('I','I',...) for each pair (LDAS(j),NNB(j))
*
            IF( TIMSUB( 4 ) ) THEN
               DO 280 IPAR = 1, NPARMS
                  LDA = LDAS( IPAR )
                  NB = NNB( IPAR )
                  IF( LDA.LT.N1 ) THEN
                     TIMES( IPAR, ITYPE, IN, 4 ) = ZERO
                     OPCNTS( IPAR, ITYPE, IN, 4 ) = ZERO
                     GO TO 280
                  END IF
*
*                 If this value of (NB,LDA) has occurred before,
*                 just use that value.
*
                  LASTL = 0
                  DO 250 J = 1, IPAR - 1
                     IF( LDA.EQ.LDAS( J ) .AND. NB.EQ.NNB( J ) )
     $                  LASTL = J
  250             CONTINUE
*
                  IF( LASTL.EQ.0 ) THEN
*
*                    Time CGGHRD, computing Q and Z
*                    (Actually, CGEQRF + CUNMQR + CUNGQR + CGGHRD.)
*
                     CALL XLAENV( 1, NB )
                     IC = 0
                     OPS = ZERO
                     S1 = SECOND( )
  260                CONTINUE
                     CALL CLACPY( 'Full', N, N, A, N1, H, LDA )
                     CALL CLACPY( 'Full', N, N, B, N1, T, LDA )
                     CALL CLAQZH( .TRUE., .TRUE., N, 1, N, H, LDA, T,
     $                            LDA, Q, LDA, Z, LDA, WORK, IINFO )
                     IF( IINFO.NE.0 ) THEN
                        WRITE( NOUT, FMT = 9997 )SUBNAM( 4 ), IINFO, N,
     $                     ITYPE, IPAR, IOLDSD
                        INFO = ABS( IINFO )
                        GO TO 930
                     END IF
*
                     S2 = SECOND( )
                     TIME = S2 - S1
                     IC = IC + 1
                     IF( TIME.LT.TIMMIN )
     $                  GO TO 260
*
*                    Subtract the time used in CLACPY.
*
                     S1 = SECOND( )
                     DO 270 J = 1, IC
                        CALL CLACPY( 'Full', N, N, A, N1, Z, LDA )
                        CALL CLACPY( 'Full', N, N, B, N1, Z, LDA )
  270                CONTINUE
                     S2 = SECOND( )
                     UNTIME = S2 - S1
*
                     TIMES( IPAR, ITYPE, IN, 4 ) = MAX( TIME-UNTIME,
     $                  ZERO ) / REAL( IC )
                     OPCNTS( IPAR, ITYPE, IN, 4 ) = OPS / REAL( IC ) +
     $                  SOPLA( 'CGEQRF', N, N, 0, 0, NB ) +
     $                  SOPLA( 'CUNMQR', N, N, 0, 0, NB ) +
     $                  SOPLA( 'CUNGQR', N, N, 0, 0, NB )
                     LDH = LDA
                  ELSE
                     OPCNTS( IPAR, ITYPE, IN, 4 ) = OPCNTS( LASTL,
     $                  ITYPE, IN, 4 )
                     TIMES( IPAR, ITYPE, IN, 4 ) = TIMES( LASTL, ITYPE,
     $                  IN, 4 )
                  END IF
  280          CONTINUE
            END IF
*
* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
*
*           Time CHGEQZ
*
*           Time CHGEQZ with JOB='E' for each value of LDAS(j)
*
            IF( TIMSUB( 5 ) ) THEN
               DO 320 IPAR = 1, NPARMS
                  LDA = LDAS( IPAR )
                  IF( LDA.LT.N1 ) THEN
                     TIMES( IPAR, ITYPE, IN, 5 ) = ZERO
                     OPCNTS( IPAR, ITYPE, IN, 5 ) = ZERO
                     GO TO 320
                  END IF
*
*                 If this value of LDA has occurred before,
*                 just use that value.
*
                  LASTL = 0
                  DO 290 J = 1, IPAR - 1
                     IF( LDA.EQ.LDAS( J ) )
     $                  LASTL = J
  290             CONTINUE
*
                  IF( LASTL.EQ.0 ) THEN
*
*                    Time CHGEQZ with JOB='E'
*
                     IC = 0
                     OPS = ZERO
                     S1 = SECOND( )
  300                CONTINUE
                     CALL CLACPY( 'Full', N, N, H, LDH, A, LDA )
                     CALL CLACPY( 'Full', N, N, T, LDH, B, LDA )
                     CALL CHGEQZ( 'E', 'N', 'N', N, 1, N, A, LDA, B,
     $                            LDA, W, W( LDA+1 ), Q, LDA, Z, LDA,
     $                            WORK, LWORK, RWORK, IINFO )
                     IF( IINFO.NE.0 ) THEN
                        WRITE( NOUT, FMT = 9997 )SUBNAM( 5 ), IINFO, N,
     $                     ITYPE, IPAR, IOLDSD
                        INFO = ABS( IINFO )
                        GO TO 930
                     END IF
                     S2 = SECOND( )
                     TIME = S2 - S1
                     IC = IC + 1
                     IF( TIME.LT.TIMMIN )
     $                  GO TO 300
*
*                    Subtract the time used in CLACPY.
*
                     S1 = SECOND( )
                     DO 310 J = 1, IC
                        CALL CLACPY( 'Full', N, N, H, LDH, Z, LDA )
                        CALL CLACPY( 'Full', N, N, T, LDH, Z, LDA )
  310                CONTINUE
                     S2 = SECOND( )
                     UNTIME = S2 - S1
*
                     TIMES( IPAR, ITYPE, IN, 5 ) = MAX( TIME-UNTIME,
     $                  ZERO ) / REAL( IC )
                     OPCNTS( IPAR, ITYPE, IN, 5 ) = OPS / REAL( IC )
                     LDS = 0
                     LDQ = 0
                  ELSE
                     OPCNTS( IPAR, ITYPE, IN, 5 ) = OPCNTS( LASTL,
     $                  ITYPE, IN, 5 )
                     TIMES( IPAR, ITYPE, IN, 5 ) = TIMES( LASTL, ITYPE,
     $                  IN, 5 )
                  END IF
  320          CONTINUE
            END IF
*
*           Time CHGEQZ with JOB='S', COMPQ=COMPZ='N' for each value
*           of LDAS(j)
*
            IF( TIMSUB( 6 ) ) THEN
               DO 360 IPAR = 1, NPARMS
                  LDA = LDAS( IPAR )
                  IF( LDA.LT.N1 ) THEN
                     TIMES( IPAR, ITYPE, IN, 6 ) = ZERO
                     OPCNTS( IPAR, ITYPE, IN, 6 ) = ZERO
                     GO TO 360
                  END IF
*
*                 If this value of LDA has occurred before,
*                 just use that value.
*
                  LASTL = 0
                  DO 330 J = 1, IPAR - 1
                     IF( LDA.EQ.LDAS( J ) )
     $                  LASTL = J
  330             CONTINUE
*
                  IF( LASTL.EQ.0 ) THEN
*
*                 Time CHGEQZ with JOB='S', COMPQ=COMPZ='N'
*
                     IC = 0
                     OPS = ZERO
                     S1 = SECOND( )
  340                CONTINUE
                     CALL CLACPY( 'Full', N, N, H, LDH, A, LDA )
                     CALL CLACPY( 'Full', N, N, T, LDH, B, LDA )
                     CALL CHGEQZ( 'S', 'N', 'N', N, 1, N, A, LDA, B,
     $                            LDA, W, W( LDA+1 ), Q, LDA, Z, LDA,
     $                            WORK, LWORK, RWORK, IINFO )
                     IF( IINFO.NE.0 ) THEN
                        WRITE( NOUT, FMT = 9997 )SUBNAM( 6 ), IINFO, N,
     $                     ITYPE, IPAR, IOLDSD
                        INFO = ABS( IINFO )
                        GO TO 930
                     END IF
                     S2 = SECOND( )
                     TIME = S2 - S1
                     IC = IC + 1
                     IF( TIME.LT.TIMMIN )
     $                  GO TO 340
*
*                 Subtract the time used in CLACPY.
*
                     S1 = SECOND( )
                     DO 350 J = 1, IC
                        CALL CLACPY( 'Full', N, N, H, LDH, Z, LDA )
                        CALL CLACPY( 'Full', N, N, T, LDH, Z, LDA )
  350                CONTINUE
                     S2 = SECOND( )
                     UNTIME = S2 - S1
*
                     TIMES( IPAR, ITYPE, IN, 6 ) = MAX( TIME-UNTIME,
     $                  ZERO ) / REAL( IC )
                     OPCNTS( IPAR, ITYPE, IN, 6 ) = OPS / REAL( IC )
                     LDS = LDA
                     LDQ = 0
                  ELSE
                     OPCNTS( IPAR, ITYPE, IN, 6 ) = OPCNTS( LASTL,
     $                  ITYPE, IN, 6 )
                     TIMES( IPAR, ITYPE, IN, 6 ) = TIMES( LASTL, ITYPE,
     $                  IN, 6 )
                  END IF
  360          CONTINUE
            ELSE IF( RUNES ) THEN
               CALL CLACPY( 'Full', N, N, H, LDH, A, N1 )
               CALL CLACPY( 'Full', N, N, T, LDH, B, N1 )
               CALL CHGEQZ( 'S', 'N', 'N', N, 1, N, A, N1, B, N1, W,
     $                      W( N1+1 ), Q, N1, Z, N1, WORK,
     $                      LWORK, RWORK, IINFO )
               IF( IINFO.NE.0 ) THEN
                  WRITE( NOUT, FMT = 9997 )SUBNAM( 6 ), IINFO, N,
     $               ITYPE, 0, IOLDSD
                  INFO = ABS( IINFO )
                  GO TO 930
               END IF
               LDS = N1
               LDQ = 0
            END IF
*
*           Time CHGEQZ with JOB='S', COMPQ='I', COMPZ='N' for each
*           value of LDAS(j)
*
            IF( TIMSUB( 7 ) ) THEN
               DO 400 IPAR = 1, NPARMS
                  LDA = LDAS( IPAR )
                  IF( LDA.LT.N1 ) THEN
                     TIMES( IPAR, ITYPE, IN, 7 ) = ZERO
                     OPCNTS( IPAR, ITYPE, IN, 7 ) = ZERO
                     GO TO 400
                  END IF
*
*                 If this value of LDA has occurred before,
*                 just use that value.
*
                  LASTL = 0
                  DO 370 J = 1, IPAR - 1
                     IF( LDA.EQ.LDAS( J ) )
     $                  LASTL = J
  370             CONTINUE
*
                  IF( LASTL.EQ.0 ) THEN
*
*                 Time CHGEQZ with JOB='S', COMPQ='I', COMPZ='N'
*
                     IC = 0
                     OPS = ZERO
                     S1 = SECOND( )
  380                CONTINUE
                     CALL CLACPY( 'Full', N, N, H, LDH, A, LDA )
                     CALL CLACPY( 'Full', N, N, T, LDH, B, LDA )
                     CALL CHGEQZ( 'S', 'I', 'N', N, 1, N, A, LDA, B,
     $                            LDA, W, W( LDA+1 ), Q, LDA, Z, LDA,
     $                            WORK, LWORK, RWORK, IINFO )
                     IF( IINFO.NE.0 ) THEN
                        WRITE( NOUT, FMT = 9997 )SUBNAM( 7 ), IINFO, N,
     $                     ITYPE, IPAR, IOLDSD
                        INFO = ABS( IINFO )
                        GO TO 930
                     END IF
                     S2 = SECOND( )
                     TIME = S2 - S1
                     IC = IC + 1
                     IF( TIME.LT.TIMMIN )
     $                  GO TO 380
*
*                 Subtract the time used in CLACPY.
*
                     S1 = SECOND( )
                     DO 390 J = 1, IC
                        CALL CLACPY( 'Full', N, N, H, LDH, Z, LDA )
                        CALL CLACPY( 'Full', N, N, T, LDH, Z, LDA )
  390                CONTINUE
                     S2 = SECOND( )
                     UNTIME = S2 - S1
*
                     TIMES( IPAR, ITYPE, IN, 7 ) = MAX( TIME-UNTIME,
     $                  ZERO ) / REAL( IC )
                     OPCNTS( IPAR, ITYPE, IN, 7 ) = OPS / REAL( IC )
                     LDS = LDA
                     LDQ = LDA
                  ELSE
                     OPCNTS( IPAR, ITYPE, IN, 7 ) = OPCNTS( LASTL,
     $                  ITYPE, IN, 7 )
                     TIMES( IPAR, ITYPE, IN, 7 ) = TIMES( LASTL, ITYPE,
     $                  IN, 7 )
                  END IF
  400          CONTINUE
            ELSE IF( RUNEQ ) THEN
               CALL CLACPY( 'Full', N, N, H, LDH, A, N1 )
               CALL CLACPY( 'Full', N, N, T, LDH, B, N1 )
               CALL CHGEQZ( 'S', 'I', 'N', N, 1, N, A, N1, B, N1, W,
     $                      W( N1+1 ), Q, N1, Z, N1, WORK,
     $                      LWORK, RWORK, IINFO )
               IF( IINFO.NE.0 ) THEN
                  WRITE( NOUT, FMT = 9997 )SUBNAM( 7 ), IINFO, N,
     $               ITYPE, 0, IOLDSD
                  INFO = ABS( IINFO )
                  GO TO 930
               END IF
               LDS = N1
               LDQ = N1
            END IF
*
*           Time CHGEQZ with JOB='S', COMPQ='N', COMPZ='I' for each
*           value of LDAS(j)
*
            IF( TIMSUB( 8 ) ) THEN
               DO 440 IPAR = 1, NPARMS
                  LDA = LDAS( IPAR )
                  IF( LDA.LT.N1 ) THEN
                     TIMES( IPAR, ITYPE, IN, 8 ) = ZERO
                     OPCNTS( IPAR, ITYPE, IN, 8 ) = ZERO
                     GO TO 440
                  END IF
*
*                 If this value of LDA has occurred before,
*                 just use that value.
*
                  LASTL = 0
                  DO 410 J = 1, IPAR - 1
                     IF( LDA.EQ.LDAS( J ) )
     $                  LASTL = J
  410             CONTINUE
*
                  IF( LASTL.EQ.0 ) THEN
*
                     NB = MIN( N, NNB( IPAR ) )
                     NSHIFT = NSHFTS( IPAR )
                     NEISP = NEISPS( IPAR )
                     MINNB = MINNBS( IPAR )
                     MINBLK = MINBKS( IPAR )
                     CALL XLAENV( 1, NB )
                     CALL XLAENV( 2, MINNB )
                     CALL XLAENV( 8, NEISP )
                     CALL XLAENV( 4, NSHIFT )
                     CALL XLAENV( 5, MINBLK )
*
*                 Time CHGEQZ with JOB='S', COMPQ='N', COMPZ='I'
*                 (Note that the "Z" matrix is stored in the array Q)
*
                     IC = 0
                     OPS = ZERO
                     S1 = SECOND( )
  420                CONTINUE
                     CALL CLACPY( 'Full', N, N, H, LDH, A, LDA )
                     CALL CLACPY( 'Full', N, N, T, LDH, B, LDA )
                     CALL CHGEQZ( 'S', 'N', 'I', N, 1, N, A, LDA, B,
     $                            LDA, W, W( LDA+1 ), Z, LDA, Q, LDA,
     $                            WORK, LWORK, RWORK, IINFO )
                     IF( IINFO.NE.0 ) THEN
                        WRITE( NOUT, FMT = 9997 )SUBNAM( 8 ), IINFO, N,
     $                     ITYPE, IPAR, IOLDSD
                        INFO = ABS( IINFO )
                        GO TO 930
                     END IF
                     S2 = SECOND( )
                     TIME = S2 - S1
                     IC = IC + 1
                     IF( TIME.LT.TIMMIN )
     $                  GO TO 420
*
*                 Subtract the time used in CLACPY.
*
                     S1 = SECOND( )
                     DO 430 J = 1, IC
                        CALL CLACPY( 'Full', N, N, H, LDH, Z, LDA )
                        CALL CLACPY( 'Full', N, N, T, LDH, Z, LDA )
  430                CONTINUE
                     S2 = SECOND( )
                     UNTIME = S2 - S1
*
                     TIMES( IPAR, ITYPE, IN, 8 ) = MAX( TIME-UNTIME,
     $                  ZERO ) / REAL( IC )
                     OPCNTS( IPAR, ITYPE, IN, 8 ) = OPS / REAL( IC )
                     LDS = LDA
                     LDQ = LDA
                  ELSE
                     OPCNTS( IPAR, ITYPE, IN, 8 ) = OPCNTS( LASTL,
     $                  ITYPE, IN, 8 )
                     TIMES( IPAR, ITYPE, IN, 8 ) = TIMES( LASTL, ITYPE,
     $                  IN, 8 )
                  END IF
  440          CONTINUE
            END IF
*
*           Time CHGEQZ with JOB='S', COMPQ='I', COMPZ='I' for each
*           value of LDAS(j)
*
            IF( TIMSUB( 9 ) ) THEN
               DO 480 IPAR = 1, NPARMS
                  LDA = LDAS( IPAR )
                  IF( LDA.LT.N1 ) THEN
                     TIMES( IPAR, ITYPE, IN, 9 ) = ZERO
                     OPCNTS( IPAR, ITYPE, IN, 9 ) = ZERO
                     GO TO 480
                  END IF
*
*                 If this value of LDA has occurred before,
*                 just use that value.
*
                  LASTL = 0
                  DO 450 J = 1, IPAR - 1
                     IF( LDA.EQ.LDAS( J ) )
     $                  LASTL = J
  450             CONTINUE
*
                  IF( LASTL.EQ.0 ) THEN
*
*                 Time CHGEQZ with JOB='S', COMPQ='I', COMPZ='I'
*
                     IC = 0
                     OPS = ZERO
                     S1 = SECOND( )
  460                CONTINUE
                     CALL CLACPY( 'Full', N, N, H, LDH, A, LDA )
                     CALL CLACPY( 'Full', N, N, T, LDH, B, LDA )
                     CALL CHGEQZ( 'S', 'I', 'I', N, 1, N, A, LDA, B,
     $                            LDA, W, W( LDA+1 ), Q, LDA, Z, LDA,
     $                            WORK, LWORK, RWORK, IINFO )
                     IF( IINFO.NE.0 ) THEN
                        WRITE( NOUT, FMT = 9997 )SUBNAM( 9 ), IINFO, N,
     $                     ITYPE, IPAR, IOLDSD
                        INFO = ABS( IINFO )
                        GO TO 930
                     END IF
                     S2 = SECOND( )
                     TIME = S2 - S1
                     IC = IC + 1
                     IF( TIME.LT.TIMMIN )
     $                  GO TO 460
*
*                 Subtract the time used in CLACPY.
*
                     S1 = SECOND( )
                     DO 470 J = 1, IC
                        CALL CLACPY( 'Full', N, N, H, LDH, Z, LDA )
                        CALL CLACPY( 'Full', N, N, T, LDH, Z, LDA )
  470                CONTINUE
                     S2 = SECOND( )
                     UNTIME = S2 - S1
*
                     TIMES( IPAR, ITYPE, IN, 9 ) = MAX( TIME-UNTIME,
     $                  ZERO ) / REAL( IC )
                     OPCNTS( IPAR, ITYPE, IN, 9 ) = OPS / REAL( IC )
                     LDS = LDA
                     LDQ = LDA
                  ELSE
                     OPCNTS( IPAR, ITYPE, IN, 9 ) = OPCNTS( LASTL,
     $                  ITYPE, IN, 9 )
                     TIMES( IPAR, ITYPE, IN, 9 ) = TIMES( LASTL, ITYPE,
     $                  IN, 9 )
                  END IF
  480          CONTINUE
            END IF
*
* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
*
*           Time CTGEVC
*
            IF( TIMSUB( 10 ) .OR. TIMSUB( 11 ) .OR. TIMSUB( 12 ) .OR.
     $          TIMSUB( 13 ) ) THEN
               DO 610 IPAR = 1, NPARMS
                  LDA = LDAS( IPAR )
                  IF( LDA.LT.N1 ) THEN
                     DO 490 J = 10, 13
                        IF( TIMSUB( J ) ) THEN
                           TIMES( IPAR, ITYPE, IN, J ) = ZERO
                           OPCNTS( IPAR, ITYPE, IN, J ) = ZERO
                        END IF
  490                CONTINUE
                     GO TO 610
                  END IF
*
*                 If this value of LDA has come up before, just use
*                 the value previously computed.
*
                  LASTL = 0
                  DO 500 J = 1, IPAR - 1
                     IF( LDA.EQ.LDAS( J ) )
     $                  LASTL = J
  500             CONTINUE
*
*                 Time CTGEVC if this is a new value of LDA
*
                  IF( LASTL.EQ.0 ) THEN
*
*                    Copy S (which is in A) and P (which is in B)
*                    if necessary to get right LDA.
*
                     IF( LDA.GT.LDS ) THEN
                        DO 520 JC = N, 1, -1
                           DO 510 JR = N, 1, -1
                              A( JR+( JC-1 )*LDA ) = A( JR+( JC-1 )*
     $                           LDS )
                              B( JR+( JC-1 )*LDA ) = B( JR+( JC-1 )*
     $                           LDS )
  510                      CONTINUE
  520                   CONTINUE
                     ELSE IF( LDA.LT.LDS ) THEN
                        DO 540 JC = 1, N
                           DO 530 JR = 1, N
                              A( JR+( JC-1 )*LDA ) = A( JR+( JC-1 )*
     $                           LDS )
                              B( JR+( JC-1 )*LDA ) = B( JR+( JC-1 )*
     $                           LDS )
  530                      CONTINUE
  540                   CONTINUE
                     END IF
                     LDS = LDA
*
*                    Time CTGEVC for Left Eigenvectors only,
*                    without back transforming
*
                     IF( TIMSUB( 10 ) ) THEN
                        IC = 0
                        OPS = ZERO
                        S1 = SECOND( )
  550                   CONTINUE
                        CALL CTGEVC( 'L', 'A', LLWORK, N, A, LDA, B,
     $                               LDA, H, LDA, T, LDA, N, ITEMP,
     $                               WORK, RWORK, IINFO )
                        IF( IINFO.NE.0 ) THEN
                           WRITE( NOUT, FMT = 9997 )SUBNAM( 10 ),
     $                        IINFO, N, ITYPE, IPAR, IOLDSD
                           INFO = ABS( IINFO )
                           GO TO 930
                        END IF
                        S2 = SECOND( )
                        TIME = S2 - S1
                        IC = IC + 1
                        IF( TIME.LT.TIMMIN )
     $                     GO TO 550
*
                        TIMES( IPAR, ITYPE, IN, 10 ) = TIME / REAL( IC )
                        OPCNTS( IPAR, ITYPE, IN, 10 ) = OPS / REAL( IC )
                     END IF
*
*                    Time CTGEVC for Left Eigenvectors only,
*                    with back transforming
*
                     IF( TIMSUB( 11 ) ) THEN
                        IC = 0
                        OPS = ZERO
                        S1 = SECOND( )
  560                   CONTINUE
                        CALL CLACPY( 'Full', N, N, Q, LDQ, H, LDA )
                        CALL CTGEVC( 'L', 'B', LLWORK, N, A, LDA, B,
     $                               LDA, H, LDA, T, LDA, N, ITEMP,
     $                               WORK, RWORK, IINFO )
                        IF( IINFO.NE.0 ) THEN
                           WRITE( NOUT, FMT = 9997 )SUBNAM( 11 ),
     $                        IINFO, N, ITYPE, IPAR, IOLDSD
                           INFO = ABS( IINFO )
                           GO TO 930
                        END IF
                        S2 = SECOND( )
                        TIME = S2 - S1
                        IC = IC + 1
                        IF( TIME.LT.TIMMIN )
     $                     GO TO 560
*
*                       Subtract the time used in CLACPY.
*
                        S1 = SECOND( )
                        DO 570 J = 1, IC
                           CALL CLACPY( 'Full', N, N, Q, LDQ, H, LDA )
  570                   CONTINUE
                        S2 = SECOND( )
                        UNTIME = S2 - S1
*
                        TIMES( IPAR, ITYPE, IN, 11 ) = MAX( TIME-UNTIME,
     $                     ZERO ) / REAL( IC )
                        OPCNTS( IPAR, ITYPE, IN, 11 ) = OPS / REAL( IC )
                     END IF
*
*                    Time CTGEVC for Right Eigenvectors only,
*                    without back transforming
*
                     IF( TIMSUB( 12 ) ) THEN
                        IC = 0
                        OPS = ZERO
                        S1 = SECOND( )
  580                   CONTINUE
                        CALL CTGEVC( 'R', 'A', LLWORK, N, A, LDA, B,
     $                               LDA, H, LDA, T, LDA, N, ITEMP,
     $                               WORK, RWORK, IINFO )
                        IF( IINFO.NE.0 ) THEN
                           WRITE( NOUT, FMT = 9997 )SUBNAM( 12 ),
     $                        IINFO, N, ITYPE, IPAR, IOLDSD
                           INFO = ABS( IINFO )
                           GO TO 930
                        END IF
                        S2 = SECOND( )
                        TIME = S2 - S1
                        IC = IC + 1
                        IF( TIME.LT.TIMMIN )
     $                     GO TO 580
*
                        TIMES( IPAR, ITYPE, IN, 12 ) = TIME / REAL( IC )
                        OPCNTS( IPAR, ITYPE, IN, 12 ) = OPS / REAL( IC )
                     END IF
*
*                    Time CTGEVC for Right Eigenvectors only,
*                    with back transforming
*
                     IF( TIMSUB( 13 ) ) THEN
                        IC = 0
                        OPS = ZERO
                        S1 = SECOND( )
  590                   CONTINUE
                        CALL CLACPY( 'Full', N, N, Q, LDQ, T, LDA )
                        CALL CTGEVC( 'R', 'B', LLWORK, N, A, LDA, B,
     $                               LDA, H, LDA, T, LDA, N, ITEMP,
     $                               WORK, RWORK, IINFO )
                        IF( IINFO.NE.0 ) THEN
                           WRITE( NOUT, FMT = 9997 )SUBNAM( 13 ),
     $                        IINFO, N, ITYPE, IPAR, IOLDSD
                           INFO = ABS( IINFO )
                           GO TO 930
                        END IF
                        S2 = SECOND( )
                        TIME = S2 - S1
                        IC = IC + 1
                        IF( TIME.LT.TIMMIN )
     $                     GO TO 590
*
*                       Subtract the time used in CLACPY.
*
                        S1 = SECOND( )
                        DO 600 J = 1, IC
                           CALL CLACPY( 'Full', N, N, Q, LDQ, T, LDA )
  600                   CONTINUE
                        S2 = SECOND( )
                        UNTIME = S2 - S1
*
                        TIMES( IPAR, ITYPE, IN, 13 ) = MAX( TIME-UNTIME,
     $                     ZERO ) / REAL( IC )
                        OPCNTS( IPAR, ITYPE, IN, 13 ) = OPS / REAL( IC )
                     END IF
*
                  ELSE
*
*                    If this LDA has previously appeared, use the
*                    previously computed value(s).
*
                     IF( TIMSUB( 10 ) ) THEN
                        OPCNTS( IPAR, ITYPE, IN, 10 ) = OPCNTS( LASTL,
     $                     ITYPE, IN, 10 )
                        TIMES( IPAR, ITYPE, IN, 10 ) = TIMES( LASTL,
     $                     ITYPE, IN, 10 )
                     END IF
                     IF( TIMSUB( 11 ) ) THEN
                        OPCNTS( IPAR, ITYPE, IN, 11 ) = OPCNTS( LASTL,
     $                     ITYPE, IN, 11 )
                        TIMES( IPAR, ITYPE, IN, 11 ) = TIMES( LASTL,
     $                     ITYPE, IN, 11 )
                     END IF
                     IF( TIMSUB( 12 ) ) THEN
                        OPCNTS( IPAR, ITYPE, IN, 12 ) = OPCNTS( LASTL,
     $                     ITYPE, IN, 12 )
                        TIMES( IPAR, ITYPE, IN, 12 ) = TIMES( LASTL,
     $                     ITYPE, IN, 12 )
                     END IF
                     IF( TIMSUB( 13 ) ) THEN
                        OPCNTS( IPAR, ITYPE, IN, 13 ) = OPCNTS( LASTL,
     $                     ITYPE, IN, 13 )
                        TIMES( IPAR, ITYPE, IN, 13 ) = TIMES( LASTL,
     $                     ITYPE, IN, 13 )
                     END IF
                  END IF
  610          CONTINUE
            END IF
*
*           Time the EISPACK Routines
*
*           Restore random number seed
*
            DO 620 J = 1, 4
               ISEED( J ) = IOLDSD( J )
  620       CONTINUE
*
*           Re-generate A
*
            IF( ITYPE.LE.MAXTYP ) THEN
*
*              Generate A (w/o rotation)
*
               CALL CLATM4( KATYPE( ITYPE ), N, 3, 1, .TRUE., ONE, ULP,
     $                      ONE, 2, ISEED, H, N1 )
               IF( N.GE.3 )
     $            H( 3+2*N1 ) = ONE
*
*              Generate B (w/o rotation)
*
               CALL CLATM4( 8, N, 3, 1, .FALSE., ONE, ONE, ONE, 2,
     $                      ISEED, T, N1 )
               IF( N.GE.2 )
     $            T( 2+N1 ) = ONE
*
               IF( N.GT.0 ) THEN
*
*                 Include rotations
*
*                 Generate U, V as Householder transformations times a
*                 diagonal matrix.  (Note that CLARFG makes Q(jc+ic)
*                 and Z(jc+ic) real.)
*
                  DO 640 JC = 1, N - 1
                     IC = ( JC-1 )*N1
                     DO 630 JR = JC, N
                        Q( JR+IC ) = CLARND( 3, ISEED )
                        Z( JR+IC ) = CLARND( 3, ISEED )
  630                CONTINUE
                     CALL CLARFG( N+1-JC, Q( JC+IC ), Q( JC+1+IC ), 1,
     $                            WORK( JC ) )
                     WORK( 2*N+JC ) = SIGN( ONE, REAL( Q( JC+IC ) ) )
                     Q( JC+IC ) = ONE
                     CALL CLARFG( N+1-JC, Z( JC+IC ), Z( JC+1+IC ), 1,
     $                            WORK( N+JC ) )
                     WORK( 3*N+JC ) = SIGN( ONE, REAL( Z( JC+IC ) ) )
                     Z( JC+IC ) = ONE
  640             CONTINUE
                  IC = ( N-1 )*N1
                  CTEMP = CLARND( 3, ISEED )
                  Q( N+IC ) = CONE
                  WORK( N ) = CZERO
                  WORK( 3*N ) = CTEMP / ABS( CTEMP )
                  CTEMP = CLARND( 3, ISEED )
                  Z( N+IC ) = CONE
                  WORK( 2*N ) = CZERO
                  WORK( 4*N ) = CTEMP / ABS( CTEMP )
*
*                 Apply the diagonal matrices
*
                  DO 660 JC = 1, N
                     DO 650 JR = 1, N
                        H( JR+IC ) = WORK( 2*N+JR )*
     $                               CONJG( WORK( 3*N+JC ) )*H( JR+IC )
                        T( JR+IC ) = WORK( 2*N+JR )*WORK( 3*N+JC )*
     $                               CONJG( WORK( 3*N+JC ) )*T( JR+IC )
  650                CONTINUE
  660             CONTINUE
                  CALL CUNM2R( 'L', 'N', N, N, N-1, Q, N1, WORK, H, N1,
     $                         WORK( 2*N+1 ), IINFO )
                  IF( IINFO.NE.0 )
     $               GO TO 670
                  CALL CUNM2R( 'R', 'C', N, N, N-1, Z, N1, WORK( N+1 ),
     $                         H, N1, WORK( 2*N+1 ), IINFO )
                  IF( IINFO.NE.0 )
     $               GO TO 670
                  CALL CUNM2R( 'L', 'N', N, N, N-1, Q, N1, WORK, T, N1,
     $                         WORK( 2*N+1 ), IINFO )
                  IF( IINFO.NE.0 )
     $               GO TO 670
                  CALL CUNM2R( 'R', 'C', N, N, N-1, Z, N1, WORK( N+1 ),
     $                         T, N1, WORK( 2*N+1 ), IINFO )
                  IF( IINFO.NE.0 )
     $               GO TO 670
               END IF
  670          CONTINUE
*
*              Copy real and imaginary parts into separate arrays
*
               DO 680 J = 1, N*N
                  AR( J ) = REAL( H( J ) )
                  AI( J ) = AIMAG( H( J ) )
                  BR( J ) = REAL( T( J ) )
                  BI( J ) = AIMAG( T( J ) )
  680          CONTINUE
            END IF
*
*           Time CQZHES w/ MATZ=.FALSE. for each LDAS(j)
*
            IF( TIMSUB( 14 ) ) THEN
               DO 720 IPAR = 1, NPARMS
                  LDA = LDAS( IPAR )
                  IF( LDA.LT.N1 ) THEN
                     TIMES( IPAR, ITYPE, IN, 14 ) = ZERO
                     OPCNTS( IPAR, ITYPE, IN, 14 ) = ZERO
                     GO TO 720
                  END IF
*
*                 If this value of LDA has come up before, just use
*                 the value previously computed.
*
                  LASTL = 0
                  DO 690 J = 1, IPAR - 1
                     IF( LDA.EQ.LDAS( J ) )
     $                  LASTL = J
  690             CONTINUE
*
                  IF( LASTL.EQ.0 ) THEN
*
*                    Time CQZHES( ...,.FALSE.,..)
*
                     IC = 0
                     OPS = ZERO
                     S1 = SECOND( )
  700                CONTINUE
                     CALL SLACPY( 'Full', N, N, AR, N1, HR, LDA )
                     CALL SLACPY( 'Full', N, N, AI, N1, HI, LDA )
                     CALL SLACPY( 'Full', N, N, BR, N1, TR, LDA )
                     CALL SLACPY( 'Full', N, N, BI, N1, TI, LDA )
                     CALL CQZHES( LDA, N, HR, HI, TR, TI, .FALSE., QR,
     $                            QI )
                     S2 = SECOND( )
                     TIME = S2 - S1
                     IC = IC + 1
                     IF( TIME.LT.TIMMIN )
     $                  GO TO 700
*
*                    Subtract the time used in CLACPY.
*
                     S1 = SECOND( )
                     DO 710 J = 1, IC
                        CALL SLACPY( 'Full', N, N, AR, N1, ZR, LDA )
                        CALL SLACPY( 'Full', N, N, AI, N1, ZI, LDA )
                        CALL SLACPY( 'Full', N, N, BR, N1, ZR, LDA )
                        CALL SLACPY( 'Full', N, N, BI, N1, ZI, LDA )
  710                CONTINUE
                     S2 = SECOND( )
                     UNTIME = S2 - S1
*
                     TIMES( IPAR, ITYPE, IN, 14 ) = MAX( TIME-UNTIME,
     $                  ZERO ) / REAL( IC )
                     OPCNTS( IPAR, ITYPE, IN, 14 ) = OPS / REAL( IC )
                  ELSE
                     OPCNTS( IPAR, ITYPE, IN, 14 ) = OPCNTS( LASTL,
     $                  ITYPE, IN, 14 )
                     TIMES( IPAR, ITYPE, IN, 14 ) = TIMES( LASTL, ITYPE,
     $                  IN, 14 )
                  END IF
                  LDH = LDA
  720          CONTINUE
            ELSE IF( RUNHES ) THEN
               CALL SLACPY( 'Full', N, N, AR, N1, HR, N1 )
               CALL SLACPY( 'Full', N, N, AI, N1, HI, N1 )
               CALL SLACPY( 'Full', N, N, BR, N1, TR, N1 )
               CALL SLACPY( 'Full', N, N, BI, N1, TI, N1 )
               CALL CQZHES( N1, N, HR, HI, TR, TI, .FALSE., QR, QI )
               LDH = N1
            END IF
*
*           Time CQZHES w/ MATZ=.TRUE. for each LDAS(j)
*
            IF( TIMSUB( 15 ) ) THEN
               DO 760 IPAR = 1, NPARMS
                  LDA = LDAS( IPAR )
                  IF( LDA.LT.N1 ) THEN
                     TIMES( IPAR, ITYPE, IN, 15 ) = ZERO
                     OPCNTS( IPAR, ITYPE, IN, 15 ) = ZERO
                     GO TO 760
                  END IF
*
*                 If this value of LDA has come up before, just use
*                 the value previously computed.
*
                  LASTL = 0
                  DO 730 J = 1, IPAR - 1
                     IF( LDA.EQ.LDAS( J ) )
     $                  LASTL = J
  730             CONTINUE
*
                  IF( LASTL.EQ.0 ) THEN
*
*                    Time CQZHES( ...,.TRUE.,..)
*
                     IC = 0
                     OPS = ZERO
                     S1 = SECOND( )
  740                CONTINUE
                     CALL SLACPY( 'Full', N, N, AR, N1, HR, LDA )
                     CALL SLACPY( 'Full', N, N, AI, N1, HI, LDA )
                     CALL SLACPY( 'Full', N, N, BR, N1, TR, LDA )
                     CALL SLACPY( 'Full', N, N, BI, N1, TI, LDA )
                     CALL CQZHES( LDA, N, HR, HI, TR, TI, .TRUE., QR,
     $                            QI )
                     S2 = SECOND( )
                     TIME = S2 - S1
                     IC = IC + 1
                     IF( TIME.LT.TIMMIN )
     $                  GO TO 740
*
*                    Subtract the time used in CLACPY.
*
                     S1 = SECOND( )
                     DO 750 J = 1, IC
                        CALL SLACPY( 'Full', N, N, AR, N1, ZR, LDA )
                        CALL SLACPY( 'Full', N, N, AI, N1, ZI, LDA )
                        CALL SLACPY( 'Full', N, N, BR, N1, ZR, LDA )
                        CALL SLACPY( 'Full', N, N, BI, N1, ZI, LDA )
  750                CONTINUE
                     S2 = SECOND( )
                     UNTIME = S2 - S1
*
                     TIMES( IPAR, ITYPE, IN, 15 ) = MAX( TIME-UNTIME,
     $                  ZERO ) / REAL( IC )
                     OPCNTS( IPAR, ITYPE, IN, 15 ) = OPS / REAL( IC )
                  ELSE
                     OPCNTS( IPAR, ITYPE, IN, 15 ) = OPCNTS( LASTL,
     $                  ITYPE, IN, 15 )
                     TIMES( IPAR, ITYPE, IN, 15 ) = TIMES( LASTL, ITYPE,
     $                  IN, 15 )
                  END IF
                  LDH = LDA
  760          CONTINUE
            END IF
*
*           Time CQZVAL w/ MATZ=.FALSE. for each LDAS(j)
*
            IF( TIMSUB( 16 ) ) THEN
               DO 800 IPAR = 1, NPARMS
                  LDA = LDAS( IPAR )
                  IF( LDA.LT.N1 ) THEN
                     TIMES( IPAR, ITYPE, IN, 16 ) = ZERO
                     OPCNTS( IPAR, ITYPE, IN, 16 ) = ZERO
                     GO TO 800
                  END IF
*
*                 If this value of LDA has come up before, just use
*                 the value previously computed.
*
                  LASTL = 0
                  DO 770 J = 1, IPAR - 1
                     IF( LDA.EQ.LDAS( J ) )
     $                  LASTL = J
  770             CONTINUE
*
                  IF( LASTL.EQ.0 ) THEN
*
*                    Time CQZVAL with MATZ=.FALSE.
*
                     IC = 0
                     OPS = ZERO
                     S1 = SECOND( )
  780                CONTINUE
                     CALL SLACPY( 'Full', N, N, HR, LDH, AR, LDA )
                     CALL SLACPY( 'Full', N, N, HI, LDH, AI, LDA )
                     CALL SLACPY( 'Full', N, N, TR, LDH, BR, LDA )
                     CALL SLACPY( 'Full', N, N, TI, LDH, BI, LDA )
                     CALL CQZVAL( LDA, N, AR, AI, BR, BI, ZERO, WR,
     $                            WR( LDA+1 ), WR( 2*LDA+1 ), .FALSE.,
     $                            QR, QI, IINFO )
                     IF( IINFO.NE.0 ) THEN
                        WRITE( NOUT, FMT = 9997 )SUBNAM( 16 ), IINFO,
     $                     N, ITYPE, IPAR, IOLDSD
                        INFO = ABS( IINFO )
                        GO TO 930
                     END IF
*
                     S2 = SECOND( )
                     TIME = S2 - S1
                     IC = IC + 1
                     IF( TIME.LT.TIMMIN )
     $                  GO TO 780
*
*                    Subtract the time used in CLACPY.
*
                     S1 = SECOND( )
                     DO 790 J = 1, IC
                        CALL SLACPY( 'Full', N, N, HR, LDH, ZR, LDA )
                        CALL SLACPY( 'Full', N, N, HI, LDH, ZI, LDA )
                        CALL SLACPY( 'Full', N, N, TR, LDH, ZR, LDA )
                        CALL SLACPY( 'Full', N, N, TI, LDH, ZI, LDA )
  790                CONTINUE
                     S2 = SECOND( )
                     UNTIME = S2 - S1
*
                     TIMES( IPAR, ITYPE, IN, 16 ) = MAX( TIME-UNTIME,
     $                  ZERO ) / REAL( IC )
                     OPCNTS( IPAR, ITYPE, IN, 16 ) = OPS / REAL( IC )
                  ELSE
                     OPCNTS( IPAR, ITYPE, IN, 16 ) = OPCNTS( LASTL,
     $                  ITYPE, IN, 16 )
                     TIMES( IPAR, ITYPE, IN, 16 ) = TIMES( LASTL, ITYPE,
     $                  IN, 16 )
                  END IF
                  LDS = 0
                  LDW = LDA
  800          CONTINUE
            END IF
*
*           Time CQZVAL w/ MATZ=.TRUE. for each LDAS(j)
*
            IF( TIMSUB( 17 ) ) THEN
               DO 840 IPAR = 1, NPARMS
                  LDA = LDAS( IPAR )
                  IF( LDA.LT.N1 ) THEN
                     TIMES( IPAR, ITYPE, IN, 17 ) = ZERO
                     OPCNTS( IPAR, ITYPE, IN, 17 ) = ZERO
                     GO TO 840
                  END IF
*
*                 If this value of LDA has come up before, just use
*                 the value previously computed.
*
                  LASTL = 0
                  DO 810 J = 1, IPAR - 1
                     IF( LDA.EQ.LDAS( J ) )
     $                  LASTL = J
  810             CONTINUE
*
                  IF( LASTL.EQ.0 ) THEN
*
*                    Time CQZVAL with MATZ=.TRUE.
*
                     IC = 0
                     OPS = ZERO
                     S1 = SECOND( )
  820                CONTINUE
                     CALL SLACPY( 'Full', N, N, HR, LDH, AR, LDA )
                     CALL SLACPY( 'Full', N, N, HI, LDH, AI, LDA )
                     CALL SLACPY( 'Full', N, N, TR, LDH, BR, LDA )
                     CALL SLACPY( 'Full', N, N, TI, LDH, BI, LDA )
                     CALL SLASET( 'Full', N, N, ZERO, ONE, QR, LDA )
                     CALL SLASET( 'Full', N, N, ZERO, ONE, QI, LDA )
                     CALL CQZVAL( LDA, N, AR, AI, BR, BI, ZERO, WR,
     $                            WR( LDA+1 ), WR( 2*LDA+1 ), .TRUE.,
     $                            QR, QI, IINFO )
                     IF( IINFO.NE.0 ) THEN
                        WRITE( NOUT, FMT = 9997 )SUBNAM( 17 ), IINFO,
     $                     N, ITYPE, IPAR, IOLDSD
                        INFO = ABS( IINFO )
                        GO TO 930
                     END IF
*
                     S2 = SECOND( )
                     TIME = S2 - S1
                     IC = IC + 1
                     IF( TIME.LT.TIMMIN )
     $                  GO TO 820
*
*                    Subtract the time used in CLACPY.
*
                     S1 = SECOND( )
                     DO 830 J = 1, IC
                        CALL SLACPY( 'Full', N, N, HR, LDH, ZR, LDA )
                        CALL SLACPY( 'Full', N, N, HI, LDH, ZI, LDA )
                        CALL SLACPY( 'Full', N, N, TR, LDH, ZR, LDA )
                        CALL SLACPY( 'Full', N, N, TI, LDH, ZI, LDA )
                        CALL SLASET( 'Full', N, N, ZERO, ONE, ZR, LDA )
                        CALL SLASET( 'Full', N, N, ZERO, ONE, ZI, LDA )
  830                CONTINUE
                     S2 = SECOND( )
                     UNTIME = S2 - S1
*
                     TIMES( IPAR, ITYPE, IN, 17 ) = MAX( TIME-UNTIME,
     $                  ZERO ) / REAL( IC )
                     OPCNTS( IPAR, ITYPE, IN, 17 ) = OPS / REAL( IC )
                  ELSE
                     OPCNTS( IPAR, ITYPE, IN, 17 ) = OPCNTS( LASTL,
     $                  ITYPE, IN, 17 )
                     TIMES( IPAR, ITYPE, IN, 17 ) = TIMES( LASTL, ITYPE,
     $                  IN, 17 )
                  END IF
                  LDS = LDA
                  LDW = LDA
  840          CONTINUE
            ELSE IF( RUNQZ ) THEN
               CALL SLACPY( 'Full', N, N, HR, LDH, AR, N1 )
               CALL SLACPY( 'Full', N, N, HI, LDH, AI, N1 )
               CALL SLACPY( 'Full', N, N, TR, LDH, BR, N1 )
               CALL SLACPY( 'Full', N, N, TI, LDH, BI, N1 )
               CALL SLASET( 'Full', N, N, ZERO, ONE, QR, N1 )
               CALL SLASET( 'Full', N, N, ZERO, ONE, QI, N1 )
               CALL CQZVAL( N1, N, AR, AI, BR, BI, ZERO, WR, WR( N1+1 ),
     $                      WR( 2*N1+1 ), .TRUE., QR, QI, IINFO )
               IF( IINFO.NE.0 ) THEN
                  WRITE( NOUT, FMT = 9997 )SUBNAM( 17 ), IINFO, N,
     $               ITYPE, IPAR, IOLDSD
                  INFO = ABS( IINFO )
                  GO TO 930
               END IF
*
               LDS = N1
               LDW = N1
            END IF
*
*           Time CQZVEC for each LDAS(j)
*
            IF( TIMSUB( 18 ) ) THEN
               DO 920 IPAR = 1, NPARMS
                  LDA = LDAS( IPAR )
                  IF( LDA.LT.N1 ) THEN
                     TIMES( IPAR, ITYPE, IN, 18 ) = ZERO
                     OPCNTS( IPAR, ITYPE, IN, 18 ) = ZERO
                     GO TO 920
                  END IF
*
*                 If this value of LDA has come up before, just use
*                 the value previously computed.
*
                  LASTL = 0
                  DO 850 J = 1, IPAR - 1
                     IF( LDA.EQ.LDAS( J ) )
     $                  LASTL = J
  850             CONTINUE
*
                  IF( LASTL.EQ.0 ) THEN
*
*                    Copy W if necessary to get right LDA.
*
                     IF( LDA.GT.LDW ) THEN
                        DO 870 JC = 3, 1, -1
                           DO 860 JR = N, 1, -1
                              WR( JR+( JC-1 )*LDA ) = WR( JR+( JC-1 )*
     $                           LDW )
  860                      CONTINUE
  870                   CONTINUE
                     ELSE IF( LDA.LT.LDW ) THEN
                        DO 890 JC = 1, 3
                           DO 880 JR = 1, N
                              WR( JR+( JC-1 )*LDA ) = WR( JR+( JC-1 )*
     $                           LDW )
  880                      CONTINUE
  890                   CONTINUE
                     END IF
                     LDW = LDA
*
*                    Time CQZVEC
*
                     IC = 0
                     OPS = ZERO
                     S1 = SECOND( )
  900                CONTINUE
                     CALL SLACPY( 'Full', N, N, AR, LDS, HR, LDA )
                     CALL SLACPY( 'Full', N, N, AI, LDS, HI, LDA )
                     CALL SLACPY( 'Full', N, N, BR, LDS, TR, LDA )
                     CALL SLACPY( 'Full', N, N, BI, LDS, TI, LDA )
                     CALL SLACPY( 'Full', N, N, QR, LDS, ZR, LDA )
                     CALL SLACPY( 'Full', N, N, QI, LDS, ZI, LDA )
                     CALL CQZVEC( LDA, N, HR, HI, TR, TI, WR,
     $                            WR( LDA+1 ), WR( 2*LDA+1 ), ZR, ZI )
                     S2 = SECOND( )
                     TIME = S2 - S1
                     IC = IC + 1
                     IF( TIME.LT.TIMMIN )
     $                  GO TO 900
*
*                    Subtract the time used in CLACPY.
*
                     S1 = SECOND( )
                     DO 910 J = 1, IC
                        CALL SLACPY( 'Full', N, N, AR, LDS, ZR, LDA )
                        CALL SLACPY( 'Full', N, N, AI, LDS, ZI, LDA )
                        CALL SLACPY( 'Full', N, N, BR, LDS, ZR, LDA )
                        CALL SLACPY( 'Full', N, N, BI, LDS, ZI, LDA )
                        CALL SLACPY( 'Full', N, N, QR, LDS, ZR, LDA )
                        CALL SLACPY( 'Full', N, N, QI, LDS, ZI, LDA )
  910                CONTINUE
                     S2 = SECOND( )
                     UNTIME = S2 - S1
*
                     TIMES( IPAR, ITYPE, IN, 18 ) = MAX( TIME-UNTIME,
     $                  ZERO ) / REAL( IC )
                     OPCNTS( IPAR, ITYPE, IN, 18 ) = OPS / REAL( IC )
                  ELSE
                     OPCNTS( IPAR, ITYPE, IN, 18 ) = OPCNTS( LASTL,
     $                  ITYPE, IN, 18 )
                     TIMES( IPAR, ITYPE, IN, 18 ) = TIMES( LASTL, ITYPE,
     $                  IN, 18 )
                  END IF
  920          CONTINUE
            END IF
*
  930    CONTINUE
  940 CONTINUE
*
*     Print a table of results for each timed routine.
*
      DO 950 ISUB = 1, NSUBS
         IF( TIMSUB( ISUB ) ) THEN
            CALL SPRTBG( SUBNAM( ISUB ), MTYPES, DOTYPE, NSIZES, NN,
     $                   INPARM( ISUB ), PNAMES, NPARMS, LDAS, NNB,
     $                   NSHFTS, NEISPS, MINNBS, MINBKS,
     $                   OPCNTS( 1, 1, 1, ISUB ), LDO1, LDO2,
     $                   TIMES( 1, 1, 1, ISUB ), LDT1, LDT2, RWORK,
     $                   LLWORK, NOUT )
         END IF
  950 CONTINUE
*
      RETURN
*
*     End of CTIM51
*
 9997 FORMAT( ' CTIM51: ', A, ' returned INFO=', I6, '.', / 9X, 'N=',
     $      I6, ', ITYPE=', I6, ', IPAR=', I6, ', ISEED=(',
     $      3( I5, ',' ), I5, ')' )
*
      END
