226 $ IWORK, LIWORK, INFO )
236 INTEGER INFO, LDA, LIWORK, LWORK, N
240 REAL A( LDA, * ), W( * ), WORK( * )
247 parameter( zero = 0.0e+0, one = 1.0e+0 )
251 LOGICAL LOWER, LQUERY, WANTZ
252 INTEGER IINFO, INDE, INDTAU, INDWK2, INDWRK, ISCALE,
253 $ liwmin, llwork, llwrk2, lwmin,
254 $ lhtrd, lwtrd, kd, ib, indhous
255 REAL ANRM, BIGNUM, EPS, RMAX, RMIN, SAFMIN, SIGMA,
262 EXTERNAL lsame, slamch, slansy, ilaenv2stage
275 wantz = lsame( jobz,
'V' )
276 lower = lsame( uplo,
'L' )
277 lquery = ( lwork.EQ.-1 .OR. liwork.EQ.-1 )
280 IF( .NOT.( lsame( jobz,
'N' ) ) )
THEN
282 ELSE IF( .NOT.( lower .OR. lsame( uplo,
'U' ) ) )
THEN
284 ELSE IF( n.LT.0 )
THEN
286 ELSE IF( lda.LT.max( 1, n ) )
THEN
295 kd = ilaenv2stage( 1,
'SSYTRD_2STAGE', jobz,
297 ib = ilaenv2stage( 2,
'SSYTRD_2STAGE', jobz,
299 lhtrd = ilaenv2stage( 3,
'SSYTRD_2STAGE', jobz,
301 lwtrd = ilaenv2stage( 4,
'SSYTRD_2STAGE', jobz,
305 lwmin = 1 + 6*n + 2*n**2
308 lwmin = 2*n + 1 + lhtrd + lwtrd
314 IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN
316 ELSE IF( liwork.LT.liwmin .AND. .NOT.lquery )
THEN
322 CALL xerbla(
'SSYEVD_2STAGE', -info )
324 ELSE IF( lquery )
THEN
342 safmin = slamch(
'Safe minimum' )
343 eps = slamch(
'Precision' )
344 smlnum = safmin / eps
345 bignum = one / smlnum
346 rmin = sqrt( smlnum )
347 rmax = sqrt( bignum )
351 anrm = slansy(
'M', uplo, n, a, lda, work )
353 IF( anrm.GT.zero .AND. anrm.LT.rmin )
THEN
356 ELSE IF( anrm.GT.rmax )
THEN
361 $
CALL slascl( uplo, 0, 0, one, sigma, n, n, a, lda, info )
368 indwrk = indhous + lhtrd
369 llwork = lwork - indwrk + 1
370 indwk2 = indwrk + n*n
371 llwrk2 = lwork - indwk2 + 1
374 $ work( indtau ), work( indhous ), lhtrd,
375 $ work( indwrk ), llwork, iinfo )
382 IF( .NOT.wantz )
THEN
383 CALL ssterf( n, w, work( inde ), info )
388 CALL sstedc(
'I', n, w, work( inde ), work( indwrk ), n,
389 $ work( indwk2 ), llwrk2, iwork, liwork, info )
390 CALL sormtr(
'L', uplo,
'N', n, n, a, lda, work( indtau ),
391 $ work( indwrk ), n, work( indwk2 ), llwrk2, iinfo )
392 CALL slacpy(
'A', n, n, work( indwrk ), n, a, lda )
398 $
CALL sscal( n, one / sigma, w, 1 )
subroutine slascl(TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO)
SLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
subroutine slacpy(UPLO, M, N, A, LDA, B, LDB)
SLACPY copies all or part of one two-dimensional array to another.
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine sstedc(COMPZ, N, D, E, Z, LDZ, WORK, LWORK, IWORK, LIWORK, INFO)
SSTEDC
subroutine ssterf(N, D, E, INFO)
SSTERF
subroutine sormtr(SIDE, UPLO, TRANS, M, N, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
SORMTR
subroutine ssytrd_2stage(VECT, UPLO, N, A, LDA, D, E, TAU, HOUS2, LHOUS2, WORK, LWORK, INFO)
SSYTRD_2STAGE
subroutine ssyevd_2stage(JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, IWORK, LIWORK, INFO)
SSYEVD_2STAGE computes the eigenvalues and, optionally, the left and/or right eigenvectors for SY mat...
subroutine sscal(N, SA, SX, INCX)
SSCAL