LAPACK 3.12.1
LAPACK: Linear Algebra PACKage
Loading...
Searching...
No Matches
chegv.f
Go to the documentation of this file.
1*> \brief \b CHEGV
2*
3* =========== DOCUMENTATION ===========
4*
5* Online html documentation available at
6* http://www.netlib.org/lapack/explore-html/
7*
8*> Download CHEGV + dependencies
9*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/chegv.f">
10*> [TGZ]</a>
11*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/chegv.f">
12*> [ZIP]</a>
13*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/chegv.f">
14*> [TXT]</a>
15*
16* Definition:
17* ===========
18*
19* SUBROUTINE CHEGV( ITYPE, JOBZ, UPLO, N, A, LDA, B, LDB, W, WORK,
20* LWORK, RWORK, INFO )
21*
22* .. Scalar Arguments ..
23* CHARACTER JOBZ, UPLO
24* INTEGER INFO, ITYPE, LDA, LDB, LWORK, N
25* ..
26* .. Array Arguments ..
27* REAL RWORK( * ), W( * )
28* COMPLEX A( LDA, * ), B( LDB, * ), WORK( * )
29* ..
30*
31*
32*> \par Purpose:
33* =============
34*>
35*> \verbatim
36*>
37*> CHEGV computes all the eigenvalues, and optionally, the eigenvectors
38*> of a complex generalized Hermitian-definite eigenproblem, of the form
39*> A*x=(lambda)*B*x, A*Bx=(lambda)*x, or B*A*x=(lambda)*x.
40*> Here A and B are assumed to be Hermitian and B is also
41*> positive definite.
42*> \endverbatim
43*
44* Arguments:
45* ==========
46*
47*> \param[in] ITYPE
48*> \verbatim
49*> ITYPE is INTEGER
50*> Specifies the problem type to be solved:
51*> = 1: A*x = (lambda)*B*x
52*> = 2: A*B*x = (lambda)*x
53*> = 3: B*A*x = (lambda)*x
54*> \endverbatim
55*>
56*> \param[in] JOBZ
57*> \verbatim
58*> JOBZ is CHARACTER*1
59*> = 'N': Compute eigenvalues only;
60*> = 'V': Compute eigenvalues and eigenvectors.
61*> \endverbatim
62*>
63*> \param[in] UPLO
64*> \verbatim
65*> UPLO is CHARACTER*1
66*> = 'U': Upper triangles of A and B are stored;
67*> = 'L': Lower triangles of A and B are stored.
68*> \endverbatim
69*>
70*> \param[in] N
71*> \verbatim
72*> N is INTEGER
73*> The order of the matrices A and B. N >= 0.
74*> \endverbatim
75*>
76*> \param[in,out] A
77*> \verbatim
78*> A is COMPLEX array, dimension (LDA, N)
79*> On entry, the Hermitian matrix A. If UPLO = 'U', the
80*> leading N-by-N upper triangular part of A contains the
81*> upper triangular part of the matrix A. If UPLO = 'L',
82*> the leading N-by-N lower triangular part of A contains
83*> the lower triangular part of the matrix A.
84*>
85*> On exit, if JOBZ = 'V', then if INFO = 0, A contains the
86*> matrix Z of eigenvectors. The eigenvectors are normalized
87*> as follows:
88*> if ITYPE = 1 or 2, Z**H*B*Z = I;
89*> if ITYPE = 3, Z**H*inv(B)*Z = I.
90*> If JOBZ = 'N', then on exit the upper triangle (if UPLO='U')
91*> or the lower triangle (if UPLO='L') of A, including the
92*> diagonal, is destroyed.
93*> \endverbatim
94*>
95*> \param[in] LDA
96*> \verbatim
97*> LDA is INTEGER
98*> The leading dimension of the array A. LDA >= max(1,N).
99*> \endverbatim
100*>
101*> \param[in,out] B
102*> \verbatim
103*> B is COMPLEX array, dimension (LDB, N)
104*> On entry, the Hermitian positive definite matrix B.
105*> If UPLO = 'U', the leading N-by-N upper triangular part of B
106*> contains the upper triangular part of the matrix B.
107*> If UPLO = 'L', the leading N-by-N lower triangular part of B
108*> contains the lower triangular part of the matrix B.
109*>
110*> On exit, if INFO <= N, the part of B containing the matrix is
111*> overwritten by the triangular factor U or L from the Cholesky
112*> factorization B = U**H*U or B = L*L**H.
113*> \endverbatim
114*>
115*> \param[in] LDB
116*> \verbatim
117*> LDB is INTEGER
118*> The leading dimension of the array B. LDB >= max(1,N).
119*> \endverbatim
120*>
121*> \param[out] W
122*> \verbatim
123*> W is REAL array, dimension (N)
124*> If INFO = 0, the eigenvalues in ascending order.
125*> \endverbatim
126*>
127*> \param[out] WORK
128*> \verbatim
129*> WORK is COMPLEX array, dimension (MAX(1,LWORK))
130*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
131*> \endverbatim
132*>
133*> \param[in] LWORK
134*> \verbatim
135*> LWORK is INTEGER
136*> The length of the array WORK. LWORK >= max(1,2*N-1).
137*> For optimal efficiency, LWORK >= (NB+1)*N,
138*> where NB is the blocksize for CHETRD returned by ILAENV.
139*>
140*> If LWORK = -1, then a workspace query is assumed; the routine
141*> only calculates the optimal size of the WORK array, returns
142*> this value as the first entry of the WORK array, and no error
143*> message related to LWORK is issued by XERBLA.
144*> \endverbatim
145*>
146*> \param[out] RWORK
147*> \verbatim
148*> RWORK is REAL array, dimension (max(1, 3*N-2))
149*> \endverbatim
150*>
151*> \param[out] INFO
152*> \verbatim
153*> INFO is INTEGER
154*> = 0: successful exit
155*> < 0: if INFO = -i, the i-th argument had an illegal value
156*> > 0: CPOTRF or CHEEV returned an error code:
157*> <= N: if INFO = i, CHEEV failed to converge;
158*> i off-diagonal elements of an intermediate
159*> tridiagonal form did not converge to zero;
160*> > N: if INFO = N + i, for 1 <= i <= N, then the leading
161*> principal minor of order i of B is not positive.
162*> The factorization of B could not be completed and
163*> no eigenvalues or eigenvectors were computed.
164*> \endverbatim
165*
166* Authors:
167* ========
168*
169*> \author Univ. of Tennessee
170*> \author Univ. of California Berkeley
171*> \author Univ. of Colorado Denver
172*> \author NAG Ltd.
173*
174*> \ingroup hegv
175*
176* =====================================================================
177 SUBROUTINE chegv( ITYPE, JOBZ, UPLO, N, A, LDA, B, LDB, W,
178 $ WORK,
179 $ LWORK, RWORK, INFO )
180*
181* -- LAPACK driver routine --
182* -- LAPACK is a software package provided by Univ. of Tennessee, --
183* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
184*
185* .. Scalar Arguments ..
186 CHARACTER JOBZ, UPLO
187 INTEGER INFO, ITYPE, LDA, LDB, LWORK, N
188* ..
189* .. Array Arguments ..
190 REAL RWORK( * ), W( * )
191 COMPLEX A( LDA, * ), B( LDB, * ), WORK( * )
192* ..
193*
194* =====================================================================
195*
196* .. Parameters ..
197 COMPLEX ONE
198 PARAMETER ( ONE = ( 1.0e+0, 0.0e+0 ) )
199* ..
200* .. Local Scalars ..
201 LOGICAL LQUERY, UPPER, WANTZ
202 CHARACTER TRANS
203 INTEGER LWKOPT, NB, NEIG
204* ..
205* .. External Functions ..
206 LOGICAL LSAME
207 INTEGER ILAENV
208 REAL SROUNDUP_LWORK
209 EXTERNAL ilaenv, lsame, sroundup_lwork
210* ..
211* .. External Subroutines ..
212 EXTERNAL cheev, chegst, cpotrf, ctrmm, ctrsm,
213 $ xerbla
214* ..
215* .. Intrinsic Functions ..
216 INTRINSIC max
217* ..
218* .. Executable Statements ..
219*
220* Test the input parameters.
221*
222 wantz = lsame( jobz, 'V' )
223 upper = lsame( uplo, 'U' )
224 lquery = ( lwork.EQ. -1 )
225*
226 info = 0
227 IF( itype.LT.1 .OR. itype.GT.3 ) THEN
228 info = -1
229 ELSE IF( .NOT.( wantz .OR. lsame( jobz, 'N' ) ) ) THEN
230 info = -2
231 ELSE IF( .NOT.( upper .OR. lsame( uplo, 'L' ) ) ) THEN
232 info = -3
233 ELSE IF( n.LT.0 ) THEN
234 info = -4
235 ELSE IF( lda.LT.max( 1, n ) ) THEN
236 info = -6
237 ELSE IF( ldb.LT.max( 1, n ) ) THEN
238 info = -8
239 END IF
240*
241 IF( info.EQ.0 ) THEN
242 nb = ilaenv( 1, 'CHETRD', uplo, n, -1, -1, -1 )
243 lwkopt = max( 1, ( nb + 1 )*n )
244 work( 1 ) = sroundup_lwork(lwkopt)
245*
246 IF( lwork.LT.max( 1, 2*n-1 ) .AND. .NOT.lquery ) THEN
247 info = -11
248 END IF
249 END IF
250*
251 IF( info.NE.0 ) THEN
252 CALL xerbla( 'CHEGV ', -info )
253 RETURN
254 ELSE IF( lquery ) THEN
255 RETURN
256 END IF
257*
258* Quick return if possible
259*
260 IF( n.EQ.0 )
261 $ RETURN
262*
263* Form a Cholesky factorization of B.
264*
265 CALL cpotrf( uplo, n, b, ldb, info )
266 IF( info.NE.0 ) THEN
267 info = n + info
268 RETURN
269 END IF
270*
271* Transform problem to standard eigenvalue problem and solve.
272*
273 CALL chegst( itype, uplo, n, a, lda, b, ldb, info )
274 CALL cheev( jobz, uplo, n, a, lda, w, work, lwork, rwork,
275 $ info )
276*
277 IF( wantz ) THEN
278*
279* Backtransform eigenvectors to the original problem.
280*
281 neig = n
282 IF( info.GT.0 )
283 $ neig = info - 1
284 IF( itype.EQ.1 .OR. itype.EQ.2 ) THEN
285*
286* For A*x=(lambda)*B*x and A*B*x=(lambda)*x;
287* backtransform eigenvectors: x = inv(L)**H*y or inv(U)*y
288*
289 IF( upper ) THEN
290 trans = 'N'
291 ELSE
292 trans = 'C'
293 END IF
294*
295 CALL ctrsm( 'Left', uplo, trans, 'Non-unit', n, neig,
296 $ one,
297 $ b, ldb, a, lda )
298*
299 ELSE IF( itype.EQ.3 ) THEN
300*
301* For B*A*x=(lambda)*x;
302* backtransform eigenvectors: x = L*y or U**H*y
303*
304 IF( upper ) THEN
305 trans = 'C'
306 ELSE
307 trans = 'N'
308 END IF
309*
310 CALL ctrmm( 'Left', uplo, trans, 'Non-unit', n, neig,
311 $ one,
312 $ b, ldb, a, lda )
313 END IF
314 END IF
315*
316 work( 1 ) = sroundup_lwork(lwkopt)
317*
318 RETURN
319*
320* End of CHEGV
321*
322 END
subroutine xerbla(srname, info)
Definition cblat2.f:3285
subroutine cheev(jobz, uplo, n, a, lda, w, work, lwork, rwork, info)
CHEEV computes the eigenvalues and, optionally, the left and/or right eigenvectors for HE matrices
Definition cheev.f:138
subroutine chegst(itype, uplo, n, a, lda, b, ldb, info)
CHEGST
Definition chegst.f:126
subroutine chegv(itype, jobz, uplo, n, a, lda, b, ldb, w, work, lwork, rwork, info)
CHEGV
Definition chegv.f:180
subroutine cpotrf(uplo, n, a, lda, info)
CPOTRF
Definition cpotrf.f:105
subroutine ctrmm(side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
CTRMM
Definition ctrmm.f:177
subroutine ctrsm(side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
CTRSM
Definition ctrsm.f:180