 LAPACK  3.10.0 LAPACK: Linear Algebra PACKage

## ◆ 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.```
Parameters
 [in] JOBZ ``` JOBZ is CHARACTER*1 = 'N': Compute eigenvalues only; = 'V': Compute eigenvalues and eigenvectors.``` [in] UPLO ``` UPLO is CHARACTER*1 = 'U': Upper triangle of A is stored; = 'L': Lower triangle of A is stored.``` [in] N ``` N is INTEGER The order of the matrix A. N >= 0.``` [in,out] A ``` A is 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.``` [in] LDA ``` LDA is INTEGER The leading dimension of the array A. LDA >= max(1,N).``` [out] W ``` W is DOUBLE PRECISION array, dimension (N) If INFO = 0, the eigenvalues in ascending order.``` [out] WORK ``` WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) On exit, if INFO = 0, WORK(1) returns the optimal LWORK.``` [in] LWORK ``` LWORK is INTEGER The length of the array WORK. LWORK >= max(1,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.``` [out] INFO ``` INFO is INTEGER = 0: successful exit < 0: if INFO = -i, the i-th argument had an illegal value > 0: if INFO = i, the algorithm failed to converge; i off-diagonal elements of an intermediate tridiagonal form did not converge to zero.```

Definition at line 131 of file dsyev.f.

