262 SUBROUTINE zhbevx( JOBZ, RANGE, UPLO, N, KD, AB, LDAB, Q, LDQ,
264 $ VU, IL, IU, ABSTOL, M, W, Z, LDZ, WORK, RWORK,
265 $ IWORK, IFAIL, INFO )
272 CHARACTER JOBZ, RANGE, UPLO
273 INTEGER IL, INFO, IU, KD, LDAB, LDQ, LDZ, M, N
274 DOUBLE PRECISION ABSTOL, VL, VU
277 INTEGER IFAIL( * ), IWORK( * )
278 DOUBLE PRECISION RWORK( * ), W( * )
279 COMPLEX*16 AB( LDAB, * ), Q( LDQ, * ), WORK( * ),
286 DOUBLE PRECISION ZERO, ONE
287 PARAMETER ( ZERO = 0.0d0, one = 1.0d0 )
288 COMPLEX*16 CZERO, CONE
289 parameter( czero = ( 0.0d0, 0.0d0 ),
290 $ cone = ( 1.0d0, 0.0d0 ) )
293 LOGICAL ALLEIG, INDEIG, LOWER, TEST, VALEIG, WANTZ
295 INTEGER I, IINFO, IMAX, INDD, INDE, INDEE, INDIBL,
296 $ indisp, indiwk, indrwk, indwrk, iscale, itmp1,
298 DOUBLE PRECISION ABSTLL, ANRM, BIGNUM, EPS, RMAX, RMIN, SAFMIN,
299 $ SIGMA, SMLNUM, TMP1, VLL, VUU
304 DOUBLE PRECISION DLAMCH, ZLANHB
305 EXTERNAL LSAME, DLAMCH, ZLANHB
314 INTRINSIC dble, max, min, sqrt
320 wantz = lsame( jobz,
'V' )
321 alleig = lsame( range,
'A' )
322 valeig = lsame( range,
'V' )
323 indeig = lsame( range,
'I' )
324 lower = lsame( uplo,
'L' )
327 IF( .NOT.( wantz .OR. lsame( jobz,
'N' ) ) )
THEN
329 ELSE IF( .NOT.( alleig .OR. valeig .OR. indeig ) )
THEN
331 ELSE IF( .NOT.( lower .OR. lsame( uplo,
'U' ) ) )
THEN
333 ELSE IF( n.LT.0 )
THEN
335 ELSE IF( kd.LT.0 )
THEN
337 ELSE IF( ldab.LT.kd+1 )
THEN
339 ELSE IF( wantz .AND. ldq.LT.max( 1, n ) )
THEN
343 IF( n.GT.0 .AND. vu.LE.vl )
345 ELSE IF( indeig )
THEN
346 IF( il.LT.1 .OR. il.GT.max( 1, n ) )
THEN
348 ELSE IF( iu.LT.min( n, il ) .OR. iu.GT.n )
THEN
354 IF( ldz.LT.1 .OR. ( wantz .AND. ldz.LT.n ) )
359 CALL xerbla(
'ZHBEVX', -info )
374 ctmp1 = ab( kd+1, 1 )
378 IF( .NOT.( vl.LT.tmp1 .AND. vu.GE.tmp1 ) )
382 w( 1 ) = dble( ctmp1 )
391 safmin = dlamch(
'Safe minimum' )
392 eps = dlamch(
'Precision' )
393 smlnum = safmin / eps
394 bignum = one / smlnum
395 rmin = sqrt( smlnum )
396 rmax = min( sqrt( bignum ), one / sqrt( sqrt( safmin ) ) )
409 anrm = zlanhb(
'M', uplo, n, kd, ab, ldab, rwork )
410 IF( anrm.GT.zero .AND. anrm.LT.rmin )
THEN
413 ELSE IF( anrm.GT.rmax )
THEN
417 IF( iscale.EQ.1 )
THEN
419 CALL zlascl(
'B', kd, kd, one, sigma, n, n, ab, ldab,
422 CALL zlascl(
'Q', kd, kd, one, sigma, n, n, ab, ldab,
426 $ abstll = abstol*sigma
439 CALL zhbtrd( jobz, uplo, n, kd, ab, ldab, rwork( indd ),
440 $ rwork( inde ), q, ldq, work( indwrk ), iinfo )
448 IF (il.EQ.1 .AND. iu.EQ.n)
THEN
452 IF ((alleig .OR. test) .AND. (abstol.LE.zero))
THEN
453 CALL dcopy( n, rwork( indd ), 1, w, 1 )
455 IF( .NOT.wantz )
THEN
456 CALL dcopy( n-1, rwork( inde ), 1, rwork( indee ), 1 )
457 CALL dsterf( n, w, rwork( indee ), info )
459 CALL zlacpy(
'A', n, n, q, ldq, z, ldz )
460 CALL dcopy( n-1, rwork( inde ), 1, rwork( indee ), 1 )
461 CALL zsteqr( jobz, n, w, rwork( indee ), z, ldz,
462 $ rwork( indrwk ), info )
486 CALL dstebz( range, order, n, vll, vuu, il, iu, abstll,
487 $ rwork( indd ), rwork( inde ), m, nsplit, w,
488 $ iwork( indibl ), iwork( indisp ), rwork( indrwk ),
489 $ iwork( indiwk ), info )
492 CALL zstein( n, rwork( indd ), rwork( inde ), m, w,
493 $ iwork( indibl ), iwork( indisp ), z, ldz,
494 $ rwork( indrwk ), iwork( indiwk ), ifail, info )
500 CALL zcopy( n, z( 1, j ), 1, work( 1 ), 1 )
501 CALL zgemv(
'N', n, n, cone, q, ldq, work, 1, czero,
509 IF( iscale.EQ.1 )
THEN
515 CALL dscal( imax, one / sigma, w, 1 )
526 IF( w( jj ).LT.tmp1 )
THEN
533 itmp1 = iwork( indibl+i-1 )
535 iwork( indibl+i-1 ) = iwork( indibl+j-1 )
537 iwork( indibl+j-1 ) = itmp1
538 CALL zswap( n, z( 1, i ), 1, z( 1, j ), 1 )
541 ifail( i ) = ifail( j )
subroutine zhbevx(jobz, range, uplo, n, kd, ab, ldab, q, ldq, vl, vu, il, iu, abstol, m, w, z, ldz, work, rwork, iwork, ifail, info)
ZHBEVX computes the eigenvalues and, optionally, the left and/or right eigenvectors for OTHER matrice...