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 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.
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,...
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 matrice...