Functions | |
| subroutine | cheev (jobz, uplo, n, a, lda, w, work, lwork, rwork, info) |
| CHEEV computes the eigenvalues and, optionally, the left and/or right eigenvectors for HE matrices | |
| subroutine | cheev_2stage (jobz, uplo, n, a, lda, w, work, lwork, rwork, info) |
| CHEEV_2STAGE computes the eigenvalues and, optionally, the left and/or right eigenvectors for HE matrices | |
| subroutine | cheevd (jobz, uplo, n, a, lda, w, work, lwork, rwork, lrwork, iwork, liwork, info) |
| CHEEVD computes the eigenvalues and, optionally, the left and/or right eigenvectors for HE matrices | |
| subroutine | cheevd_2stage (jobz, uplo, n, a, lda, w, work, lwork, rwork, lrwork, iwork, liwork, info) |
| CHEEVD_2STAGE computes the eigenvalues and, optionally, the left and/or right eigenvectors for HE matrices | |
| subroutine | cheevr (jobz, range, uplo, n, a, lda, vl, vu, il, iu, abstol, m, w, z, ldz, isuppz, work, lwork, rwork, lrwork, iwork, liwork, info) |
| CHEEVR computes the eigenvalues and, optionally, the left and/or right eigenvectors for HE matrices | |
| subroutine | cheevr_2stage (jobz, range, uplo, n, a, lda, vl, vu, il, iu, abstol, m, w, z, ldz, isuppz, work, lwork, rwork, lrwork, iwork, liwork, info) |
| CHEEVR_2STAGE computes the eigenvalues and, optionally, the left and/or right eigenvectors for HE matrices | |
| 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 | |
| subroutine | cheevx_2stage (jobz, range, uplo, n, a, lda, vl, vu, il, iu, abstol, m, w, z, ldz, work, lwork, rwork, iwork, ifail, info) |
| CHEEVX_2STAGE computes the eigenvalues and, optionally, the left and/or right eigenvectors for HE matrices | |
| subroutine | chegv (itype, jobz, uplo, n, a, lda, b, ldb, w, work, lwork, rwork, info) |
| CHEGV | |
| subroutine | chegv_2stage (itype, jobz, uplo, n, a, lda, b, ldb, w, work, lwork, rwork, info) |
| CHEGV_2STAGE | |
| subroutine | chegvd (itype, jobz, uplo, n, a, lda, b, ldb, w, work, lwork, rwork, lrwork, iwork, liwork, info) |
| CHEGVD | |
| 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) |
| CHEGVX | |
This is the group of complex eigenvalue driver functions for HE matrices
| subroutine cheev | ( | character | jobz, |
| character | uplo, | ||
| integer | n, | ||
| complex, dimension( lda, * ) | a, | ||
| integer | lda, | ||
| real, dimension( * ) | w, | ||
| complex, dimension( * ) | work, | ||
| integer | lwork, | ||
| real, dimension( * ) | rwork, | ||
| integer | info ) |
CHEEV computes the eigenvalues and, optionally, the left and/or right eigenvectors for HE matrices
Download CHEEV + dependencies [TGZ] [ZIP] [TXT]
!> !> CHEEV computes all eigenvalues and, optionally, eigenvectors of a !> complex Hermitian matrix A. !>
| [in] | JOBZ | !> JOBZ is CHARACTER*1 !> = 'N': Compute eigenvalues only; !> = 'V': Compute eigenvalues and eigenvectors. !> |
| [in] | UPLO | !> UPLO is CHARACTER*1 !> = 'U': Upper triangle of A is stored; !> = 'L': Lower triangle of A is stored. !> |
| [in] | N | !> N is INTEGER !> The order of the matrix A. 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, if JOBZ = 'V', then if INFO = 0, A contains the !> orthonormal eigenvectors of the matrix A. !> If JOBZ = 'N', then 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). !> |
| [out] | W | !> W is REAL array, dimension (N) !> If INFO = 0, the eigenvalues in ascending order. !> |
| [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-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. !> |
| [out] | RWORK | !> RWORK is REAL array, dimension (max(1, 3*N-2)) !> |
| [out] | INFO | !> INFO is INTEGER !> = 0: successful exit !> < 0: if INFO = -i, the i-th argument had an illegal value !> > 0: if INFO = i, the algorithm failed to converge; i !> off-diagonal elements of an intermediate tridiagonal !> form did not converge to zero. !> |
Definition at line 138 of file cheev.f.
| subroutine cheev_2stage | ( | character | jobz, |
| character | uplo, | ||
| integer | n, | ||
| complex, dimension( lda, * ) | a, | ||
| integer | lda, | ||
| real, dimension( * ) | w, | ||
| complex, dimension( * ) | work, | ||
| integer | lwork, | ||
| real, dimension( * ) | rwork, | ||
| integer | info ) |
CHEEV_2STAGE computes the eigenvalues and, optionally, the left and/or right eigenvectors for HE matrices
Download CHEEV_2STAGE + dependencies [TGZ] [ZIP] [TXT]
!> !> CHEEV_2STAGE computes all eigenvalues and, optionally, eigenvectors of a !> complex Hermitian matrix A using the 2stage technique for !> the reduction to tridiagonal. !>
| [in] | JOBZ | !> JOBZ is CHARACTER*1 !> = 'N': Compute eigenvalues only; !> = 'V': Compute eigenvalues and eigenvectors. !> Not available in this release. !> |
| [in] | UPLO | !> UPLO is CHARACTER*1 !> = 'U': Upper triangle of A is stored; !> = 'L': Lower triangle of A is stored. !> |
| [in] | N | !> N is INTEGER !> The order of the matrix A. 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, if JOBZ = 'V', then if INFO = 0, A contains the !> orthonormal eigenvectors of the matrix A. !> If JOBZ = 'N', then 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). !> |
| [out] | W | !> W is REAL array, dimension (N) !> If INFO = 0, the eigenvalues in ascending order. !> |
| [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 >= 1, when N <= 1; !> otherwise !> If JOBZ = 'N' and N > 1, LWORK must be queried. !> LWORK = MAX(1, dimension) where !> dimension = max(stage1,stage2) + (KD+1)*N + N !> = N*KD + N*max(KD+1,FACTOPTNB) !> + max(2*KD*KD, KD*NTHREADS) !> + (KD+1)*N + N !> where KD is the blocking size of the reduction, !> FACTOPTNB is the blocking used by the QR or LQ !> algorithm, usually FACTOPTNB=128 is a good choice !> NTHREADS is the number of threads used when !> openMP compilation is enabled, otherwise =1. !> If JOBZ = 'V' and N > 1, LWORK must be queried. Not yet available !> !> 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 (max(1, 3*N-2)) !> |
| [out] | INFO | !> INFO is INTEGER !> = 0: successful exit !> < 0: if INFO = -i, the i-th argument had an illegal value !> > 0: if INFO = i, the algorithm failed to converge; i !> off-diagonal elements of an intermediate tridiagonal !> form did not converge to zero. !> |
!> !> All details about the 2stage techniques are available in: !> !> Azzam Haidar, Hatem Ltaief, and Jack Dongarra. !> Parallel reduction to condensed forms for symmetric eigenvalue problems !> using aggregated fine-grained and memory-aware kernels. In Proceedings !> of 2011 International Conference for High Performance Computing, !> Networking, Storage and Analysis (SC '11), New York, NY, USA, !> Article 8 , 11 pages. !> http://doi.acm.org/10.1145/2063384.2063394 !> !> A. Haidar, J. Kurzak, P. Luszczek, 2013. !> An improved parallel singular value algorithm and its implementation !> for multicore hardware, In Proceedings of 2013 International Conference !> for High Performance Computing, Networking, Storage and Analysis (SC '13). !> Denver, Colorado, USA, 2013. !> Article 90, 12 pages. !> http://doi.acm.org/10.1145/2503210.2503292 !> !> A. Haidar, R. Solca, S. Tomov, T. Schulthess and J. Dongarra. !> A novel hybrid CPU-GPU generalized eigensolver for electronic structure !> calculations based on fine-grained memory aware tasks. !> International Journal of High Performance Computing Applications. !> Volume 28 Issue 2, Pages 196-209, May 2014. !> http://hpc.sagepub.com/content/28/2/196 !> !>
Definition at line 187 of file cheev_2stage.f.
| subroutine cheevd | ( | character | jobz, |
| character | uplo, | ||
| integer | n, | ||
| complex, dimension( lda, * ) | a, | ||
| integer | lda, | ||
| real, dimension( * ) | w, | ||
| complex, dimension( * ) | work, | ||
| integer | lwork, | ||
| real, dimension( * ) | rwork, | ||
| integer | lrwork, | ||
| integer, dimension( * ) | iwork, | ||
| integer | liwork, | ||
| integer | info ) |
CHEEVD computes the eigenvalues and, optionally, the left and/or right eigenvectors for HE matrices
Download CHEEVD + dependencies [TGZ] [ZIP] [TXT]
!> !> CHEEVD computes all eigenvalues and, optionally, eigenvectors of a !> complex Hermitian matrix A. If eigenvectors are desired, it uses a !> divide and conquer algorithm. !> !> The divide and conquer algorithm makes very mild assumptions about !> floating point arithmetic. It will work on machines with a guard !> digit in add/subtract, or on those binary machines without guard !> digits which subtract like the Cray X-MP, Cray Y-MP, Cray C-90, or !> Cray-2. It could conceivably fail on hexadecimal or decimal machines !> without guard digits, but we know of none. !>
| [in] | JOBZ | !> JOBZ is CHARACTER*1 !> = 'N': Compute eigenvalues only; !> = 'V': Compute eigenvalues and eigenvectors. !> |
| [in] | UPLO | !> UPLO is CHARACTER*1 !> = 'U': Upper triangle of A is stored; !> = 'L': Lower triangle of A is stored. !> |
| [in] | N | !> N is INTEGER !> The order of the matrix A. 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, if JOBZ = 'V', then if INFO = 0, A contains the !> orthonormal eigenvectors of the matrix A. !> If JOBZ = 'N', then 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). !> |
| [out] | W | !> W is REAL array, dimension (N) !> If INFO = 0, the eigenvalues in ascending order. !> |
| [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. !> If N <= 1, LWORK must be at least 1. !> If JOBZ = 'N' and N > 1, LWORK must be at least N + 1. !> If JOBZ = 'V' and N > 1, LWORK must be at least 2*N + N**2. !> !> If LWORK = -1, then a workspace query is assumed; the routine !> only calculates the optimal sizes of the WORK, RWORK and !> IWORK arrays, returns these values as the first entries of !> the WORK, RWORK and IWORK arrays, and no error message !> related to LWORK or LRWORK or LIWORK is issued by XERBLA. !> |
| [out] | RWORK | !> RWORK is REAL array, !> dimension (LRWORK) !> On exit, if INFO = 0, RWORK(1) returns the optimal LRWORK. !> |
| [in] | LRWORK | !> LRWORK is INTEGER !> The dimension of the array RWORK. !> If N <= 1, LRWORK must be at least 1. !> If JOBZ = 'N' and N > 1, LRWORK must be at least N. !> If JOBZ = 'V' and N > 1, LRWORK must be at least !> 1 + 5*N + 2*N**2. !> !> If LRWORK = -1, then a workspace query is assumed; the !> routine only calculates the optimal sizes of the WORK, RWORK !> and IWORK arrays, returns these values as the first entries !> of the WORK, RWORK and IWORK arrays, and no error message !> related to LWORK or LRWORK or LIWORK is issued by XERBLA. !> |
| [out] | IWORK | !> IWORK is INTEGER array, dimension (MAX(1,LIWORK)) !> On exit, if INFO = 0, IWORK(1) returns the optimal LIWORK. !> |
| [in] | LIWORK | !> LIWORK is INTEGER !> The dimension of the array IWORK. !> If N <= 1, LIWORK must be at least 1. !> If JOBZ = 'N' and N > 1, LIWORK must be at least 1. !> If JOBZ = 'V' and N > 1, LIWORK must be at least 3 + 5*N. !> !> If LIWORK = -1, then a workspace query is assumed; the !> routine only calculates the optimal sizes of the WORK, RWORK !> and IWORK arrays, returns these values as the first entries !> of the WORK, RWORK and IWORK arrays, and no error message !> related to LWORK or LRWORK or LIWORK is issued by XERBLA. !> |
| [out] | INFO | !> INFO is INTEGER !> = 0: successful exit !> < 0: if INFO = -i, the i-th argument had an illegal value !> > 0: if INFO = i and JOBZ = 'N', then the algorithm failed !> to converge; i off-diagonal elements of an intermediate !> tridiagonal form did not converge to zero; !> if INFO = i and JOBZ = 'V', then the algorithm failed !> to compute an eigenvalue while working on the submatrix !> lying in rows and columns INFO/(N+1) through !> mod(INFO,N+1). !> |
Definition at line 203 of file cheevd.f.
| subroutine cheevd_2stage | ( | character | jobz, |
| character | uplo, | ||
| integer | n, | ||
| complex, dimension( lda, * ) | a, | ||
| integer | lda, | ||
| real, dimension( * ) | w, | ||
| complex, dimension( * ) | work, | ||
| integer | lwork, | ||
| real, dimension( * ) | rwork, | ||
| integer | lrwork, | ||
| integer, dimension( * ) | iwork, | ||
| integer | liwork, | ||
| integer | info ) |
CHEEVD_2STAGE computes the eigenvalues and, optionally, the left and/or right eigenvectors for HE matrices
Download CHEEVD_2STAGE + dependencies [TGZ] [ZIP] [TXT]
!> !> CHEEVD_2STAGE computes all eigenvalues and, optionally, eigenvectors of a !> complex Hermitian matrix A using the 2stage technique for !> the reduction to tridiagonal. If eigenvectors are desired, it uses a !> divide and conquer algorithm. !> !> The divide and conquer algorithm makes very mild assumptions about !> floating point arithmetic. It will work on machines with a guard !> digit in add/subtract, or on those binary machines without guard !> digits which subtract like the Cray X-MP, Cray Y-MP, Cray C-90, or !> Cray-2. It could conceivably fail on hexadecimal or decimal machines !> without guard digits, but we know of none. !>
| [in] | JOBZ | !> JOBZ is CHARACTER*1 !> = 'N': Compute eigenvalues only; !> = 'V': Compute eigenvalues and eigenvectors. !> Not available in this release. !> |
| [in] | UPLO | !> UPLO is CHARACTER*1 !> = 'U': Upper triangle of A is stored; !> = 'L': Lower triangle of A is stored. !> |
| [in] | N | !> N is INTEGER !> The order of the matrix A. 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, if JOBZ = 'V', then if INFO = 0, A contains the !> orthonormal eigenvectors of the matrix A. !> If JOBZ = 'N', then 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). !> |
| [out] | W | !> W is REAL array, dimension (N) !> If INFO = 0, the eigenvalues in ascending order. !> |
| [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 dimension of the array WORK. !> If N <= 1, LWORK must be at least 1. !> If JOBZ = 'N' and N > 1, LWORK must be queried. !> LWORK = MAX(1, dimension) where !> dimension = max(stage1,stage2) + (KD+1)*N + N+1 !> = N*KD + N*max(KD+1,FACTOPTNB) !> + max(2*KD*KD, KD*NTHREADS) !> + (KD+1)*N + N+1 !> where KD is the blocking size of the reduction, !> FACTOPTNB is the blocking used by the QR or LQ !> algorithm, usually FACTOPTNB=128 is a good choice !> NTHREADS is the number of threads used when !> openMP compilation is enabled, otherwise =1. !> If JOBZ = 'V' and N > 1, LWORK must be at least 2*N + N**2 !> !> If LWORK = -1, then a workspace query is assumed; the routine !> only calculates the optimal sizes of the WORK, RWORK and !> IWORK arrays, returns these values as the first entries of !> the WORK, RWORK and IWORK arrays, and no error message !> related to LWORK or LRWORK or LIWORK is issued by XERBLA. !> |
| [out] | RWORK | !> RWORK is REAL array, !> dimension (LRWORK) !> On exit, if INFO = 0, RWORK(1) returns the optimal LRWORK. !> |
| [in] | LRWORK | !> LRWORK is INTEGER !> The dimension of the array RWORK. !> If N <= 1, LRWORK must be at least 1. !> If JOBZ = 'N' and N > 1, LRWORK must be at least N. !> If JOBZ = 'V' and N > 1, LRWORK must be at least !> 1 + 5*N + 2*N**2. !> !> If LRWORK = -1, then a workspace query is assumed; the !> routine only calculates the optimal sizes of the WORK, RWORK !> and IWORK arrays, returns these values as the first entries !> of the WORK, RWORK and IWORK arrays, and no error message !> related to LWORK or LRWORK or LIWORK is issued by XERBLA. !> |
| [out] | IWORK | !> IWORK is INTEGER array, dimension (MAX(1,LIWORK)) !> On exit, if INFO = 0, IWORK(1) returns the optimal LIWORK. !> |
| [in] | LIWORK | !> LIWORK is INTEGER !> The dimension of the array IWORK. !> If N <= 1, LIWORK must be at least 1. !> If JOBZ = 'N' and N > 1, LIWORK must be at least 1. !> If JOBZ = 'V' and N > 1, LIWORK must be at least 3 + 5*N. !> !> If LIWORK = -1, then a workspace query is assumed; the !> routine only calculates the optimal sizes of the WORK, RWORK !> and IWORK arrays, returns these values as the first entries !> of the WORK, RWORK and IWORK arrays, and no error message !> related to LWORK or LRWORK or LIWORK is issued by XERBLA. !> |
| [out] | INFO | !> INFO is INTEGER !> = 0: successful exit !> < 0: if INFO = -i, the i-th argument had an illegal value !> > 0: if INFO = i and JOBZ = 'N', then the algorithm failed !> to converge; i off-diagonal elements of an intermediate !> tridiagonal form did not converge to zero; !> if INFO = i and JOBZ = 'V', then the algorithm failed !> to compute an eigenvalue while working on the submatrix !> lying in rows and columns INFO/(N+1) through !> mod(INFO,N+1). !> |
!> !> All details about the 2stage techniques are available in: !> !> Azzam Haidar, Hatem Ltaief, and Jack Dongarra. !> Parallel reduction to condensed forms for symmetric eigenvalue problems !> using aggregated fine-grained and memory-aware kernels. In Proceedings !> of 2011 International Conference for High Performance Computing, !> Networking, Storage and Analysis (SC '11), New York, NY, USA, !> Article 8 , 11 pages. !> http://doi.acm.org/10.1145/2063384.2063394 !> !> A. Haidar, J. Kurzak, P. Luszczek, 2013. !> An improved parallel singular value algorithm and its implementation !> for multicore hardware, In Proceedings of 2013 International Conference !> for High Performance Computing, Networking, Storage and Analysis (SC '13). !> Denver, Colorado, USA, 2013. !> Article 90, 12 pages. !> http://doi.acm.org/10.1145/2503210.2503292 !> !> A. Haidar, R. Solca, S. Tomov, T. Schulthess and J. Dongarra. !> A novel hybrid CPU-GPU generalized eigensolver for electronic structure !> calculations based on fine-grained memory aware tasks. !> International Journal of High Performance Computing Applications. !> Volume 28 Issue 2, Pages 196-209, May 2014. !> http://hpc.sagepub.com/content/28/2/196 !> !>
Definition at line 251 of file cheevd_2stage.f.
| subroutine cheevr | ( | character | jobz, |
| character | range, | ||
| character | uplo, | ||
| integer | n, | ||
| complex, dimension( lda, * ) | a, | ||
| integer | lda, | ||
| real | vl, | ||
| real | vu, | ||
| integer | il, | ||
| integer | iu, | ||
| real | abstol, | ||
| integer | m, | ||
| real, dimension( * ) | w, | ||
| complex, dimension( ldz, * ) | z, | ||
| integer | ldz, | ||
| integer, dimension( * ) | isuppz, | ||
| complex, dimension( * ) | work, | ||
| integer | lwork, | ||
| real, dimension( * ) | rwork, | ||
| integer | lrwork, | ||
| integer, dimension( * ) | iwork, | ||
| integer | liwork, | ||
| integer | info ) |
CHEEVR computes the eigenvalues and, optionally, the left and/or right eigenvectors for HE matrices
Download CHEEVR + dependencies [TGZ] [ZIP] [TXT]
!> !> CHEEVR computes selected eigenvalues and, optionally, eigenvectors !> of a complex Hermitian matrix A. Eigenvalues and eigenvectors can !> be selected by specifying either a range of values or a range of !> indices for the desired eigenvalues. !> !> CHEEVR first reduces the matrix A to tridiagonal form T with a call !> to CHETRD. Then, whenever possible, CHEEVR calls CSTEMR to compute !> the eigenspectrum using Relatively Robust Representations. CSTEMR !> computes eigenvalues by the dqds algorithm, while orthogonal !> eigenvectors are computed from various L D L^T representations !> (also known as Relatively Robust Representations). Gram-Schmidt !> orthogonalization is avoided as far as possible. More specifically, !> the various steps of the algorithm are as follows. !> !> For each unreduced block (submatrix) of T, !> (a) Compute T - sigma I = L D L^T, so that L and D !> define all the wanted eigenvalues to high relative accuracy. !> This means that small relative changes in the entries of D and L !> cause only small relative changes in the eigenvalues and !> eigenvectors. The standard (unfactored) representation of the !> tridiagonal matrix T does not have this property in general. !> (b) Compute the eigenvalues to suitable accuracy. !> If the eigenvectors are desired, the algorithm attains full !> accuracy of the computed eigenvalues only right before !> the corresponding vectors have to be computed, see steps c) and d). !> (c) For each cluster of close eigenvalues, select a new !> shift close to the cluster, find a new factorization, and refine !> the shifted eigenvalues to suitable accuracy. !> (d) For each eigenvalue with a large enough relative separation compute !> the corresponding eigenvector by forming a rank revealing twisted !> factorization. Go back to (c) for any clusters that remain. !> !> The desired accuracy of the output can be specified by the input !> parameter ABSTOL. !> !> For more details, see CSTEMR's documentation and: !> - Inderjit S. Dhillon and Beresford N. Parlett: !> Linear Algebra and its Applications, 387(1), pp. 1-28, August 2004. !> - Inderjit Dhillon and Beresford Parlett: SIAM Journal on Matrix Analysis and Applications, Vol. 25, !> 2004. Also LAPACK Working Note 154. !> - Inderjit Dhillon: , !> Computer Science Division Technical Report No. UCB/CSD-97-971, !> UC Berkeley, May 1997. !> !> !> Note 1 : CHEEVR calls CSTEMR when the full spectrum is requested !> on machines which conform to the ieee-754 floating point standard. !> CHEEVR calls SSTEBZ and CSTEIN on non-ieee machines and !> when partial spectrum requests are made. !> !> Normal execution of CSTEMR may create NaNs and infinities and !> hence may abort due to a floating point exception in environments !> which do not handle NaNs and infinities in the ieee standard default !> manner. !>
| [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. !> For RANGE = 'V' or 'I' and IU - IL < N - 1, SSTEBZ and !> CSTEIN are called !> |
| [in] | UPLO | !> UPLO is CHARACTER*1 !> = 'U': Upper triangle of A is stored; !> = 'L': Lower triangle of A is stored. !> |
| [in] | N | !> N is INTEGER !> The order of the matrix A. 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] | VL | !> VL is REAL !> If RANGE='V', the lower bound of the interval to !> be searched for eigenvalues. VL < VU. !> Not referenced if RANGE = 'A' or 'I'. !> |
| [in] | VU | !> VU is REAL !> If RANGE='V', the upper bound of the interval to !> be searched for eigenvalues. VL < VU. !> Not referenced if RANGE = 'A' or 'I'. !> |
| [in] | IL | !> IL is INTEGER !> If RANGE='I', the index of the !> smallest eigenvalue 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] | IU | !> IU is INTEGER !> If RANGE='I', the index of the !> largest eigenvalue 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 A to tridiagonal form. !> !> See by Demmel and !> Kahan, LAPACK Working Note #3. !> !> If high relative accuracy is important, set ABSTOL to !> SLAMCH( 'Safe minimum' ). Doing so will guarantee that !> eigenvalues are computed to high relative accuracy when !> possible in future releases. The current code does not !> make any guarantees about high relative accuracy, but !> future releases will. See J. Barlow and J. Demmel, !> , LAPACK Working Note #7, for a discussion !> of which matrices define their eigenvalues to high relative !> accuracy. !> |
| [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 = '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). !> If JOBZ = 'N', then Z is not referenced. !> 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] | ISUPPZ | !> ISUPPZ is INTEGER array, dimension ( 2*max(1,M) ) !> The support of the eigenvectors in Z, i.e., the indices !> indicating the nonzero elements in Z. The i-th eigenvector !> is nonzero only in elements ISUPPZ( 2*i-1 ) through !> ISUPPZ( 2*i ). This is an output of CSTEMR (tridiagonal !> matrix). The support of the eigenvectors of A is typically !> 1:N because of the unitary transformations applied by CUNMTR. !> Implemented only for RANGE = 'A' or 'I' and IU - IL = N - 1 !> |
| [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 max of the blocksize for CHETRD and for !> CUNMTR as returned by ILAENV. !> !> If LWORK = -1, then a workspace query is assumed; the routine !> only calculates the optimal sizes of the WORK, RWORK and !> IWORK arrays, returns these values as the first entries of !> the WORK, RWORK and IWORK arrays, and no error message !> related to LWORK or LRWORK or LIWORK is issued by XERBLA. !> |
| [out] | RWORK | !> RWORK is REAL array, dimension (MAX(1,LRWORK)) !> On exit, if INFO = 0, RWORK(1) returns the optimal !> (and minimal) LRWORK. !> |
| [in] | LRWORK | !> LRWORK is INTEGER !> The length of the array RWORK. LRWORK >= max(1,24*N). !> !> If LRWORK = -1, then a workspace query is assumed; the !> routine only calculates the optimal sizes of the WORK, RWORK !> and IWORK arrays, returns these values as the first entries !> of the WORK, RWORK and IWORK arrays, and no error message !> related to LWORK or LRWORK or LIWORK is issued by XERBLA. !> |
| [out] | IWORK | !> IWORK is INTEGER array, dimension (MAX(1,LIWORK)) !> On exit, if INFO = 0, IWORK(1) returns the optimal !> (and minimal) LIWORK. !> |
| [in] | LIWORK | !> LIWORK is INTEGER !> The dimension of the array IWORK. LIWORK >= max(1,10*N). !> !> If LIWORK = -1, then a workspace query is assumed; the !> routine only calculates the optimal sizes of the WORK, RWORK !> and IWORK arrays, returns these values as the first entries !> of the WORK, RWORK and IWORK arrays, and no error message !> related to LWORK or LRWORK or LIWORK is issued by XERBLA. !> |
| [out] | INFO | !> INFO is INTEGER !> = 0: successful exit !> < 0: if INFO = -i, the i-th argument had an illegal value !> > 0: Internal error !> |
Definition at line 354 of file cheevr.f.
| subroutine cheevr_2stage | ( | character | jobz, |
| character | range, | ||
| character | uplo, | ||
| integer | n, | ||
| complex, dimension( lda, * ) | a, | ||
| integer | lda, | ||
| real | vl, | ||
| real | vu, | ||
| integer | il, | ||
| integer | iu, | ||
| real | abstol, | ||
| integer | m, | ||
| real, dimension( * ) | w, | ||
| complex, dimension( ldz, * ) | z, | ||
| integer | ldz, | ||
| integer, dimension( * ) | isuppz, | ||
| complex, dimension( * ) | work, | ||
| integer | lwork, | ||
| real, dimension( * ) | rwork, | ||
| integer | lrwork, | ||
| integer, dimension( * ) | iwork, | ||
| integer | liwork, | ||
| integer | info ) |
CHEEVR_2STAGE computes the eigenvalues and, optionally, the left and/or right eigenvectors for HE matrices
Download CHEEVR_2STAGE + dependencies [TGZ] [ZIP] [TXT]
!> !> CHEEVR_2STAGE computes selected eigenvalues and, optionally, eigenvectors !> of a complex Hermitian matrix A using the 2stage technique for !> the reduction to tridiagonal. Eigenvalues and eigenvectors can !> be selected by specifying either a range of values or a range of !> indices for the desired eigenvalues. !> !> CHEEVR_2STAGE first reduces the matrix A to tridiagonal form T with a call !> to CHETRD. Then, whenever possible, CHEEVR_2STAGE calls CSTEMR to compute !> eigenspectrum using Relatively Robust Representations. CSTEMR !> computes eigenvalues by the dqds algorithm, while orthogonal !> eigenvectors are computed from various L D L^T representations !> (also known as Relatively Robust Representations). Gram-Schmidt !> orthogonalization is avoided as far as possible. More specifically, !> the various steps of the algorithm are as follows. !> !> For each unreduced block (submatrix) of T, !> (a) Compute T - sigma I = L D L^T, so that L and D !> define all the wanted eigenvalues to high relative accuracy. !> This means that small relative changes in the entries of D and L !> cause only small relative changes in the eigenvalues and !> eigenvectors. The standard (unfactored) representation of the !> tridiagonal matrix T does not have this property in general. !> (b) Compute the eigenvalues to suitable accuracy. !> If the eigenvectors are desired, the algorithm attains full !> accuracy of the computed eigenvalues only right before !> the corresponding vectors have to be computed, see steps c) and d). !> (c) For each cluster of close eigenvalues, select a new !> shift close to the cluster, find a new factorization, and refine !> the shifted eigenvalues to suitable accuracy. !> (d) For each eigenvalue with a large enough relative separation compute !> the corresponding eigenvector by forming a rank revealing twisted !> factorization. Go back to (c) for any clusters that remain. !> !> The desired accuracy of the output can be specified by the input !> parameter ABSTOL. !> !> For more details, see CSTEMR's documentation and: !> - Inderjit S. Dhillon and Beresford N. Parlett: !> Linear Algebra and its Applications, 387(1), pp. 1-28, August 2004. !> - Inderjit Dhillon and Beresford Parlett: SIAM Journal on Matrix Analysis and Applications, Vol. 25, !> 2004. Also LAPACK Working Note 154. !> - Inderjit Dhillon: , !> Computer Science Division Technical Report No. UCB/CSD-97-971, !> UC Berkeley, May 1997. !> !> !> Note 1 : CHEEVR_2STAGE calls CSTEMR when the full spectrum is requested !> on machines which conform to the ieee-754 floating point standard. !> CHEEVR_2STAGE calls SSTEBZ and CSTEIN on non-ieee machines and !> when partial spectrum requests are made. !> !> Normal execution of CSTEMR may create NaNs and infinities and !> hence may abort due to a floating point exception in environments !> which do not handle NaNs and infinities in the ieee standard default !> manner. !>
| [in] | JOBZ | !> JOBZ is CHARACTER*1 !> = 'N': Compute eigenvalues only; !> = 'V': Compute eigenvalues and eigenvectors. !> Not available in this release. !> |
| [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. !> For RANGE = 'V' or 'I' and IU - IL < N - 1, SSTEBZ and !> CSTEIN are called !> |
| [in] | UPLO | !> UPLO is CHARACTER*1 !> = 'U': Upper triangle of A is stored; !> = 'L': Lower triangle of A is stored. !> |
| [in] | N | !> N is INTEGER !> The order of the matrix A. 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] | VL | !> VL is REAL !> If RANGE='V', the lower bound of the interval to !> be searched for eigenvalues. VL < VU. !> Not referenced if RANGE = 'A' or 'I'. !> |
| [in] | VU | !> VU is REAL !> If RANGE='V', the upper bound of the interval to !> be searched for eigenvalues. VL < VU. !> Not referenced if RANGE = 'A' or 'I'. !> |
| [in] | IL | !> IL is INTEGER !> If RANGE='I', the index of the !> smallest eigenvalue 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] | IU | !> IU is INTEGER !> If RANGE='I', the index of the !> largest eigenvalue 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 A to tridiagonal form. !> !> See by Demmel and !> Kahan, LAPACK Working Note #3. !> !> If high relative accuracy is important, set ABSTOL to !> SLAMCH( 'Safe minimum' ). Doing so will guarantee that !> eigenvalues are computed to high relative accuracy when !> possible in future releases. The current code does not !> make any guarantees about high relative accuracy, but !> future releases will. See J. Barlow and J. Demmel, !> , LAPACK Working Note #7, for a discussion !> of which matrices define their eigenvalues to high relative !> accuracy. !> |
| [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 = '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). !> If JOBZ = 'N', then Z is not referenced. !> 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] | ISUPPZ | !> ISUPPZ is INTEGER array, dimension ( 2*max(1,M) ) !> The support of the eigenvectors in Z, i.e., the indices !> indicating the nonzero elements in Z. The i-th eigenvector !> is nonzero only in elements ISUPPZ( 2*i-1 ) through !> ISUPPZ( 2*i ). This is an output of CSTEMR (tridiagonal !> matrix). The support of the eigenvectors of A is typically !> 1:N because of the unitary transformations applied by CUNMTR. !> Implemented only for RANGE = 'A' or 'I' and IU - IL = N - 1 !> |
| [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 dimension of the array WORK. !> If JOBZ = 'N' and N > 1, LWORK must be queried. !> LWORK = MAX(1, 26*N, dimension) where !> dimension = max(stage1,stage2) + (KD+1)*N + N !> = N*KD + N*max(KD+1,FACTOPTNB) !> + max(2*KD*KD, KD*NTHREADS) !> + (KD+1)*N + N !> where KD is the blocking size of the reduction, !> FACTOPTNB is the blocking used by the QR or LQ !> algorithm, usually FACTOPTNB=128 is a good choice !> NTHREADS is the number of threads used when !> openMP compilation is enabled, otherwise =1. !> If JOBZ = 'V' and N > 1, LWORK must be queried. Not yet available !> !> If LWORK = -1, then a workspace query is assumed; the routine !> only calculates the optimal sizes of the WORK, RWORK and !> IWORK arrays, returns these values as the first entries of !> the WORK, RWORK and IWORK arrays, and no error message !> related to LWORK or LRWORK or LIWORK is issued by XERBLA. !> |
| [out] | RWORK | !> RWORK is REAL array, dimension (MAX(1,LRWORK)) !> On exit, if INFO = 0, RWORK(1) returns the optimal !> (and minimal) LRWORK. !> |
| [in] | LRWORK | !> LRWORK is INTEGER !> The length of the array RWORK. LRWORK >= max(1,24*N). !> !> If LRWORK = -1, then a workspace query is assumed; the !> routine only calculates the optimal sizes of the WORK, RWORK !> and IWORK arrays, returns these values as the first entries !> of the WORK, RWORK and IWORK arrays, and no error message !> related to LWORK or LRWORK or LIWORK is issued by XERBLA. !> |
| [out] | IWORK | !> IWORK is INTEGER array, dimension (MAX(1,LIWORK)) !> On exit, if INFO = 0, IWORK(1) returns the optimal !> (and minimal) LIWORK. !> |
| [in] | LIWORK | !> LIWORK is INTEGER !> The dimension of the array IWORK. LIWORK >= max(1,10*N). !> !> If LIWORK = -1, then a workspace query is assumed; the !> routine only calculates the optimal sizes of the WORK, RWORK !> and IWORK arrays, returns these values as the first entries !> of the WORK, RWORK and IWORK arrays, and no error message !> related to LWORK or LRWORK or LIWORK is issued by XERBLA. !> |
| [out] | INFO | !> INFO is INTEGER !> = 0: successful exit !> < 0: if INFO = -i, the i-th argument had an illegal value !> > 0: Internal error !> |
!> !> All details about the 2stage techniques are available in: !> !> Azzam Haidar, Hatem Ltaief, and Jack Dongarra. !> Parallel reduction to condensed forms for symmetric eigenvalue problems !> using aggregated fine-grained and memory-aware kernels. In Proceedings !> of 2011 International Conference for High Performance Computing, !> Networking, Storage and Analysis (SC '11), New York, NY, USA, !> Article 8 , 11 pages. !> http://doi.acm.org/10.1145/2063384.2063394 !> !> A. Haidar, J. Kurzak, P. Luszczek, 2013. !> An improved parallel singular value algorithm and its implementation !> for multicore hardware, In Proceedings of 2013 International Conference !> for High Performance Computing, Networking, Storage and Analysis (SC '13). !> Denver, Colorado, USA, 2013. !> Article 90, 12 pages. !> http://doi.acm.org/10.1145/2503210.2503292 !> !> A. Haidar, R. Solca, S. Tomov, T. Schulthess and J. Dongarra. !> A novel hybrid CPU-GPU generalized eigensolver for electronic structure !> calculations based on fine-grained memory aware tasks. !> International Journal of High Performance Computing Applications. !> Volume 28 Issue 2, Pages 196-209, May 2014. !> http://hpc.sagepub.com/content/28/2/196 !> !>
Definition at line 402 of file cheevr_2stage.f.
| subroutine cheevx | ( | character | jobz, |
| character | range, | ||
| character | uplo, | ||
| integer | n, | ||
| complex, dimension( lda, * ) | a, | ||
| integer | lda, | ||
| 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 ) |
CHEEVX computes the eigenvalues and, optionally, the left and/or right eigenvectors for HE matrices
Download CHEEVX + dependencies [TGZ] [ZIP] [TXT]
!> !> CHEEVX computes selected eigenvalues and, optionally, eigenvectors !> of a complex Hermitian matrix A. Eigenvalues and eigenvectors can !> be selected by specifying either a range of values or a range of !> indices for the desired eigenvalues. !>
| [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 triangle of A is stored; !> = 'L': Lower triangle of A is stored. !> |
| [in] | N | !> N is INTEGER !> The order of the matrix A. 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] | VL | !> VL is REAL !> If RANGE='V', the lower bound of the interval to !> be searched for eigenvalues. VL < VU. !> Not referenced if RANGE = 'A' or 'I'. !> |
| [in] | VU | !> VU is REAL !> If RANGE='V', the upper bound of the interval to !> be searched for eigenvalues. VL < VU. !> Not referenced if RANGE = 'A' or 'I'. !> |
| [in] | IL | !> IL is INTEGER !> If RANGE='I', the index of the !> smallest eigenvalue 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] | IU | !> IU is INTEGER !> If RANGE='I', the index of the !> largest eigenvalue 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 A to tridiagonal 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').
!>
!> See by Demmel and
!> Kahan, LAPACK Working Note #3.
!> |
| [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) !> On normal exit, the first M elements contain the selected !> eigenvalues in ascending order. !> |
| [out] | Z | !> Z is COMPLEX array, dimension (LDZ, max(1,M)) !> 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). !> 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. !> If JOBZ = 'N', then Z is not referenced. !> 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 >= 1, when N <= 1; !> otherwise 2*N. !> For optimal efficiency, LWORK >= (NB+1)*N, !> where NB is the max of the blocksize for CHETRD and for !> CUNMTR as 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: if INFO = i, then i eigenvectors failed to converge. !> Their indices are stored in array IFAIL. !> |
Definition at line 256 of file cheevx.f.
| subroutine cheevx_2stage | ( | character | jobz, |
| character | range, | ||
| character | uplo, | ||
| integer | n, | ||
| complex, dimension( lda, * ) | a, | ||
| integer | lda, | ||
| 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 ) |
CHEEVX_2STAGE computes the eigenvalues and, optionally, the left and/or right eigenvectors for HE matrices
Download CHEEVX_2STAGE + dependencies [TGZ] [ZIP] [TXT]
!> !> CHEEVX_2STAGE computes selected eigenvalues and, optionally, eigenvectors !> of a complex Hermitian matrix A using the 2stage technique for !> the reduction to tridiagonal. Eigenvalues and eigenvectors can !> be selected by specifying either a range of values or a range of !> indices for the desired eigenvalues. !>
| [in] | JOBZ | !> JOBZ is CHARACTER*1 !> = 'N': Compute eigenvalues only; !> = 'V': Compute eigenvalues and eigenvectors. !> Not available in this release. !> |
| [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 triangle of A is stored; !> = 'L': Lower triangle of A is stored. !> |
| [in] | N | !> N is INTEGER !> The order of the matrix A. 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] | VL | !> VL is REAL !> If RANGE='V', the lower bound of the interval to !> be searched for eigenvalues. VL < VU. !> Not referenced if RANGE = 'A' or 'I'. !> |
| [in] | VU | !> VU is REAL !> If RANGE='V', the upper bound of the interval to !> be searched for eigenvalues. VL < VU. !> Not referenced if RANGE = 'A' or 'I'. !> |
| [in] | IL | !> IL is INTEGER !> If RANGE='I', the index of the !> smallest eigenvalue 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] | IU | !> IU is INTEGER !> If RANGE='I', the index of the !> largest eigenvalue 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 A to tridiagonal 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').
!>
!> See by Demmel and
!> Kahan, LAPACK Working Note #3.
!> |
| [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) !> On normal exit, the first M elements contain the selected !> eigenvalues in ascending order. !> |
| [out] | Z | !> Z is COMPLEX array, dimension (LDZ, max(1,M)) !> 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). !> 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. !> If JOBZ = 'N', then Z is not referenced. !> 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 >= 1, when N <= 1; !> otherwise !> If JOBZ = 'N' and N > 1, LWORK must be queried. !> LWORK = MAX(1, 8*N, dimension) where !> dimension = max(stage1,stage2) + (KD+1)*N + N !> = N*KD + N*max(KD+1,FACTOPTNB) !> + max(2*KD*KD, KD*NTHREADS) !> + (KD+1)*N + N !> where KD is the blocking size of the reduction, !> FACTOPTNB is the blocking used by the QR or LQ !> algorithm, usually FACTOPTNB=128 is a good choice !> NTHREADS is the number of threads used when !> openMP compilation is enabled, otherwise =1. !> If JOBZ = 'V' and N > 1, LWORK must be queried. Not yet available !> !> 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: if INFO = i, then i eigenvectors failed to converge. !> Their indices are stored in array IFAIL. !> |
!> !> All details about the 2stage techniques are available in: !> !> Azzam Haidar, Hatem Ltaief, and Jack Dongarra. !> Parallel reduction to condensed forms for symmetric eigenvalue problems !> using aggregated fine-grained and memory-aware kernels. In Proceedings !> of 2011 International Conference for High Performance Computing, !> Networking, Storage and Analysis (SC '11), New York, NY, USA, !> Article 8 , 11 pages. !> http://doi.acm.org/10.1145/2063384.2063394 !> !> A. Haidar, J. Kurzak, P. Luszczek, 2013. !> An improved parallel singular value algorithm and its implementation !> for multicore hardware, In Proceedings of 2013 International Conference !> for High Performance Computing, Networking, Storage and Analysis (SC '13). !> Denver, Colorado, USA, 2013. !> Article 90, 12 pages. !> http://doi.acm.org/10.1145/2503210.2503292 !> !> A. Haidar, R. Solca, S. Tomov, T. Schulthess and J. Dongarra. !> A novel hybrid CPU-GPU generalized eigensolver for electronic structure !> calculations based on fine-grained memory aware tasks. !> International Journal of High Performance Computing Applications. !> Volume 28 Issue 2, Pages 196-209, May 2014. !> http://hpc.sagepub.com/content/28/2/196 !> !>
Definition at line 303 of file cheevx_2stage.f.
| subroutine chegv | ( | integer | itype, |
| character | jobz, | ||
| character | uplo, | ||
| integer | n, | ||
| complex, dimension( lda, * ) | a, | ||
| integer | lda, | ||
| complex, dimension( ldb, * ) | b, | ||
| integer | ldb, | ||
| real, dimension( * ) | w, | ||
| complex, dimension( * ) | work, | ||
| integer | lwork, | ||
| real, dimension( * ) | rwork, | ||
| integer | info ) |
CHEGV
Download CHEGV + dependencies [TGZ] [ZIP] [TXT]
!> !> CHEGV computes all the eigenvalues, and optionally, the 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. !>
| [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] | 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, if JOBZ = 'V', then if INFO = 0, A contains the !> matrix Z of eigenvectors. The eigenvectors are normalized !> as follows: !> if ITYPE = 1 or 2, Z**H*B*Z = I; !> if ITYPE = 3, Z**H*inv(B)*Z = I. !> If JOBZ = 'N', then on exit the upper triangle (if UPLO='U') !> or the lower triangle (if UPLO='L') 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 positive definite 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). !> |
| [out] | W | !> W is REAL array, dimension (N) !> If INFO = 0, the eigenvalues in ascending order. !> |
| [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-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. !> |
| [out] | RWORK | !> RWORK is REAL array, dimension (max(1, 3*N-2)) !> |
| [out] | INFO | !> INFO is INTEGER !> = 0: successful exit !> < 0: if INFO = -i, the i-th argument had an illegal value !> > 0: CPOTRF or CHEEV returned an error code: !> <= N: if INFO = i, CHEEV failed to converge; !> i off-diagonal elements of an intermediate !> tridiagonal form did not converge to zero; !> > 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. !> |
Definition at line 179 of file chegv.f.
| subroutine chegv_2stage | ( | integer | itype, |
| character | jobz, | ||
| character | uplo, | ||
| integer | n, | ||
| complex, dimension( lda, * ) | a, | ||
| integer | lda, | ||
| complex, dimension( ldb, * ) | b, | ||
| integer | ldb, | ||
| real, dimension( * ) | w, | ||
| complex, dimension( * ) | work, | ||
| integer | lwork, | ||
| real, dimension( * ) | rwork, | ||
| integer | info ) |
CHEGV_2STAGE
Download CHEGV_2STAGE + dependencies [TGZ] [ZIP] [TXT]
!> !> CHEGV_2STAGE computes all the eigenvalues, and optionally, the 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. !> This routine use the 2stage technique for the reduction to tridiagonal !> which showed higher performance on recent architecture and for large !> sizes N>2000. !>
| [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. !> Not available in this release. !> |
| [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, if JOBZ = 'V', then if INFO = 0, A contains the !> matrix Z of eigenvectors. The eigenvectors are normalized !> as follows: !> if ITYPE = 1 or 2, Z**H*B*Z = I; !> if ITYPE = 3, Z**H*inv(B)*Z = I. !> If JOBZ = 'N', then on exit the upper triangle (if UPLO='U') !> or the lower triangle (if UPLO='L') 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 positive definite 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). !> |
| [out] | W | !> W is REAL array, dimension (N) !> If INFO = 0, the eigenvalues in ascending order. !> |
| [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 >= 1, when N <= 1; !> otherwise !> If JOBZ = 'N' and N > 1, LWORK must be queried. !> LWORK = MAX(1, dimension) where !> dimension = max(stage1,stage2) + (KD+1)*N + N !> = N*KD + N*max(KD+1,FACTOPTNB) !> + max(2*KD*KD, KD*NTHREADS) !> + (KD+1)*N + N !> where KD is the blocking size of the reduction, !> FACTOPTNB is the blocking used by the QR or LQ !> algorithm, usually FACTOPTNB=128 is a good choice !> NTHREADS is the number of threads used when !> openMP compilation is enabled, otherwise =1. !> If JOBZ = 'V' and N > 1, LWORK must be queried. Not yet available !> !> 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 (max(1, 3*N-2)) !> |
| [out] | INFO | !> INFO is INTEGER !> = 0: successful exit !> < 0: if INFO = -i, the i-th argument had an illegal value !> > 0: CPOTRF or CHEEV returned an error code: !> <= N: if INFO = i, CHEEV failed to converge; !> i off-diagonal elements of an intermediate !> tridiagonal form did not converge to zero; !> > 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. !> |
!> !> All details about the 2stage techniques are available in: !> !> Azzam Haidar, Hatem Ltaief, and Jack Dongarra. !> Parallel reduction to condensed forms for symmetric eigenvalue problems !> using aggregated fine-grained and memory-aware kernels. In Proceedings !> of 2011 International Conference for High Performance Computing, !> Networking, Storage and Analysis (SC '11), New York, NY, USA, !> Article 8 , 11 pages. !> http://doi.acm.org/10.1145/2063384.2063394 !> !> A. Haidar, J. Kurzak, P. Luszczek, 2013. !> An improved parallel singular value algorithm and its implementation !> for multicore hardware, In Proceedings of 2013 International Conference !> for High Performance Computing, Networking, Storage and Analysis (SC '13). !> Denver, Colorado, USA, 2013. !> Article 90, 12 pages. !> http://doi.acm.org/10.1145/2503210.2503292 !> !> A. Haidar, R. Solca, S. Tomov, T. Schulthess and J. Dongarra. !> A novel hybrid CPU-GPU generalized eigensolver for electronic structure !> calculations based on fine-grained memory aware tasks. !> International Journal of High Performance Computing Applications. !> Volume 28 Issue 2, Pages 196-209, May 2014. !> http://hpc.sagepub.com/content/28/2/196 !> !>
Definition at line 230 of file chegv_2stage.f.
| subroutine chegvd | ( | integer | itype, |
| character | jobz, | ||
| character | uplo, | ||
| integer | n, | ||
| complex, dimension( lda, * ) | a, | ||
| integer | lda, | ||
| complex, dimension( ldb, * ) | b, | ||
| integer | ldb, | ||
| real, dimension( * ) | w, | ||
| complex, dimension( * ) | work, | ||
| integer | lwork, | ||
| real, dimension( * ) | rwork, | ||
| integer | lrwork, | ||
| integer, dimension( * ) | iwork, | ||
| integer | liwork, | ||
| integer | info ) |
CHEGVD
Download CHEGVD + dependencies [TGZ] [ZIP] [TXT]
!> !> CHEGVD computes all the eigenvalues, and optionally, the 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. !> If eigenvectors are desired, it uses a divide and conquer algorithm. !> !> The divide and conquer algorithm makes very mild assumptions about !> floating point arithmetic. It will work on machines with a guard !> digit in add/subtract, or on those binary machines without guard !> digits which subtract like the Cray X-MP, Cray Y-MP, Cray C-90, or !> Cray-2. It could conceivably fail on hexadecimal or decimal machines !> without guard digits, but we know of none. !>
| [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] | 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, if JOBZ = 'V', then if INFO = 0, A contains the !> matrix Z of eigenvectors. The eigenvectors are normalized !> as follows: !> if ITYPE = 1 or 2, Z**H*B*Z = I; !> if ITYPE = 3, Z**H*inv(B)*Z = I. !> If JOBZ = 'N', then on exit the upper triangle (if UPLO='U') !> or the lower triangle (if UPLO='L') 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). !> |
| [out] | W | !> W is REAL array, dimension (N) !> If INFO = 0, the eigenvalues in ascending order. !> |
| [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. !> If N <= 1, LWORK >= 1. !> If JOBZ = 'N' and N > 1, LWORK >= N + 1. !> If JOBZ = 'V' and N > 1, LWORK >= 2*N + N**2. !> !> If LWORK = -1, then a workspace query is assumed; the routine !> only calculates the optimal sizes of the WORK, RWORK and !> IWORK arrays, returns these values as the first entries of !> the WORK, RWORK and IWORK arrays, and no error message !> related to LWORK or LRWORK or LIWORK is issued by XERBLA. !> |
| [out] | RWORK | !> RWORK is REAL array, dimension (MAX(1,LRWORK)) !> On exit, if INFO = 0, RWORK(1) returns the optimal LRWORK. !> |
| [in] | LRWORK | !> LRWORK is INTEGER !> The dimension of the array RWORK. !> If N <= 1, LRWORK >= 1. !> If JOBZ = 'N' and N > 1, LRWORK >= N. !> If JOBZ = 'V' and N > 1, LRWORK >= 1 + 5*N + 2*N**2. !> !> If LRWORK = -1, then a workspace query is assumed; the !> routine only calculates the optimal sizes of the WORK, RWORK !> and IWORK arrays, returns these values as the first entries !> of the WORK, RWORK and IWORK arrays, and no error message !> related to LWORK or LRWORK or LIWORK is issued by XERBLA. !> |
| [out] | IWORK | !> IWORK is INTEGER array, dimension (MAX(1,LIWORK)) !> On exit, if INFO = 0, IWORK(1) returns the optimal LIWORK. !> |
| [in] | LIWORK | !> LIWORK is INTEGER !> The dimension of the array IWORK. !> If N <= 1, LIWORK >= 1. !> If JOBZ = 'N' and N > 1, LIWORK >= 1. !> If JOBZ = 'V' and N > 1, LIWORK >= 3 + 5*N. !> !> If LIWORK = -1, then a workspace query is assumed; the !> routine only calculates the optimal sizes of the WORK, RWORK !> and IWORK arrays, returns these values as the first entries !> of the WORK, RWORK and IWORK arrays, and no error message !> related to LWORK or LRWORK or LIWORK is issued by XERBLA. !> |
| [out] | INFO | !> INFO is INTEGER !> = 0: successful exit !> < 0: if INFO = -i, the i-th argument had an illegal value !> > 0: CPOTRF or CHEEVD returned an error code: !> <= N: if INFO = i and JOBZ = 'N', then the algorithm !> failed to converge; i off-diagonal elements of an !> intermediate tridiagonal form did not converge to !> zero; !> if INFO = i and JOBZ = 'V', then the algorithm !> failed to compute an eigenvalue while working on !> the submatrix lying in rows and columns INFO/(N+1) !> through mod(INFO,N+1); !> > 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. !> |
!> !> Modified so that no backsubstitution is performed if CHEEVD fails to !> converge (NEIG in old code could be greater than N causing out of !> bounds reference to A - reported by Ralf Meyer). Also corrected the !> description of INFO and the test on ITYPE. Sven, 16 Feb 05. !>
Definition at line 247 of file chegvd.f.
| 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 ) |
CHEGVX
Download CHEGVX + dependencies [TGZ] [ZIP] [TXT]
!> !> 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. !>
| [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 !> !> If RANGE='V', the lower bound of the interval to !> be searched for eigenvalues. VL < VU. !> Not referenced if RANGE = 'A' or 'I'. !> |
| [in] | VU | !> VU is REAL !> !> If RANGE='V', the upper bound of the interval to !> be searched for eigenvalues. VL < VU. !> Not referenced if RANGE = 'A' or 'I'. !> |
| [in] | IL | !> IL is INTEGER !> !> If RANGE='I', the index of the !> smallest eigenvalue 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] | IU | !> IU is INTEGER !> !> If RANGE='I', the index of the !> largest eigenvalue 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. !> |
Definition at line 304 of file chegvx.f.