larrd(3)
π larrd β the manual, but make it make sense
okay so bestie, you've stumbled into larrd(3) from the Library Functions Manual and honestly? You're in the right place. This is the larrd family β literally described as "larrd: step in stemr, tridiag eig" β and yes it's LAPACK, yes it's Fortran, yes you're gonna slay this. Let's go π«Ά
β¨ NAME β¨
larrd β no cap, the actual name line says: larrd - larrd: step in stemr, tridiag eig. That's it, that's the vibe. It's a step inside stemr, doing tridiagonal eigenvalue things. π
πΈ SYNOPSIS πΈ
π Functions π
dlarrdβ the double-precision bestie. Full signature below πslarrdβ the single-precision bestie. Same energy, less decimal places π
Both of them: "computes the eigenvalues of a symmetric tridiagonal matrix to suitable accuracy." That's the whole assignment, and they ate.
subroutine dlarrd (range, order, n, vl, vu, il, iu, gers, reltol, d, e,
e2, pivmin, nsplit, isplit, m, w, werr, wl, wu, iblock, indexw,
work, iwork, info)
DLARRD computes the eigenvalues of a symmetric tridiagonal matrix to suitable accuracy.
subroutine slarrd (range, order, n, vl, vu, il, iu, gers, reltol, d, e,
e2, pivmin, nsplit, isplit, m, w, werr, wl, wu, iblock, indexw,
work, iwork, info)
SLARRD computes the eigenvalues of a symmetric tridiagonal matrix to suitable accuracy.
See? Identical twins. π§ββοΈ
β¨ Detailed Description β¨
okay so there's a section literally called Detailed Description and it's... empty. Nothing under it. It's giving "she said she'd text back." π
Moving on β the real content lives in the function docs. π
π Function Documentation π
π¦ subroutine dlarrd π¦
subroutine dlarrd (character range, character order, integer n, double
precision vl, double precision vu, integer il, integer iu, double
precision, dimension( * ) gers, double precision reltol, double
precision, dimension( * ) d, double precision, dimension( * ) e, double
precision, dimension( * ) e2, double precision pivmin, integer nsplit,
integer, dimension( * ) isplit, integer m, double precision, dimension(
* ) w, double precision, dimension( * ) werr, double precision wl,
double precision wu, integer, dimension( * ) iblock, integer, dimension(
* ) indexw, double precision, dimension( * ) work, integer, dimension( *
) iwork, integer info)
DLARRD computes the eigenvalues of a symmetric tridiagonal matrix to suitable accuracy.
π₯ Purpose π₯
So here's the tea, straight from the source, in its own comment-block voice:
!>
!> DLARRD computes the eigenvalues of a symmetric tridiagonal
!> matrix T to suitable accuracy. This is an auxiliary code to be
!> called from DSTEMR.
!> The user may ask for all eigenvalues, all eigenvalues
!> in the half-open interval (VL, VU], or the IL-th through IU-th
!> eigenvalues.
!>
!> To avoid overflow, the matrix must be scaled so that its
!> largest element is no greater than overflow**(1/2) * underflow**(1/4) in absolute value, and for greatest
!> accuracy, it should not be much smaller than that.
!>
!> See W. Kahan , Report CS41, Computer Science Dept., Stanford
!> University, July 21, 1966.
!>
Babe. Read the scaling line again. That's not a suggestion, that's a whole overflow warning β scale your matrix so the largest element is β€ overflow**(1/2) * underflow**(1/4) in absolute value, and for the best accuracy don't make it way smaller than that either. Respect the limits, periodt. π€
Also shoutout to W. Kahan, Report CS41, Computer Science Dept., Stanford University, July 21, 1966 β an absolute icon, we stan. π
π« Parameters π«
RANGEβCHARACTER*1. Tells it what to hunt for:'A'β () all eigenvalues will be found. Everything. The whole spectrum. π'V'β () all eigenvalues in the half-open interval(VL, VU]will be found. (Half-open! Square bracket on the right, bestie, that detail matters β¨)'I'β () theIL-th throughIU-th eigenvalues (of the entire matrix) will be found. Index range energy. π―
ORDERβCHARACTER*1. Tells it how to lay out what it found:'B'β () the eigenvalues will be grouped by split-off block (seeIBLOCK,ISPLIT) and ordered from smallest to largest within the block. Cute little clusters π'E'β () the eigenvalues for the entire matrix will be ordered from smallest to largest. One big sorted lineup, main character energy π
NβINTEGER. The order of the tridiagonal matrixT. Constraint:N >= 0. Zero is allowed, don't come for it. π«ΆVLβDOUBLE PRECISION. IfRANGE='V', the lower bound of the interval to be searched for eigenvalues. Eigenvalues less than or equal toVL, or greater thanVU, will not be returned. Constraint:VL < VU. Not referenced ifRANGE = 'A'or'I'. πVUβDOUBLE PRECISION. IfRANGE='V', the upper bound of the interval to be searched for eigenvalues. Eigenvalues less than or equal toVL, or greater thanVU, will not be returned. Constraint:VL < VU. Not referenced ifRANGE = 'A'or'I'. πILβINTEGER. IfRANGE='I', the index of the smallest eigenvalue to be returned. Constraint:1 <= IL <= IU <= N, ifN > 0;IL = 1andIU = 0ifN = 0. Not referenced ifRANGE = 'A'or'V'. π’IUβINTEGER. IfRANGE='I', the index of the largest eigenvalue to be returned. Constraint:1 <= IL <= IU <= N, ifN > 0;IL = 1andIU = 0ifN = 0. Not referenced ifRANGE = 'A'or'V'. π’GERSβDOUBLE PRECISION array, dimension (2*N). TheNGerschgorin intervals (thei-th Gerschgorin interval is(GERS(2*i-1), GERS(2*i))). Intervals everywhere, we love a bracket moment πRELTOLβDOUBLE PRECISION. The minimum relative width of an interval. When an interval is narrower thanRELTOLtimes the larger (in magnitude) endpoint, then it is considered to be sufficiently small, i.e., converged.
Note: this should always be at least radix*machine epsilon. fr fr, do not skip this one. π
DβDOUBLE PRECISION array, dimension (N). Thendiagonal elements of the tridiagonal matrixT. The main character diagonal β¨EβDOUBLE PRECISION array, dimension (N-1). The(n-1)off-diagonal elements of the tridiagonal matrixT. The supporting cast πE2βDOUBLE PRECISION array, dimension (N-1). The(n-1)squared off-diagonal elements of the tridiagonal matrixT. Same asEbut squared, because why not πPIVMINβDOUBLE PRECISION. The minimum pivot allowed in the Sturm sequence forT. Small but mighty. π₯NSPLITβINTEGER. The number of diagonal blocks in the matrixT. Constraint:1 <= NSPLIT <= N. π§©ISPLITβINTEGER array, dimension (N). The splitting points, at whichTbreaks up into submatrices. The first submatrix consists of rows/columns1toISPLIT(1), the second of rows/columnsISPLIT(1)+1throughISPLIT(2), etc., and theNSPLIT-th consists of rows/columnsISPLIT(NSPLIT-1)+1throughISPLIT(NSPLIT)=N.
(Only the firstNSPLITelements will actually be used, but since the user cannot know a priori what valueNSPLITwill have,Nwords must be reserved forISPLIT.) Reserve the wholeN, bestie, don't be stingy π«Ά
MβINTEGER. The actual number of eigenvalues found. Constraint:0 <= M <= N. (See also the description ofINFO=2,3.) Spoiler: it can come back less than you asked for πWβDOUBLE PRECISION array, dimension (N). On exit, the firstMelements ofWwill contain the eigenvalue approximations.DLARRDcomputes an intervalI_j = (a_j, b_j]that includes eigenvaluej. The eigenvalue approximation is given as the interval midpointW(j)= ( a_j + b_j)/2. The corresponding error is bounded byWERR(j) = abs( a_j - b_j)/2. Midpoint math, iconic behaviour π―WERRβDOUBLE PRECISION array, dimension (N). The error bound on the corresponding eigenvalue approximation inW. It's the receipts for how accurateWactually is π§ΎWLβDOUBLE PRECISION. That's the whole description. She's mysterious. She contains multitudes. (The details live underWUπ) πWUβDOUBLE PRECISION. The interval(WL, WU]contains all the wanted eigenvalues.- If
RANGE='V', thenWL=VLandWU=VU. Copy-paste, love that for us. - If
RANGE='A', thenWLandWUare the global Gerschgorin bounds on the spectrum. - If
RANGE='I', thenWLandWUare computed byDLAEBZfrom the index range specified.
- If
IBLOCKβINTEGER array, dimension (N). At each row/columnjwhereE(j)is zero or small, the matrixTis considered to split into a block diagonal matrix. On exit, ifINFO = 0,IBLOCK(i)specifies to which block (from1to the number of blocks) the eigenvalueW(i)belongs.
(DLARRDmay use the remainingN-Melements as workspace.) so don't be surprised if the tail end of your array gets reworked, she needed the room π€·ββοΈ
INDEXWβINTEGER array, dimension (N). The indices of the eigenvalues within each block (submatrix); for example,INDEXW(i)= jandIBLOCK(i)=kimply that thei-th eigenvalueW(i)is thej-th eigenvalue in blockk. Cute little coordinate system πΊοΈWORKβDOUBLE PRECISION array, dimension (4*N). Scratch space, double precision flavour. β¨IWORKβINTEGER array, dimension (3*N). Scratch space, integer flavour. β¨INFOβINTEGER. The whole mood report:= 0: successful exit π< 0: ifINFO = -i, thei-th argument had an illegal value π> 0: some or all of the eigenvalues failed to converge or were not computed:=1 or 3: Bisection failed to converge for some eigenvalues; these eigenvalues are flagged by a negative block number. The effect is that the eigenvalues may not be as accurate as the absolute and relative tolerances. This is generally caused by unexpectedly inaccurate arithmetic. π=2 or 3:RANGE='I'only: Not all of the eigenvaluesIL:IUwere found.- Effect:
M < IU+1-IL - Cause: non-monotonic arithmetic, causing the Sturm sequence to be non-monotonic.
- Cure: recalculate, using
RANGE='A', and pick out eigenvaluesIL:IU. In some cases, increasing thePARAMETERmay make things work.
- Effect:
= 4:RANGE='I', and the Gershgorin interval initially used was too small. No eigenvalues were computed.- Probable cause: your machine has sloppy floating-point arithmetic. π
- Cure: Increase the
PARAMETER, recompile, and try again.
π¨ real talk: INFO > 0 is not a cute look. Read the exact code it hands back before you trust any of those numbers, okay? The manpage is being extremely clear about the failure modes and we respect that.
π§ Internal Parameters: π§
FUDGEβDOUBLE PRECISION, default =2. A to widen the Gershgorin intervals. Ideally, a value of1should work, but on machines with sloppy arithmetic, this needs to be larger. The default for publicly released versions should be large enough to handle the worst machine around. Note that this has no effect on accuracy of the solution. π
Contributors
- W. Kahan, University of California, Berkeley, USA
- Beresford Parlett, University of California, Berkeley, USA
- Jim Demmel, University of California, Berkeley, USA
- Inderjit Dhillon, University of Texas, Austin, USA
- Osni Marques, LBNL/NERSC, USA
- Christof Voemel, University of California, Berkeley, USA
Author
- Univ. of Tennessee
- Univ. of California Berkeley
- Univ. of Colorado Denver
- NAG Ltd.
Definition at line 325 of file dlarrd.f.
slarrd β single precision, same energy π
subroutine slarrd (character range, character order, integer n, real vl,
real vu, integer il, integer iu, real, dimension( * ) gers, real reltol,
real, dimension( * ) d, real, dimension( * ) e, real, dimension( * ) e2,
real pivmin, integer nsplit, integer, dimension( * ) isplit, integer m,
real, dimension( * ) w, real, dimension( * ) werr, real wl, real wu,
integer, dimension( * ) iblock, integer, dimension( * ) indexw, real,
dimension( * ) work, integer, dimension( * ) iwork, integer info)
SLARRD computes the eigenvalues of a symmetric tridiagonal matrix to suitable accuracy.
β¨ Purpose β¨
SLARRD computes the eigenvalues of a symmetric tridiagonal matrix T to suitable accuracy. This is an auxiliary code to be called from SSTEMR. The user may ask for all eigenvalues, all eigenvalues in the half-open interval (VL, VU], or the IL-th through IU-th eigenvalues. π
To avoid overflow, the matrix must be scaled so that its largest element is no greater than overflow**(1/2) * underflow**(1/4) in absolute value, and for greatest accuracy, it should not be much smaller than that. π₯
See W. Kahan, Report CS41, Computer Science Dept., Stanford University, July 21, 1966.
πΈ Parameters πΈ
RANGEβCHARACTER*1= 'A': () all eigenvalues will be found.= 'V': () all eigenvalues in the half-open interval(VL, VU]will be found.= 'I': () theIL-th throughIU-th eigenvalues (of the entire matrix) will be found.
ORDERβCHARACTER*1= 'B': () the eigenvalues will be grouped by split-off block (seeIBLOCK,ISPLIT) and ordered from smallest to largest within the block.= 'E': () the eigenvalues for the entire matrix will be ordered from smallest to largest.
NβINTEGER. The order of the tridiagonal matrixT.N >= 0.VLβREAL. IfRANGE='V', the lower bound of the interval to be searched for eigenvalues. Eigenvalues less than or equal toVL, or greater thanVU, will not be returned.VL < VU. Not referenced ifRANGE = 'A'or'I'.VUβREAL. IfRANGE='V', the upper bound of the interval to be searched for eigenvalues. Eigenvalues less than or equal toVL, or greater thanVU, will not be returned.VL < VU. Not referenced ifRANGE = 'A'or'I'.ILβINTEGER. IfRANGE='I', the index of the smallest eigenvalue to be returned.1 <= IL <= IU <= N, ifN > 0;IL = 1andIU = 0ifN = 0. Not referenced ifRANGE = 'A'or'V'.IUβINTEGER. IfRANGE='I', the index of the largest eigenvalue to be returned.1 <= IL <= IU <= N, ifN > 0;IL = 1andIU = 0ifN = 0. Not referenced ifRANGE = 'A'or'V'.GERSβREALarray, dimension(2*N). TheNGerschgorin intervals (thei-th Gerschgorin interval is(GERS(2*i-1), GERS(2*i))).RELTOLβREAL. The minimum relative width of an interval. When an interval is narrower thanRELTOLtimes the larger (in magnitude) endpoint, then it is considered to be sufficiently small, i.e., converged. Note: this should always be at leastradix*machine epsilon.DβREALarray, dimension(N). Thendiagonal elements of the tridiagonal matrixT.EβREALarray, dimension(N-1). The(n-1)off-diagonal elements of the tridiagonal matrixT.E2βREALarray, dimension(N-1). The(n-1)squared off-diagonal elements of the tridiagonal matrixT.PIVMINβREAL. The minimum pivot allowed in the Sturm sequence forT.NSPLITβINTEGER. The number of diagonal blocks in the matrixT.1 <= NSPLIT <= N.ISPLITβINTEGERarray, dimension(N). The splitting points, at whichTbreaks up into submatrices. The first submatrix consists of rows/columns1toISPLIT(1), the second of rows/columnsISPLIT(1)+1throughISPLIT(2), etc., and theNSPLIT-th consists of rows/columnsISPLIT(NSPLIT-1)+1throughISPLIT(NSPLIT)=N. (Only the firstNSPLITelements will actually be used, but since the user cannot know a priori what valueNSPLITwill have,Nwords must be reserved forISPLIT.)MβINTEGER. The actual number of eigenvalues found.0 <= M <= N. (See also the description ofINFO=2,3.)WβREALarray, dimension(N). On exit, the firstMelements ofWwill contain the eigenvalue approximations.SLARRDcomputes an intervalI_j = (a_j, b_j]that includes eigenvaluej. The eigenvalue approximation is given as the interval midpointW(j)= ( a_j + b_j)/2. The corresponding error is bounded byWERR(j) = abs( a_j - b_j)/2.WERRβREALarray, dimension(N). The error bound on the corresponding eigenvalue approximation inW.WLβREAL.WUβREAL. The interval(WL, WU]contains all the wanted eigenvalues. IfRANGE='V', thenWL=VLandWU=VU. IfRANGE='A', thenWLandWUare the global Gerschgorin bounds on the spectrum. IfRANGE='I', thenWLandWUare computed bySLAEBZfrom the index range specified.IBLOCKβINTEGERarray, dimension(N). At each row/columnjwhereE(j)is zero or small, the matrixTis considered to split into a block diagonal matrix. On exit, ifINFO = 0,IBLOCK(i)specifies to which block (from1to the number of blocks) the eigenvalueW(i)belongs. (SLARRDmay use the remainingN-Melements as workspace.)INDEXWβINTEGERarray, dimension(N). The indices of the eigenvalues within each block (submatrix); for example,INDEXW(i)= jandIBLOCK(i)=kimply that thei-th eigenvalueW(i)is thej-th eigenvalue in blockk.WORKβREALarray, dimension(4*N).IWORKβINTEGERarray, dimension(3*N).INFOβINTEGER= 0: successful exit< 0: ifINFO = -i, thei-th argument had an illegal value> 0: some or all of the eigenvalues failed to converge or were not computed:=1or3: Bisection failed to converge for some eigenvalues; these eigenvalues are flagged by a negative block number. The effect is that the eigenvalues may not be as accurate as the absolute and relative tolerances. This is generally caused by unexpectedly inaccurate arithmetic.=2or3:RANGE='I'only: Not all of the eigenvaluesIL:IUwere found. Effect:M < IU+1-ILCause: non-monotonic arithmetic, causing the Sturm sequence to be non-monotonic. Cure: recalculate, usingRANGE='A', and pick out eigenvaluesIL:IU. In some cases, increasing thePARAMETERmay make things work.= 4:RANGE='I', and the Gershgorin interval initially used was too small. No eigenvalues were computed. Probable cause: your machine has sloppy floating-point arithmetic. Cure: Increase thePARAMETER, recompile, and try again.
Internal Parameters
FUDGEβREAL,default = 2. bestie this is the little safety cushion that widens the Gershgorin intervals π like, ideally a value of1should be enough, but on machines with sloppy arithmetic you gotta go bigger. The default for publicly released versions should be large enough to handle the worst machine around β yes, that machine, the cursed one in the corner π. And the slay part? It has no effect on accuracy of the solution, so don't stress π«Ά
π«Ά Contributors π«Ά
okay these absolute icons literally built this thing, show some respect:
- W. Kahan, University of California, Berkeley, USA π
- Beresford Parlett, University of California, Berkeley, USA β¨
- Jim Demmel, University of California, Berkeley, USA π
- Inderjit Dhillon, University of Texas, Austin, USA π¦
- Osni Marques, LBNL/NERSC, USA πΈ
- Christof Voemel, University of California, Berkeley, USA π
π Author π
The main character energy comes from:
- Univ. of Tennessee
- Univ. of California Berkeley
- Univ. of Colorado Denver
- NAG Ltd.
π Definition π
Located at line 325 of file slarrd.f β yes, fr fr, that's the spot π₯
π Author (the meta one) π
Generated automatically by Doxygen for LAPACK from the source code. Not a human typing this out β it's the machine doing its little autopilot thing π€β¨
π real talk: this page is auto-generated, so if something looks weird, blame the Doxygen, not me π
and that's a wrap on larrd(3) bestie!! π this whole thing is from LAPACK, Version 3.12.0, dated larrd(3) β go forth and slay those eigenvalue problems, ily, bye ππ¦π
π¦ 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