LAPACK  3.10.0
LAPACK: Linear Algebra PACKage

◆ ssbev()

subroutine ssbev ( character  JOBZ,
character  UPLO,
integer  N,
integer  KD,
real, dimension( ldab, * )  AB,
integer  LDAB,
real, dimension( * )  W,
real, dimension( ldz, * )  Z,
integer  LDZ,
real, dimension( * )  WORK,
integer  INFO 
)

SSBEV computes the eigenvalues and, optionally, the left and/or right eigenvectors for OTHER matrices

Download SSBEV + dependencies [TGZ] [ZIP] [TXT]

Purpose:
 SSBEV computes all the eigenvalues and, optionally, eigenvectors of
 a real symmetric band matrix A.
Parameters
[in]JOBZ
          JOBZ is CHARACTER*1
          = 'N':  Compute eigenvalues only;
          = 'V':  Compute eigenvalues and eigenvectors.
[in]UPLO
          UPLO is CHARACTER*1
          = 'U':  Upper triangle of A is stored;
          = 'L':  Lower triangle of A is stored.
[in]N
          N is INTEGER
          The order of the matrix A.  N >= 0.
[in]KD
          KD is INTEGER
          The number of superdiagonals of the matrix A if UPLO = 'U',
          or the number of subdiagonals if UPLO = 'L'.  KD >= 0.
[in,out]AB
          AB is REAL array, dimension (LDAB, N)
          On entry, the upper or lower triangle of the symmetric band
          matrix A, stored in the first KD+1 rows of the array.  The
          j-th column of A is stored in the j-th column of the array AB
          as follows:
          if UPLO = 'U', AB(kd+1+i-j,j) = A(i,j) for max(1,j-kd)<=i<=j;
          if UPLO = 'L', AB(1+i-j,j)    = A(i,j) for j<=i<=min(n,j+kd).

          On exit, AB is overwritten by values generated during the
          reduction to tridiagonal form.  If UPLO = 'U', the first
          superdiagonal and the diagonal of the tridiagonal matrix T
          are returned in rows KD and KD+1 of AB, and if UPLO = 'L',
          the diagonal and first subdiagonal of T are returned in the
          first two rows of AB.
[in]LDAB
          LDAB is INTEGER
          The leading dimension of the array AB.  LDAB >= KD + 1.
[out]W
          W is REAL array, dimension (N)
          If INFO = 0, the eigenvalues in ascending order.
[out]Z
          Z is REAL array, dimension (LDZ, N)
          If JOBZ = 'V', then if INFO = 0, Z contains the orthonormal
          eigenvectors of the matrix A, with the i-th column of Z
          holding the eigenvector associated with W(i).
          If JOBZ = 'N', then Z is not referenced.
[in]LDZ
          LDZ is INTEGER
          The leading dimension of the array Z.  LDZ >= 1, and if
          JOBZ = 'V', LDZ >= max(1,N).
[out]WORK
          WORK is REAL array, dimension (max(1,3*N-2))
[out]INFO
          INFO is INTEGER
          = 0:  successful exit
          < 0:  if INFO = -i, the i-th argument had an illegal value
          > 0:  if INFO = i, the algorithm failed to converge; i
                off-diagonal elements of an intermediate tridiagonal
                form did not converge to zero.
Author
Univ. of Tennessee
Univ. of California Berkeley
Univ. of Colorado Denver
NAG Ltd.

Definition at line 144 of file ssbev.f.

146 *
147 * -- LAPACK driver routine --
148 * -- LAPACK is a software package provided by Univ. of Tennessee, --
149 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
150 *
151 * .. Scalar Arguments ..
152  CHARACTER JOBZ, UPLO
153  INTEGER INFO, KD, LDAB, LDZ, N
154 * ..
155 * .. Array Arguments ..
156  REAL AB( LDAB, * ), W( * ), WORK( * ), Z( LDZ, * )
157 * ..
158 *
159 * =====================================================================
160 *
161 * .. Parameters ..
162  REAL ZERO, ONE
163  parameter( zero = 0.0e0, one = 1.0e0 )
164 * ..
165 * .. Local Scalars ..
166  LOGICAL LOWER, WANTZ
167  INTEGER IINFO, IMAX, INDE, INDWRK, ISCALE
168  REAL ANRM, BIGNUM, EPS, RMAX, RMIN, SAFMIN, SIGMA,
169  $ SMLNUM
170 * ..
171 * .. External Functions ..
172  LOGICAL LSAME
173  REAL SLAMCH, SLANSB
174  EXTERNAL lsame, slamch, slansb
175 * ..
176 * .. External Subroutines ..
177  EXTERNAL slascl, ssbtrd, sscal, ssteqr, ssterf, xerbla
178 * ..
179 * .. Intrinsic Functions ..
180  INTRINSIC sqrt
181 * ..
182 * .. Executable Statements ..
183 *
184 * Test the input parameters.
185 *
186  wantz = lsame( jobz, 'V' )
187  lower = lsame( uplo, 'L' )
188 *
189  info = 0
190  IF( .NOT.( wantz .OR. lsame( jobz, 'N' ) ) ) THEN
191  info = -1
192  ELSE IF( .NOT.( lower .OR. lsame( uplo, 'U' ) ) ) THEN
193  info = -2
194  ELSE IF( n.LT.0 ) THEN
195  info = -3
196  ELSE IF( kd.LT.0 ) THEN
197  info = -4
198  ELSE IF( ldab.LT.kd+1 ) THEN
199  info = -6
200  ELSE IF( ldz.LT.1 .OR. ( wantz .AND. ldz.LT.n ) ) THEN
201  info = -9
202  END IF
203 *
204  IF( info.NE.0 ) THEN
205  CALL xerbla( 'SSBEV ', -info )
206  RETURN
207  END IF
208 *
209 * Quick return if possible
210 *
211  IF( n.EQ.0 )
212  $ RETURN
213 *
214  IF( n.EQ.1 ) THEN
215  IF( lower ) THEN
216  w( 1 ) = ab( 1, 1 )
217  ELSE
218  w( 1 ) = ab( kd+1, 1 )
219  END IF
220  IF( wantz )
221  $ z( 1, 1 ) = one
222  RETURN
223  END IF
224 *
225 * Get machine constants.
226 *
227  safmin = slamch( 'Safe minimum' )
228  eps = slamch( 'Precision' )
229  smlnum = safmin / eps
230  bignum = one / smlnum
231  rmin = sqrt( smlnum )
232  rmax = sqrt( bignum )
233 *
234 * Scale matrix to allowable range, if necessary.
235 *
236  anrm = slansb( 'M', uplo, n, kd, ab, ldab, work )
237  iscale = 0
238  IF( anrm.GT.zero .AND. anrm.LT.rmin ) THEN
239  iscale = 1
240  sigma = rmin / anrm
241  ELSE IF( anrm.GT.rmax ) THEN
242  iscale = 1
243  sigma = rmax / anrm
244  END IF
245  IF( iscale.EQ.1 ) THEN
246  IF( lower ) THEN
247  CALL slascl( 'B', kd, kd, one, sigma, n, n, ab, ldab, info )
248  ELSE
249  CALL slascl( 'Q', kd, kd, one, sigma, n, n, ab, ldab, info )
250  END IF
251  END IF
252 *
253 * Call SSBTRD to reduce symmetric band matrix to tridiagonal form.
254 *
255  inde = 1
256  indwrk = inde + n
257  CALL ssbtrd( jobz, uplo, n, kd, ab, ldab, w, work( inde ), z, ldz,
258  $ work( indwrk ), iinfo )
259 *
260 * For eigenvalues only, call SSTERF. For eigenvectors, call SSTEQR.
261 *
262  IF( .NOT.wantz ) THEN
263  CALL ssterf( n, w, work( inde ), info )
264  ELSE
265  CALL ssteqr( jobz, n, w, work( inde ), z, ldz, work( indwrk ),
266  $ info )
267  END IF
268 *
269 * If matrix was scaled, then rescale eigenvalues appropriately.
270 *
271  IF( iscale.EQ.1 ) THEN
272  IF( info.EQ.0 ) THEN
273  imax = n
274  ELSE
275  imax = info - 1
276  END IF
277  CALL sscal( imax, one / sigma, w, 1 )
278  END IF
279 *
280  RETURN
281 *
282 * End of SSBEV
283 *
subroutine slascl(TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO)
SLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
Definition: slascl.f:143
subroutine xerbla(SRNAME, INFO)
XERBLA
Definition: xerbla.f:60
logical function lsame(CA, CB)
LSAME
Definition: lsame.f:53
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
real function slansb(NORM, UPLO, N, K, AB, LDAB, WORK)
SLANSB returns the value of the 1-norm, or the Frobenius norm, or the infinity norm,...
Definition: slansb.f:129
subroutine ssbtrd(VECT, UPLO, N, KD, AB, LDAB, D, E, Q, LDQ, WORK, INFO)
SSBTRD
Definition: ssbtrd.f:163
subroutine sscal(N, SA, SX, INCX)
SSCAL
Definition: sscal.f:79
real function slamch(CMACH)
SLAMCH
Definition: slamch.f:68
Here is the call graph for this function:
Here is the caller graph for this function: