213 SUBROUTINE chbevd( JOBZ, UPLO, N, KD, AB, LDAB, W, Z, LDZ, WORK,
214 $ LWORK, RWORK, LRWORK, IWORK, LIWORK, INFO )
222 INTEGER INFO, KD, LDAB, LDZ, LIWORK, LRWORK, LWORK, N
226 REAL RWORK( * ), W( * )
227 COMPLEX AB( LDAB, * ), WORK( * ), Z( LDZ, * )
234 parameter( zero = 0.0e0, one = 1.0e0 )
236 parameter( czero = ( 0.0e0, 0.0e0 ),
237 $ cone = ( 1.0e0, 0.0e0 ) )
240 LOGICAL LOWER, LQUERY, WANTZ
241 INTEGER IINFO, IMAX, INDE, INDWK2, INDWRK, ISCALE,
242 $ liwmin, llrwk, llwk2, lrwmin, lwmin
243 REAL ANRM, BIGNUM, EPS, RMAX, RMIN, SAFMIN, SIGMA,
249 EXTERNAL lsame, clanhb, slamch
262 wantz = lsame( jobz,
'V' )
263 lower = lsame( uplo,
'L' )
264 lquery = ( lwork.EQ.-1 .OR. liwork.EQ.-1 .OR. lrwork.EQ.-1 )
274 lrwmin = 1 + 5*n + 2*n**2
282 IF( .NOT.( wantz .OR. lsame( jobz,
'N' ) ) )
THEN
284 ELSE IF( .NOT.( lower .OR. lsame( uplo,
'U' ) ) )
THEN
286 ELSE IF( n.LT.0 )
THEN
288 ELSE IF( kd.LT.0 )
THEN
290 ELSE IF( ldab.LT.kd+1 )
THEN
292 ELSE IF( ldz.LT.1 .OR. ( wantz .AND. ldz.LT.n ) )
THEN
301 IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN
303 ELSE IF( lrwork.LT.lrwmin .AND. .NOT.lquery )
THEN
305 ELSE IF( liwork.LT.liwmin .AND. .NOT.lquery )
THEN
311 CALL xerbla(
'CHBEVD', -info )
313 ELSE IF( lquery )
THEN
323 w( 1 ) = real( ab( 1, 1 ) )
331 safmin = slamch(
'Safe minimum' )
332 eps = slamch(
'Precision' )
333 smlnum = safmin / eps
334 bignum = one / smlnum
335 rmin = sqrt( smlnum )
336 rmax = sqrt( bignum )
340 anrm = clanhb(
'M', uplo, n, kd, ab, ldab, rwork )
342 IF( anrm.GT.zero .AND. anrm.LT.rmin )
THEN
345 ELSE IF( anrm.GT.rmax )
THEN
349 IF( iscale.EQ.1 )
THEN
351 CALL clascl(
'B', kd, kd, one, sigma, n, n, ab, ldab, info )
353 CALL clascl(
'Q', kd, kd, one, sigma, n, n, ab, ldab, info )
362 llwk2 = lwork - indwk2 + 1
363 llrwk = lrwork - indwrk + 1
364 CALL chbtrd( jobz, uplo, n, kd, ab, ldab, w, rwork( inde ), z,
369 IF( .NOT.wantz )
THEN
370 CALL ssterf( n, w, rwork( inde ), info )
372 CALL cstedc(
'I', n, w, rwork( inde ), work, n, work( indwk2 ),
373 $ llwk2, rwork( indwrk ), llrwk, iwork, liwork,
375 CALL cgemm(
'N',
'N', n, n, n, cone, z, ldz, work, n, czero,
376 $ work( indwk2 ), n )
377 CALL clacpy(
'A', n, n, work( indwk2 ), n, z, ldz )
382 IF( iscale.EQ.1 )
THEN
388 CALL sscal( imax, one / sigma, w, 1 )
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine ssterf(N, D, E, INFO)
SSTERF
subroutine cgemm(TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC)
CGEMM
subroutine clascl(TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO)
CLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
subroutine clacpy(UPLO, M, N, A, LDA, B, LDB)
CLACPY copies all or part of one two-dimensional array to another.
subroutine chbtrd(VECT, UPLO, N, KD, AB, LDAB, D, E, Q, LDQ, WORK, INFO)
CHBTRD
subroutine cstedc(COMPZ, N, D, E, Z, LDZ, WORK, LWORK, RWORK, LRWORK, IWORK, LIWORK, INFO)
CSTEDC
subroutine chbevd(JOBZ, UPLO, N, KD, AB, LDAB, W, Z, LDZ, WORK, LWORK, RWORK, LRWORK, IWORK, LIWORK, INFO)
CHBEVD computes the eigenvalues and, optionally, the left and/or right eigenvectors for OTHER matrice...
subroutine sscal(N, SA, SX, INCX)
SSCAL