Contents


NAME

     chegvx  -  compute  selected  eigenvalues,  and  optionally,
     eigenvectors  of  a  complex  generalized Hermitian-definite
     eigenproblem, of the form A*x=(lambda)*B*x, A*Bx=(lambda)*x,
     or B*A*x=(lambda)*x

SYNOPSIS

     SUBROUTINE CHEGVX(ITYPE, JOBZ, RANGE, UPLO, N, A, LDA, B, LDB, VL,
           VU, IL, IU, ABSTOL, M, W, Z, LDZ, WORK, LWORK, RWORK, IWORK,
           IFAIL, INFO)

     CHARACTER * 1 JOBZ, RANGE, UPLO
     COMPLEX A(LDA,*), B(LDB,*), Z(LDZ,*), WORK(*)
     INTEGER ITYPE, N, LDA, LDB, IL, IU, M, LDZ, LWORK, INFO
     INTEGER IWORK(*), IFAIL(*)
     REAL VL, VU, ABSTOL
     REAL W(*), RWORK(*)

     SUBROUTINE CHEGVX_64(ITYPE, JOBZ, RANGE, UPLO, N, A, LDA, B, LDB, VL,
           VU, IL, IU, ABSTOL, M, W, Z, LDZ, WORK, LWORK, RWORK, IWORK,
           IFAIL, INFO)

     CHARACTER * 1 JOBZ, RANGE, UPLO
     COMPLEX A(LDA,*), B(LDB,*), Z(LDZ,*), WORK(*)
     INTEGER*8 ITYPE, N, LDA, LDB, IL, IU, M, LDZ, LWORK, INFO
     INTEGER*8 IWORK(*), IFAIL(*)
     REAL VL, VU, ABSTOL
     REAL W(*), RWORK(*)

  F95 INTERFACE
     SUBROUTINE HEGVX(ITYPE, JOBZ, RANGE, UPLO, [N], A, [LDA], B, [LDB],
            VL, VU, IL, IU, ABSTOL, M, W, Z, [LDZ], [WORK], [LWORK], [RWORK],
            [IWORK], IFAIL, [INFO])

     CHARACTER(LEN=1) :: JOBZ, RANGE, UPLO
     COMPLEX, DIMENSION(:) :: WORK
     COMPLEX, DIMENSION(:,:) :: A, B, Z
     INTEGER :: ITYPE, N, LDA, LDB, IL, IU, M, LDZ, LWORK, INFO
     INTEGER, DIMENSION(:) :: IWORK, IFAIL
     REAL :: VL, VU, ABSTOL
     REAL, DIMENSION(:) :: W, RWORK

     SUBROUTINE HEGVX_64(ITYPE, JOBZ, RANGE, UPLO, [N], A, [LDA], B, [LDB],
            VL, VU, IL, IU, ABSTOL, M, W, Z, [LDZ], [WORK], [LWORK], [RWORK],
            [IWORK], IFAIL, [INFO])

     CHARACTER(LEN=1) :: JOBZ, RANGE, UPLO
     COMPLEX, DIMENSION(:) :: WORK
     COMPLEX, DIMENSION(:,:) :: A, B, Z
     INTEGER(8) :: ITYPE, N, LDA, LDB, IL,  IU,  M,  LDZ,  LWORK,
     INFO
     INTEGER(8), DIMENSION(:) :: IWORK, IFAIL
     REAL :: VL, VU, ABSTOL
     REAL, DIMENSION(:) :: W, RWORK

  C INTERFACE
     #include <sunperf.h>

     void chegvx(int itype, char jobz, char range, char uplo, int
               n, complex *a, int lda, complex *b, int ldb, float
               vl, float vu, int il, int iu,  float  abstol,  int
               *m, float *w, complex *z, int ldz, int *ifail, int
               *info);

     void chegvx_64(long itype, char jobz, char range, char uplo,
               long  n,  complex  *a,  long lda, complex *b, long
               ldb, float vl, float vu, long il, long  iu,  float
               abstol,  long  *m, float *w, complex *z, long ldz,
               long *ifail, long *info);

PURPOSE

     chegvx computes selected eigenvalues, and optionally, eigen-
     vectors  of  a complex generalized Hermitian-definite eigen-
     problem, of the form A*x=(lambda)*B*x,  A*Bx=(lambda)*x,  or
     B*A*x=(lambda)*x.   Here A and B are assumed to be Hermitian
     and B is also positive definite.  Eigenvalues and  eigenvec-
     tors  can be selected by specifying either a range of values
     or a range of indices for the desired eigenvalues.

ARGUMENTS

     ITYPE (input)
               Specifies the problem type to be solved:
               = 1:  A*x = (lambda)*B*x
               = 2:  A*B*x = (lambda)*x
               = 3:  B*A*x = (lambda)*x

     JOBZ (input)
               = 'N':  Compute eigenvalues only;
               = 'V':  Compute eigenvalues and eigenvectors.

     RANGE (input)
               = 'A': all eigenvalues will be found.
               = 'V': all eigenvalues in the  half-open  interval
               (VL,VU]  will  be found.  = 'I': the IL-th through
               IU-th eigenvalues will be found.

     UPLO (input)
               = 'U':  Upper triangles of A and B are stored;
               = 'L':  Lower triangles of A and B are stored.

     N (input) The order of the matrices A and B.  N >= 0.

     A (input/output)
               On entry, the Hermitian matrix A.  If UPLO =  'U',
               the leading N-by-N upper triangular part of A con-
               tains the upper triangular part of the  matrix  A.
               If UPLO = 'L', the leading N-by-N lower triangular
               part of A contains the lower  triangular  part  of
               the matrix A.

               On exit,  the lower triangle (if UPLO='L') or  the
               upper  triangle  (if UPLO='U') of A, including the
               diagonal, is destroyed.

     LDA (input)
               The leading dimension of  the  array  A.   LDA  >=
               max(1,N).

     B (input/output)
               On entry, the Hermitian matrix B.  If UPLO =  'U',
               the leading N-by-N upper triangular part of B con-
               tains the upper triangular part of the  matrix  B.
               If UPLO = 'L', the leading N-by-N lower triangular
               part of B contains the lower  triangular  part  of
               the matrix B.

               On exit, if INFO <= N, the part  of  B  containing
               the matrix is overwritten by the triangular factor
               U or L from the Cholesky factorization B =  U**H*U
               or B = L*L**H.

     LDB (input)
               The leading dimension of  the  array  B.   LDB  >=
               max(1,N).

     VL (input)
               If RANGE='V', the lower and upper  bounds  of  the
               interval  to be searched for eigenvalues. VL < VU.
               Not referenced if RANGE = 'A' or 'I'.
     VU (input)
               If RANGE='V', the lower and upper  bounds  of  the
               interval  to be searched for eigenvalues. VL < VU.
               Not referenced if RANGE = 'A' or 'I'.

     IL (input)
               If RANGE='I', the indices (in ascending order)  of
               the   smallest   and  largest  eigenvalues  to  be
               returned.  1 <= IL <= IU <= N, if N > 0;  IL  =  1
               and  IU  =  0 if N = 0.  Not referenced if RANGE =
               'A' or 'V'.

     IU (input)
               If RANGE='I', the indices (in ascending order)  of
               the   smallest   and  largest  eigenvalues  to  be
               returned.  1 <= IL <= IU <= N, if N > 0;  IL  =  1
               and  IU  =  0 if N = 0.  Not referenced if RANGE =
               'A' or 'V'.

     ABSTOL (input)
               The absolute error tolerance for the  eigenvalues.
               An approximate eigenvalue is accepted as converged
               when it is determined to lie in an interval  [a,b]
               of width less than or equal to

               ABSTOL + EPS *   max( |a|,|b| ) ,

               where EPS is the machine precision.  If ABSTOL  is
               less than or equal to zero, then  EPS*|T|  will be
               used in its place, where |T| is the 1-norm of  the
               tridiagonal  matrix obtained by reducing A to tri-
               diagonal form.

               Eigenvalues will be computed most accurately  when
               ABSTOL  is  set  to  twice the underflow threshold
               2*SLAMCH('S'), not zero.  If this routine  returns
               with INFO>0, indicating that some eigenvectors did
               not converge, try setting ABSTOL to 2*SLAMCH('S').

     M (output)
               The total number of eigenvalues found.  0 <= M  <=
               N.  If RANGE = 'A', M = N, and if RANGE = 'I', M =
               IU-IL+1.

     W (output)
               The first M elements contain the  selected  eigen-
               values in ascending order.
     Z (output)
               If JOBZ = 'N', then Z is not referenced.  If  JOBZ
               =  'V', then if INFO = 0, the first M columns of Z
               contain the orthonormal eigenvectors of the matrix
               A  corresponding to the selected eigenvalues, with
               the i-th column of Z holding the eigenvector asso-
               ciated with W(i).  The eigenvectors are normalized
               as follows:  if ITYPE = 1 or 2, Z**T*B*Z =  I;  if
               ITYPE = 3, Z**T*inv(B)*Z = I.

               If an eigenvector fails  to  converge,  then  that
               column  of  Z contains the latest approximation to
               the eigenvector, and the index of the  eigenvector
               is  returned in IFAIL.  Note: the user must ensure
               that at least max(1,M) columns are supplied in the
               array  Z;  if RANGE = 'V', the exact value of M is
               not known in advance and an upper  bound  must  be
               used.

     LDZ (input)
               The leading dimension of the array Z.  LDZ  >=  1,
               and if JOBZ = 'V', LDZ >= max(1,N).

     WORK (workspace/output)
               On exit, if INFO = 0, WORK(1) returns the  optimal
               LWORK.

     LWORK (input)
               The  length  of  the   array   WORK.    LWORK   >=
               max(1,2*N-1).   For  optimal  efficiency, LWORK >=
               (NB+1)*N, where NB is  the  blocksize  for  CHETRD
               returned by ILAENV.

               If LWORK = -1, then a workspace query is  assumed;
               the  routine  only  calculates the optimal size of
               the WORK array, returns this value  as  the  first
               entry  of  the  WORK  array,  and no error message
               related to LWORK is issued by XERBLA.

     RWORK (workspace)
               dimension(7*N)

     IWORK (workspace)
               dimension(5*N)

     IFAIL (output)
               If JOBZ = 'V', then if INFO = 0, the first M  ele-
               ments  of IFAIL are zero.  If INFO > 0, then IFAIL
               contains the  indices  of  the  eigenvectors  that
               failed  to converge.  If JOBZ = 'N', then IFAIL is
               not referenced.

     INFO (output)
               = 0:  successful exit
               < 0:  if INFO = -i, the i-th argument had an ille-
               gal value
               > 0:  CPOTRF or CHEEVX returned an error code:
               <= N:  if INFO = i, CHEEVX failed to  converge;  i
               eigenvectors  failed  to  converge.  Their indices
               are stored in array IFAIL.  > N:   if INFO =  N  +
               i,  for  1  <=  i  <= N, then the leading minor of
               order i of B is not positive definite.   The  fac-
               torization  of  B  could  not  be completed and no
               eigenvalues or eigenvectors were computed.

FURTHER DETAILS

     Based on contributions by
        Mark Fahey, Department of Mathematics, Univ. of Kentucky,
     USA