260 SUBROUTINE ssbevx( 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
275 INTEGER IFAIL( * ), IWORK( * )
276 REAL AB( LDAB, * ), Q( LDQ, * ), W( * ), WORK( * ),
284 PARAMETER ( ZERO = 0.0e0, one = 1.0e0 )
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 REAL ABSTLL, ANRM, BIGNUM, EPS, RMAX, RMIN, SAFMIN,
293 $ SIGMA, SMLNUM, TMP1, VLL, VUU
298 EXTERNAL LSAME, SLAMCH, SLANSB
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(
'SSBEVX', -info )
369 IF( .NOT.( vl.LT.tmp1 .AND. vu.GE.tmp1 ) )
382 safmin = slamch(
'Safe minimum' )
383 eps = slamch(
'Precision' )
384 smlnum = safmin / eps
385 bignum = one / smlnum
386 rmin = sqrt( smlnum )
387 rmax = min( sqrt( bignum ), one / sqrt( sqrt( safmin ) ) )
400 anrm = slansb(
'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 slascl(
'B', kd, kd, one, sigma, n, n, ab, ldab,
413 CALL slascl(
'Q', kd, kd, one, sigma, n, n, ab, ldab,
417 $ abstll = abstol*sigma
429 CALL ssbtrd( 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 scopy( n, work( indd ), 1, w, 1 )
445 IF( .NOT.wantz )
THEN
446 CALL scopy( n-1, work( inde ), 1, work( indee ), 1 )
447 CALL ssterf( n, w, work( indee ), info )
449 CALL slacpy(
'A', n, n, q, ldq, z, ldz )
450 CALL scopy( n-1, work( inde ), 1, work( indee ), 1 )
451 CALL ssteqr( jobz, n, w, work( indee ), z, ldz,
452 $ work( indwrk ), info )
476 CALL sstebz( 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 sstein( n, work( indd ), work( inde ), m, w,
483 $ iwork( indibl ), iwork( indisp ), z, ldz,
484 $ work( indwrk ), iwork( indiwo ), ifail, info )
490 CALL scopy( n, z( 1, j ), 1, work( 1 ), 1 )
491 CALL sgemv(
'N', n, n, one, q, ldq, work, 1, zero,
499 IF( iscale.EQ.1 )
THEN
505 CALL sscal( 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 sswap( n, z( 1, i ), 1, z( 1, j ), 1 )
531 ifail( i ) = ifail( j )
subroutine ssbevx(jobz, range, uplo, n, kd, ab, ldab, q, ldq, vl, vu, il, iu, abstol, m, w, z, ldz, work, iwork, ifail, info)
SSBEVX computes the eigenvalues and, optionally, the left and/or right eigenvectors for OTHER matrice...