236 SUBROUTINE cgeesx( JOBVS, SORT, SELECT, SENSE, N, A, LDA, SDIM, W,
237 $ VS, LDVS, RCONDE, RCONDV, WORK, LWORK, RWORK,
245 CHARACTER JOBVS, SENSE, SORT
246 INTEGER INFO, LDA, LDVS, LWORK, N, SDIM
252 COMPLEX A( LDA, * ), VS(
263 PARAMETER ( ZERO = 0.0e0, one = 1.0e0 )
266 LOGICAL LQUERY, SCALEA, WANTSB, WANTSE, WANTSN, WANTST,
268 INTEGER HSWORK, I, IBAL, ICOND, IERR, IEVAL, IHI, ILO,
269 $ ITAU, IWRK, LWRK, MAXWRK, MINWRK
270 REAL ANRM, BIGNUM, CSCALE, EPS, SMLNUM
283 EXTERNAL lsame, ilaenv, clange, slamch
293 wantvs = lsame( jobvs,
'V' )
294 wantst = lsame( sort,
'S' )
295 wantsn = lsame( sense,
'N' )
296 wantse = lsame( sense,
'E' )
297 wantsv = lsame( sense,
'V' )
298 wantsb = lsame( sense,
'B' )
299 lquery = ( lwork.EQ.-1 )
301 IF( ( .NOT.wantvs ) .AND. ( .NOT.lsame( jobvs,
'N' ) ) )
THEN
303 ELSE IF( ( .NOT.wantst ) .AND. ( .NOT.lsame( sort,
'N' ) ) )
THEN
305 ELSE IF( .NOT.( wantsn .OR. wantse .OR. wantsv .OR. wantsb ) .OR.
306 $ ( .NOT.wantst .AND. .NOT.wantsn ) )
THEN
308 ELSE IF( n.LT.0 )
THEN
310 ELSE IF( lda.LT.
max( 1, n ) )
THEN
312 ELSE IF( ldvs.LT.1 .OR. ( wantvs .AND. ldvs.LT.n ) )
THEN
335 maxwrk = n + n*ilaenv( 1,
'CGEHRD',
' ', n, 1, n, 0 )
338 CALL chseqr(
'S', jobvs, n, 1, n, a, lda, w, vs, ldvs,
340 hswork = real( work( 1 ) )
342 IF( .NOT.wantvs )
THEN
343 maxwrk =
max( maxwrk, hswork )
345 maxwrk =
max( maxwrk, n + ( n - 1 )*ilaenv( 1,
'CUNGHR',
346 $
' ', n, 1, n, -1 ) )
347 maxwrk =
max( maxwrk, hswork )
351 $ lwrk =
max( lwrk, ( n*n )/2 )
355 IF( lwork.LT.minwrk .AND. .NOT.lquery )
THEN
361 CALL xerbla(
'CGEESX', -info )
363 ELSE IF( lquery )
THEN
377 smlnum = slamch(
'S' )
378 bignum = one / smlnum
379 CALL slabad( smlnum, bignum )
380 smlnum = sqrt( smlnum ) / eps
381 bignum = one / smlnum
385 anrm = clange(
'M', n, n, a, lda, dum )
387 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN
390 ELSE IF( anrm.GT.bignum )
THEN
395 $
CALL clascl( 'g
', 0, 0, ANRM, CSCALE, N, N, A, LDA, IERR )
403 CALL CGEBAL( 'p
', N, A, LDA, ILO, IHI, RWORK( IBAL ), IERR )
411 CALL CGEHRD( N, ILO, IHI, A, LDA, WORK( ITAU ), WORK( IWRK ),
412 $ LWORK-IWRK+1, IERR )
418 CALL CLACPY( 'l
', N, N, A, LDA, VS, LDVS )
424 CALL CUNGHR( N, ILO, IHI, VS, LDVS, WORK( ITAU ), WORK( IWRK ),
425 $ LWORK-IWRK+1, IERR )
435 CALL CHSEQR( 's
', JOBVS, N, ILO, IHI, A, LDA, W, VS, LDVS,
436 $ WORK( IWRK ), LWORK-IWRK+1, IEVAL )
442.AND..EQ.
IF( WANTST INFO0 ) THEN
444 $ CALL CLASCL( 'g
', 0, 0, CSCALE, ANRM, N, 1, W, N, IERR )
446 BWORK( I ) = SELECT( W( I ) )
455 CALL CTRSEN( SENSE, JOBVS, BWORK, N, A, LDA, VS, LDVS, W, SDIM,
456 $ RCONDE, RCONDV, WORK( IWRK ), LWORK-IWRK+1,
459 $ MAXWRK = MAX( MAXWRK, 2*SDIM*( N-SDIM ) )
460.EQ.
IF( ICOND-14 ) THEN
474 CALL CGEBAK( 'p
', 'r
', N, ILO, IHI, RWORK( IBAL ), N, VS, LDVS,
482 CALL CLASCL( 'u
', 0, 0, CSCALE, ANRM, N, N, A, LDA, IERR )
483 CALL CCOPY( N, A, LDA+1, W, 1 )
484.OR..AND..EQ.
IF( ( WANTSV WANTSB ) INFO0 ) THEN
486 CALL SLASCL( 'g
', 0, 0, CSCALE, ANRM, 1, 1, DUM, 1, IERR )
subroutine slabad(small, large)
SLABAD
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 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 cgeesx(jobvs, sort, select, sense, n, a, lda, sdim, w, vs, ldvs, rconde, rcondv, work, lwork, rwork, bwork, info)
CGEESX computes the eigenvalues, the Schur form, and, optionally, the matrix of Schur vectors for GE ...
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