258 $ WORK, LWORK, RWORK, LRWORK, IWORK,
269 INTEGER INFO, KD, LDAB, LDZ, LIWORK, LRWORK, LWORK, N
273 REAL RWORK( * ), W( * )
274 COMPLEX AB( LDAB, * ), WORK( * ), Z( LDZ, * )
281 PARAMETER ( ZERO = 0.0e0, one = 1.0e0 )
283 parameter( czero = ( 0.0e0, 0.0e0 ),
284 $ cone = ( 1.0e0, 0.0e0 ) )
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 REAL ANRM, BIGNUM, EPS, RMAX, RMIN, SAFMIN, SIGMA,
298 EXTERNAL lsame, slamch, clanhb, 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,
'CHETRD_HB2ST', jobz, n, kd, -1, -1 )
322 lhtrd = ilaenv2stage( 3,
'CHETRD_HB2ST', jobz, n, kd, ib, -1 )
323 lwtrd = ilaenv2stage( 4,
'CHETRD_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(
'CHBEVD_2STAGE', -info )
365 ELSE IF( lquery )
THEN
375 w( 1 ) = real( ab( 1, 1 ) )
383 safmin = slamch(
'Safe minimum' )
384 eps = slamch(
'Precision' )
385 smlnum = safmin / eps
386 bignum = one / smlnum
387 rmin = sqrt( smlnum )
388 rmax = sqrt( bignum )
392 anrm = clanhb(
'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 clascl(
'B', kd, kd, one, sigma, n, n, ab, ldab, info )
405 CALL clascl(
'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 ssterf( n, w, rwork( inde ), info )
429 CALL cstedc(
'I', n, w, rwork( inde ), work, n, work( indwk2 ),
430 $ llwk2, rwork( indrwk ), llrwk, iwork, liwork,
432 CALL cgemm(
'N',
'N', n, n, n, cone, z, ldz, work, n, czero,
433 $ work( indwk2 ), n )
434 CALL clacpy(
'A', n, n, work( indwk2 ), n, z, ldz )
439 IF( iscale.EQ.1 )
THEN
445 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 chetrd_hb2st(STAGE1, VECT, UPLO, N, KD, AB, LDAB, D, E, HOUS, LHOUS, WORK, LWORK, INFO)
CHETRD_HB2ST reduces a complex Hermitian band matrix A to real symmetric tridiagonal form T
subroutine cstedc(COMPZ, N, D, E, Z, LDZ, WORK, LWORK, RWORK, LRWORK, IWORK, LIWORK, INFO)
CSTEDC
subroutine chbevd_2stage(JOBZ, UPLO, N, KD, AB, LDAB, W, Z, LDZ, WORK, LWORK, RWORK, LRWORK, IWORK, LIWORK, INFO)
CHBEVD_2STAGE computes the eigenvalues and, optionally, the left and/or right eigenvectors for OTHER ...
subroutine sscal(N, SA, SX, INCX)
SSCAL