176 SUBROUTINE zgeev( 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
190 DOUBLE PRECISION RWORK( * )
191 COMPLEX*16 A( LDA, * ), VL( LDVL, * ), VR( LDVR, * ),
198 DOUBLE PRECISION ZERO, ONE
199 PARAMETER ( ZERO = 0.0d0, one = 1.0d0 )
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 DOUBLE PRECISION ANRM, BIGNUM, CSCALE, EPS, SCL, SMLNUM
211 DOUBLE PRECISION DUM( 1 )
220 INTEGER IDAMAX, ILAENV
221 DOUBLE PRECISION DLAMCH, DZNRM2, ZLANGE
222 EXTERNAL lsame, idamax, ilaenv, dlamch, dznrm2,
226 INTRINSIC dble, dcmplx, conjg, aimag, max, sqrt
233 lquery = ( lwork.EQ.-1 )
234 wantvl = lsame( jobvl,
'V' )
235 wantvr = lsame( jobvr,
'V' )
236 IF( ( .NOT.wantvl ) .AND. ( .NOT.lsame( jobvl,
'N' ) ) )
THEN
238 ELSE IF( ( .NOT.wantvr ) .AND.
239 $ ( .NOT.lsame( jobvr,
'N' ) ) )
THEN
241 ELSE IF( n.LT.0 )
THEN
243 ELSE IF( lda.LT.max( 1, n ) )
THEN
245 ELSE IF( ldvl.LT.1 .OR. ( wantvl .AND. ldvl.LT.n ) )
THEN
247 ELSE IF( ldvr.LT.1 .OR. ( wantvr .AND. ldvr.LT.n ) )
THEN
267 maxwrk = n + n*ilaenv( 1,
'ZGEHRD',
' ', n, 1, n, 0 )
270 maxwrk = max( maxwrk, n + ( n - 1 )*ilaenv( 1,
272 $
' ', n, 1, n, -1 ) )
273 CALL ztrevc3(
'L',
'B',
SELECT, n, a, lda,
274 $ vl, ldvl, vr, ldvr,
275 $ n, nout, work, -1, rwork, -1, ierr )
276 lwork_trevc = int( work(1) )
277 maxwrk = max( maxwrk, n + lwork_trevc )
278 CALL zhseqr(
'S',
'V', n, 1, n, a, lda, w, vl, ldvl,
280 ELSE IF( wantvr )
THEN
281 maxwrk = max( maxwrk, n + ( n - 1 )*ilaenv( 1,
283 $
' ', n, 1, n, -1 ) )
284 CALL ztrevc3(
'R',
'B',
SELECT, n, a, lda,
285 $ vl, ldvl, vr, ldvr,
286 $ n, nout, work, -1, rwork, -1, ierr )
287 lwork_trevc = int( work(1) )
288 maxwrk = max( maxwrk, n + lwork_trevc )
289 CALL zhseqr(
'S',
'V', n, 1, n, a, lda, w, vr, ldvr,
292 CALL zhseqr(
'E',
'N', n, 1, n, a, lda, w, vr, ldvr,
295 hswork = int( work(1) )
296 maxwrk = max( maxwrk, hswork, minwrk )
300 IF( lwork.LT.minwrk .AND. .NOT.lquery )
THEN
306 CALL xerbla(
'ZGEEV ', -info )
308 ELSE IF( lquery )
THEN
320 smlnum = dlamch(
'S' )
321 bignum = one / smlnum
322 smlnum = sqrt( smlnum ) / eps
323 bignum = one / smlnum
327 anrm = zlange(
'M', n, n, a, lda, dum )
329 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN
332 ELSE IF( anrm.GT.bignum )
THEN
337 $
CALL zlascl(
'G', 0, 0, anrm, cscale, n, n, a, lda, ierr )
344 CALL zgebal(
'B', n, a, lda, ilo, ihi, rwork( ibal ), ierr )
352 CALL zgehrd( n, ilo, ihi, a, lda, work( itau ), work( iwrk ),
353 $ lwork-iwrk+1, ierr )
361 CALL zlacpy(
'L', n, n, a, lda, vl, ldvl )
367 CALL zunghr( n, ilo, ihi, vl, ldvl, work( itau ),
369 $ lwork-iwrk+1, ierr )
376 CALL zhseqr(
'S',
'V', n, ilo, ihi, a, lda, w, vl, ldvl,
377 $ work( iwrk ), lwork-iwrk+1, info )
385 CALL zlacpy(
'F', n, n, vl, ldvl, vr, ldvr )
388 ELSE IF( wantvr )
THEN
394 CALL zlacpy(
'L', n, n, a, lda, vr, ldvr )
400 CALL zunghr( n, ilo, ihi, vr, ldvr, work( itau ),
402 $ lwork-iwrk+1, ierr )
409 CALL zhseqr(
'S',
'V', n, ilo, ihi, a, lda, w, vr, ldvr,
410 $ work( iwrk ), lwork-iwrk+1, info )
419 CALL zhseqr(
'E',
'N', n, ilo, ihi, a, lda, w, vr, ldvr,
420 $ work( iwrk ), lwork-iwrk+1, info )
428 IF( wantvl .OR. wantvr )
THEN
435 CALL ztrevc3( side,
'B',
SELECT, n, a, lda, vl, ldvl, vr,
437 $ n, nout, work( iwrk ), lwork-iwrk+1,
438 $ rwork( irwork ), n, ierr )
447 CALL zgebak(
'B',
'L', n, ilo, ihi, rwork( ibal ), n, vl,
454 scl = one / dznrm2( n, vl( 1, i ), 1 )
455 CALL zdscal( n, scl, vl( 1, i ), 1 )
457 rwork( irwork+k-1 ) = dble( vl( k, i ) )**2 +
458 $ aimag( vl( k, i ) )**2
460 k = idamax( n, rwork( irwork ), 1 )
461 tmp = conjg( vl( k, i ) ) / sqrt( rwork( irwork+k-1 ) )
462 CALL zscal( n, tmp, vl( 1, i ), 1 )
463 vl( k, i ) = dcmplx( dble( vl( k, i ) ), zero )
473 CALL zgebak(
'B',
'R', n, ilo, ihi, rwork( ibal ), n, vr,
480 scl = one / dznrm2( n, vr( 1, i ), 1 )
481 CALL zdscal( n, scl, vr( 1, i ), 1 )
483 rwork( irwork+k-1 ) = dble( vr( k, i ) )**2 +
484 $ aimag( vr( k, i ) )**2
486 k = idamax( n, rwork( irwork ), 1 )
487 tmp = conjg( vr( k, i ) ) / sqrt( rwork( irwork+k-1 ) )
488 CALL zscal( n, tmp, vr( 1, i ), 1 )
489 vr( k, i ) = dcmplx( dble( vr( k, i ) ), zero )
497 CALL zlascl(
'G', 0, 0, cscale, anrm, n-info, 1,
499 $ max( n-info, 1 ), ierr )
501 CALL zlascl(
'G', 0, 0, cscale, anrm, ilo-1, 1, w, n,