|
23 | 23 | * INTEGER ISEED( 4 ), IWORK( * ), NN( * )
|
24 | 24 | * DOUBLE PRECISION A( LDA, * ), EVECTL( LDU, * ),
|
25 | 25 | * $ EVECTR( LDU, * ), EVECTX( LDU, * ),
|
26 |
| -* $ EVECTY( LDU, * ), H( LDA, * ), RESULT( 14 ), |
| 26 | +* $ EVECTY( LDU, * ), H( LDA, * ), RESULT( 16 ), |
27 | 27 | * $ T1( LDA, * ), T2( LDA, * ), TAU( * ),
|
28 | 28 | * $ U( LDU, * ), UU( LDU, * ), UZ( LDU, * ),
|
29 | 29 | * $ WI1( * ), WI2( * ), WI3( * ), WORK( * ),
|
|
49 | 49 | *> T is "quasi-triangular", and the eigenvalue vector W.
|
50 | 50 | *>
|
51 | 51 | *> DTREVC computes the left and right eigenvector matrices
|
52 |
| -*> L and R for T. |
| 52 | +*> L and R for T. L is lower quasi-triangular, and R is |
| 53 | +*> upper quasi-triangular. |
53 | 54 | *>
|
54 | 55 | *> DHSEIN computes the left and right eigenvector matrices
|
55 | 56 | *> Y and X for H, using inverse iteration.
|
56 | 57 | *>
|
| 58 | +*> DTREVC3 computes left and right eigenvector matrices |
| 59 | +*> from a Schur matrix T and backtransforms them with Z |
| 60 | +*> to eigenvector matrices L and R for A. L and R are |
| 61 | +*> GE matrices. |
| 62 | +*> |
57 | 63 | *> When DCHKHS is called, a number of matrix "sizes" ("n's") and a
|
58 | 64 | *> number of matrix "types" are specified. For each size ("n")
|
59 | 65 | *> and each type of matrix, one matrix will be generated and used
|
60 |
| -*> to test the nonsymmetric eigenroutines. For each matrix, 14 |
| 66 | +*> to test the nonsymmetric eigenroutines. For each matrix, 16 |
61 | 67 | *> tests will be performed:
|
62 | 68 | *>
|
63 | 69 | *> (1) | A - U H U**T | / ( |A| n ulp )
|
|
88 | 94 | *>
|
89 | 95 | *> (14) | Y**H A - W**H Y | / ( |A| |Y| ulp )
|
90 | 96 | *>
|
| 97 | +*> (15) | AR - RW | / ( |A| |R| ulp ) |
| 98 | +*> |
| 99 | +*> (16) | LA - WL | / ( |A| |L| ulp ) |
| 100 | +*> |
91 | 101 | *> The "sizes" are specified by an array NN(1:NSIZES); the value of
|
92 | 102 | *> each element NN(j) specifies one size.
|
93 | 103 | *> The "types" are specified by a logical array DOTYPE( 1:NTYPES );
|
|
331 | 341 | *> Workspace.
|
332 | 342 | *> Modified.
|
333 | 343 | *>
|
334 |
| -*> RESULT - DOUBLE PRECISION array, dimension (14) |
| 344 | +*> RESULT - DOUBLE PRECISION array, dimension (16) |
335 | 345 | *> The values computed by the fourteen tests described above.
|
336 | 346 | *> The values are currently limited to 1/ulp, to avoid
|
337 | 347 | *> overflow.
|
@@ -423,7 +433,7 @@ SUBROUTINE DCHKHS( NSIZES, NN, NTYPES, DOTYPE, ISEED, THRESH,
|
423 | 433 | INTEGER ISEED( 4 ), IWORK( * ), NN( * )
|
424 | 434 | DOUBLE PRECISION A( LDA, * ), EVECTL( LDU, * ),
|
425 | 435 | $ EVECTR( LDU, * ), EVECTX( LDU, * ),
|
426 |
| - $ EVECTY( LDU, * ), H( LDA, * ), RESULT( 14 ), |
| 436 | + $ EVECTY( LDU, * ), H( LDA, * ), RESULT( 16 ), |
427 | 437 | $ T1( LDA, * ), T2( LDA, * ), TAU( * ),
|
428 | 438 | $ U( LDU, * ), UU( LDU, * ), UZ( LDU, * ),
|
429 | 439 | $ WI1( * ), WI2( * ), WI3( * ), WORK( * ),
|
@@ -461,7 +471,7 @@ SUBROUTINE DCHKHS( NSIZES, NN, NTYPES, DOTYPE, ISEED, THRESH,
|
461 | 471 | EXTERNAL DCOPY, DGEHRD, DGEMM, DGET10, DGET22, DHSEIN,
|
462 | 472 | $ DHSEQR, DHST01, DLABAD, DLACPY, DLAFTS, DLASET,
|
463 | 473 | $ DLASUM, DLATME, DLATMR, DLATMS, DORGHR, DORMHR,
|
464 |
| - $ DTREVC, XERBLA |
| 474 | + $ DTREVC, DTREVC3, XERBLA |
465 | 475 | * ..
|
466 | 476 | * .. Intrinsic Functions ..
|
467 | 477 | INTRINSIC ABS, DBLE, MAX, MIN, SQRT
|
@@ -561,7 +571,7 @@ SUBROUTINE DCHKHS( NSIZES, NN, NTYPES, DOTYPE, ISEED, THRESH,
|
561 | 571 | *
|
562 | 572 | * Initialize RESULT
|
563 | 573 | *
|
564 |
| - DO 30 J = 1, 14 |
| 574 | + DO 30 J = 1, 16 |
565 | 575 | RESULT( J ) = ZERO
|
566 | 576 | 30 CONTINUE
|
567 | 577 | *
|
@@ -1108,6 +1118,64 @@ SUBROUTINE DCHKHS( NSIZES, NN, NTYPES, DOTYPE, ISEED, THRESH,
|
1108 | 1118 | $ RESULT( 14 ) = DUMMA( 3 )*ANINV
|
1109 | 1119 | END IF
|
1110 | 1120 | *
|
| 1121 | +* Compute Left and Right Eigenvectors of A |
| 1122 | +* |
| 1123 | +* Compute a Right eigenvector matrix: |
| 1124 | +* |
| 1125 | + NTEST = 15 |
| 1126 | + RESULT( 15 ) = ULPINV |
| 1127 | +* |
| 1128 | + CALL DLACPY( ' ', N, N, UZ, LDU, EVECTR, LDU ) |
| 1129 | +* |
| 1130 | + CALL DTREVC3( 'Right', 'Back', SELECT, N, T1, LDA, DUMMA, |
| 1131 | + $ LDU, EVECTR, LDU, N, IN, WORK, NWORK, IINFO ) |
| 1132 | + IF( IINFO.NE.0 ) THEN |
| 1133 | + WRITE( NOUNIT, FMT = 9999 )'DTREVC3(R,B)', IINFO, N, |
| 1134 | + $ JTYPE, IOLDSD |
| 1135 | + INFO = ABS( IINFO ) |
| 1136 | + GO TO 250 |
| 1137 | + END IF |
| 1138 | +* |
| 1139 | +* Test 15: | AR - RW | / ( |A| |R| ulp ) |
| 1140 | +* |
| 1141 | +* (from Schur decomposition) |
| 1142 | +* |
| 1143 | + CALL DGET22( 'N', 'N', 'N', N, A, LDA, EVECTR, LDU, WR1, |
| 1144 | + $ WI1, WORK, DUMMA( 1 ) ) |
| 1145 | + RESULT( 15 ) = DUMMA( 1 ) |
| 1146 | + IF( DUMMA( 2 ).GT.THRESH ) THEN |
| 1147 | + WRITE( NOUNIT, FMT = 9998 )'Right', 'DTREVC3', |
| 1148 | + $ DUMMA( 2 ), N, JTYPE, IOLDSD |
| 1149 | + END IF |
| 1150 | +* |
| 1151 | +* Compute a Left eigenvector matrix: |
| 1152 | +* |
| 1153 | + NTEST = 16 |
| 1154 | + RESULT( 16 ) = ULPINV |
| 1155 | +* |
| 1156 | + CALL DLACPY( ' ', N, N, UZ, LDU, EVECTL, LDU ) |
| 1157 | +* |
| 1158 | + CALL DTREVC3( 'Left', 'Back', SELECT, N, T1, LDA, EVECTL, |
| 1159 | + $ LDU, DUMMA, LDU, N, IN, WORK, NWORK, IINFO ) |
| 1160 | + IF( IINFO.NE.0 ) THEN |
| 1161 | + WRITE( NOUNIT, FMT = 9999 )'DTREVC3(L,B)', IINFO, N, |
| 1162 | + $ JTYPE, IOLDSD |
| 1163 | + INFO = ABS( IINFO ) |
| 1164 | + GO TO 250 |
| 1165 | + END IF |
| 1166 | +* |
| 1167 | +* Test 16: | LA - WL | / ( |A| |L| ulp ) |
| 1168 | +* |
| 1169 | +* (from Schur decomposition) |
| 1170 | +* |
| 1171 | + CALL DGET22( 'Trans', 'N', 'Conj', N, A, LDA, EVECTL, LDU, |
| 1172 | + $ WR1, WI1, WORK, DUMMA( 3 ) ) |
| 1173 | + RESULT( 16 ) = DUMMA( 3 ) |
| 1174 | + IF( DUMMA( 4 ).GT.THRESH ) THEN |
| 1175 | + WRITE( NOUNIT, FMT = 9998 )'Left', 'DTREVC3', DUMMA( 4 ), |
| 1176 | + $ N, JTYPE, IOLDSD |
| 1177 | + END IF |
| 1178 | +* |
1111 | 1179 | * End of Loop -- Check for RESULT(j) > THRESH
|
1112 | 1180 | *
|
1113 | 1181 | 250 CONTINUE
|
|
0 commit comments