191 SUBROUTINE ssbevd( JOBZ, UPLO, N, KD, AB, LDAB, W, Z, LDZ, WORK,
192 $ LWORK, IWORK, LIWORK, INFO )
200 INTEGER INFO, KD, LDAB, LDZ, LIWORK, LWORK, N
204 REAL AB( ldab, * ), W( * ), WORK( * ), Z( ldz, * )
211 parameter( zero = 0.0e+0, one = 1.0e+0 )
214 LOGICAL LOWER, LQUERY, WANTZ
215 INTEGER IINFO, INDE, INDWK2, INDWRK, ISCALE, LIWMIN,
217 REAL ANRM, BIGNUM, EPS, RMAX, RMIN, SAFMIN, SIGMA,
223 EXTERNAL lsame, slamch, slansb
236 wantz = lsame( jobz,
'V' )
237 lower = lsame( uplo,
'L' )
238 lquery = ( lwork.EQ.-1 .OR. liwork.EQ.-1 )
247 lwmin = 1 + 5*n + 2*n**2
253 IF( .NOT.( wantz .OR. lsame( jobz,
'N' ) ) )
THEN 255 ELSE IF( .NOT.( lower .OR. lsame( uplo,
'U' ) ) )
THEN 257 ELSE IF( n.LT.0 )
THEN 259 ELSE IF( kd.LT.0 )
THEN 261 ELSE IF( ldab.LT.kd+1 )
THEN 263 ELSE IF( ldz.LT.1 .OR. ( wantz .AND. ldz.LT.n ) )
THEN 271 IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN 273 ELSE IF( liwork.LT.liwmin .AND. .NOT.lquery )
THEN 279 CALL xerbla(
'SSBEVD', -info )
281 ELSE IF( lquery )
THEN 299 safmin = slamch(
'Safe minimum' )
300 eps = slamch(
'Precision' )
301 smlnum = safmin / eps
302 bignum = one / smlnum
303 rmin = sqrt( smlnum )
304 rmax = sqrt( bignum )
308 anrm = slansb(
'M', uplo, n, kd, ab, ldab, work )
310 IF( anrm.GT.zero .AND. anrm.LT.rmin )
THEN 313 ELSE IF( anrm.GT.rmax )
THEN 317 IF( iscale.EQ.1 )
THEN 319 CALL slascl(
'B', kd, kd, one, sigma, n, n, ab, ldab, info )
321 CALL slascl(
'Q', kd, kd, one, sigma, n, n, ab, ldab, info )
329 indwk2 = indwrk + n*n
330 llwrk2 = lwork - indwk2 + 1
331 CALL ssbtrd( jobz, uplo, n, kd, ab, ldab, w, work( inde ), z, ldz,
332 $ work( indwrk ), iinfo )
336 IF( .NOT.wantz )
THEN 337 CALL ssterf( n, w, work( inde ), info )
339 CALL sstedc(
'I', n, w, work( inde ), work( indwrk ), n,
340 $ work( indwk2 ), llwrk2, iwork, liwork, info )
341 CALL sgemm(
'N',
'N', n, n, n, one, z, ldz, work( indwrk ), n,
342 $ zero, work( indwk2 ), n )
343 CALL slacpy(
'A', n, n, work( indwk2 ), n, z, ldz )
349 $
CALL sscal( n, one / sigma, w, 1 )
subroutine ssbevd(JOBZ, UPLO, N, KD, AB, LDAB, W, Z, LDZ, WORK, LWORK, IWORK, LIWORK, INFO)
SSBEVD computes the eigenvalues and, optionally, the left and/or right eigenvectors for OTHER matric...
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine sstedc(COMPZ, N, D, E, Z, LDZ, WORK, LWORK, IWORK, LIWORK, INFO)
SSTEDC
subroutine sgemm(TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC)
SGEMM
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.
subroutine ssbtrd(VECT, UPLO, N, KD, AB, LDAB, D, E, Q, LDQ, WORK, INFO)
SSBTRD
subroutine ssterf(N, D, E, INFO)
SSTERF
subroutine sscal(N, SA, SX, INCX)
SSCAL
subroutine slacpy(UPLO, M, N, A, LDA, B, LDB)
SLACPY copies all or part of one two-dimensional array to another.