231 SUBROUTINE sspevx( JOBZ, RANGE, UPLO, N, AP, VL, VU, IL, IU,
232 $ ABSTOL, M, W, Z, LDZ, WORK, IWORK, IFAIL,
240 CHARACTER JOBZ, RANGE, UPLO
241 INTEGER IL, INFO, IU, LDZ, M, N
245 INTEGER IFAIL( * ), IWORK( * )
246 REAL AP( * ), W( * ), WORK( * ), Z( ldz, * )
253 parameter( zero = 0.0e0, one = 1.0e0 )
256 LOGICAL ALLEIG, INDEIG, TEST, VALEIG, WANTZ
258 INTEGER I, IINFO, IMAX, INDD, INDE, INDEE, INDIBL,
259 $ indisp, indiwo, indtau, indwrk, iscale, itmp1,
261 REAL ABSTLL, ANRM, BIGNUM, EPS, RMAX, RMIN, SAFMIN,
262 $ sigma, smlnum, tmp1, vll, vuu
267 EXTERNAL lsame, slamch, slansp
274 INTRINSIC max, min, sqrt
280 wantz = lsame( jobz,
'V' )
281 alleig = lsame( range,
'A' )
282 valeig = lsame( range,
'V' )
283 indeig = lsame( range,
'I' )
286 IF( .NOT.( wantz .OR. lsame( jobz,
'N' ) ) )
THEN 288 ELSE IF( .NOT.( alleig .OR. valeig .OR. indeig ) )
THEN 290 ELSE IF( .NOT.( lsame( uplo,
'L' ) .OR. lsame( uplo,
'U' ) ) )
293 ELSE IF( n.LT.0 )
THEN 297 IF( n.GT.0 .AND. vu.LE.vl )
299 ELSE IF( indeig )
THEN 300 IF( il.LT.1 .OR. il.GT.max( 1, n ) )
THEN 302 ELSE IF( iu.LT.min( n, il ) .OR. iu.GT.n )
THEN 308 IF( ldz.LT.1 .OR. ( wantz .AND. ldz.LT.n ) )
313 CALL xerbla(
'SSPEVX', -info )
324 IF( alleig .OR. indeig )
THEN 328 IF( vl.LT.ap( 1 ) .AND. vu.GE.ap( 1 ) )
THEN 340 safmin = slamch(
'Safe minimum' )
341 eps = slamch(
'Precision' )
342 smlnum = safmin / eps
343 bignum = one / smlnum
344 rmin = sqrt( smlnum )
345 rmax = min( sqrt( bignum ), one / sqrt( sqrt( safmin ) ) )
358 anrm = slansp(
'M', uplo, n, ap, work )
359 IF( anrm.GT.zero .AND. anrm.LT.rmin )
THEN 362 ELSE IF( anrm.GT.rmax )
THEN 366 IF( iscale.EQ.1 )
THEN 367 CALL sscal( ( n*( n+1 ) ) / 2, sigma, ap, 1 )
369 $ abstll = abstol*sigma
382 CALL ssptrd( uplo, n, ap, work( indd ), work( inde ),
383 $ work( indtau ), iinfo )
391 IF (il.EQ.1 .AND. iu.EQ.n)
THEN 395 IF ((alleig .OR. test) .AND. (abstol.LE.zero))
THEN 396 CALL scopy( n, work( indd ), 1, w, 1 )
398 IF( .NOT.wantz )
THEN 399 CALL scopy( n-1, work( inde ), 1, work( indee ), 1 )
400 CALL ssterf( n, w, work( indee ), info )
402 CALL sopgtr( uplo, n, ap, work( indtau ), z, ldz,
403 $ work( indwrk ), iinfo )
404 CALL scopy( n-1, work( inde ), 1, work( indee ), 1 )
405 CALL ssteqr( jobz, n, w, work( indee ), z, ldz,
406 $ work( indwrk ), info )
430 CALL sstebz( range, order, n, vll, vuu, il, iu, abstll,
431 $ work( indd ), work( inde ), m, nsplit, w,
432 $ iwork( indibl ), iwork( indisp ), work( indwrk ),
433 $ iwork( indiwo ), info )
436 CALL sstein( n, work( indd ), work( inde ), m, w,
437 $ iwork( indibl ), iwork( indisp ), z, ldz,
438 $ work( indwrk ), iwork( indiwo ), ifail, info )
443 CALL sopmtr(
'L', uplo,
'N', n, m, ap, work( indtau ), z, ldz,
444 $ work( indwrk ), iinfo )
450 IF( iscale.EQ.1 )
THEN 456 CALL sscal( imax, one / sigma, w, 1 )
467 IF( w( jj ).LT.tmp1 )
THEN 474 itmp1 = iwork( indibl+i-1 )
476 iwork( indibl+i-1 ) = iwork( indibl+j-1 )
478 iwork( indibl+j-1 ) = itmp1
479 CALL sswap( n, z( 1, i ), 1, z( 1, j ), 1 )
482 ifail( i ) = ifail( j )
subroutine ssptrd(UPLO, N, AP, D, E, TAU, INFO)
SSPTRD
subroutine ssteqr(COMPZ, N, D, E, Z, LDZ, WORK, INFO)
SSTEQR
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine sstebz(RANGE, ORDER, N, VL, VU, IL, IU, ABSTOL, D, E, M, NSPLIT, W, IBLOCK, ISPLIT, WORK, IWORK, INFO)
SSTEBZ
subroutine sspevx(JOBZ, RANGE, UPLO, N, AP, VL, VU, IL, IU, ABSTOL, M, W, Z, LDZ, WORK, IWORK, IFAIL, INFO)
SSPEVX computes the eigenvalues and, optionally, the left and/or right eigenvectors for OTHER matric...
subroutine sswap(N, SX, INCX, SY, INCY)
SSWAP
subroutine sstein(N, D, E, M, W, IBLOCK, ISPLIT, Z, LDZ, WORK, IWORK, IFAIL, INFO)
SSTEIN
subroutine scopy(N, SX, INCX, SY, INCY)
SCOPY
subroutine ssterf(N, D, E, INFO)
SSTERF
subroutine sscal(N, SA, SX, INCX)
SSCAL
subroutine sopgtr(UPLO, N, AP, TAU, Q, LDQ, WORK, INFO)
SOPGTR
subroutine sopmtr(SIDE, UPLO, TRANS, M, N, AP, TAU, C, LDC, WORK, INFO)
SOPMTR