299 SUBROUTINE dsyevx_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
313 DOUBLE PRECISION ABSTOL, VL, VU
316 INTEGER IFAIL( * ), IWORK( * )
317 DOUBLE PRECISION A( lda, * ), W( * ), WORK( * ), Z( ldz, * )
323 DOUBLE PRECISION ZERO, ONE
324 parameter ( zero = 0.0d+0, one = 1.0d+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 DOUBLE PRECISION ABSTLL, ANRM, BIGNUM, EPS, RMAX, RMIN, SAFMIN,
335 $ sigma, smlnum, tmp1, vll, vuu
340 DOUBLE PRECISION DLAMCH, DLANSY
341 EXTERNAL lsame, ilaenv, dlamch, dlansy
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,
'DSYTRD_2STAGE', jobz, n, -1, -1, -1 )
397 ib = ilaenv( 18,
'DSYTRD_2STAGE', jobz, n, kd, -1, -1 )
398 lhtrd = ilaenv( 19,
'DSYTRD_2STAGE', jobz, n, kd, ib, -1 )
399 lwtrd = ilaenv( 20,
'DSYTRD_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(
'DSYEVX_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 = dlamch(
'Safe minimum' )
440 eps = dlamch(
'Precision' )
441 smlnum = safmin / eps
442 bignum = one / smlnum
443 rmin = sqrt( smlnum )
444 rmax = min( sqrt( bignum ), one / sqrt( sqrt( safmin ) ) )
454 anrm = dlansy(
'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 dscal( n-j+1, sigma, a( j, j ), 1 )
469 CALL dscal( 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 dcopy( n, work( indd ), 1, w, 1 )
506 IF( .NOT.wantz )
THEN
507 CALL dcopy( n-1, work( inde ), 1, work( indee ), 1 )
508 CALL dsterf( n, w, work( indee ), info )
510 CALL dlacpy(
'A', n, n, a, lda, z, ldz )
511 CALL dorgtr( uplo, n, z, ldz, work( indtau ),
512 $ work( indwrk ), llwork, iinfo )
513 CALL dcopy( n-1, work( inde ), 1, work( indee ), 1 )
514 CALL dsteqr( jobz, n, w, work( indee ), z, ldz,
515 $ work( indwrk ), info )
539 CALL dstebz( 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 dstein( 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 dormtr(
'L', uplo,
'N', n, m, a, lda, work( indtau ), z,
555 $ ldz, work( indwkn ), llwrkn, iinfo )
561 IF( iscale.EQ.1 )
THEN
567 CALL dscal( 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 dswap( n, z( 1, i ), 1, z( 1, j ), 1 )
593 ifail( i ) = ifail( j )
subroutine dlacpy(UPLO, M, N, A, LDA, B, LDB)
DLACPY copies all or part of one two-dimensional array to another.
subroutine dsteqr(COMPZ, N, D, E, Z, LDZ, WORK, INFO)
DSTEQR
subroutine dcopy(N, DX, INCX, DY, INCY)
DCOPY
subroutine dstein(N, D, E, M, W, IBLOCK, ISPLIT, Z, LDZ, WORK, IWORK, IFAIL, INFO)
DSTEIN
subroutine dsyevx_2stage(JOBZ, RANGE, UPLO, N, A, LDA, VL, VU, IL, IU, ABSTOL, M, W, Z, LDZ, WORK, LWORK, IWORK, IFAIL, INFO)
DSYEVX_2STAGE computes the eigenvalues and, optionally, the left and/or right eigenvectors for SY ma...
subroutine dsterf(N, D, E, INFO)
DSTERF
subroutine dswap(N, DX, INCX, DY, INCY)
DSWAP
subroutine dstebz(RANGE, ORDER, N, VL, VU, IL, IU, ABSTOL, D, E, M, NSPLIT, W, IBLOCK, ISPLIT, WORK, IWORK, INFO)
DSTEBZ
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine dscal(N, DA, DX, INCX)
DSCAL
subroutine dorgtr(UPLO, N, A, LDA, TAU, WORK, LWORK, INFO)
DORGTR
subroutine dsytrd_2stage(VECT, UPLO, N, A, LDA, D, E, TAU, HOUS2, LHOUS2, WORK, LWORK, INFO)
DSYTRD_2STAGE
subroutine dormtr(SIDE, UPLO, TRANS, M, N, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
DORMTR