298 $ IL, IU, ABSTOL, M, W, Z, LDZ, WORK,
299 $ LWORK, IWORK, IFAIL, INFO )
308 CHARACTER JOBZ, RANGE,
309 INTEGER IL, INFO, IU, LDA, LDZ, LWORK, M, N
313 INTEGER IFAIL( * ), IWORK( * )
314 REAL A( LDA, * ), W( * ), WORK( * ), Z( LDZ, * )
321PARAMETER ( ZERO = 0.0e+0, one = 1.0e+0 )
324 LOGICAL ALLEIG, INDEIG, LOWER, LQUERY, , VALEIG,
327 INTEGER I, IINFO, IMAX, INDD, INDE, INDEE, INDIBL,
328 $ indisp, indiwo, indtau, indwkn, indwrk, iscale,
329 $ itmp1, j, jj, llwork, llwrkn,
330 $ nsplit, lwmin, lhtrd, lwtrd, kd, ib, indhous
331 REAL ABSTLL, ANRM, BIGNUM, EPS, RMAX, RMIN, ,
332 $ SIGMA, SMLNUM, , VLL, VUU
338 EXTERNAL lsame, slamch, slansy, ilaenv2stage
352 lower = lsame( uplo,
'L' )
353 wantz = lsame( jobz,
'V' )
354 alleig = lsame( range,
'A' )
355 valeig = lsame( range,
'V' )
356 indeig = lsame( range,
'I' )
357 lquery = ( lwork.EQ.-1 )
360 IF( .NOT.( lsame( jobz,
'N' ) ) )
THEN
362 ELSE IF( .NOT.( alleig .OR. valeig .OR. indeig ) )
THEN
364 ELSE IF( .NOT.( lower .OR. lsame( uplo,
'U' ) ) )
THEN
366 ELSE IF( n.LT.0 )
THEN
368 ELSE IF( lda.LT.
max( 1, n ) )
THEN
374 ELSE IF( indeig )
THEN
375 IF( il.LT.1 .OR. il.GT.
max( 1, n ) )
THEN
377 ELSE IF( iu.LT.
min( n, il ) .OR. iu.GT.n )
THEN
383 IF( ldz.LT.1 .OR. ( wantz .AND. ldz.LT.n ) )
THEN
393 kd = ilaenv2stage( 1,
'SSYTRD_2STAGE', jobz,
395 ib = ilaenv2stage( 2,
'SSYTRD_2STAGE', jobz,
397 lhtrd = ilaenv2stage( 3,
'SSYTRD_2STAGE', jobz,
399 lwtrd = ilaenv2stage( 4,
'SSYTRD_2STAGE', jobz,
401 lwmin =
max( 8*n, 3*n + lhtrd + lwtrd )
405 IF( lwork.LT.lwmin .AND. .NOT.lquery )
410 CALL xerbla(
'SSYEVX_2STAGE', -info )
412 ELSE IF( lquery )
THEN
424 IF( alleig .OR. indeig )
THEN
428 IF( vl.LT.a( 1, 1 ) .AND. vu.GE.a( 1, 1 ) )
THEN
440 safmin = slamch(
'Safe minimum' )
441 eps = slamch(
'Precision' )
442 smlnum = safmin / eps
443 bignum = one / smlnum
444 rmin = sqrt( smlnum )
445 rmax =
min( sqrt( bignum ), one / sqrt( sqrt( safmin ) ) )
455 anrm = slansy( 'm
', UPLO, N, A, LDA, WORK )
456.GT..AND..LT.
IF( ANRMZERO ANRMRMIN ) THEN
459.GT.
ELSE IF( ANRMRMAX ) THEN
463.EQ.
IF( ISCALE1 ) THEN
466 CALL SSCAL( N-J+1, SIGMA, A( J, J ), 1 )
470 CALL SSCAL( J, SIGMA, A( 1, J ), 1 )
474 $ ABSTLL = ABSTOL*SIGMA
487 INDWRK = INDHOUS + LHTRD
488 LLWORK = LWORK - INDWRK + 1
490 CALL SSYTRD_2STAGE( JOBZ, UPLO, N, A, LDA, WORK( INDD ),
491 $ WORK( INDE ), WORK( INDTAU ), WORK( INDHOUS ),
492 $ LHTRD, WORK( INDWRK ), LLWORK, IINFO )
500.EQ..AND..EQ.
IF( IL1 IUN ) THEN
504.OR..AND..LE.
IF( ( ALLEIG TEST ) ( ABSTOLZERO ) ) THEN
505 CALL SCOPY( N, WORK( INDD ), 1, W, 1 )
507.NOT.
IF( WANTZ ) THEN
508 CALL SCOPY( N-1, WORK( INDE ), 1, WORK( INDEE ), 1 )
509 CALL SSTERF( N, W, WORK( INDEE ), INFO )
511 CALL SLACPY( 'a
', N, N, A, LDA, Z, LDZ )
512 CALL SORGTR( UPLO, N, Z, LDZ, WORK( INDTAU ),
513 $ WORK( INDWRK ), LLWORK, IINFO )
514 CALL SCOPY( N-1, WORK( INDE ), 1, WORK( INDEE ), 1 )
515 CALL SSTEQR( JOBZ, N, W, WORK( INDEE ), Z, LDZ,
516 $ WORK( INDWRK ), INFO )
540 CALL SSTEBZ( RANGE, ORDER, N, VLL, VUU, IL, IU, ABSTLL,
541 $ WORK( INDD ), WORK( INDE ), M, NSPLIT, W,
542 $ IWORK( INDIBL ), IWORK( INDISP ), WORK( INDWRK ),
543 $ IWORK( INDIWO ), INFO )
546 CALL SSTEIN( N, WORK( INDD ), WORK( INDE ), M, W,
547 $ IWORK( INDIBL ), IWORK( INDISP ), Z, LDZ,
548 $ WORK( INDWRK ), IWORK( INDIWO ), IFAIL, INFO )
554 LLWRKN = LWORK - INDWKN + 1
555 CALL SORMTR( 'l
', UPLO, 'n
', N, M, A, LDA, WORK( INDTAU ), Z,
556 $ LDZ, WORK( INDWKN ), LLWRKN, IINFO )
562.EQ.
IF( ISCALE1 ) THEN
568 CALL SSCAL( IMAX, ONE / SIGMA, W, 1 )
579.LT.
IF( W( JJ )TMP1 ) THEN
586 ITMP1 = IWORK( INDIBL+I-1 )
588 IWORK( INDIBL+I-1 ) = IWORK( INDIBL+J-1 )
590 IWORK( INDIBL+J-1 ) = ITMP1
591 CALL SSWAP( N, Z( 1, I ), 1, Z( 1, J ), 1 )
594 IFAIL( I ) = IFAIL( J )
subroutine slacpy(uplo, m, n, a, lda, b, ldb)
SLACPY copies all or part of one two-dimensional array to another.
subroutine ssteqr(compz, n, d, e, z, ldz, work, info)
SSTEQR
subroutine sstebz(range, order, n, vl, vu, il, iu, abstol, d, e, m, nsplit, w, iblock, isplit, work, iwork, info)
SSTEBZ
subroutine ssterf(n, d, e, info)
SSTERF
subroutine xerbla(srname, info)
XERBLA
subroutine sorgtr(uplo, n, a, lda, tau, work, lwork, info)
SORGTR
subroutine sormtr(side, uplo, trans, m, n, a, lda, tau, c, ldc, work, lwork, info)
SORMTR
subroutine sstein(n, d, e, m, w, iblock, isplit, z, ldz, work, iwork, ifail, info)
SSTEIN
subroutine ssytrd_2stage(vect, uplo, n, a, lda, d, e, tau, hous2, lhous2, work, lwork, info)
SSYTRD_2STAGE
subroutine ssyevx_2stage(jobz, range, uplo, n, a, lda, vl, vu, il, iu, abstol, m, w, z, ldz, work, lwork, iwork, ifail, info)
SSYEVX_2STAGE computes the eigenvalues and, optionally, the left and/or right eigenvectors for SY mat...
subroutine sscal(n, sa, sx, incx)
SSCAL
subroutine scopy(n, sx, incx, sy, incy)
SCOPY
subroutine sswap(n, sx, incx, sy, incy)
SSWAP