258 $ WORK, LWORK, RWORK, LRWORK, IWORK,
269 INTEGER INFO, KD, LDAB, LDZ, LIWORK, LRWORK, LWORK, N
273 DOUBLE PRECISION RWORK( * ), W( * )
274 COMPLEX*16 AB( LDAB, * ), WORK( * ), Z( LDZ, * )
280 DOUBLE PRECISION ZERO, ONE
281 PARAMETER ( ZERO = 0.0d0, one = 1.0d0 )
282 COMPLEX*16 CZERO, CONE
283 parameter( czero = ( 0.0d0, 0.0d0 ),
284 $ cone = ( 1.0d0, 0.0d0 ) )
287 LOGICAL LOWER, LQUERY, WANTZ
288 INTEGER IINFO, IMAX, INDE, INDWK2, INDRWK, ISCALE,
289 $ llwork, indwk, lhtrd, lwtrd, ib, indhous,
290 $ liwmin, llrwk, llwk2, lrwmin, lwmin
291 DOUBLE PRECISION ANRM, BIGNUM, EPS, RMAX, RMIN, SAFMIN, SIGMA,
297 DOUBLE PRECISION DLAMCH, ZLANHB
298 EXTERNAL lsame, dlamch, zlanhb, ilaenv2stage
311 wantz = lsame( jobz,
'V' )
312 lower = lsame( uplo,
'L' )
313 lquery = ( lwork.EQ.-1 .OR. liwork.EQ.-1 .OR. lrwork.EQ.-1 )
321 ib = ilaenv2stage( 2,
'ZHETRD_HB2ST', jobz, n, kd, -1, -1 )
322 lhtrd = ilaenv2stage( 3,
'ZHETRD_HB2ST', jobz, n, kd, ib, -1 )
323 lwtrd = ilaenv2stage( 4,
'ZHETRD_HB2ST', jobz, n, kd, ib, -1 )
326 lrwmin = 1 + 5*n + 2*n**2
329 lwmin = max( n, lhtrd + lwtrd )
334 IF( .NOT.( lsame( jobz,
'N' ) ) )
THEN
336 ELSE IF( .NOT.( lower .OR. lsame( uplo,
'U' ) ) )
THEN
338 ELSE IF( n.LT.0 )
THEN
340 ELSE IF( kd.LT.0 )
THEN
342 ELSE IF( ldab.LT.kd+1 )
THEN
344 ELSE IF( ldz.LT.1 .OR. ( wantz .AND. ldz.LT.n ) )
THEN
353 IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN
355 ELSE IF( lrwork.LT.lrwmin .AND. .NOT.lquery )
THEN
357 ELSE IF( liwork.LT.liwmin .AND. .NOT.lquery )
THEN
363 CALL xerbla(
'ZHBEVD_2STAGE', -info )
365 ELSE IF( lquery )
THEN
375 w( 1 ) = dble( ab( 1, 1 ) )
383 safmin = dlamch(
'Safe minimum' )
384 eps = dlamch(
'Precision' )
385 smlnum = safmin / eps
386 bignum = one / smlnum
387 rmin = sqrt( smlnum )
388 rmax = sqrt( bignum )
392 anrm = zlanhb(
'M', uplo, n, kd, ab, ldab, rwork )
394 IF( anrm.GT.zero .AND. anrm.LT.rmin )
THEN
397 ELSE IF( anrm.GT.rmax )
THEN
401 IF( iscale.EQ.1 )
THEN
403 CALL zlascl(
'B', kd, kd, one, sigma, n, n, ab, ldab, info )
405 CALL zlascl(
'Q', kd, kd, one, sigma, n, n, ab, ldab, info )
413 llrwk = lrwork - indrwk + 1
415 indwk = indhous + lhtrd
416 llwork = lwork - indwk + 1
418 llwk2 = lwork - indwk2 + 1
421 $ rwork( inde ), work( indhous ), lhtrd,
422 $ work( indwk ), llwork, iinfo )
426 IF( .NOT.wantz )
THEN
427 CALL dsterf( n, w, rwork( inde ), info )
429 CALL zstedc(
'I', n, w, rwork( inde ), work, n, work( indwk2 ),
430 $ llwk2, rwork( indrwk ), llrwk, iwork, liwork,
432 CALL zgemm(
'N',
'N', n, n, n, cone, z, ldz, work, n, czero,
433 $ work( indwk2 ), n )
434 CALL zlacpy(
'A', n, n, work( indwk2 ), n, z, ldz )
439 IF( iscale.EQ.1 )
THEN
445 CALL dscal( imax, one / sigma, w, 1 )
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine dsterf(N, D, E, INFO)
DSTERF
subroutine zgemm(TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC)
ZGEMM
subroutine zlascl(TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO)
ZLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
subroutine zlacpy(UPLO, M, N, A, LDA, B, LDB)
ZLACPY copies all or part of one two-dimensional array to another.
subroutine zhetrd_hb2st(STAGE1, VECT, UPLO, N, KD, AB, LDAB, D, E, HOUS, LHOUS, WORK, LWORK, INFO)
ZHETRD_HB2ST reduces a complex Hermitian band matrix A to real symmetric tridiagonal form T
subroutine zstedc(COMPZ, N, D, E, Z, LDZ, WORK, LWORK, RWORK, LRWORK, IWORK, LIWORK, INFO)
ZSTEDC
subroutine zhbevd_2stage(JOBZ, UPLO, N, KD, AB, LDAB, W, Z, LDZ, WORK, LWORK, RWORK, LRWORK, IWORK, LIWORK, INFO)
ZHBEVD_2STAGE computes the eigenvalues and, optionally, the left and/or right eigenvectors for OTHER ...
subroutine dscal(N, DA, DX, INCX)
DSCAL