231 SUBROUTINE dspevx( JOBZ, RANGE, UPLO, N, AP, VL, VU, IL, IU,
232 $ ABSTOL, M, W, Z, LDZ, WORK, IWORK, IFAIL,
240 CHARACTER JOBZ, RANGE, UPLO
241 INTEGER IL, INFO, IU, LDZ, M, N
242 DOUBLE PRECISION ABSTOL, VL, VU
245 INTEGER IFAIL( * ), IWORK( * )
246 DOUBLE PRECISION AP( * ), W( * ), WORK( * ), Z( LDZ, * )
252 DOUBLE PRECISION ZERO, ONE
253 PARAMETER ( ZERO = 0.0d0, one = 1.0d0 )
256 LOGICAL ALLEIG, INDEIG, TEST, VALEIG, WANTZ
258 INTEGER , IINFO, IMAX, INDD, INDE, INDEE, INDIBL,
259 $ indisp, indiwo, indtau, indwrk, iscale, itmp1,
261 DOUBLE PRECISION ABSTLL, ANRM, BIGNUM, EPS, RMAX, , SAFMIN,
262 $ SIGMA, SMLNUM, TMP1, VLL,
266 DOUBLE PRECISION DLAMCH, DLANSP
267 EXTERNAL lsame, dlamch, dlansp
280 wantz = lsame( jobz,
'V' )
282 valeig = lsame( range,
'V' )
283 indeig = lsame( range,
'I' )
286 IF( .NOT.( wantz .OR. lsame( jobz,
'N' ) ) )
THEN
288 ELSE IF( .NOT.( alleig .OR. valeig .OR. indeig ) )
THEN
290 ELSE IF( .NOT.( lsame( uplo,
'L' ) .OR. lsame( uplo,
'U' ) ) )
293 ELSE IF( n.LT.0 )
THEN
297 IF( n.GT.0 .AND. vu.LE.vl )
299 ELSE IF( indeig )
THEN
300 IF( il.LT.1 .OR. il.GT.
max( 1, n ) )
THEN
302 ELSE IF( iu.LT.
min( n, il ) .OR. iu.GT.n )
THEN
308 IF( ldz.LT.1 .OR. ( wantz .AND. ldz.LT.n ) )
313 CALL xerbla(
'DSPEVX', -info )
324 IF( alleig .OR. indeig )
THEN
328 IF( vl.LT.ap( 1 ) .AND. vu.GE.ap( 1 ) )
THEN
340 safmin = dlamch(
'Safe minimum' )
341 eps = dlamch( 'precision
' )
342 SMLNUM = SAFMIN / EPS
343 BIGNUM = ONE / SMLNUM
344 RMIN = SQRT( SMLNUM )
345 RMAX = MIN( SQRT( BIGNUM ), ONE / SQRT( SQRT( SAFMIN ) ) )
358 ANRM = DLANSP( 'm
', UPLO, N, AP, WORK )
359.GT..AND..LT.
IF( ANRMZERO ANRMRMIN ) THEN
362.GT.
ELSE IF( ANRMRMAX ) THEN
366.EQ.
IF( ISCALE1 ) THEN
367 CALL DSCAL( ( N*( N+1 ) ) / 2, SIGMA, AP, 1 )
369 $ ABSTLL = ABSTOL*SIGMA
382 CALL DSPTRD( UPLO, N, AP, WORK( INDD ), WORK( INDE ),
383 $ WORK( INDTAU ), IINFO )
391.EQ..AND..EQ.
IF (IL1 IUN) THEN
395.OR..AND..LE.
IF ((ALLEIG TEST) (ABSTOLZERO)) THEN
396 CALL DCOPY( N, WORK( INDD ), 1, W, 1 )
398.NOT.
IF( WANTZ ) THEN
399 CALL DCOPY( N-1, WORK( INDE ), 1, WORK( INDEE ), 1 )
400 CALL DSTERF( N, W, WORK( INDEE ), INFO )
402 CALL DOPGTR( UPLO, N, AP, WORK( INDTAU ), Z, LDZ,
403 $ WORK( INDWRK ), IINFO )
404 CALL DCOPY( N-1, WORK( INDE ), 1, WORK( INDEE ), 1 )
405 CALL DSTEQR( JOBZ, N, W, WORK( INDEE ), Z, LDZ,
406 $ WORK( INDWRK ), INFO )
430 CALL DSTEBZ( RANGE, ORDER, N, VLL, VUU, IL, IU, ABSTLL,
431 $ WORK( INDD ), WORK( INDE ), M, NSPLIT, W,
432 $ IWORK( INDIBL ), IWORK( INDISP ), WORK( INDWRK ),
433 $ IWORK( INDIWO ), INFO )
436 CALL DSTEIN( N, WORK( INDD ), WORK( INDE ), M, W,
437 $ IWORK( INDIBL ), IWORK( INDISP ), Z, LDZ,
438 $ WORK( INDWRK ), IWORK( INDIWO ), IFAIL, INFO )
443 CALL DOPMTR( 'l', uplo,
'N', n, m, ap, work( indtau ), z, ldz,
444 $ work( indwrk ), iinfo )
450 IF( iscale.EQ.1 )
THEN
456 CALL dscal( imax, one / sigma, w, 1 )
467 IF( w( jj ).LT.tmp1 )
THEN
474 itmp1 = iwork( indibl+i-1 )
476 iwork( indibl+i-1 ) = iwork( indibl+j-1 )
478 iwork( indibl+j-1 ) = itmp1
479 CALL dswap( n, z( 1, i ), 1, z( 1, j ), 1 )
482 ifail( i ) = ifail( j )
subroutine dsteqr(compz, n, d, e, z, ldz, work, info)
DSTEQR
subroutine dstebz(range, order, n, vl, vu, il, iu, abstol, d, e, m, nsplit, w, iblock, isplit, work, iwork, info)
DSTEBZ
subroutine dsterf(n, d, e, info)
DSTERF
subroutine xerbla(srname, info)
XERBLA
subroutine dsptrd(uplo, n, ap, d, e, tau, info)
DSPTRD
subroutine dstein(n, d, e, m, w, iblock, isplit, z, ldz, work, iwork, ifail, info)
DSTEIN
subroutine dopmtr(side, uplo, trans, m, n, ap, tau, c, ldc, work, info)
DOPMTR
subroutine dopgtr(uplo, n, ap, tau, q, ldq, work, info)
DOPGTR
subroutine dspevx(jobz, range, uplo, n, ap, vl, vu, il, iu, abstol, m, w, z, ldz, work, iwork, ifail, info)
DSPEVX computes the eigenvalues and, optionally, the left and/or right eigenvectors for OTHER matrice...
subroutine dscal(n, da, dx, incx)
DSCAL
subroutine dswap(n, dx, incx, dy, incy)
DSWAP
subroutine dcopy(n, dx, incx, dy, incy)
DCOPY