 LAPACK  3.10.1 LAPACK: Linear Algebra PACKage

## ◆ zheev()

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

ZHEEV computes the eigenvalues and, optionally, the left and/or right eigenvectors for HE matrices

Purpose:
``` ZHEEV computes all eigenvalues and, optionally, eigenvectors of a
complex Hermitian 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 COMPLEX*16 array, dimension (LDA, N) On entry, the Hermitian matrix A. If UPLO = 'U', the leading N-by-N upper triangular part of A contains the upper triangular part of the matrix A. If UPLO = 'L', the leading N-by-N lower triangular part of A contains the lower triangular part of the matrix A. On exit, if JOBZ = 'V', then if INFO = 0, A contains the orthonormal eigenvectors of the matrix A. If JOBZ = 'N', then on exit the lower triangle (if UPLO='L') or the upper triangle (if UPLO='U') of A, including the diagonal, is destroyed.``` [in] LDA ``` LDA is INTEGER The leading dimension of the array A. LDA >= max(1,N).``` [out] W ``` W is DOUBLE PRECISION array, dimension (N) If INFO = 0, the eigenvalues in ascending order.``` [out] WORK ``` WORK is COMPLEX*16 array, dimension (MAX(1,LWORK)) On exit, if INFO = 0, WORK(1) returns the optimal LWORK.``` [in] LWORK ``` LWORK is INTEGER The length of the array WORK. LWORK >= max(1,2*N-1). For optimal efficiency, LWORK >= (NB+1)*N, where NB is the blocksize for ZHETRD returned by ILAENV. If LWORK = -1, then a workspace query is assumed; the routine only calculates the optimal size of the WORK array, returns this value as the first entry of the WORK array, and no error message related to LWORK is issued by XERBLA.``` [out] RWORK ` RWORK is DOUBLE PRECISION array, dimension (max(1, 3*N-2))` [out] INFO ``` INFO is INTEGER = 0: successful exit < 0: if INFO = -i, the i-th argument had an illegal value > 0: if INFO = i, the algorithm failed to converge; i off-diagonal elements of an intermediate tridiagonal form did not converge to zero.```

Definition at line 138 of file zheev.f.

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