doubleSYeigen(3)

πŸ“¦
version 3.11.0 Β· 2 versions
, in debian bookworm

πŸ’– doubleSYeigen(3) β€” the LAPACK glow-up πŸ’–

okay so this is a page from the LAPACK manual, bestie, and it's literally the whole squad of double-precision eigenvalue driver routines for SY matrices. It's giving ✨main character energy✨ for symmetric eigenproblems. Sit down, grab a strawberry πŸ“, we're doing this.


✨ NAME ✨

doubleSYeigen β€” double πŸ’…


πŸ¦‹ SYNOPSIS πŸ¦‹

Functions

  • subroutine dsyev (JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, INFO) β€” DSYEV computes the eigenvalues and, optionally, the left and/or right eigenvectors for SY matrices
  • subroutine dsyev_2stage (JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, INFO) β€” DSYEV_2STAGE computes the eigenvalues and, optionally, the left and/or right eigenvectors for SY matrices
  • subroutine dsyevd (JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, IWORK, LIWORK, INFO) β€” DSYEVD computes the eigenvalues and, optionally, the left and/or right eigenvectors for SY matrices
  • subroutine dsyevd_2stage (JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, IWORK, LIWORK, INFO) β€” DSYEVD_2STAGE computes the eigenvalues and, optionally, the left and/or right eigenvectors for SY matrices
  • subroutine dsyevr (JOBZ, RANGE, UPLO, N, A, LDA, VL, VU, IL, IU, ABSTOL, M, W, Z, LDZ, ISUPPZ, WORK, LWORK, IWORK, LIWORK, INFO) β€” DSYEVR computes the eigenvalues and, optionally, the left and/or right eigenvectors for SY matrices
  • subroutine dsyevr_2stage (JOBZ, RANGE, UPLO, N, A, LDA, VL, VU, IL, IU, ABSTOL, M, W, Z, LDZ, ISUPPZ, WORK, LWORK, IWORK, LIWORK, INFO) β€” DSYEVR_2STAGE computes the eigenvalues and, optionally, the left and/or right eigenvectors for SY matrices
  • subroutine dsyevx (JOBZ, RANGE, UPLO, N, A, LDA, VL, VU, IL, IU, ABSTOL, M, W, Z, LDZ, WORK, LWORK, IWORK, IFAIL, INFO) β€” DSYEVX computes the eigenvalues and, optionally, the left and/or right eigenvectors for SY matrices
  • subroutine dsyevx_2stage (JOBZ, RANGE, UPLO, N, A, LDA, VL, VU, IL, IU, ABSTOL, M, W, Z, LDZ, WORK, LWORK, IWORK, IFAIL, INFO) β€” DSYEVX_2STAGE computes the eigenvalues and, optionally, the left and/or right eigenvectors for SY matrices
  • subroutine dsygv (ITYPE, JOBZ, UPLO, N, A, LDA, B, LDB, W, WORK, LWORK, INFO) β€” DSYGV
  • subroutine dsygv_2stage (ITYPE, JOBZ, UPLO, N, A, LDA, B, LDB, W, WORK, LWORK, INFO) β€” DSYGV_2STAGE
  • subroutine dsygvd (ITYPE, JOBZ, UPLO, N, A, LDA, B, LDB, W, WORK, LWORK, IWORK, LIWORK, INFO) β€” DSYGVD
  • subroutine dsygvx (ITYPE, JOBZ, RANGE, UPLO, N, A, LDA, B, LDB, VL, VU, IL, IU, ABSTOL, M, W, Z, LDZ, WORK, LWORK, IWORK, IFAIL, INFO) β€” DSYGVX

πŸ’… Detailed Description πŸ’…

This is the group of double eigenvalue driver functions for SY matrices. That's it, that's the whole vibe. ✨


πŸ“š Function Documentation πŸ“š

πŸŽ€ subroutine dsyev πŸŽ€

subroutine dsyev (character JOBZ, character UPLO, integer N, double precision, dimension( lda, * ) A, integer LDA, double precision, dimension( * ) W, double precision, dimension( * ) WORK, integer LWORK, integer INFO)

DSYEV computes the eigenvalues and, optionally, the left and/or right eigenvectors for SY matrices. πŸ¦‹

Purpose:

DSYEV computes all eigenvalues and, optionally, eigenvectors of a
real symmetric matrix A.

No cap, that's the whole job. πŸ’–

Parameters

  • JOBZ
JOBZ is CHARACTER*1
= 'N':  Compute eigenvalues only;
= 'V':  Compute eigenvalues and eigenvectors.
  • UPLO
UPLO is CHARACTER*1
= 'U':  Upper triangle of A is stored;
= 'L':  Lower triangle of A is stored.
  • N
N is INTEGER
The order of the matrix A.  N >= 0.
  • A
A is DOUBLE PRECISION array, dimension (LDA, N)
On entry, the symmetric 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.
heads up bestie β€” if JOBZ = 'N', that triangle of A (diagonal included 😭) is destroyed on exit. gone. periodt.
  • LDA
LDA is INTEGER
The leading dimension of the array A.  LDA >= max(1,N).
  • W
W is DOUBLE PRECISION array, dimension (N)
If INFO = 0, the eigenvalues in ascending order.
  • WORK
WORK is DOUBLE PRECISION 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 >= max(1,3*N-1).
For optimal efficiency, LWORK >= (NB+2)*N,
where NB is the blocksize for DSYTRD 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.

iykyk β€” setting LWORK = -1 is the little cheat code for "hey just tell me how much space you want". 🌸

  • 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.

Author

  • Univ. of Tennessee
  • Univ. of California Berkeley
  • Univ. of Colorado Denver
  • NAG Ltd.

πŸ¦‹ subroutine dsyev_2stage πŸ¦‹

