262 SUBROUTINE dsbevx( JOBZ, RANGE, UPLO, N, KD, AB, LDAB, Q, LDQ, VL,
263 $ VU, IL, IU, ABSTOL, M, W, Z, LDZ, WORK, IWORK,
271 CHARACTER JOBZ, RANGE, UPLO
272 INTEGER IL, INFO, IU, KD, LDAB, LDQ, LDZ, M, N
276 INTEGER IFAIL( * ), IWORK( * )
277 DOUBLE PRECISION AB( LDAB, * ), Q( LDQ, * ), W( * ), WORK( * ),
284 DOUBLE PRECISION ZERO, ONE
285 PARAMETER ( ZERO = 0.0d0, one = 1.0d0 )
288 LOGICAL ALLEIG, INDEIG, LOWER, TEST, VALEIG, WANTZ
290 INTEGER I, IINFO, IMAX, , INDE, , INDIBL,
291 $ indisp, indiwo, indwrk, iscale, itmp1, j, jj,
293 DOUBLE PRECISION ABSTLL, ANRM, BIGNUM, EPS, RMAX, RMIN, SAFMIN,
294 $ SIGMA, SMLNUM, TMP1, VLL, VUU
298 DOUBLE PRECISION DLAMCH, DLANSB
299 EXTERNAL lsame, dlamch, dlansb
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, info )
412 CALL dlascl(
'Q', kd, kd, one, sigma, n, n, ab, ldab, info )
415 $ abstll = abstol*sigma
427 CALL dsbtrd( jobz, uplo, n, kd, ab, ldab, work( indd ),
428 $ work( inde ), q, ldq, work( indwrk ), iinfo )
436 IF (il.EQ.1 .AND. iu.EQ.n)
THEN
440 IF ((alleig .OR. test) .AND. (abstol.LE.zero))
THEN
441 CALL dcopy( n, work( indd ), 1, w, 1 )
443 IF( .NOT.wantz )
THEN
444 CALL dcopy( n-1, work( inde ), 1, work( indee ), 1 )
445 CALL dsterf( n, w, work( indee ), info )
447 CALL dlacpy( 'a
', N, N, Q, LDQ, Z, LDZ )
448 CALL DCOPY( N-1, WORK( INDE ), 1, WORK( INDEE ), 1 )
449 CALL DSTEQR( JOBZ, N, W, WORK( INDEE ), Z, LDZ,
450 $ WORK( INDWRK ), INFO )
474 CALL DSTEBZ( RANGE, ORDER, N, VLL, VUU, IL, IU, ABSTLL,
475 $ WORK( INDD ), WORK( INDE ), M, NSPLIT, W,
476 $ IWORK( INDIBL ), IWORK( INDISP ), WORK( INDWRK ),
477 $ IWORK( INDIWO ), INFO )
480 CALL DSTEIN( N, WORK( INDD ), WORK( INDE ), M, W,
481 $ IWORK( INDIBL ), IWORK( INDISP ), Z, LDZ,
482 $ WORK( INDWRK ), IWORK( INDIWO ), IFAIL, INFO )
488 CALL DCOPY( N, Z( 1, J ), 1, WORK( 1 ), 1 )
489 CALL DGEMV( 'n
', N, N, ONE, Q, LDQ, WORK, 1, ZERO,
497.EQ.
IF( ISCALE1 ) THEN
503 CALL DSCAL( IMAX, ONE / SIGMA, W, 1 )
514.LT.
IF( W( JJ )TMP1 ) THEN
521 ITMP1 = IWORK( INDIBL+I-1 )
523 IWORK( INDIBL+I-1 ) = IWORK( INDIBL+J-1 )
525 IWORK( INDIBL+J-1 ) = ITMP1
526 CALL DSWAP( N, Z( 1, I ), 1, Z( 1, J ), 1 )
529 IFAIL( I ) = IFAIL( J )
subroutine dstebz(range, order, n, vl, vu, il, iu, abstol, d, e, m, nsplit, w, iblock, isplit, work, iwork, info)
DSTEBZ
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...