356 SUBROUTINE ddrgsx( NSIZE, NCMAX, THRESH, NIN, NOUT, A, LDA, B, AI,
357 $ BI, Z, Q, ALPHAR, ALPHAI, BETA, C, LDC, S,
358 $ WORK, LWORK, IWORK, LIWORK, BWORK, INFO )
365 INTEGER INFO, LDA, LDC, LIWORK, LWORK, NCMAX, NIN,
367 DOUBLE PRECISION THRESH
372 DOUBLE PRECISION A( LDA, * ), AI( LDA, * ), ALPHAI( * ),
373 $ alphar( * ), b( lda, * ), beta( * ),
374 $ bi( lda, * ), c( ldc, * ), q( lda, * ), s( * ),
375 $ work( * ), z( lda, * )
381 DOUBLE PRECISION ZERO, ONE, TEN
382 PARAMETER ( ZERO = 0.0d+0, one = 1.0d+0, ten = 1.0d+1 )
387 INTEGER BDSPAC, I, I1, IFUNC, IINFO, J, LINFO, MAXWRK,
388 $ minwrk, mm, mn2, nerrs, nptknt, ntest, ntestt,
390 DOUBLE PRECISION ABNRM, BIGNUM, DIFTRU, PLTRU, SMLNUM, ,
391 $ TEMP2, THRSH2, ULP, ULPINV, WEIGHT
394 DOUBLE PRECISION DIFEST( 2 ), PL( 2 ), RESULT( 10 )
399 DOUBLE PRECISION DLAMCH, DLANGE
400 EXTERNAL dlctsx, ilaenv, dlamch, dlange
407 INTRINSIC abs,
max, sqrt
411 INTEGER K, M, MPLUSN, N
414 COMMON / mn / m, n, mplusn, k, fs
420 IF( nsize.LT.0 )
THEN
422 ELSE IF( thresh.LT.zero )
THEN
424 ELSE IF( nin.LE.0 )
THEN
426 ELSE IF( nout.LE.0 )
THEN
428 ELSE IF( lda.LT.1 .OR. lda.LT.nsize )
THEN
430 ELSE IF( ldc.LT.1 .OR. ldc.LT.nsize*nsize / 2 )
THEN
432 ELSE IF( liwork.LT.nsize+6 )
THEN
444 IF( info.EQ.0 .AND. lwork.GE.1 )
THEN
445 minwrk =
max( 10*( nsize+1 ), 5*nsize*nsize / 2 )
449 maxwrk = 9*( nsize+1 ) + nsize*
450 $ ilaenv( 1,
'DGEQRF',
' ', nsize, 1, nsize, 0 )
451 maxwrk =
max( maxwrk, 9*( nsize+1 )+nsize*
452 $ ilaenv( 1,
'DORGQR',
' ', nsize, 1, nsize, -1 ) )
456 bdspac = 5*nsize*nsize / 2
457 maxwrk =
max( maxwrk, 3*nsize*nsize / 2+nsize*nsize*
458 $ ilaenv( 1,
'DGEBRD', '
', NSIZE*NSIZE / 2,
459 $ NSIZE*NSIZE / 2, -1, -1 ) )
460 MAXWRK = MAX( MAXWRK, BDSPAC )
462 MAXWRK = MAX( MAXWRK, MINWRK )
467.LT.
IF( LWORKMINWRK )
471 CALL XERBLA( 'ddrgsx', -INFO )
479 SMLNUM = DLAMCH( 's
' ) / ULP
480 BIGNUM = ONE / SMLNUM
481 CALL DLABAD( SMLNUM, BIGNUM )
503 DO 40 M = 1, NSIZE - 1
504 DO 30 N = 1, NSIZE - M
506 WEIGHT = ONE / WEIGHT
514 CALL DLASET( 'full
', MPLUSN, MPLUSN, ZERO, ZERO, AI,
516 CALL DLASET( 'full
', MPLUSN, MPLUSN, ZERO, ZERO, BI,
519 CALL DLATM5( PRTYPE, M, N, AI, LDA, AI( M+1, M+1 ),
520 $ LDA, AI( 1, M+1 ), LDA, BI, LDA,
521 $ BI( M+1, M+1 ), LDA, BI( 1, M+1 ), LDA,
522 $ Q, LDA, Z, LDA, WEIGHT, QBA, QBB )
529.EQ.
IF( IFUNC0 ) THEN
531.EQ.
ELSE IF( IFUNC1 ) THEN
533.EQ.
ELSE IF( IFUNC2 ) THEN
535.EQ.
ELSE IF( IFUNC3 ) THEN
539 CALL DLACPY( 'full
', MPLUSN, MPLUSN, AI, LDA, A, LDA )
540 CALL DLACPY( 'full
', MPLUSN, MPLUSN, BI, LDA, B, LDA )
542 CALL DGGESX( 'v
', 'v
', 's
', DLCTSX, SENSE, MPLUSN, AI,
543 $ LDA, BI, LDA, MM, ALPHAR, ALPHAI, BETA,
544 $ Q, LDA, Z, LDA, PL, DIFEST, WORK, LWORK,
545 $ IWORK, LIWORK, BWORK, LINFO )
547.NE..AND..NE.
IF( LINFO0 LINFOMPLUSN+2 ) THEN
549 WRITE( NOUT, FMT = 9999 )'dggesx', LINFO, MPLUSN,
557 CALL DLACPY( 'full
', MPLUSN, MPLUSN, AI, LDA, WORK,
559 CALL DLACPY( 'full
', MPLUSN, MPLUSN, BI, LDA,
560 $ WORK( MPLUSN*MPLUSN+1 ), MPLUSN )
561 ABNRM = DLANGE( 'fro
', MPLUSN, 2*MPLUSN, WORK, MPLUSN,
566 CALL DGET51( 1, MPLUSN, A, LDA, AI, LDA, Q, LDA, Z,
567 $ LDA, WORK, RESULT( 1 ) )
568 CALL DGET51( 1, MPLUSN, B, LDA, BI, LDA, Q, LDA, Z,
569 $ LDA, WORK, RESULT( 2 ) )
570 CALL DGET51( 3, MPLUSN, B, LDA, BI, LDA, Q, LDA, Q,
571 $ LDA, WORK, RESULT( 3 ) )
572 CALL DGET51( 3, MPLUSN, B, LDA, BI, LDA, Z, LDA, Z,
573 $ LDA, WORK, RESULT( 4 ) )
585.EQ.
IF( ALPHAI( J )ZERO ) THEN
586 TEMP2 = ( ABS( ALPHAR( J )-AI( J, J ) ) /
587 $ MAX( SMLNUM, ABS( ALPHAR( J ) ),
588 $ ABS( AI( J, J ) ) )+
589 $ ABS( BETA( J )-BI( J, J ) ) /
590 $ MAX( SMLNUM, ABS( BETA( J ) ),
591 $ ABS( BI( J, J ) ) ) ) / ULP
592.LT.
IF( JMPLUSN ) THEN
593.NE.
IF( AI( J+1, J )ZERO ) THEN
599.NE.
IF( AI( J, J-1 )ZERO ) THEN
605.GT.
IF( ALPHAI( J )ZERO ) THEN
610.LE..OR..GE.
IF( I10 I1MPLUSN ) THEN
612.LT.
ELSE IF( I1MPLUSN-1 ) THEN
613.NE.
IF( AI( I1+2, I1+1 )ZERO ) THEN
617.GT.
ELSE IF( I11 ) THEN
618.NE.
IF( AI( I1, I1-1 )ZERO ) THEN
623.NOT.
IF( ILABAD ) THEN
624 CALL DGET53( AI( I1, I1 ), LDA, BI( I1, I1 ),
625 $ LDA, BETA( J ), ALPHAR( J ),
626 $ ALPHAI( J ), TEMP2, IINFO )
627.GE.
IF( IINFO3 ) THEN
628 WRITE( NOUT, FMT = 9997 )IINFO, J,
636 TEMP1 = MAX( TEMP1, TEMP2 )
638 WRITE( NOUT, FMT = 9996 )J, MPLUSN, PRTYPE
647.EQ.
IF( LINFOMPLUSN+3 ) THEN
649.NE.
ELSE IF( MMN ) THEN
658 MN2 = MM*( MPLUSN-MM )*2
659.GE..AND..LE.
IF( IFUNC2 MN2NCMAX*NCMAX ) THEN
664 CALL DLAKF2( MM, MPLUSN-MM, AI, LDA,
665 $ AI( MM+1, MM+1 ), BI,
666 $ BI( MM+1, MM+1 ), C, LDC )
668 CALL DGESVD( 'n
', 'n
', MN2, MN2, C, LDC, S, WORK,
669 $ 1, WORK( 2 ), 1, WORK( 3 ), LWORK-2,
673.EQ.
IF( DIFEST( 2 )ZERO ) THEN
674.GT.
IF( DIFTRUABNRM*ULP )
675 $ RESULT( 8 ) = ULPINV
676.EQ.
ELSE IF( DIFTRUZERO ) THEN
677.GT.
IF( DIFEST( 2 )ABNRM*ULP )
678 $ RESULT( 8 ) = ULPINV
679.GT..OR.
ELSE IF( ( DIFTRUTHRSH2*DIFEST( 2 ) )
680.LT.
$ ( DIFTRU*THRSH2DIFEST( 2 ) ) ) THEN
681 RESULT( 8 ) = MAX( DIFTRU / DIFEST( 2 ),
682 $ DIFEST( 2 ) / DIFTRU )
690.EQ.
IF( LINFO( MPLUSN+2 ) ) THEN
691.GT.
IF( DIFTRUABNRM*ULP )
692 $ RESULT( 9 ) = ULPINV
693.GT..AND..NE.
IF( ( IFUNC1 ) ( DIFEST( 2 )ZERO ) )
694 $ RESULT( 9 ) = ULPINV
695.EQ..AND..NE.
IF( ( IFUNC1 ) ( PL( 1 )ZERO ) )
696 $ RESULT( 9 ) = ULPINV
700 NTESTT = NTESTT + NTEST
705.GE.
IF( RESULT( J )THRESH ) THEN
710.EQ.
IF( NERRS0 ) THEN
711 WRITE( NOUT, FMT = 9995 )'dgx
'
715 WRITE( NOUT, FMT = 9993 )
719 WRITE( NOUT, FMT = 9992 )'orthogonal
', '''',
720 $ 'transpose
', ( '''', I = 1, 4 )
724.LT.
IF( RESULT( J )10000.0D0 ) THEN
725 WRITE( NOUT, FMT = 9991 )MPLUSN, PRTYPE,
726 $ WEIGHT, M, J, RESULT( J )
728 WRITE( NOUT, FMT = 9990 )MPLUSN, PRTYPE,
729 $ WEIGHT, M, J, RESULT( J )
749 READ( NIN, FMT = *, END = 140 )MPLUSN
752 READ( NIN, FMT = *, END = 140 )N
754 READ( NIN, FMT = * )( AI( I, J ), J = 1, MPLUSN )
757 READ( NIN, FMT = * )( BI( I, J ), J = 1, MPLUSN )
759 READ( NIN, FMT = * )PLTRU, DIFTRU
766 CALL DLACPY( 'full
', MPLUSN, MPLUSN, AI, LDA, A, LDA )
767 CALL DLACPY( 'full
', MPLUSN, MPLUSN, BI, LDA, B, LDA )
772 CALL DGGESX( 'v
', 'v
', 's
', DLCTSX, 'b
', MPLUSN, AI, LDA, BI, LDA,
773 $ MM, ALPHAR, ALPHAI, BETA, Q, LDA, Z, LDA, PL, DIFEST,
774 $ WORK, LWORK, IWORK, LIWORK, BWORK, LINFO )
776.NE..AND..NE.
IF( LINFO0 LINFOMPLUSN+2 ) THEN
778 WRITE( NOUT, FMT = 9998 )'dggesx', LINFO, MPLUSN, NPTKNT
785 CALL DLACPY( 'full
', MPLUSN, MPLUSN, AI, LDA, WORK, MPLUSN )
786 CALL DLACPY( 'full
', MPLUSN, MPLUSN, BI, LDA,
787 $ WORK( MPLUSN*MPLUSN+1 ), MPLUSN )
788 ABNRM = DLANGE( 'fro
', MPLUSN, 2*MPLUSN, WORK, MPLUSN, WORK )
792 CALL DGET51( 1, MPLUSN, A, LDA, AI, LDA, Q, LDA, Z, LDA, WORK,
794 CALL DGET51( 1, MPLUSN, B, LDA, BI, LDA, Q, LDA, Z, LDA, WORK,
796 CALL DGET51( 3, MPLUSN, B, LDA, BI, LDA, Q, LDA, Q, LDA, WORK,
798 CALL DGET51( 3, MPLUSN, B, LDA, BI, LDA, Z, LDA, Z, LDA, WORK,
811.EQ.
IF( ALPHAI( J )ZERO ) THEN
812 TEMP2 = ( ABS( ALPHAR( J )-AI( J, J ) ) /
813 $ MAX( SMLNUM, ABS( ALPHAR( J ) ), ABS( AI( J,
814 $ J ) ) )+ABS( BETA( J )-BI( J, J ) ) /
815 $ MAX( SMLNUM, ABS( BETA( J ) ), ABS( BI( J, J ) ) ) )
817.LT.
IF( JMPLUSN ) THEN
818.NE.
IF( AI( J+1, J )ZERO ) THEN
824.NE.
IF( AI( J, J-1 )ZERO ) THEN
830.GT.
IF( ALPHAI( J )ZERO ) THEN
835.LE..OR..GE.
IF( I10 I1MPLUSN ) THEN
837.LT.
ELSE IF( I1MPLUSN-1 ) THEN
838.NE.
IF( AI( I1+2, I1+1 )ZERO ) THEN
842.GT.
ELSE IF( I11 ) THEN
843.NE.
IF( AI( I1, I1-1 )ZERO ) THEN
848.NOT.
IF( ILABAD ) THEN
849 CALL DGET53( AI( I1, I1 ), LDA, BI( I1, I1 ), LDA,
850 $ BETA( J ), ALPHAR( J ), ALPHAI( J ), TEMP2,
852.GE.
IF( IINFO3 ) THEN
853 WRITE( NOUT, FMT = 9997 )IINFO, J, MPLUSN, NPTKNT
860 TEMP1 = MAX( TEMP1, TEMP2 )
862 WRITE( NOUT, FMT = 9996 )J, MPLUSN, NPTKNT
871.EQ.
IF( LINFOMPLUSN+3 )
872 $ RESULT( 7 ) = ULPINV
878.EQ.
IF( DIFEST( 2 )ZERO ) THEN
879.GT.
IF( DIFTRUABNRM*ULP )
880 $ RESULT( 8 ) = ULPINV
881.EQ.
ELSE IF( DIFTRUZERO ) THEN
882.GT.
IF( DIFEST( 2 )ABNRM*ULP )
883 $ RESULT( 8 ) = ULPINV
884.GT..OR.
ELSE IF( ( DIFTRUTHRSH2*DIFEST( 2 ) )
885.LT.
$ ( DIFTRU*THRSH2DIFEST( 2 ) ) ) THEN
886 RESULT( 8 ) = MAX( DIFTRU / DIFEST( 2 ), DIFEST( 2 ) / DIFTRU )
893.EQ.
IF( LINFO( MPLUSN+2 ) ) THEN
894.GT.
IF( DIFTRUABNRM*ULP )
895 $ RESULT( 9 ) = ULPINV
896.GT..AND..NE.
IF( ( IFUNC1 ) ( DIFEST( 2 )ZERO ) )
897 $ RESULT( 9 ) = ULPINV
898.EQ..AND..NE.
IF( ( IFUNC1 ) ( PL( 1 )ZERO ) )
899 $ RESULT( 9 ) = ULPINV
906.EQ.
IF( PL( 1 )ZERO ) THEN
907.GT.
IF( PLTRUABNRM*ULP )
908 $ RESULT( 10 ) = ULPINV
909.EQ.
ELSE IF( PLTRUZERO ) THEN
910.GT.
IF( PL( 1 )ABNRM*ULP )
911 $ RESULT( 10 ) = ULPINV
912.GT..OR.
ELSE IF( ( PLTRUTHRESH*PL( 1 ) )
913.LT.
$ ( PLTRU*THRESHPL( 1 ) ) ) THEN
914 RESULT( 10 ) = ULPINV
917 NTESTT = NTESTT + NTEST
922.GE.
IF( RESULT( J )THRESH ) THEN
927.EQ.
IF( NERRS0 ) THEN
928 WRITE( NOUT, FMT = 9995 )'dgx
'
932 WRITE( NOUT, FMT = 9994 )
936 WRITE( NOUT, FMT = 9992 )'orthogonal
', '''',
937 $ 'transpose
', ( '''', I = 1, 4 )
941.LT.
IF( RESULT( J )10000.0D0 ) THEN
942 WRITE( NOUT, FMT = 9989 )NPTKNT, MPLUSN, J, RESULT( J )
944 WRITE( NOUT, FMT = 9988 )NPTKNT, MPLUSN, J, RESULT( J )
958 CALL ALASVM( 'dgx
', NOUT, NERRS, NTESTT, 0 )
964 9999 FORMAT( ' ddrgsx:
', A, ' returned info=
', I6, '.
', / 9X, 'n=
',
965 $ I6, ', jtype=
', I6, ')
' )
967 9998 FORMAT( ' ddrgsx: ', a,
' returned INFO=', i6,
'.', / 9x,
'N=',
968 $ i6,
', Input Example #', i2,
')' )
970 9997
FORMAT(
' DDRGSX: DGET53 returned INFO=', i1,
' for eigenvalue ',
971 $ i6,
'.', / 9x,
'N=', i6,
', JTYPE=', i6,
')' )
973 9996
FORMAT(
' DDRGSX: S not in Schur form at eigenvalue ', i6,
'.',
974 $ / 9x,
'N=', i6,
', JTYPE=', i6,
')' )
976 9995
FORMAT( / 1x, a3,
' -- Real Expert Generalized Schur form',
977 $
' problem driver' )
979 9994
FORMAT(
'Input Example' )
981 9993
FORMAT(
' Matrix types: ', /
982 $
' 1: A is a block diagonal matrix of Jordan blocks ',
983 $
'and B is the identity ', /
' matrix, ',
984 $ /
' 2: A and B are upper triangular matrices, ',
985 $ /
' 3: A and B are as type 2, but each second diagonal ',
986 $
'block in A_11 and ', /
987 $
' each third diaongal block in A_22 are 2x2 blocks,',
988 $ /
' 4: A and B are block diagonal matrices, ',
989 $ /
' 5: (A,B) has potentially close or common ',
990 $
'eigenvalues.', / )
992 9992
FORMAT( /
' Tests performed: (S is Schur, T is triangular, ',
993 $
'Q and Z are ', a,
',', / 19x,
994 $
' a is alpha, b is beta, and ', a,
' means ', a,
'.)',
995 $ /
' 1 = | A - Q S Z', a,
996 $
' | / ( |A| n ulp ) 2 = | B - Q T Z', a,
997 $
' | / ( |B| n ulp )', /
' 3 = | I - QQ', a,
998 $
' | / ( n ulp ) 4 = | I - ZZ', a,
999 $
' | / ( n ulp )', /
' 5 = 1/ULP if A is not in ',
1000 $
'Schur form S', /
' 6 = difference between (alpha,beta)',
1001 $
' and diagonals of (S,T)', /
1002 $
' 7 = 1/ULP if SDIM is not the correct number of ',
1003 $
'selected eigenvalues', /
1004 $
' 8 = 1/ULP if DIFEST/DIFTRU > 10*THRESH or ',
1005 $
'DIFTRU/DIFEST > 10*THRESH',
1006 $ /
' 9 = 1/ULP if DIFEST <> 0 or DIFTRU > ULP*norm(A,B) ',
1007 $
'when reordering fails', /
1008 $
' 10 = 1/ULP if PLEST/PLTRU > THRESH or ',
1009 $
'PLTRU/PLEST > THRESH', /
1010 $
' ( Test 10 is only for input examples )', / )
1011 9991
FORMAT(
' Matrix order=', i2,
', type=', i2,
', a=', d10.3,
1012 $
', order(A_11)=', i2,
', result ', i2,
' is ', 0p, f8.2 )
1013 9990
FORMAT(
' Matrix order=', i2,
', type=', i2,
', a=', d10.3,
1014 $
', order(A_11)=', i2,
', result ', i2,
' is ', 0p, d10.3 )
1015 9989
FORMAT(
' Input example #', i2,
', matrix order=', i4,
',',
1016 $
' result ', i2,
' is', 0p, f8.2 )
1017 9988
FORMAT(
' Input example #', i2,
', matrix order=', i4,
',',
1018 $
' result ', i2,
' is', 1p, d10.3 )
subroutine dlabad(small, large)
DLABAD
subroutine dlacpy(uplo, m, n, a, lda, b, ldb)
DLACPY copies all or part of one two-dimensional array to another.
subroutine dlaset(uplo, m, n, alpha, beta, a, lda)
DLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine xerbla(srname, info)
XERBLA
subroutine alasvm(type, nout, nfail, nrun, nerrs)
ALASVM
subroutine dggesx(jobvsl, jobvsr, sort, selctg, sense, n, a, lda, b, ldb, sdim, alphar, alphai, beta, vsl, ldvsl, vsr, ldvsr, rconde, rcondv, work, lwork, iwork, liwork, bwork, info)
DGGESX computes the eigenvalues, the Schur form, and, optionally, the matrix of Schur vectors for GE ...
subroutine dgesvd(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, work, lwork, info)
DGESVD computes the singular value decomposition (SVD) for GE matrices
subroutine dget51(itype, n, a, lda, b, ldb, u, ldu, v, ldv, work, result)
DGET51
subroutine ddrgsx(nsize, ncmax, thresh, nin, nout, a, lda, b, ai, bi, z, q, alphar, alphai, beta, c, ldc, s, work, lwork, iwork, liwork, bwork, info)
DDRGSX
subroutine dget53(a, lda, b, ldb, scale, wr, wi, result, info)
DGET53
subroutine dlakf2(m, n, a, lda, b, d, e, z, ldz)
DLAKF2
subroutine dlatm5(prtype, m, n, a, lda, b, ldb, c, ldc, d, ldd, e, lde, f, ldf, r, ldr, l, ldl, alpha, qblcka, qblckb)
DLATM5