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*> \date November 2015
173*
174*> \ingroup realOTHEReigen
175*
176*  =====================================================================
177      SUBROUTINE SSBGV( JOBZ, UPLO, N, KA, KB, AB, LDAB, BB, LDBB, W, Z,
178     $                  LDZ, WORK, INFO )
179*
180*  -- LAPACK driver routine (version 3.6.0) --
181*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
182*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
183*     November 2015
184*
185*     .. Scalar Arguments ..
186      CHARACTER          JOBZ, UPLO
187      INTEGER            INFO, KA, KB, LDAB, LDBB, LDZ, N
188*     ..
189*     .. Array Arguments ..
190      REAL               AB( LDAB, * ), BB( LDBB, * ), W( * ),
191     $                   WORK( * ), Z( LDZ, * )
192*     ..
193*
194*  =====================================================================
195*
196*     .. Local Scalars ..
197      LOGICAL            UPPER, WANTZ
198      CHARACTER          VECT
199      INTEGER            IINFO, INDE, INDWRK
200*     ..
201*     .. External Functions ..
202      LOGICAL            LSAME
203      EXTERNAL           LSAME
204*     ..
205*     .. External Subroutines ..
206      EXTERNAL           SPBSTF, SSBGST, SSBTRD, SSTEQR, SSTERF, XERBLA
207*     ..
208*     .. Executable Statements ..
209*
210*     Test the input parameters.
211*
212      WANTZ = LSAME( JOBZ, 'V' )
213      UPPER = LSAME( UPLO, 'U' )
214*
215      INFO = 0
216      IF( .NOT.( WANTZ .OR. LSAME( JOBZ, 'N' ) ) ) THEN
217         INFO = -1
218      ELSE IF( .NOT.( UPPER .OR. LSAME( UPLO, 'L' ) ) ) THEN
219         INFO = -2
220      ELSE IF( N.LT.0 ) THEN
221         INFO = -3
222      ELSE IF( KA.LT.0 ) THEN
223         INFO = -4
224      ELSE IF( KB.LT.0 .OR. KB.GT.KA ) THEN
225         INFO = -5
226      ELSE IF( LDAB.LT.KA+1 ) THEN
227         INFO = -7
228      ELSE IF( LDBB.LT.KB+1 ) THEN
229         INFO = -9
230      ELSE IF( LDZ.LT.1 .OR. ( WANTZ .AND. LDZ.LT.N ) ) THEN
231         INFO = -12
232      END IF
233      IF( INFO.NE.0 ) THEN
234         CALL XERBLA( 'SSBGV ', -INFO )
235         RETURN
236      END IF
237*
238*     Quick return if possible
239*
240      IF( N.EQ.0 )
241     $   RETURN
242*
243*     Form a split Cholesky factorization of B.
244*
245      CALL SPBSTF( UPLO, N, KB, BB, LDBB, INFO )
246      IF( INFO.NE.0 ) THEN
247         INFO = N + INFO
248         RETURN
249      END IF
250*
251*     Transform problem to standard eigenvalue problem.
252*
253      INDE = 1
254      INDWRK = INDE + N
255      CALL SSBGST( JOBZ, UPLO, N, KA, KB, AB, LDAB, BB, LDBB, Z, LDZ,
256     $             WORK( INDWRK ), IINFO )
257*
258*     Reduce to tridiagonal form.
259*
260      IF( WANTZ ) THEN
261         VECT = 'U'
262      ELSE
263         VECT = 'N'
264      END IF
265      CALL SSBTRD( VECT, UPLO, N, KA, AB, LDAB, W, WORK( INDE ), Z, LDZ,
266     $             WORK( INDWRK ), IINFO )
267*
268*     For eigenvalues only, call SSTERF.  For eigenvectors, call SSTEQR.
269*
270      IF( .NOT.WANTZ ) THEN
271         CALL SSTERF( N, W, WORK( INDE ), INFO )
272      ELSE
273         CALL SSTEQR( JOBZ, N, W, WORK( INDE ), Z, LDZ, WORK( INDWRK ),
274     $                INFO )
275      END IF
276      RETURN
277*
278*     End of SSBGV
279*
280      END
281