250 SUBROUTINE ssyevx( JOBZ, RANGE, UPLO, N, A, LDA, VL, VU, IL, IU,
251 $ ABSTOL, M, W, Z, LDZ, WORK, LWORK, IWORK,
259 CHARACTER JOBZ, RANGE, UPLO
260 INTEGER IL, INFO, IU, LDA, LDZ, LWORK, M, N
264 INTEGER IFAIL( * ), IWORK( * )
265 REAL A( lda, * ), W( * ), WORK( * ), Z( ldz, * )
272 parameter( zero = 0.0e+0, one = 1.0e+0 )
275 LOGICAL ALLEIG, INDEIG, LOWER, LQUERY, TEST, VALEIG,
278 INTEGER I, IINFO, IMAX, INDD, INDE, INDEE, INDIBL,
279 $ indisp, indiwo, indtau, indwkn, indwrk, iscale,
280 $ itmp1, j, jj, llwork, llwrkn, lwkmin,
282 REAL ABSTLL, ANRM, BIGNUM, EPS, RMAX, RMIN, SAFMIN,
283 $ sigma, smlnum, tmp1, vll, vuu
289 EXTERNAL lsame, ilaenv, slamch, slansy
296 INTRINSIC max, min, sqrt
302 lower = lsame( uplo,
'L' )
303 wantz = lsame( jobz,
'V' )
304 alleig = lsame( range,
'A' )
305 valeig = lsame( range,
'V' )
306 indeig = lsame( range,
'I' )
307 lquery = ( lwork.EQ.-1 )
310 IF( .NOT.( wantz .OR. lsame( jobz,
'N' ) ) )
THEN 312 ELSE IF( .NOT.( alleig .OR. valeig .OR. indeig ) )
THEN 314 ELSE IF( .NOT.( lower .OR. lsame( uplo,
'U' ) ) )
THEN 316 ELSE IF( n.LT.0 )
THEN 318 ELSE IF( lda.LT.max( 1, n ) )
THEN 322 IF( n.GT.0 .AND. vu.LE.vl )
324 ELSE IF( indeig )
THEN 325 IF( il.LT.1 .OR. il.GT.max( 1, n ) )
THEN 327 ELSE IF( iu.LT.min( n, il ) .OR. iu.GT.n )
THEN 333 IF( ldz.LT.1 .OR. ( wantz .AND. ldz.LT.n ) )
THEN 344 nb = ilaenv( 1,
'SSYTRD', uplo, n, -1, -1, -1 )
345 nb = max( nb, ilaenv( 1,
'SORMTR', uplo, n, -1, -1, -1 ) )
346 lwkopt = max( lwkmin, ( nb + 3 )*n )
350 IF( lwork.LT.lwkmin .AND. .NOT.lquery )
355 CALL xerbla(
'SSYEVX', -info )
357 ELSE IF( lquery )
THEN 369 IF( alleig .OR. indeig )
THEN 373 IF( vl.LT.a( 1, 1 ) .AND. vu.GE.a( 1, 1 ) )
THEN 385 safmin = slamch(
'Safe minimum' )
386 eps = slamch(
'Precision' )
387 smlnum = safmin / eps
388 bignum = one / smlnum
389 rmin = sqrt( smlnum )
390 rmax = min( sqrt( bignum ), one / sqrt( sqrt( safmin ) ) )
400 anrm = slansy(
'M', uplo, n, a, lda, work )
401 IF( anrm.GT.zero .AND. anrm.LT.rmin )
THEN 404 ELSE IF( anrm.GT.rmax )
THEN 408 IF( iscale.EQ.1 )
THEN 411 CALL sscal( n-j+1, sigma, a( j, j ), 1 )
415 CALL sscal( j, sigma, a( 1, j ), 1 )
419 $ abstll = abstol*sigma
432 llwork = lwork - indwrk + 1
433 CALL ssytrd( uplo, n, a, lda, work( indd ), work( inde ),
434 $ work( indtau ), work( indwrk ), llwork, iinfo )
442 IF( il.EQ.1 .AND. iu.EQ.n )
THEN 446 IF( ( alleig .OR. test ) .AND. ( abstol.LE.zero ) )
THEN 447 CALL scopy( n, work( indd ), 1, w, 1 )
449 IF( .NOT.wantz )
THEN 450 CALL scopy( n-1, work( inde ), 1, work( indee ), 1 )
451 CALL ssterf( n, w, work( indee ), info )
453 CALL slacpy(
'A', n, n, a, lda, z, ldz )
454 CALL sorgtr( uplo, n, z, ldz, work( indtau ),
455 $ work( indwrk ), llwork, iinfo )
456 CALL scopy( n-1, work( inde ), 1, work( indee ), 1 )
457 CALL ssteqr( jobz, n, w, work( indee ), z, ldz,
458 $ work( indwrk ), info )
482 CALL sstebz( range, order, n, vll, vuu, il, iu, abstll,
483 $ work( indd ), work( inde ), m, nsplit, w,
484 $ iwork( indibl ), iwork( indisp ), work( indwrk ),
485 $ iwork( indiwo ), info )
488 CALL sstein( n, work( indd ), work( inde ), m, w,
489 $ iwork( indibl ), iwork( indisp ), z, ldz,
490 $ work( indwrk ), iwork( indiwo ), ifail, info )
496 llwrkn = lwork - indwkn + 1
497 CALL sormtr(
'L', uplo,
'N', n, m, a, lda, work( indtau ), z,
498 $ ldz, work( indwkn ), llwrkn, iinfo )
504 IF( iscale.EQ.1 )
THEN 510 CALL sscal( imax, one / sigma, w, 1 )
521 IF( w( jj ).LT.tmp1 )
THEN 528 itmp1 = iwork( indibl+i-1 )
530 iwork( indibl+i-1 ) = iwork( indibl+j-1 )
532 iwork( indibl+j-1 ) = itmp1
533 CALL sswap( n, z( 1, i ), 1, z( 1, j ), 1 )
536 ifail( i ) = ifail( j )
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 ssyevx(JOBZ, RANGE, UPLO, N, A, LDA, VL, VU, IL, IU, ABSTOL, M, W, Z, LDZ, WORK, LWORK, IWORK, IFAIL, INFO)
SSYEVX computes the eigenvalues and, optionally, the left and/or right eigenvectors for SY matrices ...
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 ssytrd(UPLO, N, A, LDA, D, E, TAU, WORK, LWORK, INFO)
SSYTRD
subroutine sorgtr(UPLO, N, A, LDA, TAU, WORK, LWORK, INFO)
SORGTR
subroutine sormtr(SIDE, UPLO, TRANS, M, N, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
SORMTR
subroutine slacpy(UPLO, M, N, A, LDA, B, LDB)
SLACPY copies all or part of one two-dimensional array to another.