--- 
:name: cstedc
:md5sum: 0cb301e3ca0d09d7acb4ab12140db0e3
:category: :subroutine
:arguments: 
- compz: 
    :type: char
    :intent: input
- n: 
    :type: integer
    :intent: input
- d: 
    :type: real
    :intent: input/output
    :dims: 
    - n
- e: 
    :type: real
    :intent: input/output
    :dims: 
    - n-1
- z: 
    :type: complex
    :intent: input/output
    :dims: 
    - ldz
    - n
- ldz: 
    :type: integer
    :intent: input
- work: 
    :type: complex
    :intent: output
    :dims: 
    - MAX(1,lwork)
- lwork: 
    :type: integer
    :intent: input
    :option: true
    :default: "(lsame_(&compz,\"N\")||lsame_(&compz,\"I\")||n<=1) ? 1 : lsame_(&compz,\"V\") ? n*n : 0"
- rwork: 
    :type: real
    :intent: output
    :dims: 
    - MAX(1,lrwork)
- lrwork: 
    :type: integer
    :intent: input
    :option: true
    :default: "(lsame_(&compz,\"N\")||n<=1) ? 1 : lsame_(&compz,\"V\") ? 1+3*n+2*n*LG(n)+3*n*n : lsame_(&compz,\"I\") ? 1+4*n+2*n*n : 0"
- iwork: 
    :type: integer
    :intent: output
    :dims: 
    - MAX(1,liwork)
- liwork: 
    :type: integer
    :intent: input
    :option: true
    :default: "(lsame_(&compz,\"N\")||n<=1) ? 1 : lsame_(&compz,\"V\") ? 6+6*n+5*n*LG(n) : lsame_(&compz,\"I\") ? 3+5*n : 0"
- info: 
    :type: integer
    :intent: output
:substitutions: {}

