LAPACK  3.10.0
LAPACK: Linear Algebra PACKage
ssbgv.f
Go to the documentation of this file.
1 *> \brief \b SSBGV
2 *
3 * =========== DOCUMENTATION ===========
4 *
5 * Online html documentation available at
6 * http://www.netlib.org/lapack/explore-html/
7 *
8 *> \htmlonly
9 *> Download SSBGV + dependencies
10 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/ssbgv.f">
11 *> [TGZ]</a>
12 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/ssbgv.f">
13 *> [ZIP]</a>
14 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/ssbgv.f">
15 *> [TXT]</a>
16 *> \endhtmlonly
17 *
18 * Definition:
19 * ===========
20 *
21 * SUBROUTINE SSBGV( JOBZ, UPLO, N, KA, KB, AB, LDAB, BB, LDBB, W, Z,
22 * LDZ, WORK, INFO )
23 *
24 * .. Scalar Arguments ..
25 * CHARACTER JOBZ, UPLO
26 * INTEGER INFO, KA, KB, LDAB, LDBB, LDZ, N
27 * ..
28 * .. Array Arguments ..
29 * REAL AB( LDAB, * ), BB( LDBB, * ), W( * ),
30 * $ WORK( * ), Z( LDZ, * )
31 * ..
32 *
33 *
34 *> \par Purpose:
35 * =============
36 *>
37 *> \verbatim
38 *>
39 *> SSBGV computes all the eigenvalues, and optionally, the eigenvectors
40 *> of a real generalized symmetric-definite banded eigenproblem, of
41 *> the form A*x=(lambda)*B*x. Here A and B are assumed to be symmetric
42 *> and banded, and B is also positive definite.
43 *> \endverbatim
44 *
45 * Arguments:
46 * ==========
47 *
48 *> \param[in] JOBZ
49 *> \verbatim
50 *> JOBZ is CHARACTER*1
51 *> = 'N': Compute eigenvalues only;
52 *> = 'V': Compute eigenvalues and eigenvectors.
53 *> \endverbatim
54 *>
55 *> \param[in] UPLO
56 *> \verbatim
57 *> UPLO is CHARACTER*1
58 *> = 'U': Upper triangles of A and B are stored;
59 *> = 'L': Lower triangles of A and B are stored.
60 *> \endverbatim
61 *>
62 *> \param[in] N
63 *> \verbatim
64 *> N is INTEGER
65 *> The order of the matrices A and B. N >= 0.
66 *> \endverbatim
67 *>
68 *> \param[in] KA
69 *> \verbatim
70 *> KA is INTEGER
71 *> The number of superdiagonals of the matrix A if UPLO = 'U',
72 *> or the number of subdiagonals if UPLO = 'L'. KA >= 0.
73 *> \endverbatim
74 *>
75 *> \param[in] KB
76 *> \verbatim
77 *> KB is INTEGER
78 *> The number of superdiagonals of the matrix B if UPLO = 'U',
79 *> or the number of subdiagonals if UPLO = 'L'. KB >= 0.
80 *> \endverbatim
81 *>
82 *> \param[in,out] AB
83 *> \verbatim
84 *> AB is REAL array, dimension (LDAB, N)
85 *> On entry, the upper or lower triangle of the symmetric band
86 *> matrix A, stored in the first ka+1 rows of the array. The
87 *> j-th column of A is stored in the j-th column of the array AB
88 *> as follows:
89 *> if UPLO = 'U', AB(ka+1+i-j,j) = A(i,j) for max(1,j-ka)<=i<=j;
90 *> if UPLO = 'L', AB(1+i-j,j) = A(i,j) for j<=i<=min(n,j+ka).
91 *>
92 *> On exit, the contents of AB are destroyed.
93 *> \endverbatim
94 *>
95 *> \param[in] LDAB
96 *> \verbatim
97 *> LDAB is INTEGER
98 *> The leading dimension of the array AB. LDAB >= KA+1.
99 *> \endverbatim
100 *>
101 *> \param[in,out] BB
102 *> \verbatim
103 *> BB is REAL array, dimension (LDBB, N)
104 *> On entry, the upper or lower triangle of the symmetric band
105 *> matrix B, stored in the first kb+1 rows of the array. The
106 *> j-th column of B is stored in the j-th column of the array BB
107 *> as follows:
108 *> if UPLO = 'U', BB(kb+1+i-j,j) = B(i,j) for max(1,j-kb)<=i<=j;
109 *> if UPLO = 'L', BB(1+i-j,j) = B(i,j) for j<=i<=min(n,j+kb).
110 *>
111 *> On exit, the factor S from the split Cholesky factorization
112 *> B = S**T*S, as returned by SPBSTF.
113 *> \endverbatim
114 *>
115 *> \param[in] LDBB
116 *> \verbatim
117 *> LDBB is INTEGER
118 *> The leading dimension of the array BB. LDBB >= KB+1.
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] Z
128 *> \verbatim
129 *> Z is REAL array, dimension (LDZ, N)
130 *> If JOBZ = 'V', then if INFO = 0, Z contains the matrix Z of
131 *> eigenvectors, with the i-th column of Z holding the
132 *> eigenvector associated with W(i). The eigenvectors are
133 *> normalized so that Z**T*B*Z = I.
134 *> If JOBZ = 'N', then Z is not referenced.
135 *> \endverbatim
136 *>
137 *> \param[in] LDZ
138 *> \verbatim
139 *> LDZ is INTEGER
140 *> The leading dimension of the array Z. LDZ >= 1, and if
141 *> JOBZ = 'V', LDZ >= N.
142 *> \endverbatim
143 *>
144 *> \param[out] WORK
145 *> \verbatim
146 *> WORK is REAL array, dimension (3*N)
147 *> \endverbatim
148 *>
149 *> \param[out] INFO
150 *> \verbatim
151 *> INFO is INTEGER
152 *> = 0: successful exit
153 *> < 0: if INFO = -i, the i-th argument had an illegal value
154 *> > 0: if INFO = i, and i is:
155 *> <= N: the algorithm failed to converge:
156 *> i off-diagonal elements of an intermediate
157 *> tridiagonal form did not converge to zero;
158 *> > N: if INFO = N + i, for 1 <= i <= N, then SPBSTF
159 *> returned INFO = i: B is not positive definite.
160 *> The factorization of B could not be completed and
161 *> no eigenvalues or eigenvectors were computed.
162 *> \endverbatim
163 *
164 * Authors:
165 * ========
166 *
167 *> \author Univ. of Tennessee
168 *> \author Univ. of California Berkeley
169 *> \author Univ. of Colorado Denver
170 *> \author NAG Ltd.
171 *
172 *> \ingroup realOTHEReigen
173 *
174 * =====================================================================
175  SUBROUTINE ssbgv( JOBZ, UPLO, N, KA, KB, AB, LDAB, BB, LDBB, W, Z,
176  $ LDZ, WORK, INFO )
177 *
178 * -- LAPACK driver routine --
179 * -- LAPACK is a software package provided by Univ. of Tennessee, --
180 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
181 *
182 * .. Scalar Arguments ..
183  CHARACTER JOBZ, UPLO
184  INTEGER INFO, KA, KB, LDAB, LDBB, LDZ, N
185 * ..
186 * .. Array Arguments ..
187  REAL AB( LDAB, * ), BB( LDBB, * ), W( * ),
188  $ work( * ), z( ldz, * )
189 * ..
190 *
191 * =====================================================================
192 *
193 * .. Local Scalars ..
194  LOGICAL UPPER, WANTZ
195  CHARACTER VECT
196  INTEGER IINFO, INDE, INDWRK
197 * ..
198 * .. External Functions ..
199  LOGICAL LSAME
200  EXTERNAL lsame
201 * ..
202 * .. External Subroutines ..
203  EXTERNAL spbstf, ssbgst, ssbtrd, ssteqr, ssterf, xerbla
204 * ..
205 * .. Executable Statements ..
206 *
207 * Test the input parameters.
208 *
209  wantz = lsame( jobz, 'V' )
210  upper = lsame( uplo, 'U' )
211 *
212  info = 0
213  IF( .NOT.( wantz .OR. lsame( jobz, 'N' ) ) ) THEN
214  info = -1
215  ELSE IF( .NOT.( upper .OR. lsame( uplo, 'L' ) ) ) THEN
216  info = -2
217  ELSE IF( n.LT.0 ) THEN
218  info = -3
219  ELSE IF( ka.LT.0 ) THEN
220  info = -4
221  ELSE IF( kb.LT.0 .OR. kb.GT.ka ) THEN
222  info = -5
223  ELSE IF( ldab.LT.ka+1 ) THEN
224  info = -7
225  ELSE IF( ldbb.LT.kb+1 ) THEN
226  info = -9
227  ELSE IF( ldz.LT.1 .OR. ( wantz .AND. ldz.LT.n ) ) THEN
228  info = -12
229  END IF
230  IF( info.NE.0 ) THEN
231  CALL xerbla( 'SSBGV ', -info )
232  RETURN
233  END IF
234 *
235 * Quick return if possible
236 *
237  IF( n.EQ.0 )
238  $ RETURN
239 *
240 * Form a split Cholesky factorization of B.
241 *
242  CALL spbstf( uplo, n, kb, bb, ldbb, info )
243  IF( info.NE.0 ) THEN
244  info = n + info
245  RETURN
246  END IF
247 *
248 * Transform problem to standard eigenvalue problem.
249 *
250  inde = 1
251  indwrk = inde + n
252  CALL ssbgst( jobz, uplo, n, ka, kb, ab, ldab, bb, ldbb, z, ldz,
253  $ work( indwrk ), iinfo )
254 *
255 * Reduce to tridiagonal form.
256 *
257  IF( wantz ) THEN
258  vect = 'U'
259  ELSE
260  vect = 'N'
261  END IF
262  CALL ssbtrd( vect, uplo, n, ka, ab, ldab, w, work( inde ), z, ldz,
263  $ work( indwrk ), iinfo )
264 *
265 * For eigenvalues only, call SSTERF. For eigenvectors, call SSTEQR.
266 *
267  IF( .NOT.wantz ) THEN
268  CALL ssterf( n, w, work( inde ), info )
269  ELSE
270  CALL ssteqr( jobz, n, w, work( inde ), z, ldz, work( indwrk ),
271  $ info )
272  END IF
273  RETURN
274 *
275 * End of SSBGV
276 *
277  END
subroutine xerbla(SRNAME, INFO)
XERBLA
Definition: xerbla.f:60
subroutine ssteqr(COMPZ, N, D, E, Z, LDZ, WORK, INFO)
SSTEQR
Definition: ssteqr.f:131
subroutine ssterf(N, D, E, INFO)
SSTERF
Definition: ssterf.f:86
subroutine spbstf(UPLO, N, KD, AB, LDAB, INFO)
SPBSTF
Definition: spbstf.f:152
subroutine ssbtrd(VECT, UPLO, N, KD, AB, LDAB, D, E, Q, LDQ, WORK, INFO)
SSBTRD
Definition: ssbtrd.f:163
subroutine ssbgst(VECT, UPLO, N, KA, KB, AB, LDAB, BB, LDBB, X, LDX, WORK, INFO)
SSBGST
Definition: ssbgst.f:159
subroutine ssbgv(JOBZ, UPLO, N, KA, KB, AB, LDAB, BB, LDBB, W, Z, LDZ, WORK, INFO)
SSBGV
Definition: ssbgv.f:177