1CHPGVD(1) LAPACK driver routine (version 3.2) CHPGVD(1)
2
3
4
6 CHPGVD - computes all the eigenvalues and, optionally, the eigenvectors
7 of a complex generalized Hermitian-definite eigenproblem, of the form
8 A*x=(lambda)*B*x, A*Bx=(lambda)*x, or B*A*x=(lambda)*x
9
11 SUBROUTINE CHPGVD( ITYPE, JOBZ, UPLO, N, AP, BP, W, Z, LDZ, WORK,
12 LWORK, RWORK, LRWORK, IWORK, LIWORK, INFO )
13
14 CHARACTER JOBZ, UPLO
15
16 INTEGER INFO, ITYPE, LDZ, LIWORK, LRWORK, LWORK, N
17
18 INTEGER IWORK( * )
19
20 REAL RWORK( * ), W( * )
21
22 COMPLEX AP( * ), BP( * ), WORK( * ), Z( LDZ, * )
23
25 CHPGVD computes all the eigenvalues and, optionally, the eigenvectors
26 of a complex generalized Hermitian-definite eigenproblem, of the form
27 A*x=(lambda)*B*x, A*Bx=(lambda)*x, or B*A*x=(lambda)*x. Here A and B
28 are assumed to be Hermitian, stored in packed format, and B is also
29 positive definite.
30 If eigenvectors are desired, it uses a divide and conquer algorithm.
31 The divide and conquer algorithm makes very mild assumptions about
32 floating point arithmetic. It will work on machines with a guard digit
33 in add/subtract, or on those binary machines without guard digits which
34 subtract like the Cray X-MP, Cray Y-MP, Cray C-90, or Cray-2. It could
35 conceivably fail on hexadecimal or decimal machines without guard dig‐
36 its, but we know of none.
37
39 ITYPE (input) INTEGER
40 Specifies the problem type to be solved:
41 = 1: A*x = (lambda)*B*x
42 = 2: A*B*x = (lambda)*x
43 = 3: B*A*x = (lambda)*x
44
45 JOBZ (input) CHARACTER*1
46 = 'N': Compute eigenvalues only;
47 = 'V': Compute eigenvalues and eigenvectors.
48
49 UPLO (input) CHARACTER*1
50 = 'U': Upper triangles of A and B are stored;
51 = 'L': Lower triangles of A and B are stored.
52
53 N (input) INTEGER
54 The order of the matrices A and B. N >= 0.
55
56 AP (input/output) COMPLEX array, dimension (N*(N+1)/2)
57 On entry, the upper or lower triangle of the Hermitian matrix
58 A, packed columnwise in a linear array. The j-th column of A
59 is stored in the array AP as follows: if UPLO = 'U', AP(i +
60 (j-1)*j/2) = A(i,j) for 1<=i<=j; if UPLO = 'L', AP(i +
61 (j-1)*(2*n-j)/2) = A(i,j) for j<=i<=n. On exit, the contents
62 of AP are destroyed.
63
64 BP (input/output) COMPLEX array, dimension (N*(N+1)/2)
65 On entry, the upper or lower triangle of the Hermitian matrix
66 B, packed columnwise in a linear array. The j-th column of B
67 is stored in the array BP as follows: if UPLO = 'U', BP(i +
68 (j-1)*j/2) = B(i,j) for 1<=i<=j; if UPLO = 'L', BP(i +
69 (j-1)*(2*n-j)/2) = B(i,j) for j<=i<=n. On exit, the triangular
70 factor U or L from the Cholesky factorization B = U**H*U or B =
71 L*L**H, in the same storage format as B.
72
73 W (output) REAL array, dimension (N)
74 If INFO = 0, the eigenvalues in ascending order.
75
76 Z (output) COMPLEX array, dimension (LDZ, N)
77 If JOBZ = 'V', then if INFO = 0, Z contains the matrix Z of
78 eigenvectors. The eigenvectors are normalized as follows: if
79 ITYPE = 1 or 2, Z**H*B*Z = I; if ITYPE = 3, Z**H*inv(B)*Z = I.
80 If JOBZ = 'N', then Z is not referenced.
81
82 LDZ (input) INTEGER
83 The leading dimension of the array Z. LDZ >= 1, and if JOBZ =
84 'V', LDZ >= max(1,N).
85
86 WORK (workspace) COMPLEX array, dimension (MAX(1,LWORK))
87 On exit, if INFO = 0, WORK(1) returns the required LWORK.
88
89 LWORK (input) INTEGER
90 The dimension of array WORK. If N <= 1, LWORK >=
91 1. If JOBZ = 'N' and N > 1, LWORK >= N. If JOBZ = 'V' and N >
92 1, LWORK >= 2*N. If LWORK = -1, then a workspace query is
93 assumed; the routine only calculates the required sizes of the
94 WORK, RWORK and IWORK arrays, returns these values as the first
95 entries of the WORK, RWORK and IWORK arrays, and no error mes‐
96 sage related to LWORK or LRWORK or LIWORK is issued by XERBLA.
97
98 RWORK (workspace) REAL array, dimension (MAX(1,LRWORK))
99 On exit, if INFO = 0, RWORK(1) returns the required LRWORK.
100
101 LRWORK (input) INTEGER
102 The dimension of array RWORK. If N <= 1, LRWORK
103 >= 1. If JOBZ = 'N' and N > 1, LRWORK >= N. If JOBZ = 'V' and
104 N > 1, LRWORK >= 1 + 5*N + 2*N**2. If LRWORK = -1, then a
105 workspace query is assumed; the routine only calculates the
106 required sizes of the WORK, RWORK and IWORK arrays, returns
107 these values as the first entries of the WORK, RWORK and IWORK
108 arrays, and no error message related to LWORK or LRWORK or
109 LIWORK is issued by XERBLA.
110
111 IWORK (workspace/output) INTEGER array, dimension (MAX(1,LIWORK))
112 On exit, if INFO = 0, IWORK(1) returns the required LIWORK.
113
114 LIWORK (input) INTEGER
115 The dimension of array IWORK. If JOBZ = 'N' or N <= 1, LIWORK
116 >= 1. If JOBZ = 'V' and N > 1, LIWORK >= 3 + 5*N. If LIWORK
117 = -1, then a workspace query is assumed; the routine only cal‐
118 culates the required sizes of the WORK, RWORK and IWORK arrays,
119 returns these values as the first entries of the WORK, RWORK
120 and IWORK arrays, and no error message related to LWORK or
121 LRWORK or LIWORK is issued by XERBLA.
122
123 INFO (output) INTEGER
124 = 0: successful exit
125 < 0: if INFO = -i, the i-th argument had an illegal value
126 > 0: CPPTRF or CHPEVD returned an error code:
127 <= N: if INFO = i, CHPEVD failed to converge; i off-diagonal
128 elements of an intermediate tridiagonal form did not convergeto
129 zero; > N: if INFO = N + i, for 1 <= i <= n, then the leading
130 minor of order i of B is not positive definite. The factoriza‐
131 tion of B could not be completed and no eigenvalues or eigen‐
132 vectors were computed.
133
135 Based on contributions by
136 Mark Fahey, Department of Mathematics, Univ. of Kentucky, USA
137
138
139
140 LAPACK driver routine (version 3.N2o)vember 2008 CHPGVD(1)