LAPACK  3.5.0
LAPACK: Linear Algebra PACKage
chegvx.f File Reference

Go to the source code of this file.

Functions/Subroutines

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)
 CHEGST More...
 

Function/Subroutine Documentation

subroutine chegvx ( integer  ITYPE,
character  JOBZ,
character  RANGE,
character  UPLO,
integer  N,
complex, dimension( lda, * )  A,
integer  LDA,
complex, dimension( ldb, * )  B,
integer  LDB,
real  VL,
real  VU,
integer  IL,
integer  IU,
real  ABSTOL,
integer  M,
real, dimension( * )  W,
complex, dimension( ldz, * )  Z,
integer  LDZ,
complex, dimension( * )  WORK,
integer  LWORK,
real, dimension( * )  RWORK,
integer, dimension( * )  IWORK,
integer, dimension( * )  IFAIL,
integer  INFO 
)

CHEGST

Download CHEGVX + dependencies [TGZ] [ZIP] [TXT]

Purpose:
 CHEGVX computes 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.  Here A and
 B are assumed to be Hermitian and B is also positive definite.
 Eigenvalues and eigenvectors can be selected by specifying either a
 range of values or a range of indices for the desired eigenvalues.
Parameters
[in]ITYPE
          ITYPE is INTEGER
          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
[in]JOBZ
          JOBZ is CHARACTER*1
          = 'N':  Compute eigenvalues only;
          = 'V':  Compute eigenvalues and eigenvectors.
[in]RANGE
          RANGE is CHARACTER*1
          = '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.
[in]UPLO
          UPLO is CHARACTER*1
          = 'U':  Upper triangles of A and B are stored;
          = 'L':  Lower triangles of A and B are stored.
[in]N
          N is INTEGER
          The order of the matrices A and B.  N >= 0.
[in,out]A
          A is COMPLEX array, dimension (LDA, N)
          On entry, the Hermitian matrix A.  If UPLO = 'U', the
          leading N-by-N upper triangular part of A contains 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.
[in]LDA
          LDA is INTEGER
          The leading dimension of the array A.  LDA >= max(1,N).
[in,out]B
          B is COMPLEX array, dimension (LDB, N)
          On entry, the Hermitian matrix B.  If UPLO = 'U', the
          leading N-by-N upper triangular part of B contains 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.
[in]LDB
          LDB is INTEGER
          The leading dimension of the array B.  LDB >= max(1,N).
[in]VL
          VL is REAL
[in]VU
          VU is REAL

          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'.
[in]IL
          IL is INTEGER
[in]IU
          IU is INTEGER

          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'.
[in]ABSTOL
          ABSTOL is REAL
          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 C to tridiagonal form, where C is the symmetric
          matrix of the standard symmetric problem to which the
          generalized problem is transformed.

          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').
[out]M
          M is INTEGER
          The total number of eigenvalues found.  0 <= M <= N.
          If RANGE = 'A', M = N, and if RANGE = 'I', M = IU-IL+1.
[out]W
          W is REAL array, dimension (N)
          The first M elements contain the selected
          eigenvalues in ascending order.
[out]Z
          Z is COMPLEX array, dimension (LDZ, max(1,M))
          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 associated 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.
[in]LDZ
          LDZ is INTEGER
          The leading dimension of the array Z.  LDZ >= 1, and if
          JOBZ = 'V', LDZ >= max(1,N).
[out]WORK
          WORK is COMPLEX array, dimension (MAX(1,LWORK))
          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
[in]LWORK
          LWORK is INTEGER
          The length of the array WORK.  LWORK >= max(1,2*N).
          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.
[out]RWORK
          RWORK is REAL array, dimension (7*N)
[out]IWORK
          IWORK is INTEGER array, dimension (5*N)
[out]IFAIL
          IFAIL is INTEGER array, dimension (N)
          If JOBZ = 'V', then if INFO = 0, the first M elements 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.
[out]INFO
          INFO is INTEGER
          = 0:  successful exit
          < 0:  if INFO = -i, the i-th argument had an illegal 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 factorization of B could not be completed and
                    no eigenvalues or eigenvectors were computed.
Author
Univ. of Tennessee
Univ. of California Berkeley
Univ. of Colorado Denver
NAG Ltd.
Date
November 2011
Contributors:
Mark Fahey, Department of Mathematics, Univ. of Kentucky, USA

Definition at line 300 of file chegvx.f.

300 *
301 * -- LAPACK driver routine (version 3.4.0) --
302 * -- LAPACK is a software package provided by Univ. of Tennessee, --
303 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
304 * November 2011
305 *
306 * .. Scalar Arguments ..
307  CHARACTER jobz, range, uplo
308  INTEGER il, info, itype, iu, lda, ldb, ldz, lwork, m, n
309  REAL abstol, vl, vu
310 * ..
311 * .. Array Arguments ..
312  INTEGER ifail( * ), iwork( * )
313  REAL rwork( * ), w( * )
314  COMPLEX a( lda, * ), b( ldb, * ), work( * ),
315  $ z( ldz, * )
316 * ..
317 *
318 * =====================================================================
319 *
320 * .. Parameters ..
321  COMPLEX cone
322  parameter( cone = ( 1.0e+0, 0.0e+0 ) )
323 * ..
324 * .. Local Scalars ..
325  LOGICAL alleig, indeig, lquery, upper, valeig, wantz
326  CHARACTER trans
327  INTEGER lwkopt, nb
328 * ..
329 * .. External Functions ..
330  LOGICAL lsame
331  INTEGER ilaenv
332  EXTERNAL ilaenv, lsame
333 * ..
334 * .. External Subroutines ..
335  EXTERNAL cheevx, chegst, cpotrf, ctrmm, ctrsm, xerbla
336 * ..
337 * .. Intrinsic Functions ..
338  INTRINSIC max, min
339 * ..
340 * .. Executable Statements ..
341 *
342 * Test the input parameters.
343 *
344  wantz = lsame( jobz, 'V' )
345  upper = lsame( uplo, 'U' )
346  alleig = lsame( range, 'A' )
347  valeig = lsame( range, 'V' )
348  indeig = lsame( range, 'I' )
349  lquery = ( lwork.EQ.-1 )
350 *
351  info = 0
352  IF( itype.LT.1 .OR. itype.GT.3 ) THEN
353  info = -1
354  ELSE IF( .NOT.( wantz .OR. lsame( jobz, 'N' ) ) ) THEN
355  info = -2
356  ELSE IF( .NOT.( alleig .OR. valeig .OR. indeig ) ) THEN
357  info = -3
358  ELSE IF( .NOT.( upper .OR. lsame( uplo, 'L' ) ) ) THEN
359  info = -4
360  ELSE IF( n.LT.0 ) THEN
361  info = -5
362  ELSE IF( lda.LT.max( 1, n ) ) THEN
363  info = -7
364  ELSE IF( ldb.LT.max( 1, n ) ) THEN
365  info = -9
366  ELSE
367  IF( valeig ) THEN
368  IF( n.GT.0 .AND. vu.LE.vl )
369  $ info = -11
370  ELSE IF( indeig ) THEN
371  IF( il.LT.1 .OR. il.GT.max( 1, n ) ) THEN
372  info = -12
373  ELSE IF( iu.LT.min( n, il ) .OR. iu.GT.n ) THEN
374  info = -13
375  END IF
376  END IF
377  END IF
378  IF (info.EQ.0) THEN
379  IF (ldz.LT.1 .OR. (wantz .AND. ldz.LT.n)) THEN
380  info = -18
381  END IF
382  END IF
383 *
384  IF( info.EQ.0 ) THEN
385  nb = ilaenv( 1, 'CHETRD', uplo, n, -1, -1, -1 )
386  lwkopt = max( 1, ( nb + 1 )*n )
387  work( 1 ) = lwkopt
388 *
389  IF( lwork.LT.max( 1, 2*n ) .AND. .NOT.lquery ) THEN
390  info = -20
391  END IF
392  END IF
393 *
394  IF( info.NE.0 ) THEN
395  CALL xerbla( 'CHEGVX', -info )
396  RETURN
397  ELSE IF( lquery ) THEN
398  RETURN
399  END IF
400 *
401 * Quick return if possible
402 *
403  m = 0
404  IF( n.EQ.0 ) THEN
405  RETURN
406  END IF
407 *
408 * Form a Cholesky factorization of B.
409 *
410  CALL cpotrf( uplo, n, b, ldb, info )
411  IF( info.NE.0 ) THEN
412  info = n + info
413  RETURN
414  END IF
415 *
416 * Transform problem to standard eigenvalue problem and solve.
417 *
418  CALL chegst( itype, uplo, n, a, lda, b, ldb, info )
419  CALL cheevx( jobz, range, uplo, n, a, lda, vl, vu, il, iu, abstol,
420  $ m, w, z, ldz, work, lwork, rwork, iwork, ifail,
421  $ info )
422 *
423  IF( wantz ) THEN
424 *
425 * Backtransform eigenvectors to the original problem.
426 *
427  IF( info.GT.0 )
428  $ m = info - 1
429  IF( itype.EQ.1 .OR. itype.EQ.2 ) THEN
430 *
431 * For A*x=(lambda)*B*x and A*B*x=(lambda)*x;
432 * backtransform eigenvectors: x = inv(L)**H*y or inv(U)*y
433 *
434  IF( upper ) THEN
435  trans = 'N'
436  ELSE
437  trans = 'C'
438  END IF
439 *
440  CALL ctrsm( 'Left', uplo, trans, 'Non-unit', n, m, cone, b,
441  $ ldb, z, ldz )
442 *
443  ELSE IF( itype.EQ.3 ) THEN
444 *
445 * For B*A*x=(lambda)*x;
446 * backtransform eigenvectors: x = L*y or U**H*y
447 *
448  IF( upper ) THEN
449  trans = 'C'
450  ELSE
451  trans = 'N'
452  END IF
453 *
454  CALL ctrmm( 'Left', uplo, trans, 'Non-unit', n, m, cone, b,
455  $ ldb, z, ldz )
456  END IF
457  END IF
458 *
459 * Set WORK(1) to optimal complex workspace size.
460 *
461  work( 1 ) = lwkopt
462 *
463  RETURN
464 *
465 * End of CHEGVX
466 *
subroutine ctrsm(SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA, A, LDA, B, LDB)
CTRSM
Definition: ctrsm.f:182
subroutine xerbla(SRNAME, INFO)
XERBLA
Definition: xerbla.f:62
subroutine ctrmm(SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA, A, LDA, B, LDB)
CTRMM
Definition: ctrmm.f:179
logical function lsame(CA, CB)
LSAME
Definition: lsame.f:55
subroutine chegst(ITYPE, UPLO, N, A, LDA, B, LDB, INFO)
CHEGST
Definition: chegst.f:129
subroutine cheevx(JOBZ, RANGE, UPLO, N, A, LDA, VL, VU, IL, IU, ABSTOL, M, W, Z, LDZ, WORK, LWORK, RWORK, IWORK, IFAIL, INFO)
CHEEVX computes the eigenvalues and, optionally, the left and/or right eigenvectors for HE matrices ...
Definition: cheevx.f:254
integer function ilaenv(ISPEC, NAME, OPTS, N1, N2, N3, N4)
Definition: tstiee.f:83
subroutine cpotrf(UPLO, N, A, LDA, INFO)
CPOTRF
Definition: cpotrf.f:109

Here is the call graph for this function:

Here is the caller graph for this function: