233 $ WORK, LWORK, IWORK, LIWORK, INFO )
243 INTEGER INFO, KD, LDAB, LDZ, LIWORK, LWORK, N
247 DOUBLE PRECISION AB( LDAB, * ), W( * ), WORK( * ), Z( LDZ, * )
253 DOUBLE PRECISION ZERO, ONE
254 parameter( zero = 0.0d+0, one = 1.0d+0 )
257 LOGICAL LOWER, LQUERY, WANTZ
258 INTEGER IINFO, INDE, INDWK2, INDWRK, ISCALE, LIWMIN,
259 $ llwork, lwmin, lhtrd, lwtrd, ib, indhous,
261 DOUBLE PRECISION ANRM, BIGNUM, EPS, RMAX, RMIN, SAFMIN, SIGMA,
267 DOUBLE PRECISION DLAMCH,
268 EXTERNAL lsame, dlamch,
dlansb, ilaenv2stage
281 wantz = lsame( jobz,
'V' )
282 lower = lsame( uplo, 'l
' )
283.EQ..OR..EQ.
LQUERY = ( LWORK-1 LIWORK-1 )
290 IB = ILAENV2STAGE( 2, 'dsytrd_sb2st', JOBZ, N, KD, -1, -1 )
291 LHTRD = ILAENV2STAGE( 3, 'dsytrd_sb2st', JOBZ, N, KD, IB, -1 )
292 LWTRD = ILAENV2STAGE( 4, 'dsytrd_sb2st', JOBZ, N, KD, IB, -1 )
295 LWMIN = 1 + 5*N + 2*N**2
298 LWMIN = MAX( 2*N, N+LHTRD+LWTRD )
301.NOT.
IF( ( LSAME( JOBZ, 'n
' ) ) ) THEN
303.NOT..OR.
ELSE IF( ( LOWER LSAME( UPLO, 'u
' ) ) ) THEN
305.LT.
ELSE IF( N0 ) THEN
307.LT.
ELSE IF( KD0 ) THEN
309.LT.
ELSE IF( LDABKD+1 ) THEN
311.LT..OR..AND..LT.
ELSE IF( LDZ1 ( WANTZ LDZN ) ) THEN
319.LT..AND..NOT.
IF( LWORKLWMIN LQUERY ) THEN
321.LT..AND..NOT.
ELSE IF( LIWORKLIWMIN LQUERY ) THEN
329 ELSE IF( LQUERY ) THEN
347 SAFMIN = DLAMCH( 'safe minimum
' )
348 EPS = DLAMCH( 'precision
' )
349 SMLNUM = SAFMIN / EPS
350 BIGNUM = ONE / SMLNUM
351 RMIN = SQRT( SMLNUM )
352 RMAX = SQRT( BIGNUM )
356 ANRM = DLANSB( 'm
', UPLO, N, KD, AB, LDAB, WORK )
358.GT..AND..LT.
IF( ANRMZERO ANRMRMIN ) THEN
361.GT.
ELSE IF( ANRMRMAX ) THEN
365.EQ.
IF( ISCALE1 ) THEN
367 CALL DLASCL( 'b
', KD, KD, ONE, SIGMA, N, N, AB, LDAB, INFO )
369 CALL DLASCL( 'q
', KD, KD, ONE, SIGMA, N, N, AB, LDAB, INFO )
377 INDWRK = INDHOUS + LHTRD
378 LLWORK = LWORK - INDWRK + 1
379 INDWK2 = INDWRK + N*N
380 LLWRK2 = LWORK - INDWK2 + 1
382 CALL DSYTRD_SB2ST( "N", JOBZ, UPLO, N, KD, AB, LDAB, W,
383 $ WORK( INDE ), WORK( INDHOUS ), LHTRD,
384 $ WORK( INDWRK ), LLWORK, IINFO )
388.NOT.
IF( WANTZ ) THEN
389 CALL DSTERF( N, W, WORK( INDE ), INFO )
391 CALL DSTEDC( 'i
', N, W, WORK( INDE ), WORK( INDWRK ), N,
392 $ WORK( INDWK2 ), LLWRK2, IWORK, LIWORK, INFO )
393 CALL DGEMM( 'n
', 'n
', N, N, N, ONE, Z, LDZ, WORK( INDWRK ), N,
394 $ ZERO, WORK( INDWK2 ), N )
395 CALL DLACPY( 'a
', N, N, WORK( INDWK2 ), N, Z, LDZ )
401 $ CALL DSCAL( N, ONE / SIGMA, W, 1 )
subroutine dsytrd_sb2st(stage1, vect, uplo, n, kd, ab, ldab, d, e, hous, lhous, work, lwork, info)
DSYTRD_SB2ST reduces a real symmetric band matrix A to real symmetric tridiagonal form T
subroutine dlacpy(uplo, m, n, a, lda, b, ldb)
DLACPY copies all or part of one two-dimensional array to another.
subroutine dlascl(type, kl, ku, cfrom, cto, m, n, a, lda, info)
DLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
subroutine dsterf(n, d, e, info)
DSTERF
subroutine dstedc(compz, n, d, e, z, ldz, work, lwork, iwork, liwork, info)
DSTEDC
subroutine xerbla(srname, info)
XERBLA
double precision function dlansb(norm, uplo, n, k, ab, ldab, work)
DLANSB returns the value of the 1-norm, or the Frobenius norm, or the infinity norm,...
subroutine dsbevd_2stage(jobz, uplo, n, kd, ab, ldab, w, z, ldz, work, lwork, iwork, liwork, info)
DSBEVD_2STAGE computes the eigenvalues and, optionally, the left and/or right eigenvectors for OTHER ...
subroutine dscal(n, da, dx, incx)
DSCAL
subroutine dgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
DGEMM