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,
305 hswork = int( work( 1 ) )
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 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN 352 ELSE IF( anrm.GT.bignum )
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 IF( wantst .AND. info.EQ.0 )
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 IF( cscale.EQ.smlnum )
THEN 439 IF( ieval.GT.0 )
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 IF( wi( i ).EQ.zero )
THEN 458 IF( a( i+1, i ).EQ.zero )
THEN 461 ELSE IF( a( i+1, i ).NE.zero .AND. a( i, i+1 ).EQ.
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 IF( wantst .AND. info.EQ.0 )
THEN 496 cursl =
SELECT( wr( i ), wi( i ) )
497 IF( wi( i ).EQ.zero )
THEN 501 IF( cursl .AND. .NOT.lastsl )
508 cursl = cursl .OR. lastsl
513 IF( cursl .AND. .NOT.lst2sl )
subroutine sgebak(JOB, SIDE, N, ILO, IHI, SCALE, M, V, LDV, INFO)
SGEBAK
subroutine sgehrd(N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO)
SGEHRD
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine sgebal(JOB, N, A, LDA, ILO, IHI, SCALE, INFO)
SGEBAL
subroutine sorghr(N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO)
SORGHR
subroutine sswap(N, SX, INCX, SY, INCY)
SSWAP
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 slabad(SMALL, LARGE)
SLABAD
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 ...
subroutine scopy(N, SX, INCX, SY, INCY)
SCOPY
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 slacpy(UPLO, M, N, A, LDA, B, LDB)
SLACPY copies all or part of one two-dimensional array to another.