223 SUBROUTINE dggev3( JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHAR,
224 $ ALPHAI, BETA, VL, LDVL, VR, LDVR, WORK, LWORK,
232 CHARACTER JOBVL, JOBVR
233 INTEGER INFO, LDA, LDB, LDVL, LDVR, LWORK, N
236 DOUBLE PRECISION A( LDA, * ), ALPHAI( * ), ALPHAR( * ),
237 $ B( LDB, * ), BETA( * ), VL( LDVL, * ),
238 $ vr( ldvr, * ), work( * )
244 DOUBLE PRECISION ZERO, ONE
245 PARAMETER ( ZERO = 0.0d+0, one = 1.0d+0 )
248 LOGICAL ILASCL, ILBSCL, ILV, ILVL, ILVR, LQUERY
250 INTEGER ICOLS, IERR, IHI, IJOBVL, IJOBVR, ILEFT, ILO,
251 $ in, iright, irows, itau, iwrk, jc, jr, lwkopt,
253 DOUBLE PRECISION ANRM, ANRMTO, BIGNUM, BNRM, BNRMTO, EPS,
267 DOUBLE PRECISION DLAMCH, DLANGE
268 EXTERNAL lsame, dlamch, dlange
271 INTRINSIC abs, max, sqrt
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 lquery = ( lwork.EQ.-1 )
304 lwkmin = max( 1, 8*n )
305 IF( ijobvl.LE.0 )
THEN
307 ELSE IF( ijobvr.LE.0 )
THEN
309 ELSE IF( n.LT.0 )
THEN
311 ELSE IF( lda.LT.max( 1, n ) )
THEN
313 ELSE IF( ldb.LT.max( 1, n ) )
THEN
315 ELSE IF( ldvl.LT.1 .OR. ( ilvl .AND. ldvl.LT.n ) )
THEN
317 ELSE IF( ldvr.LT.1 .OR. ( ilvr .AND. ldvr.LT.n ) )
THEN
319 ELSE IF( lwork.LT.lwkmin .AND. .NOT.lquery )
THEN
326 CALL dgeqrf( n, n, b, ldb, work, work, -1, ierr )
327 lwkopt = max( lwkmin, 3*n+int( work( 1 ) ) )
328 CALL dormqr(
'L',
'T', n, n, n, b, ldb, work, a, lda,
330 lwkopt = max( lwkopt, 3*n+int( work( 1 ) ) )
332 CALL dorgqr( n, n, n, vl, ldvl, work, work, -1, ierr )
333 lwkopt = max( lwkopt, 3*n+int( work( 1 ) ) )
336 CALL dgghd3( jobvl, jobvr, n, 1, n, a, lda, b, ldb, vl,
337 $ ldvl, vr, ldvr, work, -1, ierr )
338 lwkopt = max( lwkopt, 3*n+int( work( 1 ) ) )
339 CALL dlaqz0(
'S', jobvl, jobvr, n, 1, n, a, lda, b, ldb,
340 $ alphar, alphai, beta, vl, ldvl, vr, ldvr,
341 $ work, -1, 0, ierr )
342 lwkopt = max( lwkopt, 2*n+int( work( 1 ) ) )
344 CALL dgghd3(
'N',
'N', n, 1, n, a, lda, b, ldb, vl, ldvl,
345 $ vr, ldvr, work, -1, ierr )
346 lwkopt = max( lwkopt, 3*n+int( work( 1 ) ) )
347 CALL dlaqz0(
'E', jobvl, jobvr, n, 1, n, a, lda, b, ldb,
348 $ alphar, alphai, beta, vl, ldvl, vr, ldvr,
349 $ work, -1, 0, ierr )
350 lwkopt = max( lwkopt, 2*n+int( work( 1 ) ) )
360 CALL xerbla(
'DGGEV3 ', -info )
362 ELSE IF( lquery )
THEN
374 smlnum = dlamch(
'S' )
375 bignum = one / smlnum
376 smlnum = sqrt( smlnum ) / eps
377 bignum = one / smlnum
381 anrm = dlange(
'M', n, n, a, lda, work )
383 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN
386 ELSE IF( anrm.GT.bignum )
THEN
391 $
CALL dlascl(
'G', 0, 0, anrm, anrmto, n, n, a, lda, ierr )
395 bnrm = dlange(
'M', n, n, b, ldb, work )
397 IF( bnrm.GT.zero .AND. bnrm.LT.smlnum )
THEN
400 ELSE IF( bnrm.GT.bignum )
THEN
405 $
CALL dlascl(
'G', 0, 0, bnrm, bnrmto, n, n, b, ldb, ierr )
412 CALL dggbal(
'P', n, a, lda, b, ldb, ilo, ihi, work( ileft ),
413 $ work( iright ), work( iwrk ), ierr )
417 irows = ihi + 1 - ilo
425 CALL dgeqrf( irows, icols, b( ilo, ilo ), ldb, work( itau ),
426 $ work( iwrk ), lwork+1-iwrk, ierr )
430 CALL dormqr(
'L',
'T', irows, icols, irows, b( ilo, ilo ), ldb,
431 $ work( itau ), a( ilo, ilo ), lda, work( iwrk ),
432 $ lwork+1-iwrk, ierr )
437 CALL dlaset(
'Full', n, n, zero, one, vl, ldvl )
438 IF( irows.GT.1 )
THEN
439 CALL dlacpy(
'L', irows-1, irows-1, b( ilo+1, ilo ), ldb,
440 $ vl( ilo+1, ilo ), ldvl )
442 CALL dorgqr( irows, irows, irows, vl( ilo, ilo ), ldvl,
443 $ work( itau ), work( iwrk ), lwork+1-iwrk, ierr )
449 $
CALL dlaset(
'Full', n, n, zero, one, vr, ldvr )
457 CALL dgghd3( jobvl, jobvr, n, ilo, ihi, a, lda, b, ldb, vl,
458 $ ldvl, vr, ldvr, work( iwrk ), lwork+1-iwrk, ierr )
460 CALL dgghd3(
'N',
'N', irows, 1, irows, a( ilo, ilo ), lda,
461 $ b( ilo, ilo ), ldb, vl, ldvl, vr, ldvr,
462 $ work( iwrk ), lwork+1-iwrk, ierr )
474 CALL dlaqz0( chtemp, jobvl, jobvr, n, ilo, ihi, a, lda, b, ldb,
475 $ alphar, alphai, beta, vl, ldvl, vr, ldvr,
476 $ work( iwrk ), lwork+1-iwrk, 0, ierr )
478 IF( ierr.GT.0 .AND. ierr.LE.n )
THEN
480 ELSE IF( ierr.GT.n .AND. ierr.LE.2*n )
THEN
500 CALL dtgevc( chtemp,
'B', ldumma, n, a, lda, b, ldb, vl,
502 $ vr, ldvr, n, in, work( iwrk ), ierr )
511 CALL dggbak(
'P',
'L', n, ilo, ihi, work( ileft ),
512 $ work( iright ), n, vl, ldvl, ierr )
514 IF( alphai( jc ).LT.zero )
517 IF( alphai( jc ).EQ.zero )
THEN
519 temp = max( temp, abs( vl( jr, jc ) ) )
523 temp = max( temp, abs( vl( jr, jc ) )+
524 $ abs( vl( jr, jc+1 ) ) )
530 IF( alphai( jc ).EQ.zero )
THEN
532 vl( jr, jc ) = vl( jr, jc )*temp
536 vl( jr, jc ) = vl( jr, jc )*temp
537 vl( jr, jc+1 ) = vl( jr, jc+1 )*temp
543 CALL dggbak(
'P',
'R', n, ilo, ihi, work( ileft ),
544 $ work( iright ), n, vr, ldvr, ierr )
546 IF( alphai( jc ).LT.zero )
549 IF( alphai( jc ).EQ.zero )
THEN
551 temp = max( temp, abs( vr( jr, jc ) ) )
555 temp = max( temp, abs( vr( jr, jc ) )+
556 $ abs( vr( jr, jc+1 ) ) )
562 IF( alphai( jc ).EQ.zero )
THEN
564 vr( jr, jc ) = vr( jr, jc )*temp
568 vr( jr, jc ) = vr( jr, jc )*temp
569 vr( jr, jc+1 ) = vr( jr, jc+1 )*temp
584 CALL dlascl(
'G', 0, 0, anrmto, anrm, n, 1, alphar, n,
586 CALL dlascl(
'G', 0, 0, anrmto, anrm, n, 1, alphai, n,
591 CALL dlascl(
'G', 0, 0, bnrmto, bnrm, n, 1, beta, n, ierr )