260 SUBROUTINE dsbevx( JOBZ, RANGE, UPLO, N, KD, AB, LDAB, Q, LDQ,
262 $ VU, IL, IU, ABSTOL, M, W, Z, LDZ, WORK, IWORK,
270 CHARACTER JOBZ, RANGE, UPLO
271 INTEGER IL, INFO, IU, KD, LDAB, LDQ, LDZ, M, N
272 DOUBLE PRECISION ABSTOL, VL, VU
275 INTEGER IFAIL( * ), IWORK( * )
276 DOUBLE PRECISION AB( LDAB, * ), Q( LDQ, * ), W( * ), WORK( * ),
283 DOUBLE PRECISION ZERO, ONE
284 PARAMETER ( ZERO = 0.0d0, one = 1.0d0 )
287 LOGICAL ALLEIG, INDEIG, LOWER, TEST, VALEIG, WANTZ
289 INTEGER I, IINFO, IMAX, INDD, INDE, INDEE, INDIBL,
290 $ indisp, indiwo, indwrk, iscale, itmp1, j, jj,
292 DOUBLE PRECISION ABSTLL, ANRM, BIGNUM, EPS, RMAX, RMIN, SAFMIN,
293 $ SIGMA, SMLNUM, TMP1, VLL, VUU
297 DOUBLE PRECISION DLAMCH, DLANSB
298 EXTERNAL LSAME, DLAMCH, DLANSB
306 INTRINSIC max, min, sqrt
312 wantz = lsame( jobz,
'V' )
313 alleig = lsame( range,
'A' )
314 valeig = lsame( range,
'V' )
315 indeig = lsame( range,
'I' )
316 lower = lsame( uplo,
'L' )
319 IF( .NOT.( wantz .OR. lsame( jobz,
'N' ) ) )
THEN
321 ELSE IF( .NOT.( alleig .OR. valeig .OR. indeig ) )
THEN
323 ELSE IF( .NOT.( lower .OR. lsame( uplo,
'U' ) ) )
THEN
325 ELSE IF( n.LT.0 )
THEN
327 ELSE IF( kd.LT.0 )
THEN
329 ELSE IF( ldab.LT.kd+1 )
THEN
331 ELSE IF( wantz .AND. ldq.LT.max( 1, n ) )
THEN
335 IF( n.GT.0 .AND. vu.LE.vl )
337 ELSE IF( indeig )
THEN
338 IF( il.LT.1 .OR. il.GT.max( 1, n ) )
THEN
340 ELSE IF( iu.LT.min( n, il ) .OR. iu.GT.n )
THEN
346 IF( ldz.LT.1 .OR. ( wantz .AND. ldz.LT.n ) )
351 CALL xerbla(
'DSBEVX', -info )
369 IF( .NOT.( vl.LT.tmp1 .AND. vu.GE.tmp1 ) )
382 safmin = dlamch(
'Safe minimum' )
383 eps = dlamch(
'Precision' )
384 smlnum = safmin / eps
385 bignum = one / smlnum
386 rmin = sqrt( smlnum )
387 rmax = min( sqrt( bignum ), one / sqrt( sqrt( safmin ) ) )
400 anrm = dlansb(
'M', uplo, n, kd, ab, ldab, work )
401 IF( anrm.GT.zero .AND. anrm.LT.rmin )
THEN
404 ELSE IF( anrm.GT.rmax )
THEN
408 IF( iscale.EQ.1 )
THEN
410 CALL dlascl(
'B', kd, kd, one, sigma, n, n, ab, ldab,
413 CALL dlascl(
'Q', kd, kd, one, sigma, n, n, ab, ldab,
417 $ abstll = abstol*sigma
429 CALL dsbtrd( jobz, uplo, n, kd, ab, ldab, work( indd ),
430 $ work( inde ), q, ldq, work( indwrk ), iinfo )
438 IF (il.EQ.1 .AND. iu.EQ.n)
THEN
442 IF ((alleig .OR. test) .AND. (abstol.LE.zero))
THEN
443 CALL dcopy( n, work( indd ), 1, w, 1 )
445 IF( .NOT.wantz )
THEN
446 CALL dcopy( n-1, work( inde ), 1, work( indee ), 1 )
447 CALL dsterf( n, w, work( indee ), info )
449 CALL dlacpy(
'A', n, n, q, ldq, z, ldz )
450 CALL dcopy( n-1, work( inde ), 1, work( indee ), 1 )
451 CALL dsteqr( jobz, n, w, work( indee ), z, ldz,
452 $ work( indwrk ), info )
476 CALL dstebz( range, order, n, vll, vuu, il, iu, abstll,
477 $ work( indd ), work( inde ), m, nsplit, w,
478 $ iwork( indibl ), iwork( indisp ), work( indwrk ),
479 $ iwork( indiwo ), info )
482 CALL dstein( n, work( indd ), work( inde ), m, w,
483 $ iwork( indibl ), iwork( indisp ), z, ldz,
484 $ work( indwrk ), iwork( indiwo ), ifail, info )
490 CALL dcopy( n, z( 1, j ), 1, work( 1 ), 1 )
491 CALL dgemv(
'N', n, n, one, q, ldq, work, 1, zero,
499 IF( iscale.EQ.1 )
THEN
505 CALL dscal( imax, one / sigma, w, 1 )
516 IF( w( jj ).LT.tmp1 )
THEN
523 itmp1 = iwork( indibl+i-1 )
525 iwork( indibl+i-1 ) = iwork( indibl+j-1 )
527 iwork( indibl+j-1 ) = itmp1
528 CALL dswap( n, z( 1, i ), 1, z( 1, j ), 1 )
531 ifail( i ) = ifail( j )
subroutine dsbevx(jobz, range, uplo, n, kd, ab, ldab, q, ldq, vl, vu, il, iu, abstol, m, w, z, ldz, work, iwork, ifail, info)
DSBEVX computes the eigenvalues and, optionally, the left and/or right eigenvectors for OTHER matrice...