--- 
:name: zgges
:md5sum: 910f4c2589adc83dd9ec896220604135
:category: :subroutine
:arguments: 
- jobvsl: 
    :type: char
    :intent: input
- jobvsr: 
    :type: char
    :intent: input
- sort: 
    :type: char
    :intent: input
- selctg: 
    :intent: external procedure
    :block_type: logical
    :block_arg_num: 2
    :block_arg_type: doublecomplex
- n: 
    :type: integer
    :intent: input
- a: 
    :type: doublecomplex
    :intent: input/output
    :dims: 
    - lda
    - n
- lda: 
    :type: integer
    :intent: input
- b: 
    :type: doublecomplex
    :intent: input/output
    :dims: 
    - ldb
    - n
- ldb: 
    :type: integer
    :intent: input
- sdim: 
    :type: integer
    :intent: output
- alpha: 
    :type: doublecomplex
    :intent: output
    :dims: 
    - n
- beta: 
    :type: doublecomplex
    :intent: output
    :dims: 
    - n
- vsl: 
    :type: doublecomplex
    :intent: output
    :dims: 
    - ldvsl
    - n
- ldvsl: 
    :type: integer
    :intent: input
- vsr: 
    :type: doublecomplex
    :intent: output
    :dims: 
    - ldvsr
    - n
- ldvsr: 
    :type: integer
    :intent: input
- work: 
    :type: doublecomplex
    :intent: output
    :dims: 
    - MAX(1,lwork)
- lwork: 
    :type: integer
    :intent: input
    :option: true
    :default: 2*n
- rwork: 
    :type: doublereal
    :intent: workspace
    :dims: 
    - 8*n
- bwork: 
    :type: logical
    :intent: workspace
    :dims: 
    - "lsame_(&sort,\"N\") ? 0 : n"
- info: 
    :type: integer
    :intent: output
:substitutions: 
  ldvsl: "lsame_(&jobvsl,\"V\") ? n : 1"
  ldvsr: "lsame_(&jobvsr,\"V\") ? n : 1"
:fortran_help: "      SUBROUTINE ZGGES( JOBVSL, JOBVSR, SORT, SELCTG, N, A, LDA, B, LDB, SDIM, ALPHA, BETA, VSL, LDVSL, VSR, LDVSR, WORK, LWORK, RWORK, BWORK, INFO )\n\n\
  *  Purpose\n\
  *  =======\n\
  *\n\
  *  ZGGES computes for a pair of N-by-N complex nonsymmetric matrices\n\
  *  (A,B), the generalized eigenvalues, the generalized complex Schur\n\
  *  form (S, T), and optionally left and/or right Schur vectors (VSL\n\
  *  and VSR). This gives the generalized Schur factorization\n\
  *\n\
  *          (A,B) = ( (VSL)*S*(VSR)**H, (VSL)*T*(VSR)**H )\n\
  *\n\
  *  where (VSR)**H is the conjugate-transpose of VSR.\n\
  *\n\
  *  Optionally, it also orders the eigenvalues so that a selected cluster\n\
  *  of eigenvalues appears in the leading diagonal blocks of the upper\n\
  *  triangular matrix S and the upper triangular matrix T. The leading\n\
  *  columns of VSL and VSR then form an unitary basis for the\n\
  *  corresponding left and right eigenspaces (deflating subspaces).\n\
  *\n\
  *  (If only the generalized eigenvalues are needed, use the driver\n\
  *  ZGGEV instead, which is faster.)\n\
  *\n\
  *  A generalized eigenvalue for a pair of matrices (A,B) is a scalar w\n\
  *  or a ratio alpha/beta = w, such that  A - w*B is singular.  It is\n\
  *  usually represented as the pair (alpha,beta), as there is a\n\
  *  reasonable interpretation for beta=0, and even for both being zero.\n\
  *\n\
  *  A pair of matrices (S,T) is in generalized complex Schur form if S\n\
  *  and T are upper triangular and, in addition, the diagonal elements\n\
  *  of T are non-negative real numbers.\n\
  *\n\n\
  *  Arguments\n\
  *  =========\n\
  *\n\
  *  JOBVSL  (input) CHARACTER*1\n\
  *          = 'N':  do not compute the left Schur vectors;\n\
  *          = 'V':  compute the left Schur vectors.\n\
  *\n\
  *  JOBVSR  (input) CHARACTER*1\n\
  *          = 'N':  do not compute the right Schur vectors;\n\
  *          = 'V':  compute the right Schur vectors.\n\
  *\n\
  *  SORT    (input) CHARACTER*1\n\
  *          Specifies whether or not to order the eigenvalues on the\n\
  *          diagonal of the generalized Schur form.\n\
  *          = 'N':  Eigenvalues are not ordered;\n\
  *          = 'S':  Eigenvalues are ordered (see SELCTG).\n\
  *\n\
  *  SELCTG  (external procedure) LOGICAL FUNCTION of two COMPLEX*16 arguments\n\
  *          SELCTG must be declared EXTERNAL in the calling subroutine.\n\
  *          If SORT = 'N', SELCTG is not referenced.\n\
  *          If SORT = 'S', SELCTG is used to select eigenvalues to sort\n\
  *          to the top left of the Schur form.\n\
  *          An eigenvalue ALPHA(j)/BETA(j) is selected if\n\
  *          SELCTG(ALPHA(j),BETA(j)) is true.\n\
  *\n\
  *          Note that a selected complex eigenvalue may no longer satisfy\n\
  *          SELCTG(ALPHA(j),BETA(j)) = .TRUE. after ordering, since\n\
  *          ordering may change the value of complex eigenvalues\n\
  *          (especially if the eigenvalue is ill-conditioned), in this\n\
  *          case INFO is set to N+2 (See INFO below).\n\
  *\n\
  *  N       (input) INTEGER\n\
  *          The order of the matrices A, B, VSL, and VSR.  N >= 0.\n\
  *\n\
  *  A       (input/output) COMPLEX*16 array, dimension (LDA, N)\n\
  *          On entry, the first of the pair of matrices.\n\
  *          On exit, A has been overwritten by its generalized Schur\n\
  *          form S.\n\
  *\n\
  *  LDA     (input) INTEGER\n\
  *          The leading dimension of A.  LDA >= max(1,N).\n\
  *\n\
  *  B       (input/output) COMPLEX*16 array, dimension (LDB, N)\n\
  *          On entry, the second of the pair of matrices.\n\
  *          On exit, B has been overwritten by its generalized Schur\n\
  *          form T.\n\
  *\n\
  *  LDB     (input) INTEGER\n\
  *          The leading dimension of B.  LDB >= max(1,N).\n\
  *\n\
  *  SDIM    (output) INTEGER\n\
  *          If SORT = 'N', SDIM = 0.\n\
  *          If SORT = 'S', SDIM = number of eigenvalues (after sorting)\n\
  *          for which SELCTG is true.\n\
  *\n\
  *  ALPHA   (output) COMPLEX*16 array, dimension (N)\n\
  *  BETA    (output) COMPLEX*16 array, dimension (N)\n\
  *          On exit,  ALPHA(j)/BETA(j), j=1,...,N, will be the\n\
  *          generalized eigenvalues.  ALPHA(j), j=1,...,N  and  BETA(j),\n\
  *          j=1,...,N  are the diagonals of the complex Schur form (A,B)\n\
  *          output by ZGGES. The  BETA(j) will be non-negative real.\n\
  *\n\
  *          Note: the quotients ALPHA(j)/BETA(j) may easily over- or\n\
  *          underflow, and BETA(j) may even be zero.  Thus, the user\n\
  *          should avoid naively computing the ratio alpha/beta.\n\
  *          However, ALPHA will be always less than and usually\n\
  *          comparable with norm(A) in magnitude, and BETA always less\n\
  *          than and usually comparable with norm(B).\n\
  *\n\
  *  VSL     (output) COMPLEX*16 array, dimension (LDVSL,N)\n\
  *          If JOBVSL = 'V', VSL will contain the left Schur vectors.\n\
  *          Not referenced if JOBVSL = 'N'.\n\
  *\n\
  *  LDVSL   (input) INTEGER\n\
  *          The leading dimension of the matrix VSL. LDVSL >= 1, and\n\
  *          if JOBVSL = 'V', LDVSL >= N.\n\
  *\n\
  *  VSR     (output) COMPLEX*16 array, dimension (LDVSR,N)\n\
  *          If JOBVSR = 'V', VSR will contain the right Schur vectors.\n\
  *          Not referenced if JOBVSR = 'N'.\n\
  *\n\
  *  LDVSR   (input) INTEGER\n\
  *          The leading dimension of the matrix VSR. LDVSR >= 1, and\n\
  *          if JOBVSR = 'V', LDVSR >= N.\n\
  *\n\
  *  WORK    (workspace/output) COMPLEX*16 array, dimension (MAX(1,LWORK))\n\
  *          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.\n\
  *\n\
  *  LWORK   (input) INTEGER\n\
  *          The dimension of the array WORK.  LWORK >= max(1,2*N).\n\
  *          For good performance, LWORK must generally be larger.\n\
  *\n\
  *          If LWORK = -1, then a workspace query is assumed; the routine\n\
  *          only calculates the optimal size of the WORK array, returns\n\
  *          this value as the first entry of the WORK array, and no error\n\
  *          message related to LWORK is issued by XERBLA.\n\
  *\n\
  *  RWORK   (workspace) DOUBLE PRECISION array, dimension (8*N)\n\
  *\n\
  *  BWORK   (workspace) LOGICAL array, dimension (N)\n\
  *          Not referenced if SORT = 'N'.\n\
  *\n\
  *  INFO    (output) INTEGER\n\
  *          = 0:  successful exit\n\
  *          < 0:  if INFO = -i, the i-th argument had an illegal value.\n\
  *          =1,...,N:\n\
  *                The QZ iteration failed.  (A,B) are not in Schur\n\
  *                form, but ALPHA(j) and BETA(j) should be correct for\n\
  *                j=INFO+1,...,N.\n\
  *          > N:  =N+1: other than QZ iteration failed in ZHGEQZ\n\
  *                =N+2: after reordering, roundoff changed values of\n\
  *                      some complex eigenvalues so that leading\n\
  *                      eigenvalues in the Generalized Schur form no\n\
  *                      longer satisfy SELCTG=.TRUE.  This could also\n\
  *                      be caused due to scaling.\n\
  *                =N+3: reordering falied in ZTGSEN.\n\
  *\n\n\
  *  =====================================================================\n\
  *\n"
