212 SUBROUTINE sgees( JOBVS, SORT, SELECT, N, A, LDA, SDIM, WR, WI,
213 $ VS, LDVS, WORK, LWORK, BWORK, INFO )
220 CHARACTER JOBVS, SORT
221 INTEGER INFO, LDA, LDVS, LWORK, N, SDIM
225 REAL A( LDA, * ), VS( LDVS, * ), WI( * ), WORK( * ),
237 parameter( zero = 0.0e0, one = 1.0e0 )
240 LOGICAL CURSL, LASTSL, LQUERY, LST2SL, SCALEA, WANTST,
242 INTEGER HSWORK, I, I1, I2, IBAL, ICOND, IERR, IEVAL,
243 $ ihi, ilo, inxt, ip, itau, iwrk, maxwrk, minwrk
244 REAL ANRM, BIGNUM, CSCALE, EPS, S, SEP, SMLNUM
258 REAL SLAMCH, SLANGE, SROUNDUP_LWORK
259 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.
276 $ ( .NOT.lsame( sort,
'N' ) ) )
THEN
278 ELSE IF( n.LT.0 )
THEN
280 ELSE IF( lda.LT.max( 1, n ) )
THEN
282 ELSE IF( ldvs.LT.1 .OR. ( wantvs .AND. ldvs.LT.n ) )
THEN
301 maxwrk = 2*n + n*ilaenv( 1,
'SGEHRD',
' ', n, 1, n, 0 )
304 CALL shseqr(
'S', jobvs, n, 1, n, a, lda, wr, wi, vs,
307 hswork = int( work( 1 ) )
309 IF( .NOT.wantvs )
THEN
310 maxwrk = max( maxwrk, n + hswork )
312 maxwrk = max( maxwrk, 2*n + ( n - 1 )*ilaenv( 1,
313 $
'SORGHR',
' ', n, 1, n, -1 ) )
314 maxwrk = max( maxwrk, n + hswork )
317 work( 1 ) = sroundup_lwork(maxwrk)
319 IF( lwork.LT.minwrk .AND. .NOT.lquery )
THEN
325 CALL xerbla(
'SGEES ', -info )
327 ELSE IF( lquery )
THEN
341 smlnum = slamch(
'S' )
342 bignum = one / smlnum
343 smlnum = sqrt( smlnum ) / eps
344 bignum = one / smlnum
348 anrm = slange(
'M', n, n, a, lda, dum )
350 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN
353 ELSE IF( anrm.GT.bignum )
THEN
358 $
CALL slascl(
'G', 0, 0, anrm, cscale, n, n, a, lda, ierr )
364 CALL sgebal(
'P', n, a, lda, ilo, ihi, work( ibal ), ierr )
371 CALL sgehrd( n, ilo, ihi, a, lda, work( itau ), work( iwrk ),
372 $ lwork-iwrk+1, ierr )
378 CALL slacpy(
'L', n, n, a, lda, vs, ldvs )
383 CALL sorghr( n, ilo, ihi, vs, ldvs, work( itau ),
385 $ lwork-iwrk+1, ierr )
394 CALL shseqr(
'S', jobvs, n, ilo, ihi, a, lda, wr, wi, vs, ldvs,
395 $ work( iwrk ), lwork-iwrk+1, ieval )
401 IF( wantst .AND. info.EQ.0 )
THEN
403 CALL slascl(
'G', 0, 0, cscale, anrm, n, 1, wr, n, ierr )
404 CALL slascl(
'G', 0, 0, cscale, anrm, n, 1, wi, n, ierr )
407 bwork( i ) =
SELECT( wr( i ), wi( i ) )
413 CALL strsen(
'N', jobvs, bwork, n, a, lda, vs, ldvs, wr, wi,
414 $ sdim, s, sep, work( iwrk ), lwork-iwrk+1, idum, 1,
425 CALL sgebak(
'P',
'R', n, ilo, ihi, work( ibal ), n, vs,
434 CALL slascl(
'H', 0, 0, cscale, anrm, n, n, a, lda, ierr )
435 CALL scopy( n, a, lda+1, wr, 1 )
436 IF( cscale.EQ.smlnum )
THEN
442 IF( ieval.GT.0 )
THEN
445 CALL slascl(
'G', 0, 0, cscale, anrm, ilo-1, 1, wi,
446 $ max( ilo-1, 1 ), ierr )
447 ELSE IF( wantst )
THEN
458 IF( wi( i ).EQ.zero )
THEN
461 IF( a( i+1, i ).EQ.zero )
THEN
464 ELSE IF( a( i+1, i ).NE.zero .AND. a( i, i+1 ).EQ.
469 $
CALL sswap( i-1, a( 1, i ), 1, a( 1, i+1 ),
472 $
CALL sswap( n-i-1, a( i, i+2 ), lda,
473 $ a( i+1, i+2 ), lda )
475 CALL sswap( n, vs( 1, i ), 1, vs( 1, i+1 ),
478 a( i, i+1 ) = a( i+1, i )
488 CALL slascl(
'G', 0, 0, cscale, anrm, n-ieval, 1,
489 $ wi( ieval+1 ), max( n-ieval, 1 ), ierr )
492 IF( wantst .AND. info.EQ.0 )
THEN
501 cursl =
SELECT( wr( i ), wi( i ) )
502 IF( wi( i ).EQ.zero )
THEN
506 IF( cursl .AND. .NOT.lastsl )
513 cursl = cursl .OR. lastsl
518 IF( cursl .AND. .NOT.lst2sl )
532 work( 1 ) = sroundup_lwork(maxwrk)