subroutine dsyev_2stage (character JOBZ, character UPLO, integer N, double precision, dimension( lda, * ) A, integer LDA, double precision, dimension( * ) W, double precision, dimension( * ) WORK, integer LWORK, integer INFO)

DSYEV_2STAGE computes the eigenvalues and, optionally, the left and/or right eigenvectors for SY matrices. It's the two-stage glow-up, bestie. ✨

Purpose:

DSYEV_2STAGE computes all eigenvalues and, optionally, eigenvectors of a
real symmetric matrix A using the 2stage technique for
the reduction to tridiagonal.

Parameters

  • JOBZ
JOBZ is CHARACTER*1
= 'N':  Compute eigenvalues only;
= 'V':  Compute eigenvalues and eigenvectors.
        Not available in this release.
😭 not available in this release for 'V', bestie. don't come for me, it's literally what it says.
  • UPLO
UPLO is CHARACTER*1
= 'U':  Upper triangle of A is stored;
= 'L':  Lower triangle of A is stored.
  • N
N is INTEGER
The order of the matrix A.  N >= 0.
  • A
A is DOUBLE PRECISION array, dimension (LDA, N)
On entry, the symmetric 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.
same warning, same energy πŸ’€ β€” JOBZ = 'N' means that triangle of A plus the diagonal gets destroyed.
  • LDA
LDA is INTEGER
The leading dimension of the array A.  LDA >= max(1,N).
  • W
W is DOUBLE PRECISION array, dimension (N)
If INFO = 0, the eigenvalues in ascending order.
  • WORK
WORK is DOUBLE PRECISION array, dimension 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, dimension) where
                         dimension = max(stage1,stage2) + (KD+1)*N + 2*N
                                   = N*KD + N*max(KD+1,FACTOPTNB)
                                     + max(2*KD*KD, KD*NTHREADS)
                                     + (KD+1)*N + 2*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.

ngl this LWORK formula is a whole meal. πŸ“ also note: if JOBZ = 'V' and N > 1, LWORK must be queried, and it's Not yet available.

  • 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.

Author

  • Univ. of Tennessee
  • Univ. of California Berkeley
  • Univ. of Colorado Denver
  • NAG Ltd.

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

the receipts, bestie πŸ“š β€” all three of them, cited and everything. πŸ’œ

✨ dsyevd β€” the moment we've all been waiting for πŸ’…

subroutine dsyevd (character JOBZ, character UPLO, integer N, double
    precision, dimension( lda, * ) A, integer LDA, double precision,
    dimension( * ) W, double precision, dimension( * ) WORK, integer LWORK,
    integer, dimension( * ) IWORK, integer LIWORK, integer INFO)

okay so bestie, listen β€” DSYEVD computes the eigenvalues and, optionally, the left and/or right eigenvectors for SY matrices. main character behavior honestly.


πŸŽ€ Purpose

DSYEVD computes all eigenvalues and, optionally, eigenvectors of a real symmetric matrix A. If eigenvectors are desired, it uses a divide and conquer algorithm. it's giving ✨big brain✨ energy, fr.

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. no cap. 😭

Because of large use of BLAS of level 3, DSYEVD needs N**2 more workspace than DSYEVX. she's a little extra but she's worth it πŸ’…


🌸 Parameters

  • JOBZ β€” JOBZ is CHARACTER*1
    • = 'N': Compute eigenvalues only;
    • = 'V': Compute eigenvalues and eigenvectors.
  • UPLO β€” UPLO is CHARACTER*1
    • = 'U': Upper triangle of A is stored;
    • = 'L': Lower triangle of A is stored.
  • N β€” N is INTEGER. The order of the matrix A. N >= 0.
  • A β€” A is DOUBLE PRECISION array, dimension (LDA, N)
    • On entry, the symmetric 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. πŸ’€ she really said "you won't be needing this anymore."
  • LDA β€” LDA is INTEGER. The leading dimension of the array A. LDA >= max(1,N).
  • W β€” W is DOUBLE PRECISION array, dimension (N). If INFO = 0, the eigenvalues in ascending order. bestie they come out sorted, we love a tidy queen πŸ‘‘
  • WORK β€” WORK is DOUBLE PRECISION array, dimension (LWORK). On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
  • 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 at least 2*N+1.
    • If JOBZ = 'V' and N > 1, LWORK must be at least 1 + 6*N + 2*N**2.
    • If LWORK = -1, then a workspace query is assumed; the routine only calculates the optimal sizes of the WORK and IWORK arrays, returns these values as the first entries of the WORK and IWORK arrays, and no error message related to LWORK or LIWORK is issued by XERBLA.
  • IWORK β€” IWORK is INTEGER array, dimension (MAX(1,LIWORK)). On exit, if INFO = 0, IWORK(1) returns the optimal LIWORK.
  • 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 and IWORK arrays, returns these values as the first entries of the WORK and IWORK arrays, and no error message related to LWORK or LIWORK is issued by XERBLA.
  • 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).

πŸ’– Author

  • Univ. of Tennessee
  • Univ. of California Berkeley
  • Univ. of Colorado Denver
  • NAG Ltd.

🫢 Contributors:

  • Jeff Rutter, Computer Science Division, University of California at Berkeley, USA
  • Modified by Francoise Tisseur, University of Tennessee
  • Modified description of INFO. Sven, 16 Feb 05.

πŸ¦‹ dsyevd_2stage β€” she got a glow-up ✨

subroutine dsyevd_2stage (character JOBZ, character UPLO, integer N, double
    precision, dimension( lda, * ) A, integer LDA, double precision,
    dimension( * ) W, double precision, dimension( * ) WORK, integer LWORK,
    integer, dimension( * ) IWORK, integer LIWORK, integer INFO)

DSYEVD_2STAGE computes the eigenvalues and, optionally, the left and/or right eigenvectors for SY matrices β€” but make it two stage, iykyk.


🌈 Purpose

DSYEVD_2STAGE computes all eigenvalues and, optionally, eigenvectors of a real symmetric 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. same disclaimer bestie, it's iconic at this point πŸ’€


🌸 Parameters

  • JOBZ β€” JOBZ is CHARACTER*1
    • = 'N': Compute eigenvalues only;
    • = 'V': Compute eigenvalues and eigenvectors. Not available in this release. 😭 yeah she's still cooking, give her a sec.
  • UPLO β€” UPLO is CHARACTER*1
    • = 'U': Upper triangle of A is stored;
    • = 'L': Lower triangle of A is stored.
  • N β€” N is INTEGER. The order of the matrix A. N >= 0.
  • A β€” A is DOUBLE PRECISION array, dimension (LDA, N)
    • On entry, the symmetric 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. same deal, bestie, she takes what she needs πŸ’…
  • LDA β€” LDA is INTEGER. The leading dimension of the array A. LDA >= max(1,N).
  • W β€” W is DOUBLE PRECISION array, dimension (N). If INFO = 0, the eigenvalues in ascending order.
  • WORK β€” WORK is DOUBLE PRECISION array, dimension (LWORK). On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
  • 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. fr fr, no guessing here:
LWORK = MAX(1, dimension) where
dimension = max(stage1,stage2) + (KD+1)*N + 2*N+1
          = N*KD + N*max(KD+1,FACTOPTNB)
            + max(2*KD*KD, KD*NTHREADS)
            + (KD+1)*N + 2*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 1 + 6*N + 2*N**2.
  • If LWORK = -1, then a workspace query is assumed; the routine only calculates the optimal sizes of the WORK and IWORK arrays, returns these values as the first entries of the WORK and IWORK arrays, and no error message related to LWORK or LIWORK is issued by XERBLA.
  • IWORK β€” IWORK is INTEGER array, dimension (MAX(1,LIWORK)). On exit, if INFO = 0, IWORK(1) returns the optimal LIWORK.
  • 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 and IWORK arrays, returns these values as the first entries of the WORK and IWORK arrays, and no error message related to LWORK or LIWORK is issued by XERBLA.
  • 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).

πŸ’œ Author

  • Univ. of Tennessee

Contributors

  • Jeff Rutter, Computer Science Division, University of California at Berkeley, USA
  • Modified by Francoise Tisseur, University of Tennessee
  • Modified description of INFO. Sven, 16 Feb 05.

πŸ“š Further Details πŸ“š

Okay bestie, all the lore about the 2stage techniques lives in these, no cap:

  • 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

🌟 subroutine dsyevr 🌟

subroutine dsyevr (character JOBZ, character RANGE, character UPLO, integer
    N, double precision, dimension( lda, * ) A, integer LDA, double
    precision VL, double precision VU, integer IL, integer IU, double
    precision ABSTOL, integer M, double precision, dimension( * ) W, double
    precision, dimension( ldz, * ) Z, integer LDZ, integer, dimension( * )
    ISUPPZ, double precision, dimension( * ) WORK, integer LWORK, integer,
    dimension( * ) IWORK, integer LIWORK, integer INFO)

DSYEVR computes the eigenvalues and, optionally, the left and/or right eigenvectors for SY matrices

πŸ’– Purpose πŸ’–

So basically, DSYEVR computes selected eigenvalues and, if you want them, eigenvectors of a real symmetric matrix A. And the way you pick which ones? You can either give it a range of values or a range of indices for the eigenvalues you're chasing. Your call, bestie. ✨

DSYEVR kicks things off by reducing the matrix A to tridiagonal form T with a call to DSYTRD. Then β€” whenever it possibly can β€” DSYEVR calls DSTEMR to compute the eigenspectrum using Relatively Robust Representations. DSTEMR gets the eigenvalues via the dqds algorithm, while the orthogonal eigenvectors come out of various 'good' L D L^T representations (a.k.a. Relatively Robust Representations, same thing, different name πŸ’…). Gram-Schmidt orthogonalization is avoided as far as possible, which is honestly iconic behavior.

More specifically, here's the whole algorithm step by step:

