258 $ WORK, LWORK, RWORK, LRWORK, IWORK,
269 INTEGER INFO, KD, LDAB, LDZ, LIWORK, LRWORK, LWORK, N
274COMPLEX*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, , 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.EQ..OR..EQ..OR..EQ.
LQUERY = ( LWORK-1 LIWORK-1 LRWORK-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.NOT.
IF( ( LSAME( JOBZ, 'n
' ) ) ) THEN
336.NOT..OR.
ELSE IF( ( LOWER LSAME( UPLO, 'u
' ) ) ) THEN
338.LT.
ELSE IF( N0 ) THEN
340.LT.
ELSE IF( KD0 ) THEN
342.LT.
ELSE IF( LDABKD+1 ) THEN
344.LT..OR..AND..LT.
ELSE IF( LDZ1 ( WANTZ LDZN ) ) THEN
353.LT..AND..NOT.
IF( LWORKLWMIN LQUERY ) THEN
355.LT..AND..NOT.
ELSE IF( LRWORKLRWMIN LQUERY ) THEN
357.LT..AND..NOT.
ELSE IF( LIWORKLIWMIN LQUERY ) THEN
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.GT..AND..LT.
IF( ANRMZERO ANRMRMIN ) THEN
397.GT.
ELSE IF( ANRMRMAX ) THEN
401.EQ.
IF( ISCALE1 ) 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
420 CALL ZHETRD_HB2ST( "N", JOBZ, UPLO, N, KD, AB, LDAB, W,
421 $ RWORK( INDE ), WORK( INDHOUS ), LHTRD,
422 $ WORK( INDWK ), LLWORK, IINFO )
426.NOT.
IF( 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.EQ.
IF( ISCALE1 ) THEN
445 CALL DSCAL( IMAX, ONE / SIGMA, W, 1 )
subroutine dsterf(n, d, e, info)
DSTERF
subroutine xerbla(srname, info)
XERBLA
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 zgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
ZGEMM
subroutine dscal(n, da, dx, incx)
DSCAL