278 SUBROUTINE cgegv( JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHA, BETA,
279 $ VL, LDVL, VR, LDVR, WORK, LWORK, RWORK, INFO )
286 CHARACTER JOBVL, JOBVR
287 INTEGER INFO, LDA, LDB, LDVL, LDVR, LWORK, N
291 COMPLEX A( LDA, * ), ALPHA( * ), B( LDB, * ),
292 $ beta( * ), vl( ldvl, * ), vr( ldvr, * ),
300 parameter( zero = 0.0e0, one = 1.0e0 )
302 parameter( czero = ( 0.0e0, 0.0e0 ),
303 $ cone = ( 1.0e0, 0.0e0 ) )
306 LOGICAL ILIMIT, ILV, ILVL, ILVR, LQUERY
308 INTEGER ICOLS, IHI, IINFO, IJOBVL, IJOBVR, ILEFT, ILO,
309 $ in, iright, irows, irwork, itau, iwork, jc, jr,
310 $ lopt, lwkmin, lwkopt, nb, nb1, nb2, nb3
311 REAL ABSAI, ABSAR, ABSB, ANRM, ANRM1, ANRM2, BNRM,
312 $ bnrm1, bnrm2, eps, safmax, safmin, salfai,
313 $ salfar, sbeta, scale, temp
327 EXTERNAL ilaenv, lsame, clange, slamch
330 INTRINSIC abs, aimag, cmplx, int, max, real
336 abs1( x ) = abs( real( x ) ) + abs( aimag( x ) )
342 IF( lsame( jobvl,
'N' ) )
THEN
345 ELSE IF( lsame( jobvl,
'V' ) )
THEN
353 IF( lsame( jobvr,
'N' ) )
THEN
356 ELSE IF( lsame( jobvr,
'V' ) )
THEN
367 lwkmin = max( 2*n, 1 )
370 lquery = ( lwork.EQ.-1 )
372 IF( ijobvl.LE.0 )
THEN
374 ELSE IF( ijobvr.LE.0 )
THEN
376 ELSE IF( n.LT.0 )
THEN
378 ELSE IF( lda.LT.max( 1, n ) )
THEN
380 ELSE IF( ldb.LT.max( 1, n ) )
THEN
382 ELSE IF( ldvl.LT.1 .OR. ( ilvl .AND. ldvl.LT.n ) )
THEN
384 ELSE IF( ldvr.LT.1 .OR. ( ilvr .AND. ldvr.LT.n ) )
THEN
386 ELSE IF( lwork.LT.lwkmin .AND. .NOT.lquery )
THEN
391 nb1 = ilaenv( 1,
'CGEQRF',
' ', n, n, -1, -1 )
392 nb2 = ilaenv( 1,
'CUNMQR',
' ', n, n, n, -1 )
393 nb3 = ilaenv( 1,
'CUNGQR',
' ', n, n, n, -1 )
394 nb = max( nb1, nb2, nb3 )
395 lopt = max( 2*n, n*(nb+1) )
400 CALL xerbla(
'CGEGV ', -info )
402 ELSE IF( lquery )
THEN
413 eps = slamch(
'E' )*slamch(
'B' )
414 safmin = slamch(
'S' )
415 safmin = safmin + safmin
416 safmax = one / safmin
420 anrm = clange(
'M', n, n, a, lda, rwork )
423 IF( anrm.LT.one )
THEN
424 IF( safmax*anrm.LT.one )
THEN
430 IF( anrm.GT.zero )
THEN
431 CALL clascl(
'G', -1, -1, anrm, one, n, n, a, lda, iinfo )
432 IF( iinfo.NE.0 )
THEN
440 bnrm = clange(
'M', n, n, b, ldb, rwork )
443 IF( bnrm.LT.one )
THEN
444 IF( safmax*bnrm.LT.one )
THEN
450 IF( bnrm.GT.zero )
THEN
451 CALL clascl(
'G', -1, -1, bnrm, one, n, n, b, ldb, iinfo )
452 IF( iinfo.NE.0 )
THEN
464 CALL cggbal(
'P', n, a, lda, b, ldb, ilo, ihi, rwork( ileft ),
465 $ rwork( iright ), rwork( irwork ), iinfo )
466 IF( iinfo.NE.0 )
THEN
473 irows = ihi + 1 - ilo
481 CALL cgeqrf( irows, icols, b( ilo, ilo ), ldb, work( itau ),
482 $ work( iwork ), lwork+1-iwork, iinfo )
484 $ lwkopt = max( lwkopt, int( work( iwork ) )+iwork-1 )
485 IF( iinfo.NE.0 )
THEN
490 CALL cunmqr(
'L',
'C', irows, icols, irows, b( ilo, ilo ), ldb,
491 $ work( itau ), a( ilo, ilo ), lda, work( iwork ),
492 $ lwork+1-iwork, iinfo )
494 $ lwkopt = max( lwkopt, int( work( iwork ) )+iwork-1 )
495 IF( iinfo.NE.0 )
THEN
501 CALL claset(
'Full', n, n, czero, cone, vl, ldvl )
502 CALL clacpy(
'L', irows-1, irows-1, b( ilo+1, ilo ), ldb,
503 $ vl( ilo+1, ilo ), ldvl )
504 CALL cungqr( irows, irows, irows, vl( ilo, ilo ), ldvl,
505 $ work( itau ), work( iwork ), lwork+1-iwork,
508 $ lwkopt = max( lwkopt, int( work( iwork ) )+iwork-1 )
509 IF( iinfo.NE.0 )
THEN
516 $
CALL claset(
'Full', n, n, czero, cone, vr, ldvr )
524 CALL cgghrd( jobvl, jobvr, n, ilo, ihi, a, lda, b, ldb, vl,
525 $ ldvl, vr, ldvr, iinfo )
527 CALL cgghrd(
'N',
'N', irows, 1, irows, a( ilo, ilo ), lda,
528 $ b( ilo, ilo ), ldb, vl, ldvl, vr, ldvr, iinfo )
530 IF( iinfo.NE.0 )
THEN
543 CALL chgeqz( chtemp, jobvl, jobvr, n, ilo, ihi, a, lda, b, ldb,
544 $ alpha, beta, vl, ldvl, vr, ldvr, work( iwork ),
545 $ lwork+1-iwork, rwork( irwork ), iinfo )
547 $ lwkopt = max( lwkopt, int( work( iwork ) )+iwork-1 )
548 IF( iinfo.NE.0 )
THEN
549 IF( iinfo.GT.0 .AND. iinfo.LE.n )
THEN
551 ELSE IF( iinfo.GT.n .AND. iinfo.LE.2*n )
THEN
573 CALL ctgevc( chtemp,
'B', ldumma, n, a, lda, b, ldb, vl, ldvl,
574 $ vr, ldvr, n, in, work( iwork ), rwork( irwork ),
576 IF( iinfo.NE.0 )
THEN
584 CALL cggbak(
'P',
'L', n, ilo, ihi, rwork( ileft ),
585 $ rwork( iright ), n, vl, ldvl, iinfo )
586 IF( iinfo.NE.0 )
THEN
593 temp = max( temp, abs1( vl( jr, jc ) ) )
599 vl( jr, jc ) = vl( jr, jc )*temp
604 CALL cggbak(
'P',
'R', n, ilo, ihi, rwork( ileft ),
605 $ rwork( iright ), n, vr, ldvr, iinfo )
606 IF( iinfo.NE.0 )
THEN
613 temp = max( temp, abs1( vr( jr, jc ) ) )
619 vr( jr, jc ) = vr( jr, jc )*temp
637 absar = abs( real( alpha( jc ) ) )
638 absai = abs( aimag( alpha( jc ) ) )
639 absb = abs( real( beta( jc ) ) )
640 salfar = anrm*real( alpha( jc ) )
641 salfai = anrm*aimag( alpha( jc ) )
642 sbeta = bnrm*real( beta( jc ) )
648 IF( abs( salfai ).LT.safmin .AND. absai.GE.
649 $ max( safmin, eps*absar, eps*absb ) )
THEN
651 scale = ( safmin / anrm1 ) / max( safmin, anrm2*absai )
656 IF( abs( salfar ).LT.safmin .AND. absar.GE.
657 $ max( safmin, eps*absai, eps*absb ) )
THEN
659 scale = max( scale, ( safmin / anrm1 ) /
660 $ max( safmin, anrm2*absar ) )
665 IF( abs( sbeta ).LT.safmin .AND. absb.GE.
666 $ max( safmin, eps*absar, eps*absai ) )
THEN
668 scale = max( scale, ( safmin / bnrm1 ) /
669 $ max( safmin, bnrm2*absb ) )
675 temp = ( scale*safmin )*max( abs( salfar ), abs( salfai ),
678 $ scale = scale / temp
686 salfar = ( scale*real( alpha( jc ) ) )*anrm
687 salfai = ( scale*aimag( alpha( jc ) ) )*anrm
688 sbeta = ( scale*beta( jc ) )*bnrm
690 alpha( jc ) = cmplx( salfar, salfai )