214 SUBROUTINE sgees( JOBVS, SORT, SELECT, N, A, LDA, SDIM, WR, WI,
215 $ VS, LDVS, WORK, LWORK, BWORK, INFO )
222 CHARACTER JOBVS, SORT
223 INTEGER INFO, LDA, LDVS, LWORK, N, SDIM
227 REAL A( LDA, * ), VS( LDVS, * ), WI( * ), WORK( * ),
239 parameter( zero = 0.0e0, one = 1.0e0 )
242 LOGICAL CURSL, LASTSL, LQUERY, LST2SL, SCALEA, WANTST,
244 INTEGER HSWORK, I, I1, I2, IBAL, ICOND, IERR, IEVAL,
245 $ ihi, ilo, inxt, ip, itau, iwrk, maxwrk, minwrk
246 REAL ANRM, BIGNUM, CSCALE, EPS, S, SEP, SMLNUM
260 EXTERNAL lsame, ilaenv, slamch, slange
270 lquery = ( lwork.EQ.-1 )
271 wantvs = lsame( jobvs,
'V' )
272 wantst = lsame( sort,
'S' )
273 IF( ( .NOT.wantvs ) .AND. ( .NOT.lsame( jobvs,
'N' ) ) )
THEN
275 ELSE IF( ( .NOT.wantst ) .AND. ( .NOT.lsame( sort,
'N' ) ) )
THEN
277 ELSE IF( n.LT.0 )
THEN
279 ELSE IF( lda.LT.
max( 1, n ) )
THEN
281 ELSE IF( ldvs.LT.1 .OR. ( wantvs .AND. ldvs.LT.n ) )
THEN
300 maxwrk = 2*n + n*ilaenv( 1,
'SGEHRD',
' ', n, 1, n, 0 )
303 CALL shseqr(
'S', jobvs, n, 1, n, a, lda, wr, wi, vs, ldvs,
307 IF( .NOT.wantvs )
THEN
308 maxwrk =
max( maxwrk, n + hswork )
310 maxwrk =
max( maxwrk, 2*n + ( n - 1 )*ilaenv( 1,
311 $
'SORGHR',
' ', n, 1, n, -1 ) )
312 maxwrk =
max( maxwrk, n + hswork )
317 IF( lwork.LT.minwrk .AND. .NOT.lquery )
THEN
323 CALL xerbla(
'SGEES ', -info )
325 ELSE IF( lquery )
THEN
339 smlnum = slamch( 's
' )
340 BIGNUM = ONE / SMLNUM
341 CALL SLABAD( SMLNUM, BIGNUM )
342 SMLNUM = SQRT( SMLNUM ) / EPS
343 BIGNUM = ONE / SMLNUM
347 ANRM = SLANGE( 'm
', N, N, A, LDA, DUM )
349.GT..AND..LT.
IF( ANRMZERO ANRMSMLNUM ) THEN
352.GT.
ELSE IF( ANRMBIGNUM ) THEN
357 $ CALL SLASCL( 'g
', 0, 0, ANRM, CSCALE, N, N, A, LDA, IERR )
363 CALL SGEBAL( 'p
', N, A, LDA, ILO, IHI, WORK( IBAL ), IERR )
370 CALL SGEHRD( N, ILO, IHI, A, LDA, WORK( ITAU ), WORK( IWRK ),
371 $ LWORK-IWRK+1, IERR )
377 CALL SLACPY( 'l
', N, N, A, LDA, VS, LDVS )
382 CALL SORGHR( N, ILO, IHI, VS, LDVS, WORK( ITAU ), WORK( IWRK ),
383 $ LWORK-IWRK+1, IERR )
392 CALL SHSEQR( 's
', JOBVS, N, ILO, IHI, A, LDA, WR, WI, VS, LDVS,
393 $ WORK( IWRK ), LWORK-IWRK+1, IEVAL )
399.AND..EQ.
IF( WANTST INFO0 ) THEN
401 CALL SLASCL( 'g
', 0, 0, CSCALE, ANRM, N, 1, WR, N, IERR )
402 CALL SLASCL( 'g
', 0, 0, CSCALE, ANRM, N, 1, WI, N, IERR )
405 BWORK( I ) = SELECT( WR( I ), WI( I ) )
411 CALL STRSEN( 'n
', JOBVS, BWORK, N, A, LDA, VS, LDVS, WR, WI,
412 $ SDIM, S, SEP, WORK( IWRK ), LWORK-IWRK+1, IDUM, 1,
423 CALL SGEBAK( 'p
', 'r
', N, ILO, IHI, WORK( IBAL ), N, VS, LDVS,
431 CALL SLASCL( 'h
', 0, 0, CSCALE, ANRM, N, N, A, LDA, IERR )
432 CALL SCOPY( N, A, LDA+1, WR, 1 )
433.EQ.
IF( CSCALESMLNUM ) THEN
439.GT.
IF( IEVAL0 ) THEN
442 CALL SLASCL( 'g
', 0, 0, CSCALE, ANRM, ILO-1, 1, WI,
443 $ MAX( ILO-1, 1 ), IERR )
444 ELSE IF( WANTST ) THEN
455.EQ.
IF( WI( I )ZERO ) THEN
458.EQ.
IF( A( I+1, I )ZERO ) THEN
461.NE..AND..EQ.
ELSE IF( A( I+1, I )ZERO A( I, I+1 )
466 $ CALL SSWAP( I-1, A( 1, I ), 1, A( 1, I+1 ), 1 )
468 $ CALL SSWAP( N-I-1, A( I, I+2 ), LDA,
469 $ A( I+1, I+2 ), LDA )
471 CALL SSWAP( N, VS( 1, I ), 1, VS( 1, I+1 ), 1 )
473 A( I, I+1 ) = A( I+1, I )
483 CALL SLASCL( 'g
', 0, 0, CSCALE, ANRM, N-IEVAL, 1,
484 $ WI( IEVAL+1 ), MAX( N-IEVAL, 1 ), IERR )
487.AND..EQ.
IF( WANTST INFO0 ) THEN
496 CURSL = SELECT( WR( I ), WI( I ) )
497.EQ.
IF( WI( I )ZERO ) THEN
501.AND..NOT.
IF( CURSL LASTSL )
508.OR.
CURSL = CURSL LASTSL
513.AND..NOT.
IF( CURSL LST2SL )
subroutine slabad(small, large)
SLABAD
subroutine slacpy(uplo, m, n, a, lda, b, ldb)
SLACPY copies all or part of one two-dimensional array to another.
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 xerbla(srname, info)
XERBLA
subroutine sgehrd(n, ilo, ihi, a, lda, tau, work, lwork, info)
SGEHRD
subroutine sgebal(job, n, a, lda, ilo, ihi, scale, info)
SGEBAL
subroutine sgebak(job, side, n, ilo, ihi, scale, m, v, ldv, info)
SGEBAK
subroutine sgees(jobvs, sort, select, n, a, lda, sdim, wr, wi, vs, ldvs, work, lwork, bwork, info)
SGEES computes the eigenvalues, the Schur form, and, optionally, the matrix of Schur vectors for GE m...
subroutine shseqr(job, compz, n, ilo, ihi, h, ldh, wr, wi, z, ldz, work, lwork, info)
SHSEQR
subroutine strsen(job, compq, select, n, t, ldt, q, ldq, wr, wi, m, s, sep, work, lwork, iwork, liwork, info)
STRSEN
subroutine sorghr(n, ilo, ihi, a, lda, tau, work, lwork, info)
SORGHR
subroutine scopy(n, sx, incx, sy, incy)
SCOPY
subroutine sswap(n, sx, incx, sy, incy)
SSWAP