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 sormtr(SIDE, UPLO, TRANS, M, N, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
SORMTR
subroutine ssteqr(COMPZ, N, D, E, Z, LDZ, WORK, INFO)
SSTEQR
subroutine sstein(N, D, E, M, W, IBLOCK, ISPLIT, Z, LDZ, WORK, IWORK, IFAIL, INFO)
SSTEIN
subroutine xerbla(SRNAME, INFO)
XERBLA
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 sstebz(RANGE, ORDER, N, VL, VU, IL, IU, ABSTOL, D, E, M, NSPLIT, W, IBLOCK, ISPLIT, WORK, IWORK, INFO)
SSTEBZ
subroutine sscal(N, SA, SX, INCX)
SSCAL
subroutine sswap(N, SX, INCX, SY, INCY)
SSWAP
subroutine ssytrd_2stage(VECT, UPLO, N, A, LDA, D, E, TAU, HOUS2, LHOUS2, WORK, LWORK, INFO)
SSYTRD_2STAGE
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