262 SUBROUTINE chbevx( 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
277 INTEGER IFAIL( * ), IWORK( * )
278 REAL RWORK( * ), W( * )
279 COMPLEX AB( LDAB, * ), Q( LDQ, * ), WORK( * ),
287 PARAMETER ( ZERO = 0.0e0, one = 1.0e0 )
289 parameter( czero = ( 0.0e0, 0.0e0 ),
290 $ cone = ( 1.0e0, 0.0e0 ) )
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 REAL ABSTLL, ANRM, BIGNUM, EPS, RMAX, RMIN, SAFMIN,
299 $ SIGMA, SMLNUM, TMP1, VLL, VUU
305 EXTERNAL LSAME, CLANHB, SLAMCH
314 INTRINSIC max, min, real, 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(
'CHBEVX', -info )
374 ctmp1 = ab( kd+1, 1 )
378 IF( .NOT.( vl.LT.tmp1 .AND. vu.GE.tmp1 ) )
382 w( 1 ) = real( ctmp1 )
391 safmin = slamch(
'Safe minimum' )
392 eps = slamch(
'Precision' )
393 smlnum = safmin / eps
394 bignum = one / smlnum
395 rmin = sqrt( smlnum )
396 rmax = min( sqrt( bignum ), one / sqrt( sqrt( safmin ) ) )
409 anrm = clanhb(
'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 clascl(
'B', kd, kd, one, sigma, n, n, ab, ldab,
422 CALL clascl(
'Q', kd, kd, one, sigma, n, n, ab, ldab,
426 $ abstll = abstol*sigma
439 CALL chbtrd( 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 scopy( n, rwork( indd ), 1, w, 1 )
455 IF( .NOT.wantz )
THEN
456 CALL scopy( n-1, rwork( inde ), 1, rwork( indee ), 1 )
457 CALL ssterf( n, w, rwork( indee ), info )
459 CALL clacpy(
'A', n, n, q, ldq, z, ldz )
460 CALL scopy( n-1, rwork( inde ), 1, rwork( indee ), 1 )
461 CALL csteqr( jobz, n, w, rwork( indee ), z, ldz,
462 $ rwork( indrwk ), info )
486 CALL sstebz( 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 cstein( n, rwork( indd ), rwork( inde ), m, w,
493 $ iwork( indibl ), iwork( indisp ), z, ldz,
494 $ rwork( indrwk ), iwork( indiwk ), ifail, info )
500 CALL ccopy( n, z( 1, j ), 1, work( 1 ), 1 )
501 CALL cgemv(
'N', n, n, cone, q, ldq, work, 1, czero,
509 IF( iscale.EQ.1 )
THEN
515 CALL sscal( 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 cswap( n, z( 1, i ), 1, z( 1, j ), 1 )
541 ifail( i ) = ifail( j )
subroutine chbevx(jobz, range, uplo, n, kd, ab, ldab, q, ldq, vl, vu, il, iu, abstol, m, w, z, ldz, work, rwork, iwork, ifail, info)
CHBEVX computes the eigenvalues and, optionally, the left and/or right eigenvectors for OTHER matrice...