SRC/cheevx_2stage.f(3)
π SRC/cheevx_2stage.f π
okay bestie, welcome to the LAPACK Library Functions Manual, and strap in, because this one is a baddie. It's a Fortran subroutine that does eigenvalues two-stage style and honestly? she's iconic. π
β¨ NAME β¨
SRC/cheevx_2stage.f β that's the file, that's the vibe, no notes. π
πΈ SYNOPSIS πΈ
Functions/Subroutines
So the whole function signature is long, like, unreasonably long, but we're not skipping a single character of it because every argument matters:
subroutine cheevx_2stage (jobz, range, uplo, n, a, lda, vl, vu, il, iu,
abstol, m, w, z, ldz, work, lwork, rwork, iwork, ifail, info)
and what she does is:
CHEEVX_2STAGE computes the eigenvalues and, optionally, the left and/or right eigenvectors for HE matrices
like, that's the whole personality. π
π¦ Function/Subroutine Documentation π¦
Here's the full signature with all the types spelled out, character for character:
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
π― Purpose
!>
!> 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.
!>
so yeah β she computes selected eigenvalues (not necessarily all of them, you get to pick π) plus optionally the eigenvectors, of a complex Hermitian matrix A, and she does it with the 2stage technique for the reduction to tridiagonal. Obsessed. β¨
π Parameters π
JOBZ
!> JOBZ is CHARACTER*1
!> = 'N': Compute eigenvalues only;
!> = 'V': Compute eigenvalues and eigenvectors.
!> Not available in this release.
!>
β οΈ heads up: 'V' (eigenvalues and eigenvectors) is not available in this release. so like, don't come for her when it doesn't work, she told you. π
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.
!>
three modes, pick your fighter:
'A'β all eigenvalues, the whole buffet π'V'β everything in the half-open interval(VL,VU](note the half-open, bestie, that bracket is doing WORK)'I'β theIL-th throughIU-th eigenvalues
UPLO
!> UPLO is CHARACTER*1
!> = 'U': Upper triangle of A is stored;
!> = 'L': Lower triangle of A is stored.
!>
which triangle of A you're storing. upper or lower, choose wisely. π¦
N
!> N is INTEGER
!> The order of the matrix A. N >= 0.
!>
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.
!>
π warning: on exit, that triangle of A β including the diagonal β is destroyed. gone. reduced to atoms. back up your matrix if you needed it, fr fr.
LDA
!> LDA is INTEGER
!> The leading dimension of the array A. LDA >= max(1,N).
!>
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'.
!>
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'.
!>
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'.
!>
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'.
!>
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.
!>
so the convergence test is literally the interval width ABSTOL + EPS * max( |a|,|b| ) where EPS is machine precision. if ABSTOL is <= 0, then EPS*|T| steps in instead, where |T| is the 1-norm of the tridiagonal matrix from reducing A to tridiagonal form.
π‘ patch notes from the devs: eigenvalues come out most accurately whenABSTOLis set to twice the underflow threshold2*SLAMCH('S'), not zero. and ifINFO>0(some eigenvectors didn't converge), try settingABSTOLto2*SLAMCH('S'). iykyk. π§
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.
!>
W
!> W is REAL array, dimension (N)
!> On normal exit, the first M elements contain the selected
!> eigenvalues in ascending order.
!>
ascending order, always, she's organized like that. πΈ
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.
!>
π the note is important, bestie: you have to make sure at leastmax(1,M)columns exist inZ. and ifRANGE = 'V'you can't even knowMin advance, so use an upper bound. main character responsibility. π«Ά
LDZ
!> LDZ is INTEGER
!> The leading dimension of the array Z. LDZ >= 1, and if
!> JOBZ = 'V', LDZ >= max(1,N).
!>
WORK
!> WORK is COMPLEX array, dimension (MAX(1,LWORK))
!> On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
!>
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.
!>
okay this is the big one so let's break it down:
LWORK >= 1whenN <= 1; otherwise...- if
JOBZ = 'N'andN > 1,LWORKmust be queried, andLWORK = MAX(1, 8*N, dimension)wheredimension = max(stage1,stage2) + (KD+1)*N + N= N*KD + N*max(KD+1,FACTOPTNB) + max(2*KD*KD, KD*NTHREADS) + (KD+1)*N + NwithKD= blocking size of the reduction,FACTOPTNB= the blocking used by the QR or LQ algorithm (usuallyFACTOPTNB=128is a good choice), andNTHREADS= number of threads used when openMP compilation is enabled, otherwise=1. - if
JOBZ = 'V'andN > 1,LWORKmust be queried β not yet available π - and if
LWORK = -1, it's a workspace query: the routine only computes the optimal size of theWORKarray, drops it as the first entry ofWORK, andXERBLAstays quiet aboutLWORK. no error message, no drama.
RWORK
!> RWORK is REAL array, dimension (7*N)
!>
IWORK
!> IWORK is INTEGER array, dimension (5*N)
!>
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.
!>
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.
!>
so INFO = 0 slay, INFO < 0 means argument -i was illegal π, and INFO > 0 means i eigenvectors didn't converge and their indices are chilling in IFAIL.
π Author π
- Univ. of Tennessee
- Univ. of California Berkeley
- Univ. of Colorado Denver
- NAG Ltd.
the whole squad, honestly. π«Ά
β Further Details β
!>
!> 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
!>
!>
three papers, three links, all the 2stage lore. go read them, i believe in you. πβ¨
Definition
Definition at line 303 of file cheevx_2stage.f.
π Author π
Generated automatically by Doxygen for LAPACK from the source code.
and that's the whole page, bestie!! π this beauty is from LAPACK, Version 3.12.0, and it lives at SRC/cheevx_2stage.f(3). go forth and compute those Hermitian eigenvalues, you've got this. π¦πΈπ
π¦ where this page comes from
- arch rolling: lapack-doc 3.12.1-2 Β· custom
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms