295 SUBROUTINE zdrgvx( NSIZE, THRESH, NIN, NOUT, A, LDA, B, AI, BI,
296 $ ALPHA, BETA, VL, VR, ILO, IHI, LSCALE, RSCALE,
297 $ S, DTRU, DIF, DIFTRU, WORK, LWORK, RWORK,
298 $ IWORK, LIWORK, RESULT, BWORK, INFO )
306 INTEGER IHI, ILO, INFO, LDA, LIWORK, LWORK, NIN, NOUT,
308 DOUBLE PRECISION THRESH
313 DOUBLE PRECISION DIF( * ), DIFTRU( * ), DTRU( * ), LSCALE( * ),
314 $ result( 4 ), rscale( * ), rwork( * ), s( * )
315 COMPLEX*16 A( lda, * ), AI( lda, * ), ALPHA( * ),
316 $ b( lda, * ), beta( * ), bi( lda, * ),
317 $ vl( lda, * ), vr( lda, * ), work( * )
323 DOUBLE PRECISION ZERO, ONE, TEN, TNTH, HALF
324 parameter( zero = 0.0d+0, one = 1.0d+0, ten = 1.0d+1,
325 $ tnth = 1.0d-1, half = 0.5d+0 )
328 INTEGER I, IPTYPE, IWA, IWB, IWX, IWY, J, LINFO,
329 $ maxwrk, minwrk, n, nerrs, nmax, nptknt, ntestt
330 DOUBLE PRECISION ABNORM, ANORM, BNORM, RATIO1, RATIO2, THRSH2,
334 COMPLEX*16 WEIGHT( 5 )
338 DOUBLE PRECISION DLAMCH, ZLANGE
339 EXTERNAL ilaenv, dlamch, zlange
345 INTRINSIC abs, dcmplx, max, sqrt
355 IF( nsize.LT.0 )
THEN 357 ELSE IF( thresh.LT.zero )
THEN 359 ELSE IF( nin.LE.0 )
THEN 361 ELSE IF( nout.LE.0 )
THEN 363 ELSE IF( lda.LT.1 .OR. lda.LT.nmax )
THEN 365 ELSE IF( liwork.LT.nmax+2 )
THEN 377 IF( info.EQ.0 .AND. lwork.GE.1 )
THEN 378 minwrk = 2*nmax*( nmax+1 )
379 maxwrk = nmax*( 1+ilaenv( 1,
'ZGEQRF',
' ', nmax, 1, nmax,
381 maxwrk = max( maxwrk, 2*nmax*( nmax+1 ) )
385 IF( lwork.LT.minwrk )
389 CALL xerbla(
'ZDRGVX', -info )
406 weight( 1 ) = dcmplx( tnth, zero )
407 weight( 2 ) = dcmplx( half, zero )
409 weight( 4 ) = one / weight( 2 )
410 weight( 5 ) = one / weight( 1 )
420 CALL zlatm6( iptype, 5, a, lda, b, vr, lda, vl,
421 $ lda, weight( iwa ), weight( iwb ),
422 $ weight( iwx ), weight( iwy ), dtru,
429 CALL zlacpy(
'F', n, n, a, lda, ai, lda )
430 CALL zlacpy(
'F', n, n, b, lda, bi, lda )
432 CALL zggevx(
'N',
'V',
'V',
'B', n, ai, lda, bi,
433 $ lda, alpha, beta, vl, lda, vr, lda,
434 $ ilo, ihi, lscale, rscale, anorm,
435 $ bnorm, s, dif, work, lwork, rwork,
436 $ iwork, bwork, linfo )
437 IF( linfo.NE.0 )
THEN 438 WRITE( nout, fmt = 9999 )
'ZGGEVX', linfo, n,
439 $ iptype, iwa, iwb, iwx, iwy
445 CALL zlacpy(
'Full', n, n, ai, lda, work, n )
446 CALL zlacpy(
'Full', n, n, bi, lda, work( n*n+1 ),
448 abnorm = zlange(
'Fro', n, 2*n, work, n, rwork )
453 CALL zget52( .true., n, a, lda, b, lda, vl, lda,
454 $ alpha, beta, work, rwork,
456 IF( result( 2 ).GT.thresh )
THEN 457 WRITE( nout, fmt = 9998 )
'Left',
'ZGGEVX',
458 $ result( 2 ), n, iptype, iwa, iwb, iwx, iwy
462 CALL zget52( .false., n, a, lda, b, lda, vr, lda,
463 $ alpha, beta, work, rwork,
465 IF( result( 3 ).GT.thresh )
THEN 466 WRITE( nout, fmt = 9998 )
'Right',
'ZGGEVX',
467 $ result( 3 ), n, iptype, iwa, iwb, iwx, iwy
474 IF( s( i ).EQ.zero )
THEN 475 IF( dtru( i ).GT.abnorm*ulp )
476 $ result( 3 ) = ulpinv
477 ELSE IF( dtru( i ).EQ.zero )
THEN 478 IF( s( i ).GT.abnorm*ulp )
479 $ result( 3 ) = ulpinv
481 rwork( i ) = max( abs( dtru( i ) / s( i ) ),
482 $ abs( s( i ) / dtru( i ) ) )
483 result( 3 ) = max( result( 3 ), rwork( i ) )
490 IF( dif( 1 ).EQ.zero )
THEN 491 IF( diftru( 1 ).GT.abnorm*ulp )
492 $ result( 4 ) = ulpinv
493 ELSE IF( diftru( 1 ).EQ.zero )
THEN 494 IF( dif( 1 ).GT.abnorm*ulp )
495 $ result( 4 ) = ulpinv
496 ELSE IF( dif( 5 ).EQ.zero )
THEN 497 IF( diftru( 5 ).GT.abnorm*ulp )
498 $ result( 4 ) = ulpinv
499 ELSE IF( diftru( 5 ).EQ.zero )
THEN 500 IF( dif( 5 ).GT.abnorm*ulp )
501 $ result( 4 ) = ulpinv
503 ratio1 = max( abs( diftru( 1 ) / dif( 1 ) ),
504 $ abs( dif( 1 ) / diftru( 1 ) ) )
505 ratio2 = max( abs( diftru( 5 ) / dif( 5 ) ),
506 $ abs( dif( 5 ) / diftru( 5 ) ) )
507 result( 4 ) = max( ratio1, ratio2 )
515 IF( ( result( j ).GE.thrsh2 .AND. j.GE.4 ) .OR.
516 $ ( result( j ).GE.thresh .AND. j.LE.3 ) )
522 IF( nerrs.EQ.0 )
THEN 523 WRITE( nout, fmt = 9997 )
'ZXV' 529 WRITE( nout, fmt = 9995 )
530 WRITE( nout, fmt = 9994 )
531 WRITE( nout, fmt = 9993 )
535 WRITE( nout, fmt = 9992 )
'''',
540 IF( result( j ).LT.10000.0d0 )
THEN 541 WRITE( nout, fmt = 9991 )iptype, iwa,
542 $ iwb, iwx, iwy, j, result( j )
544 WRITE( nout, fmt = 9990 )iptype, iwa,
545 $ iwb, iwx, iwy, j, result( j )
565 READ( nin, fmt = *, end = 150 )n
569 READ( nin, fmt = * )( a( i, j ), j = 1, n )
572 READ( nin, fmt = * )( b( i, j ), j = 1, n )
574 READ( nin, fmt = * )( dtru( i ), i = 1, n )
575 READ( nin, fmt = * )( diftru( i ), i = 1, n )
583 CALL zlacpy(
'F', n, n, a, lda, ai, lda )
584 CALL zlacpy(
'F', n, n, b, lda, bi, lda )
586 CALL zggevx(
'N',
'V',
'V',
'B', n, ai, lda, bi, lda, alpha, beta,
587 $ vl, lda, vr, lda, ilo, ihi, lscale, rscale, anorm,
588 $ bnorm, s, dif, work, lwork, rwork, iwork, bwork,
591 IF( linfo.NE.0 )
THEN 592 WRITE( nout, fmt = 9987 )
'ZGGEVX', linfo, n, nptknt
598 CALL zlacpy(
'Full', n, n, ai, lda, work, n )
599 CALL zlacpy(
'Full', n, n, bi, lda, work( n*n+1 ), n )
600 abnorm = zlange(
'Fro', n, 2*n, work, n, rwork )
605 CALL zget52( .true., n, a, lda, b, lda, vl, lda, alpha, beta,
606 $ work, rwork, result( 1 ) )
607 IF( result( 2 ).GT.thresh )
THEN 608 WRITE( nout, fmt = 9986 )
'Left',
'ZGGEVX', result( 2 ), n,
613 CALL zget52( .false., n, a, lda, b, lda, vr, lda, alpha, beta,
614 $ work, rwork, result( 2 ) )
615 IF( result( 3 ).GT.thresh )
THEN 616 WRITE( nout, fmt = 9986 )
'Right',
'ZGGEVX', result( 3 ), n,
624 IF( s( i ).EQ.zero )
THEN 625 IF( dtru( i ).GT.abnorm*ulp )
626 $ result( 3 ) = ulpinv
627 ELSE IF( dtru( i ).EQ.zero )
THEN 628 IF( s( i ).GT.abnorm*ulp )
629 $ result( 3 ) = ulpinv
631 rwork( i ) = max( abs( dtru( i ) / s( i ) ),
632 $ abs( s( i ) / dtru( i ) ) )
633 result( 3 ) = max( result( 3 ), rwork( i ) )
640 IF( dif( 1 ).EQ.zero )
THEN 641 IF( diftru( 1 ).GT.abnorm*ulp )
642 $ result( 4 ) = ulpinv
643 ELSE IF( diftru( 1 ).EQ.zero )
THEN 644 IF( dif( 1 ).GT.abnorm*ulp )
645 $ result( 4 ) = ulpinv
646 ELSE IF( dif( 5 ).EQ.zero )
THEN 647 IF( diftru( 5 ).GT.abnorm*ulp )
648 $ result( 4 ) = ulpinv
649 ELSE IF( diftru( 5 ).EQ.zero )
THEN 650 IF( dif( 5 ).GT.abnorm*ulp )
651 $ result( 4 ) = ulpinv
653 ratio1 = max( abs( diftru( 1 ) / dif( 1 ) ),
654 $ abs( dif( 1 ) / diftru( 1 ) ) )
655 ratio2 = max( abs( diftru( 5 ) / dif( 5 ) ),
656 $ abs( dif( 5 ) / diftru( 5 ) ) )
657 result( 4 ) = max( ratio1, ratio2 )
665 IF( result( j ).GE.thrsh2 )
THEN 670 IF( nerrs.EQ.0 )
THEN 671 WRITE( nout, fmt = 9997 )
'ZXV' 677 WRITE( nout, fmt = 9996 )
681 WRITE( nout, fmt = 9992 )
'''',
'transpose',
'''' 685 IF( result( j ).LT.10000.0d0 )
THEN 686 WRITE( nout, fmt = 9989 )nptknt, n, j, result( j )
688 WRITE( nout, fmt = 9988 )nptknt, n, j, result( j )
700 CALL alasvm(
'ZXV', nout, nerrs, ntestt, 0 )
706 9999
FORMAT(
' ZDRGVX: ', a,
' returned INFO=', i6,
'.', / 9x,
'N=',
707 $ i6,
', JTYPE=', i6,
')' )
709 9998
FORMAT(
' ZDRGVX: ', a,
' Eigenvectors from ', a,
' incorrectly ',
710 $
'normalized.', /
' Bits of error=', 0p, g10.3,
',', 9x,
711 $
'N=', i6,
', JTYPE=', i6,
', IWA=', i5,
', IWB=', i5,
712 $
', IWX=', i5,
', IWY=', i5 )
714 9997
FORMAT( / 1x, a3,
' -- Complex Expert Eigenvalue/vector',
715 $
' problem driver' )
717 9996
FORMAT(
'Input Example' )
719 9995
FORMAT(
' Matrix types: ', / )
721 9994
FORMAT(
' TYPE 1: Da is diagonal, Db is identity, ',
722 $ /
' A = Y^(-H) Da X^(-1), B = Y^(-H) Db X^(-1) ',
723 $ /
' YH and X are left and right eigenvectors. ', / )
725 9993
FORMAT(
' TYPE 2: Da is quasi-diagonal, Db is identity, ',
726 $ /
' A = Y^(-H) Da X^(-1), B = Y^(-H) Db X^(-1) ',
727 $ /
' YH and X are left and right eigenvectors. ', / )
729 9992
FORMAT( /
' Tests performed: ', / 4x,
730 $
' a is alpha, b is beta, l is a left eigenvector, ', / 4x,
731 $
' r is a right eigenvector and ', a,
' means ', a,
'.',
732 $ /
' 1 = max | ( b A - a B )', a,
' l | / const.',
733 $ /
' 2 = max | ( b A - a B ) r | / const.',
734 $ /
' 3 = max ( Sest/Stru, Stru/Sest ) ',
735 $
' over all eigenvalues', /
736 $
' 4 = max( DIFest/DIFtru, DIFtru/DIFest ) ',
737 $
' over the 1st and 5th eigenvectors', / )
739 9991
FORMAT(
' Type=', i2,
',',
' IWA=', i2,
', IWB=', i2,
', IWX=',
740 $ i2,
', IWY=', i2,
', result ', i2,
' is', 0p, f8.2 )
742 9990
FORMAT(
' Type=', i2,
',',
' IWA=', i2,
', IWB=', i2,
', IWX=',
743 $ i2,
', IWY=', i2,
', result ', i2,
' is', 1p, d10.3 )
745 9989
FORMAT(
' Input example #', i2,
', matrix order=', i4,
',',
746 $
' result ', i2,
' is', 0p, f8.2 )
748 9988
FORMAT(
' Input example #', i2,
', matrix order=', i4,
',',
749 $
' result ', i2,
' is', 1p, d10.3 )
751 9987
FORMAT(
' ZDRGVX: ', a,
' returned INFO=', i6,
'.', / 9x,
'N=',
752 $ i6,
', Input example #', i2,
')' )
754 9986
FORMAT(
' ZDRGVX: ', a,
' Eigenvectors from ', a,
' incorrectly ',
755 $
'normalized.', /
' Bits of error=', 0p, g10.3,
',', 9x,
756 $
'N=', i6,
', Input Example #', i2,
')' )
subroutine alasvm(TYPE, NOUT, NFAIL, NRUN, NERRS)
ALASVM
subroutine zlatm6(TYPE, N, A, LDA, B, X, LDX, Y, LDY, ALPHA, BETA, WX, WY, S, DIF)
ZLATM6
subroutine zdrgvx(NSIZE, THRESH, NIN, NOUT, A, LDA, B, AI, BI, ALPHA, BETA, VL, VR, ILO, IHI, LSCALE, RSCALE, S, DTRU, DIF, DIFTRU, WORK, LWORK, RWORK, IWORK, LIWORK, RESULT, BWORK, INFO)
ZDRGVX
subroutine zlacpy(UPLO, M, N, A, LDA, B, LDB)
ZLACPY copies all or part of one two-dimensional array to another.
subroutine zget52(LEFT, N, A, LDA, B, LDB, E, LDE, ALPHA, BETA, WORK, RWORK, RESULT)
ZGET52
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine zggevx(BALANC, JOBVL, JOBVR, SENSE, N, A, LDA, B, LDB, ALPHA, BETA, VL, LDVL, VR, LDVR, ILO, IHI, LSCALE, RSCALE, ABNRM, BBNRM, RCONDE, RCONDV, WORK, LWORK, RWORK, IWORK, BWORK, INFO)
ZGGEVX computes the eigenvalues and, optionally, the left and/or right eigenvectors for GE matrices ...