LAPACK 3.11.0 LAPACK: Linear Algebra PACKage
Searching...
No Matches
sspgv.f
Go to the documentation of this file.
1*> \brief \b SSPGV
2*
3* =========== DOCUMENTATION ===========
4*
5* Online html documentation available at
6* http://www.netlib.org/lapack/explore-html/
7*
8*> \htmlonly
10*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/sspgv.f">
11*> [TGZ]</a>
12*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/sspgv.f">
13*> [ZIP]</a>
14*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/sspgv.f">
15*> [TXT]</a>
16*> \endhtmlonly
17*
18* Definition:
19* ===========
20*
21* SUBROUTINE SSPGV( ITYPE, JOBZ, UPLO, N, AP, BP, W, Z, LDZ, WORK,
22* INFO )
23*
24* .. Scalar Arguments ..
25* CHARACTER JOBZ, UPLO
26* INTEGER INFO, ITYPE, LDZ, N
27* ..
28* .. Array Arguments ..
29* REAL AP( * ), BP( * ), W( * ), WORK( * ),
30* \$ Z( LDZ, * )
31* ..
32*
33*
34*> \par Purpose:
35* =============
36*>
37*> \verbatim
38*>
39*> SSPGV computes all the eigenvalues and, optionally, the eigenvectors
40*> of a real generalized symmetric-definite eigenproblem, of the form
41*> A*x=(lambda)*B*x, A*Bx=(lambda)*x, or B*A*x=(lambda)*x.
42*> Here A and B are assumed to be symmetric, stored in packed format,
43*> and B is also positive definite.
44*> \endverbatim
45*
46* Arguments:
47* ==========
48*
49*> \param[in] ITYPE
50*> \verbatim
51*> ITYPE is INTEGER
52*> Specifies the problem type to be solved:
53*> = 1: A*x = (lambda)*B*x
54*> = 2: A*B*x = (lambda)*x
55*> = 3: B*A*x = (lambda)*x
56*> \endverbatim
57*>
58*> \param[in] JOBZ
59*> \verbatim
60*> JOBZ is CHARACTER*1
61*> = 'N': Compute eigenvalues only;
62*> = 'V': Compute eigenvalues and eigenvectors.
63*> \endverbatim
64*>
65*> \param[in] UPLO
66*> \verbatim
67*> UPLO is CHARACTER*1
68*> = 'U': Upper triangles of A and B are stored;
69*> = 'L': Lower triangles of A and B are stored.
70*> \endverbatim
71*>
72*> \param[in] N
73*> \verbatim
74*> N is INTEGER
75*> The order of the matrices A and B. N >= 0.
76*> \endverbatim
77*>
78*> \param[in,out] AP
79*> \verbatim
80*> AP is REAL array, dimension (N*(N+1)/2)
81*> On entry, the upper or lower triangle of the symmetric matrix
82*> A, packed columnwise in a linear array. The j-th column of A
83*> is stored in the array AP as follows:
84*> if UPLO = 'U', AP(i + (j-1)*j/2) = A(i,j) for 1<=i<=j;
85*> if UPLO = 'L', AP(i + (j-1)*(2*n-j)/2) = A(i,j) for j<=i<=n.
86*>
87*> On exit, the contents of AP are destroyed.
88*> \endverbatim
89*>
90*> \param[in,out] BP
91*> \verbatim
92*> BP is REAL array, dimension (N*(N+1)/2)
93*> On entry, the upper or lower triangle of the symmetric matrix
94*> B, packed columnwise in a linear array. The j-th column of B
95*> is stored in the array BP as follows:
96*> if UPLO = 'U', BP(i + (j-1)*j/2) = B(i,j) for 1<=i<=j;
97*> if UPLO = 'L', BP(i + (j-1)*(2*n-j)/2) = B(i,j) for j<=i<=n.
98*>
99*> On exit, the triangular factor U or L from the Cholesky
100*> factorization B = U**T*U or B = L*L**T, in the same storage
101*> format as B.
102*> \endverbatim
103*>
104*> \param[out] W
105*> \verbatim
106*> W is REAL array, dimension (N)
107*> If INFO = 0, the eigenvalues in ascending order.
108*> \endverbatim
109*>
110*> \param[out] Z
111*> \verbatim
112*> Z is REAL array, dimension (LDZ, N)
113*> If JOBZ = 'V', then if INFO = 0, Z contains the matrix Z of
114*> eigenvectors. The eigenvectors are normalized as follows:
115*> if ITYPE = 1 or 2, Z**T*B*Z = I;
116*> if ITYPE = 3, Z**T*inv(B)*Z = I.
117*> If JOBZ = 'N', then Z is not referenced.
118*> \endverbatim
119*>
120*> \param[in] LDZ
121*> \verbatim
122*> LDZ is INTEGER
123*> The leading dimension of the array Z. LDZ >= 1, and if
124*> JOBZ = 'V', LDZ >= max(1,N).
125*> \endverbatim
126*>
127*> \param[out] WORK
128*> \verbatim
129*> WORK is REAL array, dimension (3*N)
130*> \endverbatim
131*>
132*> \param[out] INFO
133*> \verbatim
134*> INFO is INTEGER
135*> = 0: successful exit
136*> < 0: if INFO = -i, the i-th argument had an illegal value
137*> > 0: SPPTRF or SSPEV returned an error code:
138*> <= N: if INFO = i, SSPEV failed to converge;
139*> i off-diagonal elements of an intermediate
140*> tridiagonal form did not converge to zero.
141*> > N: if INFO = n + i, for 1 <= i <= n, then the leading
142*> minor of order i of B is not positive definite.
143*> The factorization of B could not be completed and
144*> no eigenvalues or eigenvectors were computed.
145*> \endverbatim
146*
147* Authors:
148* ========
149*
150*> \author Univ. of Tennessee
151*> \author Univ. of California Berkeley
152*> \author Univ. of Colorado Denver
153*> \author NAG Ltd.
154*
155*> \ingroup realOTHEReigen
156*
157* =====================================================================
158 SUBROUTINE sspgv( ITYPE, JOBZ, UPLO, N, AP, BP, W, Z, LDZ, WORK,
159 \$ INFO )
160*
161* -- LAPACK driver routine --
162* -- LAPACK is a software package provided by Univ. of Tennessee, --
163* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
164*
165* .. Scalar Arguments ..
166 CHARACTER JOBZ, UPLO
167 INTEGER INFO, ITYPE, LDZ, N
168* ..
169* .. Array Arguments ..
170 REAL AP( * ), BP( * ), W( * ), WORK( * ),
171 \$ z( ldz, * )
172* ..
173*
174* =====================================================================
175*
176* .. Local Scalars ..
177 LOGICAL UPPER, WANTZ
178 CHARACTER TRANS
179 INTEGER J, NEIG
180* ..
181* .. External Functions ..
182 LOGICAL LSAME
183 EXTERNAL lsame
184* ..
185* .. External Subroutines ..
186 EXTERNAL spptrf, sspev, sspgst, stpmv, stpsv, xerbla
187* ..
188* .. Executable Statements ..
189*
190* Test the input parameters.
191*
192 wantz = lsame( jobz, 'V' )
193 upper = lsame( uplo, 'U' )
194*
195 info = 0
196 IF( itype.LT.1 .OR. itype.GT.3 ) THEN
197 info = -1
198 ELSE IF( .NOT.( wantz .OR. lsame( jobz, 'N' ) ) ) THEN
199 info = -2
200 ELSE IF( .NOT.( upper .OR. lsame( uplo, 'L' ) ) ) THEN
201 info = -3
202 ELSE IF( n.LT.0 ) THEN
203 info = -4
204 ELSE IF( ldz.LT.1 .OR. ( wantz .AND. ldz.LT.n ) ) THEN
205 info = -9
206 END IF
207 IF( info.NE.0 ) THEN
208 CALL xerbla( 'SSPGV ', -info )
209 RETURN
210 END IF
211*
212* Quick return if possible
213*
214 IF( n.EQ.0 )
215 \$ RETURN
216*
217* Form a Cholesky factorization of B.
218*
219 CALL spptrf( uplo, n, bp, info )
220 IF( info.NE.0 ) THEN
221 info = n + info
222 RETURN
223 END IF
224*
225* Transform problem to standard eigenvalue problem and solve.
226*
227 CALL sspgst( itype, uplo, n, ap, bp, info )
228 CALL sspev( jobz, uplo, n, ap, w, z, ldz, work, info )
229*
230 IF( wantz ) THEN
231*
232* Backtransform eigenvectors to the original problem.
233*
234 neig = n
235 IF( info.GT.0 )
236 \$ neig = info - 1
237 IF( itype.EQ.1 .OR. itype.EQ.2 ) THEN
238*
239* For A*x=(lambda)*B*x and A*B*x=(lambda)*x;
240* backtransform eigenvectors: x = inv(L)**T*y or inv(U)*y
241*
242 IF( upper ) THEN
243 trans = 'N'
244 ELSE
245 trans = 'T'
246 END IF
247*
248 DO 10 j = 1, neig
249 CALL stpsv( uplo, trans, 'Non-unit', n, bp, z( 1, j ),
250 \$ 1 )
251 10 CONTINUE
252*
253 ELSE IF( itype.EQ.3 ) THEN
254*
255* For B*A*x=(lambda)*x;
256* backtransform eigenvectors: x = L*y or U**T*y
257*
258 IF( upper ) THEN
259 trans = 'T'
260 ELSE
261 trans = 'N'
262 END IF
263*
264 DO 20 j = 1, neig
265 CALL stpmv( uplo, trans, 'Non-unit', n, bp, z( 1, j ),
266 \$ 1 )
267 20 CONTINUE
268 END IF
269 END IF
270 RETURN
271*
272* End of SSPGV
273*
274 END
subroutine xerbla(SRNAME, INFO)
XERBLA
Definition: xerbla.f:60
subroutine sspgst(ITYPE, UPLO, N, AP, BP, INFO)
SSPGST
Definition: sspgst.f:113
subroutine spptrf(UPLO, N, AP, INFO)
SPPTRF
Definition: spptrf.f:119
subroutine sspev(JOBZ, UPLO, N, AP, W, Z, LDZ, WORK, INFO)
SSPEV computes the eigenvalues and, optionally, the left and/or right eigenvectors for OTHER matrices
Definition: sspev.f:130
subroutine sspgv(ITYPE, JOBZ, UPLO, N, AP, BP, W, Z, LDZ, WORK, INFO)
SSPGV
Definition: sspgv.f:160
subroutine stpmv(UPLO, TRANS, DIAG, N, AP, X, INCX)
STPMV
Definition: stpmv.f:142
subroutine stpsv(UPLO, TRANS, DIAG, N, AP, X, INCX)
STPSV
Definition: stpsv.f:144