214 SUBROUTINE dgees( 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 DOUBLE PRECISION A( LDA, * ), VS( LDVS, * ), WI( * ), WORK( * ),
238 DOUBLE PRECISION ZERO, ONE
239 parameter( zero = 0.0d0, one = 1.0d0 )
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 DOUBLE PRECISION ANRM, BIGNUM, CSCALE, EPS, S, SEP, SMLNUM
250 DOUBLE PRECISION DUM( 1 )
259 DOUBLE PRECISION DLAMCH, DLANGE
260 EXTERNAL lsame, ilaenv, dlamch, dlange
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,
'DGEHRD',
' ', n, 1, n, 0 )
303 CALL dhseqr(
'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 $
'DORGHR', '
', N, 1, N, -1 ) )
312 MAXWRK = MAX( MAXWRK, N + HSWORK )
317.LT..AND..NOT.
IF( LWORKMINWRK LQUERY ) THEN
323 CALL XERBLA( 'dgees ', -INFO )
325 ELSE IF( LQUERY ) THEN
339 SMLNUM = DLAMCH( 's
' )
340 BIGNUM = ONE / SMLNUM
341 CALL DLABAD( SMLNUM, BIGNUM )
342 SMLNUM = SQRT( SMLNUM ) / EPS
343 BIGNUM = ONE / SMLNUM
347 ANRM = DLANGE( 'm
', N, N, A, LDA, DUM )
349.GT..AND..LT.
IF( ANRMZERO ANRMSMLNUM ) THEN
352.GT.
ELSE IF( ANRMBIGNUM ) THEN
357 $ CALL DLASCL( 'g
', 0, 0, ANRM, CSCALE, N, N, A, LDA, IERR )
363 CALL DGEBAL( 'p
', N, A, LDA, ILO, IHI, WORK( IBAL ), IERR )
370 CALL DGEHRD( N, ILO, IHI, A, LDA, WORK( ITAU ), WORK( IWRK ),
371 $ LWORK-IWRK+1, IERR )
377 CALL DLACPY( 'l
', N, N, A, LDA, VS, LDVS )
382 CALL DORGHR( N, ILO, IHI, VS, LDVS, WORK( ITAU ), WORK( IWRK ),
383 $ LWORK-IWRK+1, IERR )
392 CALL DHSEQR( '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 DLASCL( 'g
', 0, 0, CSCALE, ANRM, N, 1, WR, N, IERR )
402 CALL DLASCL( 'g
', 0, 0, CSCALE, ANRM, N, 1, WI, N, IERR )
405 BWORK( I ) = SELECT( WR( I ), WI( I ) )
411 CALL DTRSEN( 'n
', JOBVS, BWORK, N, A, LDA, VS, LDVS, WR, WI,
412 $ SDIM, S, SEP, WORK( IWRK ), LWORK-IWRK+1, IDUM, 1,
423 CALL DGEBAK( 'p
', 'r
', N, ILO, IHI, WORK( IBAL ), N, VS, LDVS,
431 CALL DLASCL( 'h
', 0, 0, CSCALE, ANRM, N, N, A, LDA, IERR )
432 CALL DCOPY( N, A, LDA+1, WR, 1 )
433.EQ.
IF( CSCALESMLNUM ) THEN
439.GT.
IF( IEVAL0 ) THEN
442 CALL DLASCL( '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 DSWAP( I-1, A( 1, I ), 1, A( 1, I+1 ), 1 )
468 $ CALL DSWAP( N-I-1, A( I, I+2 ), LDA,
469 $ A( I+1, I+2 ), LDA )
471 CALL DSWAP( N, VS( 1, I ), 1, VS( 1, I+1 ), 1 )
473 A( I, I+1 ) = A( I+1, I )
483 CALL DLASCL( '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 dlabad(small, large)
DLABAD
subroutine dlacpy(uplo, m, n, a, lda, b, ldb)
DLACPY copies all or part of one two-dimensional array to another.
subroutine dlascl(type, kl, ku, cfrom, cto, m, n, a, lda, info)
DLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
subroutine xerbla(srname, info)
XERBLA
subroutine dgehrd(n, ilo, ihi, a, lda, tau, work, lwork, info)
DGEHRD
subroutine dgebal(job, n, a, lda, ilo, ihi, scale, info)
DGEBAL
subroutine dgebak(job, side, n, ilo, ihi, scale, m, v, ldv, info)
DGEBAK
subroutine dgees(jobvs, sort, select, n, a, lda, sdim, wr, wi, vs, ldvs, work, lwork, bwork, info)
DGEES computes the eigenvalues, the Schur form, and, optionally, the matrix of Schur vectors for GE m...
subroutine dhseqr(job, compz, n, ilo, ihi, h, ldh, wr, wi, z, ldz, work, lwork, info)
DHSEQR
subroutine dtrsen(job, compq, select, n, t, ldt, q, ldq, wr, wi, m, s, sep, work, lwork, iwork, liwork, info)
DTRSEN
subroutine dorghr(n, ilo, ihi, a, lda, tau, work, lwork, info)
DORGHR
subroutine dswap(n, dx, incx, dy, incy)
DSWAP
subroutine dcopy(n, dx, incx, dy, incy)
DCOPY