176 SUBROUTINE cgeev( JOBVL, JOBVR, N, A, LDA, W, VL, LDVL, VR,
178 $ WORK, LWORK, RWORK, INFO )
186 CHARACTER JOBVL, JOBVR
187 INTEGER INFO, LDA, LDVL, LDVR, LWORK, N
191 COMPLEX A( LDA, * ), VL( LDVL, * ), VR( LDVR, * ),
199 PARAMETER ( ZERO = 0.0e0, one = 1.0e0 )
202 LOGICAL LQUERY, SCALEA, WANTVL, WANTVR
204 INTEGER HSWORK, I, IBAL, IERR, IHI, ILO, IRWORK, ITAU,
205 $ iwrk, k, lwork_trevc, maxwrk, minwrk, nout
206 REAL ANRM, BIGNUM, CSCALE, EPS, SCL, SMLNUM
221 INTEGER ISAMAX, ILAENV
222 REAL SLAMCH, SCNRM2, CLANGE,
224 EXTERNAL lsame, isamax, ilaenv,
225 $ slamch, scnrm2, clange,
229 INTRINSIC real, cmplx, conjg, aimag, max, sqrt
236 lquery = ( lwork.EQ.-1 )
237 wantvl = lsame( jobvl,
'V' )
238 wantvr = lsame( jobvr,
'V' )
239 IF( ( .NOT.wantvl ) .AND. ( .NOT.lsame( jobvl,
'N' ) ) )
THEN
241 ELSE IF( ( .NOT.wantvr ) .AND.
242 $ ( .NOT.lsame( jobvr,
'N' ) ) )
THEN
244 ELSE IF( n.LT.0 )
THEN
246 ELSE IF( lda.LT.max( 1, n ) )
THEN
248 ELSE IF( ldvl.LT.1 .OR. ( wantvl .AND. ldvl.LT.n ) )
THEN
250 ELSE IF( ldvr.LT.1 .OR. ( wantvr .AND. ldvr.LT.n ) )
THEN
270 maxwrk = n + n*ilaenv( 1,
'CGEHRD',
' ', n, 1, n, 0 )
273 maxwrk = max( maxwrk, n + ( n - 1 )*ilaenv( 1,
275 $
' ', n, 1, n, -1 ) )
276 CALL ctrevc3(
'L',
'B',
SELECT, n, a, lda,
277 $ vl, ldvl, vr, ldvr,
278 $ n, nout, work, -1, rwork, -1, ierr )
279 lwork_trevc = int( work(1) )
280 maxwrk = max( maxwrk, n + lwork_trevc )
281 CALL chseqr(
'S',
'V', n, 1, n, a, lda, w, vl, ldvl,
283 ELSE IF( wantvr )
THEN
284 maxwrk = max( maxwrk, n + ( n - 1 )*ilaenv( 1,
286 $
' ', n, 1, n, -1 ) )
287 CALL ctrevc3(
'R',
'B',
SELECT, n, a, lda,
288 $ vl, ldvl, vr, ldvr,
289 $ n, nout, work, -1, rwork, -1, ierr )
290 lwork_trevc = int( work(1) )
291 maxwrk = max( maxwrk, n + lwork_trevc )
292 CALL chseqr(
'S',
'V', n, 1, n, a, lda, w, vr, ldvr,
295 CALL chseqr(
'E',
'N', n, 1, n, a, lda, w, vr, ldvr,
298 hswork = int( work(1) )
299 maxwrk = max( maxwrk, hswork, minwrk )
303 IF( lwork.LT.minwrk .AND. .NOT.lquery )
THEN
309 CALL xerbla(
'CGEEV ', -info )
311 ELSE IF( lquery )
THEN
323 smlnum = slamch(
'S' )
324 bignum = one / smlnum
325 smlnum = sqrt( smlnum ) / eps
326 bignum = one / smlnum
330 anrm = clange(
'M', n, n, a, lda, dum )
332 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN
335 ELSE IF( anrm.GT.bignum )
THEN
340 $
CALL clascl(
'G', 0, 0, anrm, cscale, n, n, a, lda, ierr )
347 CALL cgebal(
'B', n, a, lda, ilo, ihi, rwork( ibal ), ierr )
355 CALL cgehrd( n, ilo, ihi, a, lda, work( itau ), work( iwrk ),
356 $ lwork-iwrk+1, ierr )
364 CALL clacpy(
'L', n, n, a, lda, vl, ldvl )
370 CALL cunghr( n, ilo, ihi, vl, ldvl, work( itau ),
372 $ lwork-iwrk+1, ierr )
379 CALL chseqr(
'S',
'V', n, ilo, ihi, a, lda, w, vl, ldvl,
380 $ work( iwrk ), lwork-iwrk+1, info )
388 CALL clacpy(
'F', n, n, vl, ldvl, vr, ldvr )
391 ELSE IF( wantvr )
THEN
397 CALL clacpy(
'L', n, n, a, lda, vr, ldvr )
403 CALL cunghr( n, ilo, ihi, vr, ldvr, work( itau ),
405 $ lwork-iwrk+1, ierr )
412 CALL chseqr(
'S',
'V', n, ilo, ihi, a, lda, w, vr, ldvr,
413 $ work( iwrk ), lwork-iwrk+1, info )
422 CALL chseqr(
'E',
'N', n, ilo, ihi, a, lda, w, vr, ldvr,
423 $ work( iwrk ), lwork-iwrk+1, info )
431 IF( wantvl .OR. wantvr )
THEN
438 CALL ctrevc3( side,
'B',
SELECT, n, a, lda, vl, ldvl, vr,
440 $ n, nout, work( iwrk ), lwork-iwrk+1,
441 $ rwork( irwork ), n, ierr )
450 CALL cgebak(
'B',
'L', n, ilo, ihi, rwork( ibal ), n, vl,
457 scl = one / scnrm2( n, vl( 1, i ), 1 )
458 CALL csscal( n, scl, vl( 1, i ), 1 )
460 rwork( irwork+k-1 ) = real( vl( k, i ) )**2 +
461 $ aimag( vl( k, i ) )**2
463 k = isamax( n, rwork( irwork ), 1 )
464 tmp = conjg( vl( k, i ) ) / sqrt( rwork( irwork+k-1 ) )
465 CALL cscal( n, tmp, vl( 1, i ), 1 )
466 vl( k, i ) = cmplx( real( vl( k, i ) ), zero )
476 CALL cgebak(
'B',
'R', n, ilo, ihi, rwork( ibal ), n, vr,
483 scl = one / scnrm2( n, vr( 1, i ), 1 )
484 CALL csscal( n, scl, vr( 1, i ), 1 )
486 rwork( irwork+k-1 ) = real( vr( k, i ) )**2 +
487 $ aimag( vr( k, i ) )**2
489 k = isamax( n, rwork( irwork ), 1 )
490 tmp = conjg( vr( k, i ) ) / sqrt( rwork( irwork+k-1 ) )
491 CALL cscal( n, tmp, vr( 1, i ), 1 )
492 vr( k, i ) = cmplx( real( vr( k, i ) ), zero )
500 CALL clascl(
'G', 0, 0, cscale, anrm, n-info, 1,
502 $ max( n-info, 1 ), ierr )
504 CALL clascl(
'G', 0, 0, cscale, anrm, ilo-1, 1, w, n,