195 SUBROUTINE cgees( JOBVS, SORT, SELECT, N, A, LDA, SDIM, W, VS,
196 $ LDVS, WORK, LWORK, RWORK, BWORK, INFO )
204 INTEGER , LDA, LDVS, LWORK
209 COMPLEX A( LDA, * ), VS( LDVS, * ), ( * ), WORK( * )
220 parameter( zero = 0.0e0, one = 1.0e0 )
223 LOGICAL LQUERY, SCALEA, WANTST, WANTVS
224 INTEGER HSWORK, , IBAL, ICOND, IERR, IEVAL, IHI, ILO,
225 $ itau, iwrk, maxwrk, minwrk
226 REAL ANRM, BIGNUM, CSCALE, , S, SEP, SMLNUM
239 EXTERNAL lsame,
ilaenv, clange, slamch
249 lquery = ( lwork.EQ.-1 )
250 wantvs = lsame( jobvs,
'V' )
251 wantst = lsame( sort,
'S' )
252 IF( ( .NOT.wantvs ) .AND. ( .NOT.lsame( jobvs,
'N' ) ) )
THEN
254 ELSE IF( ( .NOT.wantst ) .AND. ( .NOT.lsame( sort,
'N' ) ) )
THEN
256 ELSE IF( n.LT.0 )
THEN
258 ELSE IF( lda.LT.
max( 1, n ) )
THEN
260 ELSE IF( ldvs.LT.1 .OR. ( wantvs .AND. ldvs.LT.n ) )
THEN
280 maxwrk = n + n*
ilaenv( 1,
'CGEHRD',
' ', n, 1, n, 0 )
283 CALL chseqr(
'S', jobvs, n, 1, n, a, lda, w, vs, ldvs,
285 hswork = real( work( 1 ) )
287 IF( .NOT.wantvs )
THEN
288 maxwrk =
max( maxwrk, hswork )
290 maxwrk =
max( maxwrk, n + ( n - 1 )*
ilaenv( 1,
'CUNGHR',
291 $
' ', n, 1, n, -1 ) )
292 maxwrk =
max( maxwrk, hswork )
297 IF( lwork.LT.minwrk .AND. .NOT.lquery )
THEN
303 CALL xerbla(
'CGEES ', -info )
305 ELSE IF( lquery )
THEN
319 smlnum = slamch(
'S' )
320 bignum = one / smlnum
321 CALL slabad( smlnum, bignum )
322 smlnum = sqrt( smlnum ) / eps
323 bignum = one / smlnum
327 anrm = clange( 'm
', N, N, A, LDA, DUM )
329.GT..AND..LT.
IF( ANRMZERO ANRMSMLNUM ) THEN
332.GT.
ELSE IF( ANRMBIGNUM ) THEN
337 $ CALL CLASCL( 'g
', 0, 0, ANRM, CSCALE, N, N, A, LDA, IERR )
344 CALL CGEBAL( 'p
', N, A, LDA, ILO, IHI, RWORK( IBAL ), IERR )
352 CALL CGEHRD( N, ILO, IHI, A, LDA, WORK( ITAU ), WORK( IWRK ),
353 $ LWORK-IWRK+1, IERR )
359 CALL CLACPY( 'l
', N, N, A, LDA, VS, LDVS )
365 CALL CUNGHR( N, ILO, IHI, VS, LDVS, WORK( ITAU ), WORK( IWRK ),
366 $ LWORK-IWRK+1, IERR )
376 CALL CHSEQR( 's
', JOBVS, N, ILO, IHI, A, LDA, W, VS, LDVS,
377 $ WORK( IWRK ), LWORK-IWRK+1, IEVAL )
383.AND..EQ.
IF( WANTST INFO0 ) THEN
385 $ CALL CLASCL( 'g
', 0, 0, CSCALE, ANRM, N, 1, W, N, IERR )
387 BWORK( I ) = SELECT( W( I ) )
394 CALL CTRSEN( 'n
', JOBVS, BWORK, N, A, LDA, VS, LDVS, W, SDIM,
395 $ S, SEP, WORK( IWRK ), LWORK-IWRK+1, ICOND )
404 CALL CGEBAK( 'p
', 'r
', N, ILO, IHI, RWORK( IBAL ), N, VS, LDVS,
412 CALL CLASCL( 'u
', 0, 0, CSCALE, ANRM, N, N, A, LDA, IERR )
413 CALL CCOPY( N, A, LDA+1, W, 1 )
subroutine slabad(small, large)
SLABAD
integer function ilaenv(ispec, name, opts, n1, n2, n3, n4)
ILAENV
subroutine xerbla(srname, info)
XERBLA
subroutine cgebal(job, n, a, lda, ilo, ihi, scale, info)
CGEBAL
subroutine cgehrd(n, ilo, ihi, a, lda, tau, work, lwork, info)
CGEHRD
subroutine cgebak(job, side, n, ilo, ihi, scale, m, v, ldv, info)
CGEBAK
subroutine cgees(jobvs, sort, select, n, a, lda, sdim, w, vs, ldvs, work, lwork, rwork, bwork, info)
CGEES computes the eigenvalues, the Schur form, and, optionally, the matrix of Schur vectors for GE m...
subroutine clascl(type, kl, ku, cfrom, cto, m, n, a, lda, info)
CLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
subroutine clacpy(uplo, m, n, a, lda, b, ldb)
CLACPY copies all or part of one two-dimensional array to another.
subroutine cunghr(n, ilo, ihi, a, lda, tau, work, lwork, info)
CUNGHR
subroutine ctrsen(job, compq, select, n, t, ldt, q, ldq, w, m, s, sep, work, lwork, info)
CTRSEN
subroutine chseqr(job, compz, n, ilo, ihi, h, ldh, w, z, ldz, work, lwork, info)
CHSEQR
subroutine ccopy(n, cx, incx, cy, incy)
CCOPY