213 SUBROUTINE zhbevd( JOBZ, UPLO, N, KD, AB, LDAB, W, Z, LDZ, WORK,
214 $ LWORK, RWORK, LRWORK, IWORK, LIWORK, INFO )
222 INTEGER, LRWORK, LWORK,
226 DOUBLE PRECISION RWORK( * ), W(
227COMPLEX*16 AB( LDAB, * ), WORK( * ), Z(
233 DOUBLE PRECISION ZERO,
235 COMPLEX*16 CZERO, CONE
236 parameter( czero = ( 0.0d0, 0.0d0 ),
237 $ cone = ( 1.0d0, 0.0d0 ) )
240 LOGICAL , LQUERY, WANTZ
241 INTEGER IINFO, IMAX, INDE, INDWK2, INDWRK, ISCALE,
242 $ liwmin, llrwk, llwk2, lrwmin, lwmin
243 DOUBLE PRECISION ANRM, BIGNUM, , RMAX, RMIN, SAFMIN, SIGMA,
249EXTERNAL lsame, dlamch, zlanhb
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(
'ZHBEVD', -info )
313 ELSE IF( lquery )
THEN
323 w( 1 ) = dble( ab( 1, 1 ) )
331 safmin = dlamch(
'Safe minimum' )
332 eps = dlamch(
'Precision' )
333 smlnum = safmin / eps
334 bignum = one / smlnum
335 rmin = sqrt( smlnum )
336 rmax = sqrt( bignum )
340 anrm = zlanhb(
'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 zlascl(
'B', kd, kd, one, sigma, n, n, ab, ldab, info )
353 CALL zlascl(
'Q', kd, kd, one, sigma, n, n, ab, ldab, info )
362 llwk2 = lwork - indwk2 + 1
363 llrwk = lrwork - indwrk + 1
364 CALL zhbtrd( jobz, uplo, n, kd, ab, ldab, w, rwork( inde ), z,
369 IF( .NOT.wantz )
THEN
370 CALL dsterf( n, w, rwork( inde ), info )
372 CALL zstedc(
'I', n, w, rwork( inde ), work, n, work( indwk2 ),
373 $ llwk2, rwork( indwrk ), llrwk, iwork, liwork
375 CALL zgemm(
'N',
'N', n, n, n, cone, z, ldz, work, n, czero,
377 CALL zlacpy(
'A', n, n, work( indwk2 ), n, z, ldz )
382 IF( iscale.EQ.1 )
THEN
388 CALL dscal( imax, one / sigma, w, 1 )
subroutine zhbevd(jobz, uplo, n, kd, ab, ldab, w, z, ldz, work, lwork, rwork, lrwork, iwork, liwork, info)
ZHBEVD computes the eigenvalues and, optionally, the left and/or right eigenvectors for OTHER matrice...