132 *
133 * -- LAPACK driver routine --
134 * -- LAPACK is a software package provided by Univ. of Tennessee, --
135 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
136 *
137 * .. Scalar Arguments ..
138  CHARACTER JOBZ, UPLO
139  INTEGER INFO, LDA, LWORK, N
140 * ..
141 * .. Array Arguments ..
142  DOUBLE PRECISION A( LDA, * ), W( * ), WORK( * )
143 * ..
144 *
145 * =====================================================================
146 *
147 * .. Parameters ..
148  DOUBLE PRECISION ZERO, ONE
149  parameter( zero = 0.0d0, one = 1.0d0 )
150 * ..
151 * .. Local Scalars ..
152  LOGICAL LOWER, LQUERY, WANTZ
153  INTEGER IINFO, IMAX, INDE, INDTAU, INDWRK, ISCALE,
154  \$ LLWORK, LWKOPT, NB
155  DOUBLE PRECISION ANRM, BIGNUM, EPS, RMAX, RMIN, SAFMIN, SIGMA,
156  \$ SMLNUM
157 * ..
158 * .. External Functions ..
159  LOGICAL LSAME
160  INTEGER ILAENV
161  DOUBLE PRECISION DLAMCH, DLANSY
162  EXTERNAL lsame, ilaenv, dlamch, dlansy
163 * ..
164 * .. External Subroutines ..
165  EXTERNAL dlascl, dorgtr, dscal, dsteqr, dsterf, dsytrd,
166  \$ xerbla
167 * ..
168 * .. Intrinsic Functions ..
169  INTRINSIC max, sqrt
170 * ..
171 * .. Executable Statements ..
172 *
173 * Test the input parameters.
174 *
175  wantz = lsame( jobz, 'V' )
176  lower = lsame( uplo, 'L' )
177  lquery = ( lwork.EQ.-1 )
178 *
179  info = 0
180  IF( .NOT.( wantz .OR. lsame( jobz, 'N' ) ) ) THEN
181  info = -1
182  ELSE IF( .NOT.( lower .OR. lsame( uplo, 'U' ) ) ) THEN
183  info = -2
184  ELSE IF( n.LT.0 ) THEN
185  info = -3
186  ELSE IF( lda.LT.max( 1, n ) ) THEN
187  info = -5
188  END IF
189 *
190  IF( info.EQ.0 ) THEN
191  nb = ilaenv( 1, 'DSYTRD', uplo, n, -1, -1, -1 )
192  lwkopt = max( 1, ( nb+2 )*n )
193  work( 1 ) = lwkopt
194 *
195  IF( lwork.LT.max( 1, 3*n-1 ) .AND. .NOT.lquery )
196  \$ info = -8
197  END IF
198 *
199  IF( info.NE.0 ) THEN
200  CALL xerbla( 'DSYEV ', -info )
201  RETURN
202  ELSE IF( lquery ) THEN
203  RETURN
204  END IF
205 *
206 * Quick return if possible
207 *
208  IF( n.EQ.0 ) THEN
209  RETURN
210  END IF
211 *
212  IF( n.EQ.1 ) THEN
213  w( 1 ) = a( 1, 1 )
214  work( 1 ) = 2
215  IF( wantz )
216  \$ a( 1, 1 ) = one
217  RETURN
218  END IF
219 *
220 * Get machine constants.
221 *
222  safmin = dlamch( 'Safe minimum' )
223  eps = dlamch( 'Precision' )
224  smlnum = safmin / eps
225  bignum = one / smlnum
226  rmin = sqrt( smlnum )
227  rmax = sqrt( bignum )
228 *
229 * Scale matrix to allowable range, if necessary.
230 *
231  anrm = dlansy( 'M', uplo, n, a, lda, work )
232  iscale = 0
233  IF( anrm.GT.zero .AND. anrm.LT.rmin ) THEN
234  iscale = 1
235  sigma = rmin / anrm
236  ELSE IF( anrm.GT.rmax ) THEN
237  iscale = 1
238  sigma = rmax / anrm
239  END IF
240  IF( iscale.EQ.1 )
241  \$ CALL dlascl( uplo, 0, 0, one, sigma, n, n, a, lda, info )
242 *
243 * Call DSYTRD to reduce symmetric matrix to tridiagonal form.
244 *
245  inde = 1
246  indtau = inde + n
247  indwrk = indtau + n
248  llwork = lwork - indwrk + 1
249  CALL dsytrd( uplo, n, a, lda, w, work( inde ), work( indtau ),
250  \$ work( indwrk ), llwork, iinfo )
251 *
252 * For eigenvalues only, call DSTERF. For eigenvectors, first call
253 * DORGTR to generate the orthogonal matrix, then call DSTEQR.
254 *
255  IF( .NOT.wantz ) THEN
256  CALL dsterf( n, w, work( inde ), info )
257  ELSE
258  CALL dorgtr( uplo, n, a, lda, work( indtau ), work( indwrk ),
259  \$ llwork, iinfo )
260  CALL dsteqr( jobz, n, w, work( inde ), a, lda, work( indtau ),
261  \$ info )
262  END IF
263 *
264 * If matrix was scaled, then rescale eigenvalues appropriately.
265 *
266  IF( iscale.EQ.1 ) THEN
267  IF( info.EQ.0 ) THEN
268  imax = n
269  ELSE
270  imax = info - 1
271  END IF
272  CALL dscal( imax, one / sigma, w, 1 )
273  END IF
274 *
275 * Set WORK(1) to optimal workspace size.
276 *
277  work( 1 ) = lwkopt
278 *
279  RETURN
280 *
281 * End of DSYEV
282 *
double precision function dlamch(CMACH)
DLAMCH
Definition: dlamch.f:69
subroutine dlascl(TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO)
DLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
Definition: dlascl.f:143
integer function ilaenv(ISPEC, NAME, OPTS, N1, N2, N3, N4)
ILAENV
Definition: ilaenv.f:162
subroutine xerbla(SRNAME, INFO)
XERBLA
Definition: xerbla.f:60
logical function lsame(CA, CB)
LSAME
Definition: lsame.f:53
subroutine dsteqr(COMPZ, N, D, E, Z, LDZ, WORK, INFO)
DSTEQR
Definition: dsteqr.f:131
subroutine dsterf(N, D, E, INFO)
DSTERF
Definition: dsterf.f:86
subroutine dscal(N, DA, DX, INCX)
DSCAL
Definition: dscal.f:79
subroutine dorgtr(UPLO, N, A, LDA, TAU, WORK, LWORK, INFO)
DORGTR
Definition: dorgtr.f:123
double precision function dlansy(NORM, UPLO, N, A, LDA, WORK)
DLANSY returns the value of the 1-norm, or the Frobenius norm, or the infinity norm,...
Definition: dlansy.f:122
subroutine dsytrd(UPLO, N, A, LDA, D, E, TAU, WORK, LWORK, INFO)
DSYTRD
Definition: dsytrd.f:192
Here is the call graph for this function:
Here is the caller graph for this function: