214 SUBROUTINE zggev3( JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHA, BETA,
215 $ VL, LDVL, VR, LDVR, WORK, LWORK, RWORK, INFO )
222 CHARACTER JOBVL, JOBVR
223 INTEGER INFO, , LDB, LDVL, LDVR, LWORK, N
226 DOUBLE PRECISION RWORK( * )
227 COMPLEX*16 A( LDA, * ), ALPHA( * ), B( LDB, * ),
228 $ beta( * ), vl( ldvl, * ), vr( ldvr, * ),
235 DOUBLE PRECISION ZERO, ONE
236 parameter( zero = 0.0d0, one = 1.0d0 )
237 COMPLEX*16 CZERO, CONE
238 parameter( czero = ( 0.0d0, 0.0d0 ),
239 $ cone = ( 1.0d0, 0.0d0 ) )
242 LOGICAL ILASCL, ILBSCL, ILV, ILVL, ILVR, LQUERY
244 INTEGER ICOLS, IERR, IHI, IJOBVL, IJOBVR, ILEFT, ILO,
245 $ in, iright, irows, irwrk, itau, iwrk,
jc, jr,
247 DOUBLE PRECISION ANRM, ANRMTO, BIGNUM, BNRM, BNRMTO, EPS,
261 DOUBLE PRECISION DLAMCH, ZLANGE
262 EXTERNAL lsame, dlamch, zlange
265 INTRINSIC abs, dble, dimag,
max, sqrt
268 DOUBLE PRECISION ABS1
271 abs1( x ) = abs( dble( x ) ) + abs( dimag( x ) )
277 IF( lsame( jobvl,
'N' ) )
THEN
280 ELSE IF( lsame( jobvl,
'V' ) )
THEN
288 IF( lsame( jobvr, 'n
' ) ) THEN
291 ELSE IF( LSAME( JOBVR, 'v
' ) ) THEN
303.EQ.
LQUERY = ( LWORK-1 )
304.LE.
IF( IJOBVL0 ) THEN
306.LE.
ELSE IF( IJOBVR0 ) THEN
308.LT.
ELSE IF( N0 ) THEN
310.LT.
ELSE IF( LDAMAX( 1, N ) ) THEN
312.LT.
ELSE IF( LDBMAX( 1, N ) ) THEN
314.LT..OR..AND..LT.
ELSE IF( LDVL1 ( ILVL LDVLN ) ) THEN
316.LT..OR..AND..LT.
ELSE IF( LDVR1 ( ILVR LDVRN ) ) THEN
318.LT..AND..NOT.
ELSE IF( LWORKMAX( 1, 2*N ) LQUERY ) THEN
325 CALL ZGEQRF( N, N, B, LDB, WORK, WORK, -1, IERR )
326 LWKOPT = MAX( 1, N+INT( WORK( 1 ) ) )
327 CALL ZUNMQR( 'l',
'C', n, n, n, b, ldb, work, a, lda, work,
329 lwkopt =
max( lwkopt, n+int( work( 1 ) ) )
331 CALL zungqr( n, n, n, vl, ldvl, work, work, -1, ierr )
332 lwkopt =
max( lwkopt, n+int( work( 1 ) ) )
335 CALL zgghd3( jobvl, jobvr, n, 1, n, a, lda, b, ldb, vl,
336 $ ldvl, vr, ldvr, work, -1, ierr )
337 lwkopt =
max( lwkopt, n+int( work( 1 ) ) )
339 $ alpha, beta, vl, ldvl, vr, ldvr, work, -1,
341 lwkopt =
max( lwkopt, n+int( work( 1 ) ) )
343 CALL zgghd3( jobvl, jobvr, n, 1, n, a, lda, b, ldb, vl,
344 $ ldvl, vr, ldvr, work, -1, ierr )
345 lwkopt =
max( lwkopt, n+int( work( 1 ) ) )
346 CALL zlaqz0(
'E', jobvl, jobvr, n, 1, n, a, lda, b, ldb,
347 $ alpha, beta, vl, ldvl, vr, ldvr, work, -1,
349 lwkopt =
max( lwkopt, n+int( work( 1 ) ) )
351 work( 1 ) = dcmplx( lwkopt )
355 CALL xerbla(
'ZGGEV3 ', -info )
357 ELSE IF( lquery )
THEN
368 eps = dlamch(
'E' )*dlamch(
'B' )
369 smlnum = dlamch(
'S' )
370 bignum = one / smlnum
371 CALL dlabad( smlnum, bignum )
372 smlnum = sqrt( smlnum ) / eps
373 bignum = one / smlnum
377 anrm = zlange(
'M', n, n, a, lda, rwork )
379 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN
382 ELSE IF( anrm.GT.bignum )
THEN
387 $
CALL zlascl(
'G', 0, 0, anrm, anrmto, n, n, a, lda, ierr )
391 bnrm = zlange(
'M', n, n, b, ldb, rwork )
393 IF( bnrm.GT.zero .AND. bnrm.LT.smlnum )
THEN
396 ELSE IF( bnrm.GT.bignum )
THEN
401 $
CALL zlascl(
'G', 0, 0, bnrm, bnrmto, n, n, b
408 CALL zggbal(
'P', n, a, lda, b, ldb, ilo, ihi, rwork( ileft ),
409 $ rwork( iright ), rwork( irwrk ), ierr )
413 irows = ihi + 1 - ilo
421 CALL zgeqrf( irows, icols, b( ilo, ilo ), ldb, work( itau ),
422 $ work( iwrk ), lwork+1-iwrk, ierr )
426 CALL zunmqr(
'L',
'C', irows, icols, irows, b( ilo, ilo ), ldb,
427 $ work( itau ), a( ilo, ilo ), lda, work( iwrk ),
428 $ lwork+1-iwrk, ierr )
433 CALL zlaset(
'Full', n, n, czero, cone, vl, ldvl )
434 IF( irows.GT.1 )
THEN
435 CALL zlacpy(
'L', irows-1, irows-1, b( ilo+1, ilo ), ldb,
436 $ vl( ilo+1, ilo ), ldvl )
438 CALL zungqr( irows, irows, irows, vl( ilo, ilo ), ldvl,
439 $ work( itau ), work( iwrk ), lwork+1-iwrk, ierr )
445 $
CALL zlaset(
'Full', n, n, czero, cone, vr, ldvr )
453 CALL zgghd3( jobvl, jobvr, n, ilo, ihi, a, lda, b, ldb, vl,
454 $ ldvl, vr, ldvr, work( iwrk ), lwork+1-iwrk, ierr )
456 CALL zgghd3(
'N',
'N', irows, 1, irows
457 $ b( ilo, ilo ), ldb, vl, ldvl, vr, ldvr,
458 $ work( iwrk ), lwork+1-iwrk, ierr )
470 CALL zlaqz0( chtemp, jobvl, jobvr, n, ilo, ihi, a, lda, b, ldb,
471 $ alpha, beta, vl, ldvl, vr, ldvr, work( iwrk ),
472 $ lwork+1-iwrk, rwork( irwrk ), 0, ierr )
474 IF( ierr.GT.0 .AND. ierr.LE.n )
THEN
476 ELSE IF( ierr.GT.n .AND. ierr.LE.2*n )
THEN
497 CALL ztgevc( chtemp,
'B', ldumma, n, a, lda, b, ldb, vl, ldvl,
498 $ vr, ldvr, n, in, work( iwrk ), rwork( irwrk ),
508 CALL zggbak(
'P',
'L', n, ilo, ihi, rwork( ileft ),
509 $ rwork( iright ), n, vl, ldvl, ierr )
513 temp =
max( temp, abs1( vl( jr,
jc ) ) )
519 vl( jr,
jc ) = vl( jr,
jc )*temp
524 CALL zggbak(
'P',
'R', n, ilo, ihi, rwork( ileft ),
525 $ rwork( iright ), n, vr, ldvr, ierr )
529 temp =
max( temp, abs1( vr( jr,
jc ) ) )
535 vr( jr,
jc ) = vr( jr,
jc )*temp
546 $
CALL zlascl(
'G', 0, 0, anrmto, anrm, n, 1, alpha, n, ierr )
549 $
CALL zlascl(
'G', 0, 0, bnrmto, bnrm, n, 1, beta, n, ierr )
551 work( 1 ) = dcmplx( lwkopt )