1*> \brief <b> CHPEV computes the eigenvalues and, optionally, the left and/or right eigenvectors for OTHER matrices</b> 2* 3* =========== DOCUMENTATION =========== 4* 5* Online html documentation available at 6* http://www.netlib.org/lapack/explore-html/ 7* 8*> \htmlonly 9*> Download CHPEV + dependencies 10*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/chpev.f"> 11*> [TGZ]</a> 12*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/chpev.f"> 13*> [ZIP]</a> 14*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/chpev.f"> 15*> [TXT]</a> 16*> \endhtmlonly 17* 18* Definition: 19* =========== 20* 21* SUBROUTINE CHPEV( JOBZ, UPLO, N, AP, W, Z, LDZ, WORK, RWORK, 22* INFO ) 23* 24* .. Scalar Arguments .. 25* CHARACTER JOBZ, UPLO 26* INTEGER INFO, LDZ, N 27* .. 28* .. Array Arguments .. 29* REAL RWORK( * ), W( * ) 30* COMPLEX AP( * ), WORK( * ), Z( LDZ, * ) 31* .. 32* 33* 34*> \par Purpose: 35* ============= 36*> 37*> \verbatim 38*> 39*> CHPEV computes all the eigenvalues and, optionally, eigenvectors of a 40*> complex Hermitian matrix in packed storage. 41*> \endverbatim 42* 43* Arguments: 44* ========== 45* 46*> \param[in] JOBZ 47*> \verbatim 48*> JOBZ is CHARACTER*1 49*> = 'N': Compute eigenvalues only; 50*> = 'V': Compute eigenvalues and eigenvectors. 51*> \endverbatim 52*> 53*> \param[in] UPLO 54*> \verbatim 55*> UPLO is CHARACTER*1 56*> = 'U': Upper triangle of A is stored; 57*> = 'L': Lower triangle of A is stored. 58*> \endverbatim 59*> 60*> \param[in] N 61*> \verbatim 62*> N is INTEGER 63*> The order of the matrix A. N >= 0. 64*> \endverbatim 65*> 66*> \param[in,out] AP 67*> \verbatim 68*> AP is COMPLEX array, dimension (N*(N+1)/2) 69*> On entry, the upper or lower triangle of the Hermitian matrix 70*> A, packed columnwise in a linear array. The j-th column of A 71*> is stored in the array AP as follows: 72*> if UPLO = 'U', AP(i + (j-1)*j/2) = A(i,j) for 1<=i<=j; 73*> if UPLO = 'L', AP(i + (j-1)*(2*n-j)/2) = A(i,j) for j<=i<=n. 74*> 75*> On exit, AP is overwritten by values generated during the 76*> reduction to tridiagonal form. If UPLO = 'U', the diagonal 77*> and first superdiagonal of the tridiagonal matrix T overwrite 78*> the corresponding elements of A, and if UPLO = 'L', the 79*> diagonal and first subdiagonal of T overwrite the 80*> corresponding elements of A. 81*> \endverbatim 82*> 83*> \param[out] W 84*> \verbatim 85*> W is REAL array, dimension (N) 86*> If INFO = 0, the eigenvalues in ascending order. 87*> \endverbatim 88*> 89*> \param[out] Z 90*> \verbatim 91*> Z is COMPLEX array, dimension (LDZ, N) 92*> If JOBZ = 'V', then if INFO = 0, Z contains the orthonormal 93*> eigenvectors of the matrix A, with the i-th column of Z 94*> holding the eigenvector associated with W(i). 95*> If JOBZ = 'N', then Z is not referenced. 96*> \endverbatim 97*> 98*> \param[in] LDZ 99*> \verbatim 100*> LDZ is INTEGER 101*> The leading dimension of the array Z. LDZ >= 1, and if 102*> JOBZ = 'V', LDZ >= max(1,N). 103*> \endverbatim 104*> 105*> \param[out] WORK 106*> \verbatim 107*> WORK is COMPLEX array, dimension (max(1, 2*N-1)) 108*> \endverbatim 109*> 110*> \param[out] RWORK 111*> \verbatim 112*> RWORK is REAL array, dimension (max(1, 3*N-2)) 113*> \endverbatim 114*> 115*> \param[out] INFO 116*> \verbatim 117*> INFO is INTEGER 118*> = 0: successful exit. 119*> < 0: if INFO = -i, the i-th argument had an illegal value. 120*> > 0: if INFO = i, the algorithm failed to converge; i 121*> off-diagonal elements of an intermediate tridiagonal 122*> form did not converge to zero. 123*> \endverbatim 124* 125* Authors: 126* ======== 127* 128*> \author Univ. of Tennessee 129*> \author Univ. of California Berkeley 130*> \author Univ. of Colorado Denver 131*> \author NAG Ltd. 132* 133*> \ingroup complexOTHEReigen 134* 135* ===================================================================== 136 SUBROUTINE CHPEV( JOBZ, UPLO, N, AP, W, Z, LDZ, WORK, RWORK, 137 $ INFO ) 138* 139* -- LAPACK driver routine -- 140* -- LAPACK is a software package provided by Univ. of Tennessee, -- 141* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- 142* 143* .. Scalar Arguments .. 144 CHARACTER JOBZ, UPLO 145 INTEGER INFO, LDZ, N 146* .. 147* .. Array Arguments .. 148 REAL RWORK( * ), W( * ) 149 COMPLEX AP( * ), WORK( * ), Z( LDZ, * ) 150* .. 151* 152* ===================================================================== 153* 154* .. Parameters .. 155 REAL ZERO, ONE 156 PARAMETER ( ZERO = 0.0E0, ONE = 1.0E0 ) 157* .. 158* .. Local Scalars .. 159 LOGICAL WANTZ 160 INTEGER IINFO, IMAX, INDE, INDRWK, INDTAU, INDWRK, 161 $ ISCALE 162 REAL ANRM, BIGNUM, EPS, RMAX, RMIN, SAFMIN, SIGMA, 163 $ SMLNUM 164* .. 165* .. External Functions .. 166 LOGICAL LSAME 167 REAL CLANHP, SLAMCH 168 EXTERNAL LSAME, CLANHP, SLAMCH 169* .. 170* .. External Subroutines .. 171 EXTERNAL CHPTRD, CSSCAL, CSTEQR, CUPGTR, SSCAL, SSTERF, 172 $ XERBLA 173* .. 174* .. Intrinsic Functions .. 175 INTRINSIC SQRT 176* .. 177* .. Executable Statements .. 178* 179* Test the input parameters. 180* 181 WANTZ = LSAME( JOBZ, 'V' ) 182* 183 INFO = 0 184 IF( .NOT.( WANTZ .OR. LSAME( JOBZ, 'N' ) ) ) THEN 185 INFO = -1 186 ELSE IF( .NOT.( LSAME( UPLO, 'L' ) .OR. LSAME( UPLO, 'U' ) ) ) 187 $ THEN 188 INFO = -2 189 ELSE IF( N.LT.0 ) THEN 190 INFO = -3 191 ELSE IF( LDZ.LT.1 .OR. ( WANTZ .AND. LDZ.LT.N ) ) THEN 192 INFO = -7 193 END IF 194* 195 IF( INFO.NE.0 ) THEN 196 CALL XERBLA( 'CHPEV ', -INFO ) 197 RETURN 198 END IF 199* 200* Quick return if possible 201* 202 IF( N.EQ.0 ) 203 $ RETURN 204* 205 IF( N.EQ.1 ) THEN 206 W( 1 ) = REAL( AP( 1 ) ) 207 RWORK( 1 ) = 1 208 IF( WANTZ ) 209 $ Z( 1, 1 ) = ONE 210 RETURN 211 END IF 212* 213* Get machine constants. 214* 215 SAFMIN = SLAMCH( 'Safe minimum' ) 216 EPS = SLAMCH( 'Precision' ) 217 SMLNUM = SAFMIN / EPS 218 BIGNUM = ONE / SMLNUM 219 RMIN = SQRT( SMLNUM ) 220 RMAX = SQRT( BIGNUM ) 221* 222* Scale matrix to allowable range, if necessary. 223* 224 ANRM = CLANHP( 'M', UPLO, N, AP, RWORK ) 225 ISCALE = 0 226 IF( ANRM.GT.ZERO .AND. ANRM.LT.RMIN ) THEN 227 ISCALE = 1 228 SIGMA = RMIN / ANRM 229 ELSE IF( ANRM.GT.RMAX ) THEN 230 ISCALE = 1 231 SIGMA = RMAX / ANRM 232 END IF 233 IF( ISCALE.EQ.1 ) THEN 234 CALL CSSCAL( ( N*( N+1 ) ) / 2, SIGMA, AP, 1 ) 235 END IF 236* 237* Call CHPTRD to reduce Hermitian packed matrix to tridiagonal form. 238* 239 INDE = 1 240 INDTAU = 1 241 CALL CHPTRD( UPLO, N, AP, W, RWORK( INDE ), WORK( INDTAU ), 242 $ IINFO ) 243* 244* For eigenvalues only, call SSTERF. For eigenvectors, first call 245* CUPGTR to generate the orthogonal matrix, then call CSTEQR. 246* 247 IF( .NOT.WANTZ ) THEN 248 CALL SSTERF( N, W, RWORK( INDE ), INFO ) 249 ELSE 250 INDWRK = INDTAU + N 251 CALL CUPGTR( UPLO, N, AP, WORK( INDTAU ), Z, LDZ, 252 $ WORK( INDWRK ), IINFO ) 253 INDRWK = INDE + N 254 CALL CSTEQR( JOBZ, N, W, RWORK( INDE ), Z, LDZ, 255 $ RWORK( INDRWK ), INFO ) 256 END IF 257* 258* If matrix was scaled, then rescale eigenvalues appropriately. 259* 260 IF( ISCALE.EQ.1 ) THEN 261 IF( INFO.EQ.0 ) THEN 262 IMAX = N 263 ELSE 264 IMAX = INFO - 1 265 END IF 266 CALL SSCAL( IMAX, ONE / SIGMA, W, 1 ) 267 END IF 268* 269 RETURN 270* 271* End of CHPEV 272* 273 END 274