:fortran_help: "      SUBROUTINE CSTEDC( COMPZ, N, D, E, Z, LDZ, WORK, LWORK, RWORK, LRWORK, IWORK, LIWORK, INFO )\n\n\
  *  Purpose\n\
  *  =======\n\
  *\n\
  *  CSTEDC computes all eigenvalues and, optionally, eigenvectors of a\n\
  *  symmetric tridiagonal matrix using the divide and conquer method.\n\
  *  The eigenvectors of a full or band complex Hermitian matrix can also\n\
  *  be found if CHETRD or CHPTRD or CHBTRD has been used to reduce this\n\
  *  matrix to tridiagonal form.\n\
  *\n\
  *  This code makes very mild assumptions about floating point\n\
  *  arithmetic. It will work on machines with a guard digit in\n\
  *  add/subtract, or on those binary machines without guard digits\n\
  *  which subtract like the Cray X-MP, Cray Y-MP, Cray C-90, or Cray-2.\n\
  *  It could conceivably fail on hexadecimal or decimal machines\n\
  *  without guard digits, but we know of none.  See SLAED3 for details.\n\
  *\n\n\
  *  Arguments\n\
  *  =========\n\
  *\n\
  *  COMPZ   (input) CHARACTER*1\n\
  *          = 'N':  Compute eigenvalues only.\n\
  *          = 'I':  Compute eigenvectors of tridiagonal matrix also.\n\
  *          = 'V':  Compute eigenvectors of original Hermitian matrix\n\
  *                  also.  On entry, Z contains the unitary matrix used\n\
  *                  to reduce the original matrix to tridiagonal form.\n\
  *\n\
  *  N       (input) INTEGER\n\
  *          The dimension of the symmetric tridiagonal matrix.  N >= 0.\n\
  *\n\
  *  D       (input/output) REAL array, dimension (N)\n\
  *          On entry, the diagonal elements of the tridiagonal matrix.\n\
  *          On exit, if INFO = 0, the eigenvalues in ascending order.\n\
  *\n\
  *  E       (input/output) REAL array, dimension (N-1)\n\
  *          On entry, the subdiagonal elements of the tridiagonal matrix.\n\
  *          On exit, E has been destroyed.\n\
  *\n\
  *  Z       (input/output) COMPLEX array, dimension (LDZ,N)\n\
  *          On entry, if COMPZ = 'V', then Z contains the unitary\n\
  *          matrix used in the reduction to tridiagonal form.\n\
  *          On exit, if INFO = 0, then if COMPZ = 'V', Z contains the\n\
  *          orthonormal eigenvectors of the original Hermitian matrix,\n\
  *          and if COMPZ = 'I', Z contains the orthonormal eigenvectors\n\
  *          of the symmetric tridiagonal matrix.\n\
  *          If  COMPZ = 'N', then Z is not referenced.\n\
  *\n\
  *  LDZ     (input) INTEGER\n\
  *          The leading dimension of the array Z.  LDZ >= 1.\n\
  *          If eigenvectors are desired, then LDZ >= max(1,N).\n\
  *\n\
  *  WORK    (workspace/output) COMPLEX    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.\n\
  *          If COMPZ = 'N' or 'I', or N <= 1, LWORK must be at least 1.\n\
  *          If COMPZ = 'V' and N > 1, LWORK must be at least N*N.\n\
  *          Note that for COMPZ = 'V', then if N is less than or\n\
  *          equal to the minimum divide size, usually 25, then LWORK need\n\
  *          only be 1.\n\
  *\n\
  *          If LWORK = -1, then a workspace query is assumed; the routine\n\
  *          only calculates the optimal sizes of the WORK, RWORK and\n\
  *          IWORK arrays, returns these values as the first entries of\n\
  *          the WORK, RWORK and IWORK arrays, and no error message\n\
  *          related to LWORK or LRWORK or LIWORK is issued by XERBLA.\n\
  *\n\
  *  RWORK   (workspace/output) REAL array, dimension (MAX(1,LRWORK))\n\
  *          On exit, if INFO = 0, RWORK(1) returns the optimal LRWORK.\n\
  *\n\
  *  LRWORK  (input) INTEGER\n\
  *          The dimension of the array RWORK.\n\
  *          If COMPZ = 'N' or N <= 1, LRWORK must be at least 1.\n\
  *          If COMPZ = 'V' and N > 1, LRWORK must be at least\n\
  *                         1 + 3*N + 2*N*lg N + 3*N**2 ,\n\
  *                         where lg( N ) = smallest integer k such\n\
  *                         that 2**k >= N.\n\
  *          If COMPZ = 'I' and N > 1, LRWORK must be at least\n\
  *                         1 + 4*N + 2*N**2 .\n\
  *          Note that for COMPZ = 'I' or 'V', then if N is less than or\n\
  *          equal to the minimum divide size, usually 25, then LRWORK\n\
  *          need only be max(1,2*(N-1)).\n\
  *\n\
  *          If LRWORK = -1, then a workspace query is assumed; the\n\
  *          routine only calculates the optimal sizes of the WORK, RWORK\n\
  *          and IWORK arrays, returns these values as the first entries\n\
  *          of the WORK, RWORK and IWORK arrays, and no error message\n\
  *          related to LWORK or LRWORK or LIWORK is issued by XERBLA.\n\
  *\n\
  *  IWORK   (workspace/output) INTEGER array, dimension (MAX(1,LIWORK))\n\
  *          On exit, if INFO = 0, IWORK(1) returns the optimal LIWORK.\n\
  *\n\
  *  LIWORK  (input) INTEGER\n\
  *          The dimension of the array IWORK.\n\
  *          If COMPZ = 'N' or N <= 1, LIWORK must be at least 1.\n\
  *          If COMPZ = 'V' or N > 1,  LIWORK must be at least\n\
  *                                    6 + 6*N + 5*N*lg N.\n\
  *          If COMPZ = 'I' or N > 1,  LIWORK must be at least\n\
  *                                    3 + 5*N .\n\
  *          Note that for COMPZ = 'I' or 'V', then if N is less than or\n\
  *          equal to the minimum divide size, usually 25, then LIWORK\n\
  *          need only be 1.\n\
  *\n\
  *          If LIWORK = -1, then a workspace query is assumed; the\n\
  *          routine only calculates the optimal sizes of the WORK, RWORK\n\
  *          and IWORK arrays, returns these values as the first entries\n\
  *          of the WORK, RWORK and IWORK arrays, and no error message\n\
  *          related to LWORK or LRWORK or LIWORK is issued by XERBLA.\n\
  *\n\
  *  INFO    (output) INTEGER\n\
  *          = 0:  successful exit.\n\
  *          < 0:  if INFO = -i, the i-th argument had an illegal value.\n\
  *          > 0:  The algorithm failed to compute an eigenvalue while\n\
  *                working on the submatrix lying in rows and columns\n\
  *                INFO/(N+1) through mod(INFO,N+1).\n\
  *\n\n\
  *  Further Details\n\
  *  ===============\n\
  *\n\
  *  Based on contributions by\n\
  *     Jeff Rutter, Computer Science Division, University of California\n\
  *     at Berkeley, USA\n\
  *\n\
  *  =====================================================================\n\
  *\n"
