299 SUBROUTINE ssyevx_2stage( JOBZ, RANGE, UPLO, N, A, LDA, VL, VU,
300 $ IL, IU, ABSTOL, M, W, Z, LDZ, WORK,
301 $ LWORK, IWORK, IFAIL, INFO )
311 CHARACTER JOBZ, RANGE, UPLO
312 INTEGER IL, INFO, IU, LDA, LDZ, LWORK, M, N
316 INTEGER IFAIL( * ), IWORK( * )
317 REAL A( lda, * ), W( * ), WORK( * ), Z( ldz, * )
324 parameter( zero = 0.0e+0, one = 1.0e+0 )
327 LOGICAL ALLEIG, INDEIG, LOWER, LQUERY, TEST, VALEIG,
330 INTEGER I, IINFO, IMAX, INDD, INDE, INDEE, INDIBL,
331 $ indisp, indiwo, indtau, indwkn, indwrk, iscale,
332 $ itmp1, j, jj, llwork, llwrkn,
333 $ nsplit, lwmin, lhtrd, lwtrd, kd, ib, indhous
334 REAL ABSTLL, ANRM, BIGNUM, EPS, RMAX, RMIN, SAFMIN,
335 $ sigma, smlnum, tmp1, vll, vuu
341 EXTERNAL lsame, ilaenv, slamch, slansy
349 INTRINSIC max, min, sqrt
355 lower = lsame( uplo,
'L' )
356 wantz = lsame( jobz,
'V' )
357 alleig = lsame( range,
'A' )
358 valeig = lsame( range,
'V' )
359 indeig = lsame( range,
'I' )
360 lquery = ( lwork.EQ.-1 )
363 IF( .NOT.( lsame( jobz,
'N' ) ) )
THEN 365 ELSE IF( .NOT.( alleig .OR. valeig .OR. indeig ) )
THEN 367 ELSE IF( .NOT.( lower .OR. lsame( uplo,
'U' ) ) )
THEN 369 ELSE IF( n.LT.0 )
THEN 371 ELSE IF( lda.LT.max( 1, n ) )
THEN 375 IF( n.GT.0 .AND. vu.LE.vl )
377 ELSE IF( indeig )
THEN 378 IF( il.LT.1 .OR. il.GT.max( 1, n ) )
THEN 380 ELSE IF( iu.LT.min( n, il ) .OR. iu.GT.n )
THEN 386 IF( ldz.LT.1 .OR. ( wantz .AND. ldz.LT.n ) )
THEN 396 kd = ilaenv( 17,
'SSYTRD_2STAGE', jobz, n, -1, -1, -1 )
397 ib = ilaenv( 18,
'SSYTRD_2STAGE', jobz, n, kd, -1, -1 )
398 lhtrd = ilaenv( 19,
'SSYTRD_2STAGE', jobz, n, kd, ib, -1 )
399 lwtrd = ilaenv( 20,
'SSYTRD_2STAGE', jobz, n, kd, ib, -1 )
400 lwmin = max( 8*n, 3*n + lhtrd + lwtrd )
404 IF( lwork.LT.lwmin .AND. .NOT.lquery )
409 CALL xerbla(
'SSYEVX_2STAGE', -info )
411 ELSE IF( lquery )
THEN 423 IF( alleig .OR. indeig )
THEN 427 IF( vl.LT.a( 1, 1 ) .AND. vu.GE.a( 1, 1 ) )
THEN 439 safmin = slamch(
'Safe minimum' )
440 eps = slamch(
'Precision' )
441 smlnum = safmin / eps
442 bignum = one / smlnum
443 rmin = sqrt( smlnum )
444 rmax = min( sqrt( bignum ), one / sqrt( sqrt( safmin ) ) )
454 anrm = slansy(
'M', uplo, n, a, lda, work )
455 IF( anrm.GT.zero .AND. anrm.LT.rmin )
THEN 458 ELSE IF( anrm.GT.rmax )
THEN 462 IF( iscale.EQ.1 )
THEN 465 CALL sscal( n-j+1, sigma, a( j, j ), 1 )
469 CALL sscal( j, sigma, a( 1, j ), 1 )
473 $ abstll = abstol*sigma
486 indwrk = indhous + lhtrd
487 llwork = lwork - indwrk + 1
490 $ work( inde ), work( indtau ), work( indhous ),
491 $ lhtrd, work( indwrk ), llwork, iinfo )
499 IF( il.EQ.1 .AND. iu.EQ.n )
THEN 503 IF( ( alleig .OR. test ) .AND. ( abstol.LE.zero ) )
THEN 504 CALL scopy( n, work( indd ), 1, w, 1 )
506 IF( .NOT.wantz )
THEN 507 CALL scopy( n-1, work( inde ), 1, work( indee ), 1 )
508 CALL ssterf( n, w, work( indee ), info )
510 CALL slacpy(
'A', n, n, a, lda, z, ldz )
511 CALL sorgtr( uplo, n, z, ldz, work( indtau ),
512 $ work( indwrk ), llwork, iinfo )
513 CALL scopy( n-1, work( inde ), 1, work( indee ), 1 )
514 CALL ssteqr( jobz, n, w, work( indee ), z, ldz,
515 $ work( indwrk ), info )
539 CALL sstebz( range, order, n, vll, vuu, il, iu, abstll,
540 $ work( indd ), work( inde ), m, nsplit, w,
541 $ iwork( indibl ), iwork( indisp ), work( indwrk ),
542 $ iwork( indiwo ), info )
545 CALL sstein( n, work( indd ), work( inde ), m, w,
546 $ iwork( indibl ), iwork( indisp ), z, ldz,
547 $ work( indwrk ), iwork( indiwo ), ifail, info )
553 llwrkn = lwork - indwkn + 1
554 CALL sormtr(
'L', uplo,
'N', n, m, a, lda, work( indtau ), z,
555 $ ldz, work( indwkn ), llwrkn, iinfo )
561 IF( iscale.EQ.1 )
THEN 567 CALL sscal( imax, one / sigma, w, 1 )
578 IF( w( jj ).LT.tmp1 )
THEN 585 itmp1 = iwork( indibl+i-1 )
587 iwork( indibl+i-1 ) = iwork( indibl+j-1 )
589 iwork( indibl+j-1 ) = itmp1
590 CALL sswap( n, z( 1, i ), 1, z( 1, j ), 1 )
593 ifail( i ) = ifail( j )
subroutine sstebz(RANGE, ORDER, N, VL, VU, IL, IU, ABSTOL, D, E, M, NSPLIT, W, IBLOCK, ISPLIT, WORK, IWORK, INFO)
SSTEBZ
subroutine ssteqr(COMPZ, N, D, E, Z, LDZ, WORK, INFO)
SSTEQR
subroutine ssytrd_2stage(VECT, UPLO, N, A, LDA, D, E, TAU, HOUS2, LHOUS2, WORK, LWORK, INFO)
SSYTRD_2STAGE
subroutine sormtr(SIDE, UPLO, TRANS, M, N, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
SORMTR
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine sstein(N, D, E, M, W, IBLOCK, ISPLIT, Z, LDZ, WORK, IWORK, IFAIL, INFO)
SSTEIN
subroutine sscal(N, SA, SX, INCX)
SSCAL
subroutine sswap(N, SX, INCX, SY, INCY)
SSWAP
subroutine ssyevx_2stage(JOBZ, RANGE, UPLO, N, A, LDA, VL, VU, IL, IU, ABSTOL, M, W, Z, LDZ, WORK, LWORK, IWORK, IFAIL, INFO)
SSYEVX_2STAGE computes the eigenvalues and, optionally, the left and/or right eigenvectors for SY ma...
subroutine slacpy(UPLO, M, N, A, LDA, B, LDB)
SLACPY copies all or part of one two-dimensional array to another.
subroutine ssterf(N, D, E, INFO)
SSTERF
subroutine sorgtr(UPLO, N, A, LDA, TAU, WORK, LWORK, INFO)
SORGTR
subroutine scopy(N, SX, INCX, SY, INCY)
SCOPY