text: #include "f2c.h"
  #include "blaswrap.h"
  
  /* Table of constant values */
  
  static integer c__1 = 1;
  static integer c__4 = 4;
  
  /* Subroutine */ int zget23_(logical *comp, integer *isrt, char *balanc, 
  	integer *jtype, doublereal *thresh, integer *iseed, integer *nounit, 
  	integer *n, doublecomplex *a, integer *lda, doublecomplex *h__, 
  	doublecomplex *w, doublecomplex *w1, doublecomplex *vl, integer *ldvl, 
  	 doublecomplex *vr, integer *ldvr, doublecomplex *lre, integer *ldlre, 
  	 doublereal *rcondv, doublereal *rcndv1, doublereal *rcdvin, 
  	doublereal *rconde, doublereal *rcnde1, doublereal *rcdein, 
  	doublereal *scale, doublereal *scale1, doublereal *result, 
  	doublecomplex *work, integer *lwork, doublereal *rwork, integer *info)
  {
      /* Initialized data */
  
      static char sens[1*2] = "N" "V";
  
      /* Format strings */
      static char fmt_9998[] = "(\002 ZGET23: \002,a,\002 returned INFO=\002,i"
  	    "6,\002.\002,/9x,\002N=\002,i6,\002, JTYPE=\002,i6,\002, BALANC = "
  	    "\002,a,\002, ISEED=(\002,3(i5,\002,\002),i5,\002)\002)";
      static char fmt_9999[] = "(\002 ZGET23: \002,a,\002 returned INFO=\002,i"
  	    "6,\002.\002,/9x,\002N=\002,i6,\002, INPUT EXAMPLE NUMBER = \002,"
  	    "i4)";
  
      /* System generated locals */
      integer a_dim1, a_offset, h_dim1, h_offset, lre_dim1, lre_offset, vl_dim1,
  	     vl_offset, vr_dim1, vr_offset, i__1, i__2, i__3, i__4, i__5;
      doublereal d__1, d__2, d__3, d__4, d__5;
  
      /* Builtin functions */
      integer s_wsfe(cilist *), do_fio(integer *, char *, ftnlen), e_wsfe(void);
      double z_abs(doublecomplex *), d_imag(doublecomplex *);
  
      /* Local variables */
      integer i__, j;
      doublereal v;
      integer jj, ihi, ilo;
      doublereal eps, res[2], tol, ulp, vmx;
      integer ihi1, ilo1;
      doublecomplex cdum[1];
      integer kmin;
      doublecomplex ctmp;
      doublereal vmax, tnrm, vrmx, vtst;
      logical balok, nobal;
      doublereal abnrm;
      extern logical lsame_(char *, char *);
      integer iinfo;
      char sense[1];
      extern /* Subroutine */ int zget22_(char *, char *, char *, integer *, 
  	    doublecomplex *, integer *, doublecomplex *, integer *, 
  	    doublecomplex *, doublecomplex *, doublereal *, doublereal *);
      integer isens;
      doublereal tolin, abnrm1;
      extern doublereal dznrm2_(integer *, doublecomplex *, integer *), dlamch_(
  	    char *);
      extern /* Subroutine */ int xerbla_(char *, integer *);
      integer isensm;
      doublereal vricmp;
      extern /* Subroutine */ int zlacpy_(char *, integer *, integer *, 
  	    doublecomplex *, integer *, doublecomplex *, integer *);
      doublereal vrimin;
      extern /* Subroutine */ int zgeevx_(char *, char *, char *, char *, 
  	    integer *, doublecomplex *, integer *, doublecomplex *, 
  	    doublecomplex *, integer *, doublecomplex *, integer *, integer *, 
  	     integer *, doublereal *, doublereal *, doublereal *, doublereal *
  , doublecomplex *, integer *, doublereal *, integer *);
      doublereal smlnum, ulpinv;
  
      /* Fortran I/O blocks */
      static cilist io___14 = { 0, 0, 0, fmt_9998, 0 };
      static cilist io___15 = { 0, 0, 0, fmt_9999, 0 };
      static cilist io___28 = { 0, 0, 0, fmt_9998, 0 };
      static cilist io___29 = { 0, 0, 0, fmt_9999, 0 };
      static cilist io___30 = { 0, 0, 0, fmt_9998, 0 };
      static cilist io___31 = { 0, 0, 0, fmt_9999, 0 };
      static cilist io___32 = { 0, 0, 0, fmt_9998, 0 };
      static cilist io___33 = { 0, 0, 0, fmt_9999, 0 };
      static cilist io___34 = { 0, 0, 0, fmt_9999, 0 };
  
  
  
  /*  -- LAPACK test routine (version 3.1) -- */
  /*     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
  /*     November 2006 */
  
  /*     .. Scalar Arguments .. */
  /*     .. */
  /*     .. Array Arguments .. */
  /*     .. */
  
  /*  Purpose */
  /*  ======= */
  
  /*     ZGET23  checks the nonsymmetric eigenvalue problem driver CGEEVX. */
  /*     If COMP = .FALSE., the first 8 of the following tests will be */
  /*     performed on the input matrix A, and also test 9 if LWORK is */
  /*     sufficiently large. */
  /*     if COMP is .TRUE. all 11 tests will be performed. */
  
  /*     (1)     | A * VR - VR * W | / ( n |A| ulp ) */
  
  /*       Here VR is the matrix of unit right eigenvectors. */
  /*       W is a diagonal matrix with diagonal entries W(j). */
  
  /*     (2)     | A**H * VL - VL * W**H | / ( n |A| ulp ) */
  
  /*       Here VL is the matrix of unit left eigenvectors, A**H is the */
  /*       conjugate transpose of A, and W is as above. */
  
  /*     (3)     | |VR(i)| - 1 | / ulp and largest component real */
  
  /*       VR(i) denotes the i-th column of VR. */
  
  /*     (4)     | |VL(i)| - 1 | / ulp and largest component real */
  
  /*       VL(i) denotes the i-th column of VL. */
  
  /*     (5)     0 if W(full) = W(partial), 1/ulp otherwise */
  
  /*       W(full) denotes the eigenvalues computed when VR, VL, RCONDV */
  /*       and RCONDE are also computed, and W(partial) denotes the */
  /*       eigenvalues computed when only some of VR, VL, RCONDV, and */
  /*       RCONDE are computed. */
  
  /*     (6)     0 if VR(full) = VR(partial), 1/ulp otherwise */
  
  /*       VR(full) denotes the right eigenvectors computed when VL, RCONDV */
  /*       and RCONDE are computed, and VR(partial) denotes the result */
  /*       when only some of VL and RCONDV are computed. */
  
  /*     (7)     0 if VL(full) = VL(partial), 1/ulp otherwise */
  
  /*       VL(full) denotes the left eigenvectors computed when VR, RCONDV */
  /*       and RCONDE are computed, and VL(partial) denotes the result */
  /*       when only some of VR and RCONDV are computed. */
  
  /*     (8)     0 if SCALE, ILO, IHI, ABNRM (full) = */
  /*                  SCALE, ILO, IHI, ABNRM (partial) */
  /*             1/ulp otherwise */
  
  /*       SCALE, ILO, IHI and ABNRM describe how the matrix is balanced. */
  /*       (full) is when VR, VL, RCONDE and RCONDV are also computed, and */
  /*       (partial) is when some are not computed. */
  
  /*     (9)     0 if RCONDV(full) = RCONDV(partial), 1/ulp otherwise */
  
  /*       RCONDV(full) denotes the reciprocal condition numbers of the */
  /*       right eigenvectors computed when VR, VL and RCONDE are also */
  /*       computed. RCONDV(partial) denotes the reciprocal condition */
  /*       numbers when only some of VR, VL and RCONDE are computed. */
  
  /*    (10)     |RCONDV - RCDVIN| / cond(RCONDV) */
  
  /*       RCONDV is the reciprocal right eigenvector condition number */
  /*       computed by ZGEEVX and RCDVIN (the precomputed true value) */
  /*       is supplied as input. cond(RCONDV) is the condition number of */
  /*       RCONDV, and takes errors in computing RCONDV into account, so */
  /*       that the resulting quantity should be O(ULP). cond(RCONDV) is */
  /*       essentially given by norm(A)/RCONDE. */
  
  /*    (11)     |RCONDE - RCDEIN| / cond(RCONDE) */
  
  /*       RCONDE is the reciprocal eigenvalue condition number */
  /*       computed by ZGEEVX and RCDEIN (the precomputed true value) */
  /*       is supplied as input.  cond(RCONDE) is the condition number */
  /*       of RCONDE, and takes errors in computing RCONDE into account, */
  /*       so that the resulting quantity should be O(ULP). cond(RCONDE) */
  /*       is essentially given by norm(A)/RCONDV. */
  
  /*  Arguments */
  /*  ========= */
  
  /*  COMP    (input) LOGICAL */
  /*          COMP describes which input tests to perform: */
  /*            = .FALSE. if the computed condition numbers are not to */
  /*                      be tested against RCDVIN and RCDEIN */
  /*            = .TRUE.  if they are to be compared */
  
  /*  ISRT    (input) INTEGER */
  /*          If COMP = .TRUE., ISRT indicates in how the eigenvalues */
  /*          corresponding to values in RCDVIN and RCDEIN are ordered: */
  /*            = 0 means the eigenvalues are sorted by */
  /*                increasing real part */
  /*            = 1 means the eigenvalues are sorted by */
  /*                increasing imaginary part */
  /*          If COMP = .FALSE., ISRT is not referenced. */
  
  /*  BALANC  (input) CHARACTER */
  /*          Describes the balancing option to be tested. */
  /*            = 'N' for no permuting or diagonal scaling */
  /*            = 'P' for permuting but no diagonal scaling */
  /*            = 'S' for no permuting but diagonal scaling */
  /*            = 'B' for permuting and diagonal scaling */
  
  /*  JTYPE   (input) INTEGER */
  /*          Type of input matrix. Used to label output if error occurs. */
  
  /*  THRESH  (input) DOUBLE PRECISION */
  /*          A test will count as "failed" if the "error", computed as */
  /*          described above, exceeds THRESH.  Note that the error */
  /*          is scaled to be O(1), so THRESH should be a reasonably */
  /*          small multiple of 1, e.g., 10 or 100.  In particular, */
  /*          it should not depend on the precision (single vs. double) */
  /*          or the size of the matrix.  It must be at least zero. */
  
  /*  ISEED   (input) INTEGER array, dimension (4) */
  /*          If COMP = .FALSE., the random number generator seed */
  /*          used to produce matrix. */
  /*          If COMP = .TRUE., ISEED(1) = the number of the example. */
  /*          Used to label output if error occurs. */
  
  /*  NOUNIT  (input) INTEGER */
  /*          The FORTRAN unit number for printing out error messages */
  /*          (e.g., if a routine returns INFO not equal to 0.) */
  
  /*  N       (input) INTEGER */
  /*          The dimension of A. N must be at least 0. */
  
  /*  A       (input/output) COMPLEX*16 array, dimension (LDA,N) */
  /*          Used to hold the matrix whose eigenvalues are to be */
  /*          computed. */
  
  /*  LDA     (input) INTEGER */
  /*          The leading dimension of A, and H. LDA must be at */
  /*          least 1 and at least N. */
  
  /*  H       (workspace) COMPLEX*16 array, dimension (LDA,N) */
  /*          Another copy of the test matrix A, modified by ZGEEVX. */
  
  /*  W       (workspace) COMPLEX*16 array, dimension (N) */
  /*          Contains the eigenvalues of A. */
  
  /*  W1      (workspace) COMPLEX*16 array, dimension (N) */
  /*          Like W, this array contains the eigenvalues of A, */
  /*          but those computed when ZGEEVX only computes a partial */
  /*          eigendecomposition, i.e. not the eigenvalues and left */
  /*          and right eigenvectors. */
  
  /*  VL      (workspace) COMPLEX*16 array, dimension (LDVL,N) */
  /*          VL holds the computed left eigenvectors. */
  
  /*  LDVL    (input) INTEGER */
  /*          Leading dimension of VL. Must be at least max(1,N). */
  
  /*  VR      (workspace) COMPLEX*16 array, dimension (LDVR,N) */
  /*          VR holds the computed right eigenvectors. */
  
  /*  LDVR    (input) INTEGER */
  /*          Leading dimension of VR. Must be at least max(1,N). */
  
  /*  LRE     (workspace) COMPLEX*16 array, dimension (LDLRE,N) */
  /*          LRE holds the computed right or left eigenvectors. */
  
  /*  LDLRE   (input) INTEGER */
  /*          Leading dimension of LRE. Must be at least max(1,N). */
  
  /*  RCONDV  (workspace) DOUBLE PRECISION array, dimension (N) */
  /*          RCONDV holds the computed reciprocal condition numbers */
  /*          for eigenvectors. */
  
  /*  RCNDV1  (workspace) DOUBLE PRECISION array, dimension (N) */
  /*          RCNDV1 holds more computed reciprocal condition numbers */
  /*          for eigenvectors. */
  
  /*  RCDVIN  (input) DOUBLE PRECISION array, dimension (N) */
  /*          When COMP = .TRUE. RCDVIN holds the precomputed reciprocal */
  /*          condition numbers for eigenvectors to be compared with */
  /*          RCONDV. */
  
  /*  RCONDE  (workspace) DOUBLE PRECISION array, dimension (N) */
  /*          RCONDE holds the computed reciprocal condition numbers */
  /*          for eigenvalues. */
  
  /*  RCNDE1  (workspace) DOUBLE PRECISION array, dimension (N) */
  /*          RCNDE1 holds more computed reciprocal condition numbers */
  /*          for eigenvalues. */
  
  /*  RCDEIN  (input) DOUBLE PRECISION array, dimension (N) */
  /*          When COMP = .TRUE. RCDEIN holds the precomputed reciprocal */
  /*          condition numbers for eigenvalues to be compared with */
  /*          RCONDE. */
  
  /*  SCALE   (workspace) DOUBLE PRECISION array, dimension (N) */
  /*          Holds information describing balancing of matrix. */
  
  /*  SCALE1  (workspace) DOUBLE PRECISION array, dimension (N) */
  /*          Holds information describing balancing of matrix. */
  
  /*  RESULT  (output) DOUBLE PRECISION array, dimension (11) */
  /*          The values computed by the 11 tests described above. */
  /*          The values are currently limited to 1/ulp, to avoid */
  /*          overflow. */
  
  /*  WORK    (workspace) COMPLEX*16 array, dimension (LWORK) */
  
  /*  LWORK   (input) INTEGER */
  /*          The number of entries in WORK.  This must be at least */
  /*          2*N, and 2*N+N**2 if tests 9, 10 or 11 are to be performed. */
  
  /*  RWORK   (workspace) DOUBLE PRECISION array, dimension (2*N) */
  
  /*  INFO    (output) INTEGER */
  /*          If 0,  successful exit. */
  /*          If <0, input parameter -INFO had an incorrect value. */
  /*          If >0, ZGEEVX returned an error code, the absolute */
  /*                 value of which is returned. */
  
  /*  ===================================================================== */
  
  /*     .. Parameters .. */
  /*     .. */
  /*     .. Local Scalars .. */
  /*     .. */
  /*     .. Local Arrays .. */
  /*     .. */
  /*     .. External Functions .. */
  /*     .. */
  /*     .. External Subroutines .. */
  /*     .. */
  /*     .. Intrinsic Functions .. */
  /*     .. */
  /*     .. Data statements .. */
      /* Parameter adjustments */
      --iseed;
      h_dim1 = *lda;
      h_offset = 1 + h_dim1;
      h__ -= h_offset;
      a_dim1 = *lda;
      a_offset = 1 + a_dim1;
      a -= a_offset;
      --w;
      --w1;
      vl_dim1 = *ldvl;
      vl_offset = 1 + vl_dim1;
      vl -= vl_offset;
      vr_dim1 = *ldvr;
      vr_offset = 1 + vr_dim1;
      vr -= vr_offset;
      lre_dim1 = *ldlre;
      lre_offset = 1 + lre_dim1;
      lre -= lre_offset;
      --rcondv;
      --rcndv1;
      --rcdvin;
      --rconde;
      --rcnde1;
      --rcdein;
      --scale;
      --scale1;
      --result;
      --work;
      --rwork;
  
      /* Function Body */
  /*     .. */
  /*     .. Executable Statements .. */
  
  /*     Check for errors */
  
      nobal = lsame_(balanc, "N");
      balok = nobal || lsame_(balanc, "P") || lsame_(
  	    balanc, "S") || lsame_(balanc, "B");
      *info = 0;
      if (*isrt != 0 && *isrt != 1) {
  	*info = -2;
      } else if (! balok) {
  	*info = -3;
      } else if (*thresh < 0.) {
  	*info = -5;
      } else if (*nounit <= 0) {
  	*info = -7;
      } else if (*n < 0) {
  	*info = -8;
      } else if (*lda < 1 || *lda < *n) {
  	*info = -10;
      } else if (*ldvl < 1 || *ldvl < *n) {
  	*info = -15;
      } else if (*ldvr < 1 || *ldvr < *n) {
  	*info = -17;
      } else if (*ldlre < 1 || *ldlre < *n) {
  	*info = -19;
      } else if (*lwork < *n << 1 || *comp && *lwork < (*n << 1) + *n * *n) {
  	*info = -30;
      }
  
      if (*info != 0) {
  	i__1 = -(*info);
  	xerbla_("ZGET23", &i__1);
  	return 0;
      }
  
  /*     Quick return if nothing to do */
  
      for (i__ = 1; i__ <= 11; ++i__) {
  	result[i__] = -1.;
  /* L10: */
      }
  
      if (*n == 0) {
  	return 0;
      }
  
  /*     More Important constants */
  
      ulp = dlamch_("Precision");
      smlnum = dlamch_("S");
      ulpinv = 1. / ulp;
  
  /*     Compute eigenvalues and eigenvectors, and test them */
  
      if (*lwork >= (*n << 1) + *n * *n) {
  	*(unsigned char *)sense = 'B';
  	isensm = 2;
      } else {
  	*(unsigned char *)sense = 'E';
  	isensm = 1;
      }
      zlacpy_("F", n, n, &a[a_offset], lda, &h__[h_offset], lda);
      zgeevx_(balanc, "V", "V", sense, n, &h__[h_offset], lda, &w[1], &vl[
  	    vl_offset], ldvl, &vr[vr_offset], ldvr, &ilo, &ihi, &scale[1], &
  	    abnrm, &rconde[1], &rcondv[1], &work[1], lwork, &rwork[1], &iinfo);
      if (iinfo != 0) {
  	result[1] = ulpinv;
  	if (*jtype != 22) {
  	    io___14.ciunit = *nounit;
  	    s_wsfe(&io___14);
  	    do_fio(&c__1, "ZGEEVX1", (ftnlen)7);
  	    do_fio(&c__1, (char *)&iinfo, (ftnlen)sizeof(integer));
  	    do_fio(&c__1, (char *)&(*n), (ftnlen)sizeof(integer));
  	    do_fio(&c__1, (char *)&(*jtype), (ftnlen)sizeof(integer));
  	    do_fio(&c__1, balanc, (ftnlen)1);
  	    do_fio(&c__4, (char *)&iseed[1], (ftnlen)sizeof(integer));
  	    e_wsfe();
  	} else {
  	    io___15.ciunit = *nounit;
  	    s_wsfe(&io___15);
  	    do_fio(&c__1, "ZGEEVX1", (ftnlen)7);
  	    do_fio(&c__1, (char *)&iinfo, (ftnlen)sizeof(integer));
  	    do_fio(&c__1, (char *)&(*n), (ftnlen)sizeof(integer));
  	    do_fio(&c__1, (char *)&iseed[1], (ftnlen)sizeof(integer));
  	    e_wsfe();
  	}
  	*info = abs(iinfo);
  	return 0;
      }
  
  /*     Do Test (1) */
  
      zget22_("N", "N", "N", n, &a[a_offset], lda, &vr[vr_offset], ldvr, &w[1], 
  	    &work[1], &rwork[1], res);
      result[1] = res[0];
  
  /*     Do Test (2) */
  
      zget22_("C", "N", "C", n, &a[a_offset], lda, &vl[vl_offset], ldvl, &w[1], 
  	    &work[1], &rwork[1], res);
      result[2] = res[0];
  
  /*     Do Test (3) */
  
      i__1 = *n;
      for (j = 1; j <= i__1; ++j) {
  	tnrm = dznrm2_(n, &vr[j * vr_dim1 + 1], &c__1);
  /* Computing MAX */
  /* Computing MIN */
  	d__4 = ulpinv, d__5 = (d__1 = tnrm - 1., abs(d__1)) / ulp;
  	d__2 = result[3], d__3 = min(d__4,d__5);
  	result[3] = max(d__2,d__3);
  	vmx = 0.;
  	vrmx = 0.;
  	i__2 = *n;
  	for (jj = 1; jj <= i__2; ++jj) {
  	    vtst = z_abs(&vr[jj + j * vr_dim1]);
  	    if (vtst > vmx) {
  		vmx = vtst;
  	    }
  	    i__3 = jj + j * vr_dim1;
  	    if (d_imag(&vr[jj + j * vr_dim1]) == 0. && (d__1 = vr[i__3].r, 
  		    abs(d__1)) > vrmx) {
  		i__4 = jj + j * vr_dim1;
  		vrmx = (d__2 = vr[i__4].r, abs(d__2));
  	    }
  /* L20: */
  	}
  	if (vrmx / vmx < 1. - ulp * 2.) {
  	    result[3] = ulpinv;
  	}
  /* L30: */
      }
  
  /*     Do Test (4) */
  
      i__1 = *n;
      for (j = 1; j <= i__1; ++j) {
  	tnrm = dznrm2_(n, &vl[j * vl_dim1 + 1], &c__1);
  /* Computing MAX */
  /* Computing MIN */
  	d__4 = ulpinv, d__5 = (d__1 = tnrm - 1., abs(d__1)) / ulp;
  	d__2 = result[4], d__3 = min(d__4,d__5);
  	result[4] = max(d__2,d__3);
  	vmx = 0.;
  	vrmx = 0.;
  	i__2 = *n;
  	for (jj = 1; jj <= i__2; ++jj) {
  	    vtst = z_abs(&vl[jj + j * vl_dim1]);
  	    if (vtst > vmx) {
  		vmx = vtst;
  	    }
  	    i__3 = jj + j * vl_dim1;
  	    if (d_imag(&vl[jj + j * vl_dim1]) == 0. && (d__1 = vl[i__3].r, 
  		    abs(d__1)) > vrmx) {
  		i__4 = jj + j * vl_dim1;
  		vrmx = (d__2 = vl[i__4].r, abs(d__2));
  	    }
  /* L40: */
  	}
  	if (vrmx / vmx < 1. - ulp * 2.) {
  	    result[4] = ulpinv;
  	}
  /* L50: */
      }
  
  /*     Test for all options of computing condition numbers */
  
      i__1 = isensm;
      for (isens = 1; isens <= i__1; ++isens) {
  
  	*(unsigned char *)sense = *(unsigned char *)&sens[isens - 1];
  
  /*        Compute eigenvalues only, and test them */
  
  	zlacpy_("F", n, n, &a[a_offset], lda, &h__[h_offset], lda);
  	zgeevx_(balanc, "N", "N", sense, n, &h__[h_offset], lda, &w1[1], cdum, 
  		 &c__1, cdum, &c__1, &ilo1, &ihi1, &scale1[1], &abnrm1, &
  		rcnde1[1], &rcndv1[1], &work[1], lwork, &rwork[1], &iinfo);
  	if (iinfo != 0) {
  	    result[1] = ulpinv;
  	    if (*jtype != 22) {
  		io___28.ciunit = *nounit;
  		s_wsfe(&io___28);
  		do_fio(&c__1, "ZGEEVX2", (ftnlen)7);
  		do_fio(&c__1, (char *)&iinfo, (ftnlen)sizeof(integer));
  		do_fio(&c__1, (char *)&(*n), (ftnlen)sizeof(integer));
  		do_fio(&c__1, (char *)&(*jtype), (ftnlen)sizeof(integer));
  		do_fio(&c__1, balanc, (ftnlen)1);
  		do_fio(&c__4, (char *)&iseed[1], (ftnlen)sizeof(integer));
  		e_wsfe();
  	    } else {
  		io___29.ciunit = *nounit;
  		s_wsfe(&io___29);
  		do_fio(&c__1, "ZGEEVX2", (ftnlen)7);
  		do_fio(&c__1, (char *)&iinfo, (ftnlen)sizeof(integer));
  		do_fio(&c__1, (char *)&(*n), (ftnlen)sizeof(integer));
  		do_fio(&c__1, (char *)&iseed[1], (ftnlen)sizeof(integer));
  		e_wsfe();
  	    }
  	    *info = abs(iinfo);
  	    goto L190;
  	}
  
  /*        Do Test (5) */
  
  	i__2 = *n;
  	for (j = 1; j <= i__2; ++j) {
  	    i__3 = j;
  	    i__4 = j;
  	    if (w[i__3].r != w1[i__4].r || w[i__3].i != w1[i__4].i) {
  		result[5] = ulpinv;
  	    }
  /* L60: */
  	}
  
  /*        Do Test (8) */
  
  	if (! nobal) {
  	    i__2 = *n;
  	    for (j = 1; j <= i__2; ++j) {
  		if (scale[j] != scale1[j]) {
  		    result[8] = ulpinv;
  		}
  /* L70: */
  	    }
  	    if (ilo != ilo1) {
  		result[8] = ulpinv;
  	    }
  	    if (ihi != ihi1) {
  		result[8] = ulpinv;
  	    }
  	    if (abnrm != abnrm1) {
  		result[8] = ulpinv;
  	    }
  	}
  
  /*        Do Test (9) */
  
  	if (isens == 2 && *n > 1) {
  	    i__2 = *n;
  	    for (j = 1; j <= i__2; ++j) {
  		if (rcondv[j] != rcndv1[j]) {
  		    result[9] = ulpinv;
  		}
  /* L80: */
  	    }
  	}
  
  /*        Compute eigenvalues and right eigenvectors, and test them */
  
  	zlacpy_("F", n, n, &a[a_offset], lda, &h__[h_offset], lda);
  	zgeevx_(balanc, "N", "V", sense, n, &h__[h_offset], lda, &w1[1], cdum, 
  		 &c__1, &lre[lre_offset], ldlre, &ilo1, &ihi1, &scale1[1], &
  		abnrm1, &rcnde1[1], &rcndv1[1], &work[1], lwork, &rwork[1], &
  		iinfo);
  	if (iinfo != 0) {
  	    result[1] = ulpinv;
  	    if (*jtype != 22) {
  		io___30.ciunit = *nounit;
  		s_wsfe(&io___30);
  		do_fio(&c__1, "ZGEEVX3", (ftnlen)7);
  		do_fio(&c__1, (char *)&iinfo, (ftnlen)sizeof(integer));
  		do_fio(&c__1, (char *)&(*n), (ftnlen)sizeof(integer));
  		do_fio(&c__1, (char *)&(*jtype), (ftnlen)sizeof(integer));
  		do_fio(&c__1, balanc, (ftnlen)1);
  		do_fio(&c__4, (char *)&iseed[1], (ftnlen)sizeof(integer));
  		e_wsfe();
  	    } else {
  		io___31.ciunit = *nounit;
  		s_wsfe(&io___31);
  		do_fio(&c__1, "ZGEEVX3", (ftnlen)7);
  		do_fio(&c__1, (char *)&iinfo, (ftnlen)sizeof(integer));
  		do_fio(&c__1, (char *)&(*n), (ftnlen)sizeof(integer));
  		do_fio(&c__1, (char *)&iseed[1], (ftnlen)sizeof(integer));
  		e_wsfe();
  	    }
  	    *info = abs(iinfo);
  	    goto L190;
  	}
  
  /*        Do Test (5) again */
  
  	i__2 = *n;
  	for (j = 1; j <= i__2; ++j) {
  	    i__3 = j;
  	    i__4 = j;
  	    if (w[i__3].r != w1[i__4].r || w[i__3].i != w1[i__4].i) {
  		result[5] = ulpinv;
  	    }
  /* L90: */
  	}
  
  /*        Do Test (6) */
  
  	i__2 = *n;
  	for (j = 1; j <= i__2; ++j) {
  	    i__3 = *n;
  	    for (jj = 1; jj <= i__3; ++jj) {
  		i__4 = j + jj * vr_dim1;
  		i__5 = j + jj * lre_dim1;
  		if (vr[i__4].r != lre[i__5].r || vr[i__4].i != lre[i__5].i) {
  		    result[6] = ulpinv;
  		}
  /* L100: */
  	    }
  /* L110: */
  	}
  
  /*        Do Test (8) again */
  
  	if (! nobal) {
  	    i__2 = *n;
  	    for (j = 1; j <= i__2; ++j) {
  		if (scale[j] != scale1[j]) {
  		    result[8] = ulpinv;
  		}
  /* L120: */
  	    }
  	    if (ilo != ilo1) {
  		result[8] = ulpinv;
  	    }
  	    if (ihi != ihi1) {
  		result[8] = ulpinv;
  	    }
  	    if (abnrm != abnrm1) {
  		result[8] = ulpinv;
  	    }
  	}
  
  /*        Do Test (9) again */
  
  	if (isens == 2 && *n > 1) {
  	    i__2 = *n;
  	    for (j = 1; j <= i__2; ++j) {
  		if (rcondv[j] != rcndv1[j]) {
  		    result[9] = ulpinv;
  		}
  /* L130: */
  	    }
  	}
  
  /*        Compute eigenvalues and left eigenvectors, and test them */
  
  	zlacpy_("F", n, n, &a[a_offset], lda, &h__[h_offset], lda);
  	zgeevx_(balanc, "V", "N", sense, n, &h__[h_offset], lda, &w1[1], &lre[
  		lre_offset], ldlre, cdum, &c__1, &ilo1, &ihi1, &scale1[1], &
  		abnrm1, &rcnde1[1], &rcndv1[1], &work[1], lwork, &rwork[1], &
  		iinfo);
  	if (iinfo != 0) {
  	    result[1] = ulpinv;
  	    if (*jtype != 22) {
  		io___32.ciunit = *nounit;
  		s_wsfe(&io___32);
  		do_fio(&c__1, "ZGEEVX4", (ftnlen)7);
  		do_fio(&c__1, (char *)&iinfo, (ftnlen)sizeof(integer));
  		do_fio(&c__1, (char *)&(*n), (ftnlen)sizeof(integer));
  		do_fio(&c__1, (char *)&(*jtype), (ftnlen)sizeof(integer));
  		do_fio(&c__1, balanc, (ftnlen)1);
  		do_fio(&c__4, (char *)&iseed[1], (ftnlen)sizeof(integer));
  		e_wsfe();
  	    } else {
  		io___33.ciunit = *nounit;
  		s_wsfe(&io___33);
  		do_fio(&c__1, "ZGEEVX4", (ftnlen)7);
  		do_fio(&c__1, (char *)&iinfo, (ftnlen)sizeof(integer));
  		do_fio(&c__1, (char *)&(*n), (ftnlen)sizeof(integer));
  		do_fio(&c__1, (char *)&iseed[1], (ftnlen)sizeof(integer));
  		e_wsfe();
  	    }
  	    *info = abs(iinfo);
  	    goto L190;
  	}
  
  /*        Do Test (5) again */
  
  	i__2 = *n;
  	for (j = 1; j <= i__2; ++j) {
  	    i__3 = j;
  	    i__4 = j;
  	    if (w[i__3].r != w1[i__4].r || w[i__3].i != w1[i__4].i) {
  		result[5] = ulpinv;
  	    }
  /* L140: */
  	}
  
  /*        Do Test (7) */
  
  	i__2 = *n;
  	for (j = 1; j <= i__2; ++j) {
  	    i__3 = *n;
  	    for (jj = 1; jj <= i__3; ++jj) {
  		i__4 = j + jj * vl_dim1;
  		i__5 = j + jj * lre_dim1;
  		if (vl[i__4].r != lre[i__5].r || vl[i__4].i != lre[i__5].i) {
  		    result[7] = ulpinv;
  		}
  /* L150: */
  	    }
  /* L160: */
  	}
  
  /*        Do Test (8) again */
  
  	if (! nobal) {
  	    i__2 = *n;
  	    for (j = 1; j <= i__2; ++j) {
  		if (scale[j] != scale1[j]) {
  		    result[8] = ulpinv;
  		}
  /* L170: */
  	    }
  	    if (ilo != ilo1) {
  		result[8] = ulpinv;
  	    }
  	    if (ihi != ihi1) {
  		result[8] = ulpinv;
  	    }
  	    if (abnrm != abnrm1) {
  		result[8] = ulpinv;
  	    }
  	}
  
  /*        Do Test (9) again */
  
  	if (isens == 2 && *n > 1) {
  	    i__2 = *n;
  	    for (j = 1; j <= i__2; ++j) {
  		if (rcondv[j] != rcndv1[j]) {
  		    result[9] = ulpinv;
  		}
  /* L180: */
  	    }
  	}
  
  L190:
  
  /* L200: */
  	;
      }
  
  /*     If COMP, compare condition numbers to precomputed ones */
  
      if (*comp) {
  	zlacpy_("F", n, n, &a[a_offset], lda, &h__[h_offset], lda);
  	zgeevx_("N", "V", "V", "B", n, &h__[h_offset], lda, &w[1], &vl[
  		vl_offset], ldvl, &vr[vr_offset], ldvr, &ilo, &ihi, &scale[1], 
  		 &abnrm, &rconde[1], &rcondv[1], &work[1], lwork, &rwork[1], &
  		iinfo);
  	if (iinfo != 0) {
  	    result[1] = ulpinv;
  	    io___34.ciunit = *nounit;
  	    s_wsfe(&io___34);
  	    do_fio(&c__1, "ZGEEVX5", (ftnlen)7);
  	    do_fio(&c__1, (char *)&iinfo, (ftnlen)sizeof(integer));
  	    do_fio(&c__1, (char *)&(*n), (ftnlen)sizeof(integer));
  	    do_fio(&c__1, (char *)&iseed[1], (ftnlen)sizeof(integer));
  	    e_wsfe();
  	    *info = abs(iinfo);
  	    goto L250;
  	}
  
  /*        Sort eigenvalues and condition numbers lexicographically */
  /*        to compare with inputs */
  
  	i__1 = *n - 1;
  	for (i__ = 1; i__ <= i__1; ++i__) {
  	    kmin = i__;
  	    if (*isrt == 0) {
  		i__2 = i__;
  		vrimin = w[i__2].r;
  	    } else {
  		vrimin = d_imag(&w[i__]);
  	    }
  	    i__2 = *n;
  	    for (j = i__ + 1; j <= i__2; ++j) {
  		if (*isrt == 0) {
  		    i__3 = j;
  		    vricmp = w[i__3].r;
  		} else {
  		    vricmp = d_imag(&w[j]);
  		}
  		if (vricmp < vrimin) {
  		    kmin = j;
  		    vrimin = vricmp;
  		}
  /* L210: */
  	    }
  	    i__2 = kmin;
  	    ctmp.r = w[i__2].r, ctmp.i = w[i__2].i;
  	    i__2 = kmin;
  	    i__3 = i__;
  	    w[i__2].r = w[i__3].r, w[i__2].i = w[i__3].i;
  	    i__2 = i__;
  	    w[i__2].r = ctmp.r, w[i__2].i = ctmp.i;
  	    vrimin = rconde[kmin];
  	    rconde[kmin] = rconde[i__];
  	    rconde[i__] = vrimin;
  	    vrimin = rcondv[kmin];
  	    rcondv[kmin] = rcondv[i__];
  	    rcondv[i__] = vrimin;
  /* L220: */
  	}
  
  /*        Compare condition numbers for eigenvectors */
  /*        taking their condition numbers into account */
  
  	result[10] = 0.;
  	eps = max(5.9605e-8,ulp);
  /* Computing MAX */
  	d__1 = (doublereal) (*n) * eps * abnrm;
  	v = max(d__1,smlnum);
  	if (abnrm == 0.) {
  	    v = 1.;
  	}
  	i__1 = *n;
  	for (i__ = 1; i__ <= i__1; ++i__) {
  	    if (v > rcondv[i__] * rconde[i__]) {
  		tol = rcondv[i__];
  	    } else {
  		tol = v / rconde[i__];
  	    }
  	    if (v > rcdvin[i__] * rcdein[i__]) {
  		tolin = rcdvin[i__];
  	    } else {
  		tolin = v / rcdein[i__];
  	    }
  /* Computing MAX */
  	    d__1 = tol, d__2 = smlnum / eps;
  	    tol = max(d__1,d__2);
  /* Computing MAX */
  	    d__1 = tolin, d__2 = smlnum / eps;
  	    tolin = max(d__1,d__2);
  	    if (eps * (rcdvin[i__] - tolin) > rcondv[i__] + tol) {
  		vmax = 1. / eps;
  	    } else if (rcdvin[i__] - tolin > rcondv[i__] + tol) {
  		vmax = (rcdvin[i__] - tolin) / (rcondv[i__] + tol);
  	    } else if (rcdvin[i__] + tolin < eps * (rcondv[i__] - tol)) {
  		vmax = 1. / eps;
  	    } else if (rcdvin[i__] + tolin < rcondv[i__] - tol) {
  		vmax = (rcondv[i__] - tol) / (rcdvin[i__] + tolin);
  	    } else {
  		vmax = 1.;
  	    }
  	    result[10] = max(result[10],vmax);
  /* L230: */
  	}
  
  /*        Compare condition numbers for eigenvalues */
  /*        taking their condition numbers into account */
  
  	result[11] = 0.;
  	i__1 = *n;
  	for (i__ = 1; i__ <= i__1; ++i__) {
  	    if (v > rcondv[i__]) {
  		tol = 1.;
  	    } else {
  		tol = v / rcondv[i__];
  	    }
  	    if (v > rcdvin[i__]) {
  		tolin = 1.;
  	    } else {
  		tolin = v / rcdvin[i__];
  	    }
  /* Computing MAX */
  	    d__1 = tol, d__2 = smlnum / eps;
  	    tol = max(d__1,d__2);
  /* Computing MAX */
  	    d__1 = tolin, d__2 = smlnum / eps;
  	    tolin = max(d__1,d__2);
  	    if (eps * (rcdein[i__] - tolin) > rconde[i__] + tol) {
  		vmax = 1. / eps;
  	    } else if (rcdein[i__] - tolin > rconde[i__] + tol) {
  		vmax = (rcdein[i__] - tolin) / (rconde[i__] + tol);
  	    } else if (rcdein[i__] + tolin < eps * (rconde[i__] - tol)) {
  		vmax = 1. / eps;
  	    } else if (rcdein[i__] + tolin < rconde[i__] - tol) {
  		vmax = (rconde[i__] - tol) / (rcdein[i__] + tolin);
  	    } else {
  		vmax = 1.;
  	    }
  	    result[11] = max(result[11],vmax);
  /* L240: */
  	}
  L250:
  
  	;
      }
  
  
      return 0;
  
  /*     End of ZGET23 */
  
  } /* zget23_ */
  