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 dstein(N, D, E, M, W, IBLOCK, ISPLIT, Z, LDZ, WORK, IWORK, IFAIL, INFO)
DSTEIN
subroutine dcopy(N, DX, INCX, DY, INCY)
DCOPY
subroutine dormtr(SIDE, UPLO, TRANS, M, N, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
DORMTR
subroutine dsterf(N, D, E, INFO)
DSTERF
subroutine dswap(N, DX, INCX, DY, INCY)
DSWAP
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine dsytrd_2stage(VECT, UPLO, N, A, LDA, D, E, TAU, HOUS2, LHOUS2, WORK, LWORK, INFO)
DSYTRD_2STAGE
subroutine dscal(N, DA, DX, INCX)
DSCAL
subroutine dorgtr(UPLO, N, A, LDA, TAU, WORK, LWORK, INFO)
DORGTR
subroutine dstebz(RANGE, ORDER, N, VL, VU, IL, IU, ABSTOL, D, E, M, NSPLIT, W, IBLOCK, ISPLIT, WORK, IWORK, INFO)
DSTEBZ
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...