Contents


NAME

     ssygvx  -  compute  selected  eigenvalues,  and  optionally,
     eigenvectors of a real generalized symmetric-definite eigen-
     problem, of the form A*x=(lambda)*B*x,  A*Bx=(lambda)*x,  or
     B*A*x=(lambda)*x

SYNOPSIS

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

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

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

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

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

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

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

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

  C INTERFACE
     #include <sunperf.h>

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

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

PURPOSE

     ssygvx computes selected eigenvalues, and optionally, eigen-
     vectors  of a real generalized symmetric-definite eigenprob-
     lem, 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 symmetric
     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 triangle of A and B are stored;
               = 'L':  Lower triangle of A and B are stored.

     N (input) The order of the matrix pencil (A,B).  N >= 0.

     A (input/output)
               On entry, the symmetric 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 symmetric 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**T*U
               or B = L*L**T.

     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)
               See the description of VL.
     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)
               See the description of IL.

     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*DLAMCH('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)
               On normal exit, the first M elements  contain  the
               selected eigenvalues in ascending order.

     Z (input) 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)
               On exit, if INFO = 0, WORK(1) returns the  optimal
               LWORK.

     LWORK (input)
               The  length  of  the   array   WORK.    LWORK   >=
               max(1,8*N).   For  optimal  efficiency,  LWORK  >=
               (NB+3)*N, where NB is  the  blocksize  for  SSYTRD
               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.

     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:  SPOTRF or SSYEVX returned an error code:
               <= N:  if INFO = i, SSYEVX 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