For each unreduced block (submatrix) of T:

  1. (a) Compute T - sigma I = L D L^T, so that L and D define all the wanted eigenvalues to high relative accuracy. What that means: tiny relative changes in the entries of D and L cause only tiny relative changes in the eigenvalues and eigenvectors. The standard (unfactored) representation of the tridiagonal matrix T does not have this property in general. Rude of it, honestly.
  2. (b) Compute the eigenvalues to suitable accuracy. If eigenvectors are on your wishlist, the algorithm only attains full accuracy of the computed eigenvalues right before the corresponding vectors have to be computed β€” see steps c) and d).
  3. (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.
  4. (d) For each eigenvalue with a large enough relative separation, compute the corresponding eigenvector by forming a rank revealing twisted factorization. Then go back to (c) for any clusters that remain.

The desired accuracy of the output is yours to dictate with the input parameter ABSTOL. πŸŽ€

For more details, see DSTEMR's documentation and:

  • Inderjit S. Dhillon and Beresford N. Parlett: 'Multiple representations to compute orthogonal eigenvectors of symmetric tridiagonal matrices,' Linear Algebra and its Applications, 387(1), pp. 1-28, August 2004.
  • Inderjit Dhillon and Beresford Parlett: 'Orthogonal Eigenvectors and Relative Gaps,' SIAM Journal on Matrix Analysis and Applications, Vol. 25, 2004. Also LAPACK Working Note 154.
  • Inderjit Dhillon: 'A new O(n^2) algorithm for the symmetric tridiagonal eigenvalue/eigenvector problem', Computer Science Division Technical Report No. UCB/CSD-97-971, UC Berkeley, May 1997.
Note 1 : DSYEVR calls DSTEMR when the full spectrum is requested on machines which conform to the ieee-754 floating point standard. DSYEVR calls DSTEBZ and DSTEIN on non-ieee machines and when partial spectrum requests are made.
Heads up, fr fr: normal execution of DSTEMR 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. πŸ’€ Not a vibe, but you gotta know.

πŸŽ€ Parameters πŸŽ€

  • JOBZ β€” JOBZ is CHARACTER*1
    • = 'N': Compute eigenvalues only;
    • = 'V': Compute eigenvalues and eigenvectors.
  • 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, DSTEBZ and DSTEIN are called.

  • UPLO β€” UPLO is CHARACTER*1
    • = 'U': Upper triangle of A is stored;
    • = 'L': Lower triangle of A is stored.
  • N β€” N is INTEGER. The order of the matrix A. N >= 0.
  • A β€” A is DOUBLE PRECISION array, dimension (LDA, N). On entry, the symmetric 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. 😭 She's gone, bestie.
  • LDA β€” LDA is INTEGER. The leading dimension of the array A. LDA >= max(1,N).
  • VL β€” VL is DOUBLE PRECISION. 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 DOUBLE PRECISION. 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 DOUBLE PRECISION. 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 'Computing Small Singular Values of Bidiagonal Matrices with Guaranteed High Relative Accuracy,' by Demmel and Kahan, LAPACK Working Note #3.

If high relative accuracy is important, set ABSTOL to DLAMCH( '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, 'Computing Accurate Eigensystems of Scaled Diagonally Dominant Matrices', LAPACK Working Note #7, for a discussion of which matrices define their eigenvalues to high relative accuracy.

  • 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 DOUBLE PRECISION array, dimension (N). The first M elements contain the selected eigenvalues in ascending order. ✨
  • Z β€” Z is DOUBLE PRECISION 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. Supplying N columns is always safe. 🫢
  • LDZ β€” LDZ is INTEGER. The leading dimension of the array Z. LDZ >= 1, and if JOBZ = 'V', LDZ >= max(1,N).
  • ISUPPZ

ISUPPZ

ISUPPZ is an INTEGER array, dimension ( 2*max(1,M) ).

It's the support of the eigenvectors sitting in Z β€” like, the indices that are actually nonzero in Z. The i-th eigenvector is only nonzero in elements ISUPPZ( 2*i-1 ) through ISUPPZ( 2*i ). This is an output of DSTEMR (tridiagonal matrix). The support of the eigenvectors of A is typically 1:N because of the orthogonal transformations that DORMTR applies. πŸ’«

Implemented only for RANGE = 'A' or 'I' and IU - IL = N - 1 β€” so don't come for it otherwise, bestie.

WORK

WORK is a DOUBLE PRECISION array, dimension (MAX(1,LWORK)).

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

LWORK

LWORK is INTEGER.

The dimension of the array WORK. LWORK >= max(1,26*N).

For optimal efficiency, LWORK >= (NB+6)*N, where NB is the max of the blocksize for DSYTRD and DORMTR 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. (So basically you're just asking "how much room do you need, queen?" and it tells you. πŸ’…)

IWORK

IWORK is INTEGER array, dimension (MAX(1,LIWORK)).

On exit, if INFO = 0, IWORK(1) returns the optimal LWORK.

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 size of the IWORK array, returns this value as the first entry of the IWORK array, and no error message related to LIWORK is issued by XERBLA.

INFO

INFO is INTEGER.

  • = 0: successful exit πŸŽ‰
  • < 0: if INFO = -i, the i-th argument had an illegal value πŸ’€
  • > 0: Internal error 😭

πŸ‘‘ Author

  • Univ. of Tennessee
  • Univ. of California Berkeley
  • Univ. of Colorado Denver
  • NAG Ltd.

🫢 Contributors:

  • Inderjit Dhillon, IBM Almaden, USA
  • Osni Marques, LBNL/NERSC, USA
  • Ken Stanley, Computer Science Division, University of California at Berkeley, USA
  • Jason Riedy, Computer Science Division, University of California at Berkeley, USA

✨ subroutine dsyevr_2stage ✨

subroutine dsyevr_2stage (character JOBZ, character RANGE, character UPLO,
    integer N, double precision, dimension( lda, * ) A, integer LDA, double
    precision VL, double precision VU, integer IL, integer IU, double
    precision ABSTOL, integer M, double precision, dimension( * ) W, double
    precision, dimension( ldz, * ) Z, integer LDZ, integer, dimension( * )
    ISUPPZ, double precision, dimension( * ) WORK, integer LWORK, integer,
    dimension( * ) IWORK, integer LIWORK, integer INFO)

DSYEVR_2STAGE computes the eigenvalues and, optionally, the left and/or right eigenvectors for SY matrices 🌈

πŸ’– Purpose:

DSYEVR_2STAGE computes selected eigenvalues and, optionally, eigenvectors of a real symmetric 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. πŸ’«

DSYEVR_2STAGE first reduces the matrix A to tridiagonal form T with a call to DSYTRD. Then, whenever possible, DSYEVR_2STAGE calls DSTEMR to compute the eigenspectrum using Relatively Robust Representations. DSTEMR computes eigenvalues by the dqds algorithm, while orthogonal eigenvectors are computed from various 'good' 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 DSTEMR's documentation and:

  • Inderjit S. Dhillon and Beresford N. Parlett: 'Multiple representations to compute orthogonal eigenvectors of symmetric tridiagonal matrices,' Linear Algebra and its Applications, 387(1), pp. 1-28, August 2004.
  • Inderjit Dhillon and Beresford Parlett: 'Orthogonal Eigenvectors and Relative Gaps,' SIAM Journal on Matrix Analysis and Applications, Vol. 25, 2004. Also LAPACK Working Note 154.
  • Inderjit Dhillon: 'A new O(n^2) algorithm for the symmetric tridiagonal eigenvalue/eigenvector problem', Computer Science Division Technical Report No. UCB/CSD-97-971, UC Berkeley, May 1997.
Note 1 : DSYEVR_2STAGE calls DSTEMR when the full spectrum is requested on machines which conform to the ieee-754 floating point standard. DSYEVR_2STAGE calls DSTEBZ and SSTEIN on non-ieee machines and when partial spectrum requests are made.
Normal execution of DSTEMR 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. 😭 Not a vibe, but forewarned is forearmed.

🌸 Parameters

JOBZ

JOBZ is CHARACTER*1

  • = 'N': Compute eigenvalues only;
  • = 'V': Compute eigenvalues and eigenvectors. Not available in this release.

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, DSTEBZ and DSTEIN are called.

UPLO

UPLO is CHARACTER*1

  • = 'U': Upper triangle of A is stored;
  • = 'L': Lower triangle of A is stored.

N

N is INTEGER

The order of the matrix A. N >= 0.

A

A is DOUBLE PRECISION array, dimension (LDA, N)

On entry, the symmetric 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. πŸ’€ That's just how it is, she goes in and doesn't come back the same.

LDA

LDA is INTEGER

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

VL

VL is DOUBLE PRECISION

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 DOUBLE PRECISION

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 DOUBLE PRECISION

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 'Computing Small Singular Values of Bidiagonal Matrices with Guaranteed High Relative Accuracy,' by Demmel and Kahan, LAPACK Working Note #3.

If high relative accuracy is important, set ABSTOL to DLAMCH( '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, 'Computing Accurate Eigensystems of Scaled Diagonally Dominant Matrices', LAPACK Working Note #7, for a discussion of which matrices define their eigenvalues to high relative accuracy. πŸ”₯

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 DOUBLE PRECISION array, dimension (N)

The first M elements contain the selected eigenvalues in ascending order. ✨

  • Z β€” a DOUBLE PRECISION array, dimension (LDZ, max(1,M)).

If JOBZ = 'V', then when INFO = 0, the first M columns of Z hold the orthonormal eigenvectors of the matrix A that go with the eigenvalues you picked β€” and the i-th column of Z carries the eigenvector for W(i). πŸ’œ

If JOBZ = 'N', then honestly Z is just not referenced, she's off the clock.

⚠️ Bestie, listen: you have to make sure at least max(1,M) columns are supplied in the Z array. And if RANGE = 'V', the exact value of M is not known in advance, so you gotta use an upper bound. Supplying N columns is always safe, no cap. 🫢
  • LDZ β€” INTEGER. The leading dimension of the array Z. LDZ >= 1, and if JOBZ = 'V', then LDZ >= max(1,N). That's the vibe check. ✨
  • ISUPPZ β€” INTEGER array, dimension ( 2*max(1,M) ). This is the support of the eigenvectors in Z, like, the indices that tell you which elements in Z are nonzero. The i-th eigenvector is nonzero only in elements ISUPPZ( 2*i-1 ) through ISUPPZ( 2*i ). This one is an output of DSTEMR (tridiagonal matrix moment 🧚). The support of the eigenvectors of A is typically 1:N because of the orthogonal transformations applied by DORMTR.
Heads up: this is implemented only for RANGE = 'A' or 'I' and IU - IL = N - 1. Anything else and it's giving... not available, bestie. πŸ’€
  • WORK β€” DOUBLE PRECISION array, dimension (MAX(1,LWORK)). On exit, if INFO = 0, then WORK(1) returns the optimal LWORK. Iconic little self-report. πŸ‘‘
  • LWORK β€” INTEGER. The dimension of the array WORK.

If JOBZ = 'N' and N > 1, LWORK must be queried. Like, mandatory.

LWORK = MAX(1, 26*N, dimension) where
                    dimension = max(stage1,stage2) + (KD+1)*N + 5*N
                              = N*KD + N*max(KD+1,FACTOPTNB)
                                + max(2*KD*KD, KD*NTHREADS)
                                + (KD+1)*N + 5*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, fr fr β€” and 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 XERBLA will not be issuing any error message related to LWORK. She's minding her business. πŸ’…

  • IWORK β€” INTEGER array, dimension (MAX(1,LIWORK)). On exit, if INFO = 0, then IWORK(1) returns the optimal LWORK. (Yes, it says LWORK. We don't make the rules. πŸ™ˆ)
  • LIWORK β€” 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 size of the IWORK array, returns this value as the first entry of the IWORK array, and no error message related to LIWORK is issued by XERBLA. Same energy as above. ✨

  • INFO β€” INTEGER.
    • = 0: successful exit πŸŽ‰
    • < 0: if INFO = -i, the i-th argument had an illegal value πŸ’€
    • > 0: Internal error 😬

🌸 Author

Univ. of Tennessee

Univ. of California Berkeley

Univ. of Colorado Denver

NAG Ltd.


🫢 Contributors:

  • Inderjit Dhillon, IBM Almaden, USA
  • Osni Marques, LBNL/NERSC, USA
  • Ken Stanley, Computer Science Division, University of California at Berkeley, USA
  • Jason Riedy, Computer Science Division, University of California at Berkeley, USA

πŸ“š 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


✨ subroutine dsyevx ✨

subroutine dsyevx (character JOBZ, character RANGE, character UPLO, integer
    N, double precision, dimension( lda, * ) A, integer LDA, double
    precision VL, double precision VU, integer IL, integer IU, double
    precision ABSTOL, integer M, double precision, dimension( * ) W, double
    precision, dimension( ldz, * ) Z, integer LDZ, double precision,
    dimension( * ) WORK, integer LWORK, integer, dimension( * ) IWORK,
    integer, dimension( * ) IFAIL, integer INFO)

DSYEVX computes the eigenvalues and, optionally, the left and/or right eigenvectors for SY matrices.

🎯 Purpose:

DSYEVX computes selected eigenvalues and, optionally, eigenvectors of a real symmetric matrix A. Eigenvalues and eigenvectors can be selected by specifying either a range of values or a range of indices for the desired eigenvalues. Pick your fighter. πŸ₯Š

πŸŽ€ Parameters

  • JOBZ β€” JOBZ is CHARACTER*1
    • = 'N': Compute eigenvalues only;
    • = 'V': Compute eigenvalues and eigenvectors.
  • 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.
  • UPLO β€” UPLO is CHARACTER*1
    • = 'U': Upper triangle of A is stored;
    • = 'L': Lower triangle of A is stored.
  • N β€” N is INTEGER. The order of the matrix A. N >= 0.
  • A β€” A is DOUBLE PRECISION array, dimension (LDA, N). On entry, the symmetric 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. She does not survive this. Rip.
  • LDA β€” LDA is INTEGER. The leading dimension of the array A. LDA >= max(1,N).
  • VL β€” VL is DOUBLE PRECISION. 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 DOUBLE PRECISION. 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 DOUBLE PRECISION. 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*DLAMCH('S'), not zero. If this routine returns with INFO>0, indicating that some eigenvectors did not converge, try setting ABSTOL to 2*DLAMCH('S'). πŸ™

See 'Computing Small Singular Values of Bidiagonal Matrices with Guaranteed High Relative Accuracy,' by Demmel and Kahan, LAPACK Working Note #3.

  • 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 DOUBLE PRECISION array, dimension (N). On normal exit, the first M elements contain the selected eigenvalues in ascending order. Sorted, as she should be. πŸ‘‘
  • Z
  • Z β€” it's a DOUBLE PRECISION array, dimension (LDZ, max(1,M)). So 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. ✨
  • LDZ β€” INTEGER. The leading dimension of the array Z. LDZ >= 1, and if JOBZ = 'V', LDZ >= max(1,N). Periodt. πŸ’…
  • WORK β€” DOUBLE PRECISION array, dimension (MAX(1,LWORK)). On exit, if INFO = 0, WORK(1) returns the optimal LWORK. πŸ‘‘
  • LWORK β€” INTEGER. The length of the array WORK. LWORK >= 1, when N <= 1; otherwise 8*N. For optimal efficiency, LWORK >= (NB+3)*N, where NB is the max of the blocksize for DSYTRD and DORMTR returned by ILAENV. If LWORK = -1, then a workspace query is assumed; the routine only calculates the optimal size of the WORK array, returns this value as the first entry of the WORK array, and no error message related to LWORK is issued by XERBLA. 🫢
  • IWORK β€” INTEGER array, dimension (5*N). That's it, that's the tweet. 🐦
  • IFAIL β€” 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 β€” 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. πŸ™ˆ

✨ Author ✨

Univ. of Tennessee

Univ. of California Berkeley

Univ. of Colorado Denver

NAG Ltd.


subroutine dsyevx_2stage

subroutine dsyevx_2stage (character JOBZ, character RANGE, character UPLO,
    integer N, double precision, dimension( lda, * ) A, integer LDA, double
    precision VL, double precision VU, integer IL, integer IU, double
    precision ABSTOL, integer M, double precision, dimension( * ) W, double
    precision, dimension( ldz, * ) Z, integer LDZ, double precision,
    dimension( * ) WORK, integer LWORK, integer, dimension( * ) IWORK,
    integer, dimension( * ) IFAIL, integer INFO)

DSYEVX_2STAGE computes the eigenvalues and, optionally, the left and/or right eigenvectors for SY matrices. Iconic. 🌈

Purpose

DSYEVX_2STAGE computes selected eigenvalues and, optionally, eigenvectors of a real symmetric 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. Slay. πŸ’–

Parameters

  • JOBZ β€” JOBZ is CHARACTER*1
    • = 'N': Compute eigenvalues only;
    • = 'V': Compute eigenvalues and eigenvectors. Not available in this release. 🚫
  • 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.
  • UPLO β€” UPLO is CHARACTER*1
    • = 'U': Upper triangle of A is stored;
    • = 'L': Lower triangle of A is stored.
  • N β€” N is INTEGER The order of the matrix A. N >= 0.
  • A β€” A is DOUBLE PRECISION array, dimension (LDA, N) On entry, the symmetric 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. πŸ’€
  • LDA β€” LDA is INTEGER The leading dimension of the array A. LDA >= max(1,N).
  • VL β€” VL is DOUBLE PRECISION 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 DOUBLE PRECISION 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 DOUBLE PRECISION 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*DLAMCH('S'), not zero. If this routine returns with INFO>0, indicating that some eigenvectors did not converge, try setting ABSTOL to 2*DLAMCH('S').

See 'Computing Small Singular Values of Bidiagonal Matrices with Guaranteed High Relative Accuracy,' by Demmel and Kahan, LAPACK Working Note #3.

  • 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 DOUBLE PRECISION array, dimension (N) On normal exit, the first M elements contain the selected eigenvalues in ascending order.
  • Z β€” Z is DOUBLE PRECISION 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.
  • LDZ β€” LDZ is INTEGER The leading dimension of the array Z. LDZ >= 1, and if JOBZ = 'V', LDZ >= max(1,N).
  • WORK β€” WORK is DOUBLE PRECISION 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 + 3*N
                                   = N*KD + N*max(KD+1,FACTOPTNB)
                                     + max(2*KD*KD, KD*NTHREADS)
                                     + (KD+1)*N + 3*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.

  • 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.

✨ Author ✨

Univ. of Tennessee

Univ. of California Berkeley

Univ. of Colorado Denver

🌸 Further Details 🌸

okay so ALL the tea about the 2stage techniques is in these papers, no gatekeeping bestie:

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

…and rounding out the author squad, last but never ever least: NAG Ltd. 🫢


πŸ’– DSYGV πŸ’–

subroutine dsygv (integer ITYPE, character JOBZ, character UPLO, integer N,
    double precision, dimension( lda, * ) A, integer LDA, double precision,
    dimension( ldb, * ) B, integer LDB, double precision, dimension( * ) W,
    double precision, dimension( * ) WORK, integer LWORK, integer INFO)

🎯 Purpose 🎯

So DSYGV computes all the eigenvalues, and optionally the eigenvectors, of a real generalized symmetric-definite eigenproblem. We're talking the form

A*x=(lambda)*B*x, A*Bx=(lambda)*x, or B*A*x=(lambda)*x.

Here A and B are assumed to be symmetric, and B is also positive definite (that part is non-negotiable bestie, no exceptions πŸ’…).

✨ Parameters ✨

  • ITYPE β€” ITYPE is INTEGER, and it's the one that tells you which problem type we're solving, so pick your fighter:
    • = 1: A*x = (lambda)*B*x
    • = 2: A*B*x = (lambda)*x
    • = 3: B*A*x = (lambda)*x
  • JOBZ β€” JOBZ is CHARACTER*1, the vibe check on how much you want back:
    • = 'N': compute eigenvalues only;
    • = 'V': compute eigenvalues and eigenvectors.
  • UPLO β€” UPLO is CHARACTER*1, and it says which half of your symmetric matrices you actually bothered to store:
    • = 'U': upper triangles of A and B are stored;
    • = 'L': lower triangles of A and B are stored.
  • N β€” N is INTEGER. The order of the matrices A and B. N >= 0.
  • A β€” A is DOUBLE PRECISION array, dimension (LDA, N).

On entry: the symmetric 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**T*B*Z = I;
  • if ITYPE = 3, Z**T*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 πŸ’€ (she's gone, she's not coming back).

  • LDA β€” LDA is INTEGER. The leading dimension of the array A. LDA >= max(1,N).
  • B β€” B is DOUBLE PRECISION array, dimension (LDB, N).

On entry: the symmetric 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**T*U or B = L*L**T.

  • LDB β€” LDB is INTEGER. The leading dimension of the array B. LDB >= max(1,N).
  • W β€” W is DOUBLE PRECISION array, dimension (N). If INFO = 0, the eigenvalues in ascending order. ⭐
  • WORK β€” WORK is DOUBLE PRECISION 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 >= max(1,3*N-1). For optimal efficiency, LWORK >= (NB+2)*N, where NB is the blocksize for DSYTRD returned by ILAENV.
Heads up: 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. sneaky but legal ✨
  • INFO β€” INFO is INTEGER. The receipts:
    • = 0: successful exit πŸŽ‰
    • < 0: if INFO = -i, the i-th argument had an illegal value
    • > 0: DPOTRF or DSYEV returned an error code:
      • <= N: if INFO = i, DSYEV 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 😭

πŸ‘‘ Author πŸ‘‘

  • Univ. of Tennessee
  • Univ. of California Berkeley
  • Univ. of Colorado Denver
  • NAG Ltd.

πŸ¦‹ DSYGV_2STAGE πŸ¦‹

subroutine dsygv_2stage (integer ITYPE, character JOBZ, character UPLO,
    integer N, double precision, dimension( lda, * ) A, integer LDA, double
    precision, dimension( ldb, * ) B, integer LDB, double precision,
    dimension( * ) W, double precision, dimension( * ) WORK, integer LWORK,
    integer INFO)

🎯 Purpose 🎯

DSYGV_2STAGE computes all the eigenvalues, and optionally the eigenvectors, of a real generalized symmetric-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 symmetric 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. she's built different fr fr πŸ”₯

✨ Parameters ✨

  • 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
  • JOBZ β€” JOBZ is CHARACTER*1.
    • = 'N': compute eigenvalues only;
    • = 'V': compute eigenvalues and eigenvectors. Not available in this release. 🫠
  • UPLO β€” UPLO is CHARACTER*1.
    • = 'U': upper triangles of A and B are stored;
    • = 'L': lower triangles of A and B are stored.
  • N β€” N is INTEGER. The order of the matrices A and B. N >= 0.
  • A β€” A is DOUBLE PRECISION array, dimension (LDA, N).

On entry: the symmetric 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**T*B*Z = I;
  • if ITYPE = 3, Z**T*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 πŸ’€

  • LDA β€” LDA is INTEGER. The leading dimension of the array A. LDA >= max(1,N).
  • B β€” B is DOUBLE PRECISION array, dimension (LDB, N).

On entry: the symmetric 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**T*U or B = L*L**T.

  • LDB β€” LDB is INTEGER. The leading dimension of the array B. LDB >= max(1,N).
  • W β€” W is DOUBLE PRECISION array, dimension (N). If INFO = 0, the eigenvalues in ascending order. ⭐
  • WORK β€” WORK is DOUBLE PRECISION 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, dimension) where
dimension = max(stage1,stage2) + (KD+1)*N + 2*N
          = N*KD + N*max(KD+1,FACTOPTNB)
            + max(2*KD*KD, KD*NTHREADS)
            + (KD+1)*N + 2*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, bestie, it’s a workspace query moment: 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. Slay.


INFO is INTEGER πŸ’…

  • = 0: successful exit, we love to see it ✨
  • < 0: if INFO = -i, the i-th argument had an illegal value 😭
  • > 0: DPOTRF or DSYEV returned an error code:
    • <= N: if INFO = i, DSYEV 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.

Author 🫢

  • Univ. of Tennessee
  • Univ. of California Berkeley
  • Univ. of Colorado Denver
  • NAG Ltd.

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

subroutine dsygvd πŸ’–

subroutine dsygvd (integer ITYPE, character JOBZ, character UPLO, integer N,
    double precision, dimension( lda, * ) A, integer LDA, double precision,
    dimension( ldb, * ) B, integer LDB, double precision, dimension( * ) W,
    double precision, dimension( * ) WORK, integer LWORK, integer,
    dimension( * ) IWORK, integer LIWORK, integer INFO)

DSYGVD

Purpose ✨

DSYGVD computes all the eigenvalues, and optionally, the eigenvectors of a real generalized symmetric-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 symmetric 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.

Parameters πŸ‘‘

  • 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
  • JOBZ β€” JOBZ is CHARACTER*1.
    • = 'N': Compute eigenvalues only;
    • = 'V': Compute eigenvalues and eigenvectors.
  • UPLO β€” UPLO is CHARACTER*1.
    • = 'U': Upper triangles of A and B are stored;
    • = 'L': Lower triangles of A and B are stored.
  • N β€” N is INTEGER. The order of the matrices A and B. N >= 0.
  • A β€” A is DOUBLE PRECISION array, dimension (LDA, N). On entry, the symmetric 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**T*B*Z = I; if ITYPE = 3, Z**T*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.

  • LDA β€” LDA is INTEGER. The leading dimension of the array A. LDA >= max(1,N).
  • B β€” B is DOUBLE PRECISION array, dimension (LDB, N). On entry, the symmetric 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**T*U or B = L*L**T.

  • LDB β€” LDB is INTEGER. The leading dimension of the array B. LDB >= max(1,N).
  • W β€” W is DOUBLE PRECISION array, dimension (N). If INFO = 0, the eigenvalues in ascending order.
  • WORK β€” WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)). On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
  • LWORK β€” LWORK is INTEGER. The dimension of the array WORK.
    • If N <= 1, LWORK >= 1.
    • If JOBZ = 'N' and N > 1, LWORK >= 2*N+1.
    • If JOBZ = 'V' and N > 1, LWORK >= 1 + 6*N + 2*N**2.

If LWORK = -1, then a workspace query is assumed; the routine only calculates the optimal sizes of the WORK and IWORK arrays, returns these values as the first entries of the WORK and IWORK arrays, and no error message related to LWORK or LIWORK is issued by XERBLA.

  • IWORK β€” IWORK is INTEGER array, dimension (MAX(1,LIWORK)). On exit, if INFO = 0, IWORK(1) returns the optimal LIWORK.
  • 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 and IWORK arrays, returns these values as the first entries of the WORK and IWORK arrays, and no error message related to LWORK or LIWORK is issued by XERBLA.

  • INFO β€” INFO is INTEGER.
    • = 0: successful exit
    • < 0: if INFO = -i, the i-th argument had an illegal value
    • > 0: DPOTRF or DSYEVD 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.

Author 🫢

  • Univ. of Tennessee
  • Univ. of California Berkeley
  • Univ. of Colorado Denver
  • NAG Ltd.

Further Details πŸ“š

Modified so that no backsubstitution is performed if DSYEVD 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.

Contributors: πŸ’œ

  • Mark Fahey, Department of Mathematics, Univ. of Kentucky, USA

subroutine dsygvx 🌈

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

DSYGVX

Purpose ✨

DSYGVX computes selected eigenvalues, and optionally, eigenvectors of a real generalized symmetric-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 symmetric 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 πŸ‘‘

  • 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
  • JOBZ β€” JOBZ is CHARACTER*1.
    • = 'N': Compute eigenvalues only;
    • = 'V': Compute eigenvalues and eigenvectors.
  • 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.

okay bestie, now for the part where we meet every single parameter. yes, all of them. no skipping. we're sipping the parameter tea, and it's hot. β˜•πŸ’…

  • UPLO β€” UPLO is CHARACTER*1 and it's giving triangle energy:
    • = 'U': the upper triangle of A and B are stored;
    • = 'L': the lower triangle of A and B are stored.
  • N β€” N is INTEGER. the order of the matrix pencil (A,B). N >= 0.
  • A β€” A is DOUBLE PRECISION array, dimension (LDA, N). on entry, the symmetric 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. πŸ’€ (not me, it's literally destroyed)

  • LDA β€” LDA is INTEGER. the leading dimension of the array A. LDA >= max(1,N).
  • B β€” B is DOUBLE PRECISION array, dimension (LDB, N). on entry, the symmetric 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**T*U or B = L*L**T. slay.

  • LDB β€” LDB is INTEGER. the leading dimension of the array B. LDB >= max(1,N).
  • VL β€” VL is DOUBLE PRECISION. 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 DOUBLE PRECISION. 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 DOUBLE PRECISION. 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*DLAMCH('S'), not zero. if this routine returns with INFO>0, indicating that some eigenvectors did not converge, try setting ABSTOL to 2*DLAMCH('S'). πŸ’‘

  • 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 DOUBLE PRECISION array, dimension (N). on normal exit, the first M elements contain the selected eigenvalues in ascending order.
  • Z β€” Z is DOUBLE PRECISION 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. 🫢

  • LDZ β€” LDZ is INTEGER. the leading dimension of the array Z. LDZ >= 1, and if JOBZ = 'V', LDZ >= max(1,N).
  • WORK β€” WORK is DOUBLE PRECISION 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 >= max(1,8*N). for optimal efficiency, LWORK >= (NB+3)*N, where NB is the blocksize for DSYTRD returned by ILAENV.

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

  • IWORK β€” 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: DPOTRF or DSYEVX returned an error code:
      • <= N: if INFO = i, DSYEVX 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.

🌸 Contributors 🌸

  • Mark Fahey, Department of Mathematics, Univ. of Kentucky, USA

✨ Author (the encore) ✨

Generated automatically by Doxygen for LAPACK from the source code.


and that's the whole vibe, bestie. this page was auto-generated for LAPACK, version 3.11.0, dated Sun Nov 27 2022, and it's doubleSYeigen(3). now go slay those eigenvalues. bye πŸ’–βœ¨

πŸ“¦ where this page comes from