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, DLANSB
268 EXTERNAL lsame, dlamch, dlansb, ilaenv2stage
281 wantz = lsame( jobz,
'V' )
282 lower = lsame( uplo,
'L' )
283 lquery = ( lwork.EQ.-1 .OR. liwork.EQ.-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 IF( .NOT.( lsame( jobz,
'N' ) ) )
THEN
303 ELSE IF( .NOT.( lower .OR. lsame( uplo,
'U' ) ) )
THEN
305 ELSE IF( n.LT.0 )
THEN
307 ELSE IF( kd.LT.0 )
THEN
309 ELSE IF( ldab.LT.kd+1 )
THEN
311 ELSE IF( ldz.LT.1 .OR. ( wantz .AND. ldz.LT.n ) )
THEN
319 IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN
321 ELSE IF( liwork.LT.liwmin .AND. .NOT.lquery )
THEN
327 CALL xerbla(
'DSBEVD_2STAGE', -info )
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 IF( anrm.GT.zero .AND. anrm.LT.rmin )
THEN
361 ELSE IF( anrm.GT.rmax )
THEN
365 IF( iscale.EQ.1 )
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
383 $ work( inde ), work( indhous ), lhtrd,
384 $ work( indwrk ), llwork, iinfo )
388 IF( .NOT.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 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 dlacpy(UPLO, M, N, A, LDA, B, LDB)
DLACPY copies all or part of one two-dimensional array to another.
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine dstedc(COMPZ, N, D, E, Z, LDZ, WORK, LWORK, IWORK, LIWORK, INFO)
DSTEDC
subroutine dsterf(N, D, E, INFO)
DSTERF
subroutine dscal(N, DA, DX, INCX)
DSCAL
subroutine dgemm(TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC)
DGEMM
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 ...