You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

cdrgsx.f 33 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954
  1. *> \brief \b CDRGSX
  2. *
  3. * =========== DOCUMENTATION ===========
  4. *
  5. * Online html documentation available at
  6. * http://www.netlib.org/lapack/explore-html/
  7. *
  8. * Definition:
  9. * ===========
  10. *
  11. * SUBROUTINE CDRGSX( NSIZE, NCMAX, THRESH, NIN, NOUT, A, LDA, B,
  12. * AI, BI, Z, Q, ALPHA, BETA, C, LDC, S, WORK,
  13. * LWORK, RWORK, IWORK, LIWORK, BWORK, INFO )
  14. *
  15. * .. Scalar Arguments ..
  16. * INTEGER INFO, LDA, LDC, LIWORK, LWORK, NCMAX, NIN,
  17. * $ NOUT, NSIZE
  18. * REAL THRESH
  19. * ..
  20. * .. Array Arguments ..
  21. * LOGICAL BWORK( * )
  22. * INTEGER IWORK( * )
  23. * REAL RWORK( * ), S( * )
  24. * COMPLEX A( LDA, * ), AI( LDA, * ), ALPHA( * ),
  25. * $ B( LDA, * ), BETA( * ), BI( LDA, * ),
  26. * $ C( LDC, * ), Q( LDA, * ), WORK( * ),
  27. * $ Z( LDA, * )
  28. * ..
  29. *
  30. *
  31. *> \par Purpose:
  32. * =============
  33. *>
  34. *> \verbatim
  35. *>
  36. *> CDRGSX checks the nonsymmetric generalized eigenvalue (Schur form)
  37. *> problem expert driver CGGESX.
  38. *>
  39. *> CGGES factors A and B as Q*S*Z' and Q*T*Z' , where ' means conjugate
  40. *> transpose, S and T are upper triangular (i.e., in generalized Schur
  41. *> form), and Q and Z are unitary. It also computes the generalized
  42. *> eigenvalues (alpha(j),beta(j)), j=1,...,n. Thus,
  43. *> w(j) = alpha(j)/beta(j) is a root of the characteristic equation
  44. *>
  45. *> det( A - w(j) B ) = 0
  46. *>
  47. *> Optionally it also reorders the eigenvalues so that a selected
  48. *> cluster of eigenvalues appears in the leading diagonal block of the
  49. *> Schur forms; computes a reciprocal condition number for the average
  50. *> of the selected eigenvalues; and computes a reciprocal condition
  51. *> number for the right and left deflating subspaces corresponding to
  52. *> the selected eigenvalues.
  53. *>
  54. *> When CDRGSX is called with NSIZE > 0, five (5) types of built-in
  55. *> matrix pairs are used to test the routine CGGESX.
  56. *>
  57. *> When CDRGSX is called with NSIZE = 0, it reads in test matrix data
  58. *> to test CGGESX.
  59. *> (need more details on what kind of read-in data are needed).
  60. *>
  61. *> For each matrix pair, the following tests will be performed and
  62. *> compared with the threshold THRESH except for the tests (7) and (9):
  63. *>
  64. *> (1) | A - Q S Z' | / ( |A| n ulp )
  65. *>
  66. *> (2) | B - Q T Z' | / ( |B| n ulp )
  67. *>
  68. *> (3) | I - QQ' | / ( n ulp )
  69. *>
  70. *> (4) | I - ZZ' | / ( n ulp )
  71. *>
  72. *> (5) if A is in Schur form (i.e. triangular form)
  73. *>
  74. *> (6) maximum over j of D(j) where:
  75. *>
  76. *> |alpha(j) - S(j,j)| |beta(j) - T(j,j)|
  77. *> D(j) = ------------------------ + -----------------------
  78. *> max(|alpha(j)|,|S(j,j)|) max(|beta(j)|,|T(j,j)|)
  79. *>
  80. *> (7) if sorting worked and SDIM is the number of eigenvalues
  81. *> which were selected.
  82. *>
  83. *> (8) the estimated value DIF does not differ from the true values of
  84. *> Difu and Difl more than a factor 10*THRESH. If the estimate DIF
  85. *> equals zero the corresponding true values of Difu and Difl
  86. *> should be less than EPS*norm(A, B). If the true value of Difu
  87. *> and Difl equal zero, the estimate DIF should be less than
  88. *> EPS*norm(A, B).
  89. *>
  90. *> (9) If INFO = N+3 is returned by CGGESX, the reordering "failed"
  91. *> and we check that DIF = PL = PR = 0 and that the true value of
  92. *> Difu and Difl is < EPS*norm(A, B). We count the events when
  93. *> INFO=N+3.
  94. *>
  95. *> For read-in test matrices, the same tests are run except that the
  96. *> exact value for DIF (and PL) is input data. Additionally, there is
  97. *> one more test run for read-in test matrices:
  98. *>
  99. *> (10) the estimated value PL does not differ from the true value of
  100. *> PLTRU more than a factor THRESH. If the estimate PL equals
  101. *> zero the corresponding true value of PLTRU should be less than
  102. *> EPS*norm(A, B). If the true value of PLTRU equal zero, the
  103. *> estimate PL should be less than EPS*norm(A, B).
  104. *>
  105. *> Note that for the built-in tests, a total of 10*NSIZE*(NSIZE-1)
  106. *> matrix pairs are generated and tested. NSIZE should be kept small.
  107. *>
  108. *> SVD (routine CGESVD) is used for computing the true value of DIF_u
  109. *> and DIF_l when testing the built-in test problems.
  110. *>
  111. *> Built-in Test Matrices
  112. *> ======================
  113. *>
  114. *> All built-in test matrices are the 2 by 2 block of triangular
  115. *> matrices
  116. *>
  117. *> A = [ A11 A12 ] and B = [ B11 B12 ]
  118. *> [ A22 ] [ B22 ]
  119. *>
  120. *> where for different type of A11 and A22 are given as the following.
  121. *> A12 and B12 are chosen so that the generalized Sylvester equation
  122. *>
  123. *> A11*R - L*A22 = -A12
  124. *> B11*R - L*B22 = -B12
  125. *>
  126. *> have prescribed solution R and L.
  127. *>
  128. *> Type 1: A11 = J_m(1,-1) and A_22 = J_k(1-a,1).
  129. *> B11 = I_m, B22 = I_k
  130. *> where J_k(a,b) is the k-by-k Jordan block with ``a'' on
  131. *> diagonal and ``b'' on superdiagonal.
  132. *>
  133. *> Type 2: A11 = (a_ij) = ( 2(.5-sin(i)) ) and
  134. *> B11 = (b_ij) = ( 2(.5-sin(ij)) ) for i=1,...,m, j=i,...,m
  135. *> A22 = (a_ij) = ( 2(.5-sin(i+j)) ) and
  136. *> B22 = (b_ij) = ( 2(.5-sin(ij)) ) for i=m+1,...,k, j=i,...,k
  137. *>
  138. *> Type 3: A11, A22 and B11, B22 are chosen as for Type 2, but each
  139. *> second diagonal block in A_11 and each third diagonal block
  140. *> in A_22 are made as 2 by 2 blocks.
  141. *>
  142. *> Type 4: A11 = ( 20(.5 - sin(ij)) ) and B22 = ( 2(.5 - sin(i+j)) )
  143. *> for i=1,...,m, j=1,...,m and
  144. *> A22 = ( 20(.5 - sin(i+j)) ) and B22 = ( 2(.5 - sin(ij)) )
  145. *> for i=m+1,...,k, j=m+1,...,k
  146. *>
  147. *> Type 5: (A,B) and have potentially close or common eigenvalues and
  148. *> very large departure from block diagonality A_11 is chosen
  149. *> as the m x m leading submatrix of A_1:
  150. *> | 1 b |
  151. *> | -b 1 |
  152. *> | 1+d b |
  153. *> | -b 1+d |
  154. *> A_1 = | d 1 |
  155. *> | -1 d |
  156. *> | -d 1 |
  157. *> | -1 -d |
  158. *> | 1 |
  159. *> and A_22 is chosen as the k x k leading submatrix of A_2:
  160. *> | -1 b |
  161. *> | -b -1 |
  162. *> | 1-d b |
  163. *> | -b 1-d |
  164. *> A_2 = | d 1+b |
  165. *> | -1-b d |
  166. *> | -d 1+b |
  167. *> | -1+b -d |
  168. *> | 1-d |
  169. *> and matrix B are chosen as identity matrices (see SLATM5).
  170. *>
  171. *> \endverbatim
  172. *
  173. * Arguments:
  174. * ==========
  175. *
  176. *> \param[in] NSIZE
  177. *> \verbatim
  178. *> NSIZE is INTEGER
  179. *> The maximum size of the matrices to use. NSIZE >= 0.
  180. *> If NSIZE = 0, no built-in tests matrices are used, but
  181. *> read-in test matrices are used to test SGGESX.
  182. *> \endverbatim
  183. *>
  184. *> \param[in] NCMAX
  185. *> \verbatim
  186. *> NCMAX is INTEGER
  187. *> Maximum allowable NMAX for generating Kroneker matrix
  188. *> in call to CLAKF2
  189. *> \endverbatim
  190. *>
  191. *> \param[in] THRESH
  192. *> \verbatim
  193. *> THRESH is REAL
  194. *> A test will count as "failed" if the "error", computed as
  195. *> described above, exceeds THRESH. Note that the error
  196. *> is scaled to be O(1), so THRESH should be a reasonably
  197. *> small multiple of 1, e.g., 10 or 100. In particular,
  198. *> it should not depend on the precision (single vs. double)
  199. *> or the size of the matrix. THRESH >= 0.
  200. *> \endverbatim
  201. *>
  202. *> \param[in] NIN
  203. *> \verbatim
  204. *> NIN is INTEGER
  205. *> The FORTRAN unit number for reading in the data file of
  206. *> problems to solve.
  207. *> \endverbatim
  208. *>
  209. *> \param[in] NOUT
  210. *> \verbatim
  211. *> NOUT is INTEGER
  212. *> The FORTRAN unit number for printing out error messages
  213. *> (e.g., if a routine returns INFO not equal to 0.)
  214. *> \endverbatim
  215. *>
  216. *> \param[out] A
  217. *> \verbatim
  218. *> A is COMPLEX array, dimension (LDA, NSIZE)
  219. *> Used to store the matrix whose eigenvalues are to be
  220. *> computed. On exit, A contains the last matrix actually used.
  221. *> \endverbatim
  222. *>
  223. *> \param[in] LDA
  224. *> \verbatim
  225. *> LDA is INTEGER
  226. *> The leading dimension of A, B, AI, BI, Z and Q,
  227. *> LDA >= max( 1, NSIZE ). For the read-in test,
  228. *> LDA >= max( 1, N ), N is the size of the test matrices.
  229. *> \endverbatim
  230. *>
  231. *> \param[out] B
  232. *> \verbatim
  233. *> B is COMPLEX array, dimension (LDA, NSIZE)
  234. *> Used to store the matrix whose eigenvalues are to be
  235. *> computed. On exit, B contains the last matrix actually used.
  236. *> \endverbatim
  237. *>
  238. *> \param[out] AI
  239. *> \verbatim
  240. *> AI is COMPLEX array, dimension (LDA, NSIZE)
  241. *> Copy of A, modified by CGGESX.
  242. *> \endverbatim
  243. *>
  244. *> \param[out] BI
  245. *> \verbatim
  246. *> BI is COMPLEX array, dimension (LDA, NSIZE)
  247. *> Copy of B, modified by CGGESX.
  248. *> \endverbatim
  249. *>
  250. *> \param[out] Z
  251. *> \verbatim
  252. *> Z is COMPLEX array, dimension (LDA, NSIZE)
  253. *> Z holds the left Schur vectors computed by CGGESX.
  254. *> \endverbatim
  255. *>
  256. *> \param[out] Q
  257. *> \verbatim
  258. *> Q is COMPLEX array, dimension (LDA, NSIZE)
  259. *> Q holds the right Schur vectors computed by CGGESX.
  260. *> \endverbatim
  261. *>
  262. *> \param[out] ALPHA
  263. *> \verbatim
  264. *> ALPHA is COMPLEX array, dimension (NSIZE)
  265. *> \endverbatim
  266. *>
  267. *> \param[out] BETA
  268. *> \verbatim
  269. *> BETA is COMPLEX array, dimension (NSIZE)
  270. *>
  271. *> On exit, ALPHA/BETA are the eigenvalues.
  272. *> \endverbatim
  273. *>
  274. *> \param[out] C
  275. *> \verbatim
  276. *> C is COMPLEX array, dimension (LDC, LDC)
  277. *> Store the matrix generated by subroutine CLAKF2, this is the
  278. *> matrix formed by Kronecker products used for estimating
  279. *> DIF.
  280. *> \endverbatim
  281. *>
  282. *> \param[in] LDC
  283. *> \verbatim
  284. *> LDC is INTEGER
  285. *> The leading dimension of C. LDC >= max(1, LDA*LDA/2 ).
  286. *> \endverbatim
  287. *>
  288. *> \param[out] S
  289. *> \verbatim
  290. *> S is REAL array, dimension (LDC)
  291. *> Singular values of C
  292. *> \endverbatim
  293. *>
  294. *> \param[out] WORK
  295. *> \verbatim
  296. *> WORK is COMPLEX array, dimension (LWORK)
  297. *> \endverbatim
  298. *>
  299. *> \param[in] LWORK
  300. *> \verbatim
  301. *> LWORK is INTEGER
  302. *> The dimension of the array WORK. LWORK >= 3*NSIZE*NSIZE/2
  303. *> \endverbatim
  304. *>
  305. *> \param[out] RWORK
  306. *> \verbatim
  307. *> RWORK is REAL array,
  308. *> dimension (5*NSIZE*NSIZE/2 - 4)
  309. *> \endverbatim
  310. *>
  311. *> \param[out] IWORK
  312. *> \verbatim
  313. *> IWORK is INTEGER array, dimension (LIWORK)
  314. *> \endverbatim
  315. *>
  316. *> \param[in] LIWORK
  317. *> \verbatim
  318. *> LIWORK is INTEGER
  319. *> The dimension of the array IWORK. LIWORK >= NSIZE + 2.
  320. *> \endverbatim
  321. *>
  322. *> \param[out] BWORK
  323. *> \verbatim
  324. *> BWORK is LOGICAL array, dimension (NSIZE)
  325. *> \endverbatim
  326. *>
  327. *> \param[out] INFO
  328. *> \verbatim
  329. *> INFO is INTEGER
  330. *> = 0: successful exit
  331. *> < 0: if INFO = -i, the i-th argument had an illegal value.
  332. *> > 0: A routine returned an error code.
  333. *> \endverbatim
  334. *
  335. * Authors:
  336. * ========
  337. *
  338. *> \author Univ. of Tennessee
  339. *> \author Univ. of California Berkeley
  340. *> \author Univ. of Colorado Denver
  341. *> \author NAG Ltd.
  342. *
  343. *> \ingroup complex_eig
  344. *
  345. * =====================================================================
  346. SUBROUTINE CDRGSX( NSIZE, NCMAX, THRESH, NIN, NOUT, A, LDA, B,
  347. $ AI, BI, Z, Q, ALPHA, BETA, C, LDC, S, WORK,
  348. $ LWORK, RWORK, IWORK, LIWORK, BWORK, INFO )
  349. *
  350. * -- LAPACK test routine --
  351. * -- LAPACK is a software package provided by Univ. of Tennessee, --
  352. * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
  353. *
  354. * .. Scalar Arguments ..
  355. INTEGER INFO, LDA, LDC, LIWORK, LWORK, NCMAX, NIN,
  356. $ NOUT, NSIZE
  357. REAL THRESH
  358. * ..
  359. * .. Array Arguments ..
  360. LOGICAL BWORK( * )
  361. INTEGER IWORK( * )
  362. REAL RWORK( * ), S( * )
  363. COMPLEX A( LDA, * ), AI( LDA, * ), ALPHA( * ),
  364. $ B( LDA, * ), BETA( * ), BI( LDA, * ),
  365. $ C( LDC, * ), Q( LDA, * ), WORK( * ),
  366. $ Z( LDA, * )
  367. * ..
  368. *
  369. * =====================================================================
  370. *
  371. * .. Parameters ..
  372. REAL ZERO, ONE, TEN
  373. PARAMETER ( ZERO = 0.0E+0, ONE = 1.0E+0, TEN = 1.0E+1 )
  374. COMPLEX CZERO
  375. PARAMETER ( CZERO = ( 0.0E+0, 0.0E+0 ) )
  376. * ..
  377. * .. Local Scalars ..
  378. LOGICAL ILABAD
  379. CHARACTER SENSE
  380. INTEGER BDSPAC, I, IFUNC, J, LINFO, MAXWRK, MINWRK, MM,
  381. $ MN2, NERRS, NPTKNT, NTEST, NTESTT, PRTYPE, QBA,
  382. $ QBB
  383. REAL ABNRM, BIGNUM, DIFTRU, PLTRU, SMLNUM, TEMP1,
  384. $ TEMP2, THRSH2, ULP, ULPINV, WEIGHT
  385. COMPLEX X
  386. * ..
  387. * .. Local Arrays ..
  388. REAL DIFEST( 2 ), PL( 2 ), RESULT( 10 )
  389. * ..
  390. * .. External Functions ..
  391. LOGICAL CLCTSX
  392. INTEGER ILAENV
  393. REAL CLANGE, SLAMCH
  394. EXTERNAL CLCTSX, ILAENV, CLANGE, SLAMCH
  395. * ..
  396. * .. External Subroutines ..
  397. EXTERNAL ALASVM, CGESVD, CGET51, CGGESX, CLACPY, CLAKF2,
  398. $ CLASET, CLATM5, XERBLA
  399. * ..
  400. * .. Scalars in Common ..
  401. LOGICAL FS
  402. INTEGER K, M, MPLUSN, N
  403. * ..
  404. * .. Common blocks ..
  405. COMMON / MN / M, N, MPLUSN, K, FS
  406. * ..
  407. * .. Intrinsic Functions ..
  408. INTRINSIC ABS, AIMAG, MAX, REAL, SQRT
  409. * ..
  410. * .. Statement Functions ..
  411. REAL ABS1
  412. * ..
  413. * .. Statement Function definitions ..
  414. ABS1( X ) = ABS( REAL( X ) ) + ABS( AIMAG( X ) )
  415. * ..
  416. * .. Executable Statements ..
  417. *
  418. * Check for errors
  419. *
  420. IF( NSIZE.LT.0 ) THEN
  421. INFO = -1
  422. ELSE IF( THRESH.LT.ZERO ) THEN
  423. INFO = -2
  424. ELSE IF( NIN.LE.0 ) THEN
  425. INFO = -3
  426. ELSE IF( NOUT.LE.0 ) THEN
  427. INFO = -4
  428. ELSE IF( LDA.LT.1 .OR. LDA.LT.NSIZE ) THEN
  429. INFO = -6
  430. ELSE IF( LDC.LT.1 .OR. LDC.LT.NSIZE*NSIZE / 2 ) THEN
  431. INFO = -15
  432. ELSE IF( LIWORK.LT.NSIZE+2 ) THEN
  433. INFO = -21
  434. END IF
  435. *
  436. * Compute workspace
  437. * (Note: Comments in the code beginning "Workspace:" describe the
  438. * minimal amount of workspace needed at that point in the code,
  439. * as well as the preferred amount for good performance.
  440. * NB refers to the optimal block size for the immediately
  441. * following subroutine, as returned by ILAENV.)
  442. *
  443. MINWRK = 1
  444. IF( INFO.EQ.0 .AND. LWORK.GE.1 ) THEN
  445. MINWRK = 3*NSIZE*NSIZE / 2
  446. *
  447. * workspace for cggesx
  448. *
  449. MAXWRK = NSIZE*( 1+ILAENV( 1, 'CGEQRF', ' ', NSIZE, 1, NSIZE,
  450. $ 0 ) )
  451. MAXWRK = MAX( MAXWRK, NSIZE*( 1+ILAENV( 1, 'CUNGQR', ' ',
  452. $ NSIZE, 1, NSIZE, -1 ) ) )
  453. *
  454. * workspace for cgesvd
  455. *
  456. BDSPAC = 3*NSIZE*NSIZE / 2
  457. MAXWRK = MAX( MAXWRK, NSIZE*NSIZE*
  458. $ ( 1+ILAENV( 1, 'CGEBRD', ' ', NSIZE*NSIZE / 2,
  459. $ NSIZE*NSIZE / 2, -1, -1 ) ) )
  460. MAXWRK = MAX( MAXWRK, BDSPAC )
  461. *
  462. MAXWRK = MAX( MAXWRK, MINWRK )
  463. *
  464. WORK( 1 ) = MAXWRK
  465. END IF
  466. *
  467. IF( LWORK.LT.MINWRK )
  468. $ INFO = -18
  469. *
  470. IF( INFO.NE.0 ) THEN
  471. CALL XERBLA( 'CDRGSX', -INFO )
  472. RETURN
  473. END IF
  474. *
  475. * Important constants
  476. *
  477. ULP = SLAMCH( 'P' )
  478. ULPINV = ONE / ULP
  479. SMLNUM = SLAMCH( 'S' ) / ULP
  480. BIGNUM = ONE / SMLNUM
  481. THRSH2 = TEN*THRESH
  482. NTESTT = 0
  483. NERRS = 0
  484. *
  485. * Go to the tests for read-in matrix pairs
  486. *
  487. IFUNC = 0
  488. IF( NSIZE.EQ.0 )
  489. $ GO TO 70
  490. *
  491. * Test the built-in matrix pairs.
  492. * Loop over different functions (IFUNC) of CGGESX, types (PRTYPE)
  493. * of test matrices, different size (M+N)
  494. *
  495. PRTYPE = 0
  496. QBA = 3
  497. QBB = 4
  498. WEIGHT = SQRT( ULP )
  499. *
  500. DO 60 IFUNC = 0, 3
  501. DO 50 PRTYPE = 1, 5
  502. DO 40 M = 1, NSIZE - 1
  503. DO 30 N = 1, NSIZE - M
  504. *
  505. WEIGHT = ONE / WEIGHT
  506. MPLUSN = M + N
  507. *
  508. * Generate test matrices
  509. *
  510. FS = .TRUE.
  511. K = 0
  512. *
  513. CALL CLASET( 'Full', MPLUSN, MPLUSN, CZERO, CZERO, AI,
  514. $ LDA )
  515. CALL CLASET( 'Full', MPLUSN, MPLUSN, CZERO, CZERO, BI,
  516. $ LDA )
  517. *
  518. CALL CLATM5( PRTYPE, M, N, AI, LDA, AI( M+1, M+1 ),
  519. $ LDA, AI( 1, M+1 ), LDA, BI, LDA,
  520. $ BI( M+1, M+1 ), LDA, BI( 1, M+1 ), LDA,
  521. $ Q, LDA, Z, LDA, WEIGHT, QBA, QBB )
  522. *
  523. * Compute the Schur factorization and swapping the
  524. * m-by-m (1,1)-blocks with n-by-n (2,2)-blocks.
  525. * Swapping is accomplished via the function CLCTSX
  526. * which is supplied below.
  527. *
  528. IF( IFUNC.EQ.0 ) THEN
  529. SENSE = 'N'
  530. ELSE IF( IFUNC.EQ.1 ) THEN
  531. SENSE = 'E'
  532. ELSE IF( IFUNC.EQ.2 ) THEN
  533. SENSE = 'V'
  534. ELSE IF( IFUNC.EQ.3 ) THEN
  535. SENSE = 'B'
  536. END IF
  537. *
  538. CALL CLACPY( 'Full', MPLUSN, MPLUSN, AI, LDA, A, LDA )
  539. CALL CLACPY( 'Full', MPLUSN, MPLUSN, BI, LDA, B, LDA )
  540. *
  541. CALL CGGESX( 'V', 'V', 'S', CLCTSX, SENSE, MPLUSN, AI,
  542. $ LDA, BI, LDA, MM, ALPHA, BETA, Q, LDA, Z,
  543. $ LDA, PL, DIFEST, WORK, LWORK, RWORK,
  544. $ IWORK, LIWORK, BWORK, LINFO )
  545. *
  546. IF( LINFO.NE.0 .AND. LINFO.NE.MPLUSN+2 ) THEN
  547. RESULT( 1 ) = ULPINV
  548. WRITE( NOUT, FMT = 9999 )'CGGESX', LINFO, MPLUSN,
  549. $ PRTYPE
  550. INFO = LINFO
  551. GO TO 30
  552. END IF
  553. *
  554. * Compute the norm(A, B)
  555. *
  556. CALL CLACPY( 'Full', MPLUSN, MPLUSN, AI, LDA, WORK,
  557. $ MPLUSN )
  558. CALL CLACPY( 'Full', MPLUSN, MPLUSN, BI, LDA,
  559. $ WORK( MPLUSN*MPLUSN+1 ), MPLUSN )
  560. ABNRM = CLANGE( 'Fro', MPLUSN, 2*MPLUSN, WORK, MPLUSN,
  561. $ RWORK )
  562. *
  563. * Do tests (1) to (4)
  564. *
  565. RESULT( 2 ) = ZERO
  566. CALL CGET51( 1, MPLUSN, A, LDA, AI, LDA, Q, LDA, Z,
  567. $ LDA, WORK, RWORK, RESULT( 1 ) )
  568. CALL CGET51( 1, MPLUSN, B, LDA, BI, LDA, Q, LDA, Z,
  569. $ LDA, WORK, RWORK, RESULT( 2 ) )
  570. CALL CGET51( 3, MPLUSN, B, LDA, BI, LDA, Q, LDA, Q,
  571. $ LDA, WORK, RWORK, RESULT( 3 ) )
  572. CALL CGET51( 3, MPLUSN, B, LDA, BI, LDA, Z, LDA, Z,
  573. $ LDA, WORK, RWORK, RESULT( 4 ) )
  574. NTEST = 4
  575. *
  576. * Do tests (5) and (6): check Schur form of A and
  577. * compare eigenvalues with diagonals.
  578. *
  579. TEMP1 = ZERO
  580. RESULT( 5 ) = ZERO
  581. RESULT( 6 ) = ZERO
  582. *
  583. DO 10 J = 1, MPLUSN
  584. ILABAD = .FALSE.
  585. TEMP2 = ( ABS1( ALPHA( J )-AI( J, J ) ) /
  586. $ MAX( SMLNUM, ABS1( ALPHA( J ) ),
  587. $ ABS1( AI( J, J ) ) )+
  588. $ ABS1( BETA( J )-BI( J, J ) ) /
  589. $ MAX( SMLNUM, ABS1( BETA( J ) ),
  590. $ ABS1( BI( J, J ) ) ) ) / ULP
  591. IF( J.LT.MPLUSN ) THEN
  592. IF( AI( J+1, J ).NE.ZERO ) THEN
  593. ILABAD = .TRUE.
  594. RESULT( 5 ) = ULPINV
  595. END IF
  596. END IF
  597. IF( J.GT.1 ) THEN
  598. IF( AI( J, J-1 ).NE.ZERO ) THEN
  599. ILABAD = .TRUE.
  600. RESULT( 5 ) = ULPINV
  601. END IF
  602. END IF
  603. TEMP1 = MAX( TEMP1, TEMP2 )
  604. IF( ILABAD ) THEN
  605. WRITE( NOUT, FMT = 9997 )J, MPLUSN, PRTYPE
  606. END IF
  607. 10 CONTINUE
  608. RESULT( 6 ) = TEMP1
  609. NTEST = NTEST + 2
  610. *
  611. * Test (7) (if sorting worked)
  612. *
  613. RESULT( 7 ) = ZERO
  614. IF( LINFO.EQ.MPLUSN+3 ) THEN
  615. RESULT( 7 ) = ULPINV
  616. ELSE IF( MM.NE.N ) THEN
  617. RESULT( 7 ) = ULPINV
  618. END IF
  619. NTEST = NTEST + 1
  620. *
  621. * Test (8): compare the estimated value DIF and its
  622. * value. first, compute the exact DIF.
  623. *
  624. RESULT( 8 ) = ZERO
  625. MN2 = MM*( MPLUSN-MM )*2
  626. IF( IFUNC.GE.2 .AND. MN2.LE.NCMAX*NCMAX ) THEN
  627. *
  628. * Note: for either following two cases, there are
  629. * almost same number of test cases fail the test.
  630. *
  631. CALL CLAKF2( MM, MPLUSN-MM, AI, LDA,
  632. $ AI( MM+1, MM+1 ), BI,
  633. $ BI( MM+1, MM+1 ), C, LDC )
  634. *
  635. CALL CGESVD( 'N', 'N', MN2, MN2, C, LDC, S, WORK,
  636. $ 1, WORK( 2 ), 1, WORK( 3 ), LWORK-2,
  637. $ RWORK, INFO )
  638. DIFTRU = S( MN2 )
  639. *
  640. IF( DIFEST( 2 ).EQ.ZERO ) THEN
  641. IF( DIFTRU.GT.ABNRM*ULP )
  642. $ RESULT( 8 ) = ULPINV
  643. ELSE IF( DIFTRU.EQ.ZERO ) THEN
  644. IF( DIFEST( 2 ).GT.ABNRM*ULP )
  645. $ RESULT( 8 ) = ULPINV
  646. ELSE IF( ( DIFTRU.GT.THRSH2*DIFEST( 2 ) ) .OR.
  647. $ ( DIFTRU*THRSH2.LT.DIFEST( 2 ) ) ) THEN
  648. RESULT( 8 ) = MAX( DIFTRU / DIFEST( 2 ),
  649. $ DIFEST( 2 ) / DIFTRU )
  650. END IF
  651. NTEST = NTEST + 1
  652. END IF
  653. *
  654. * Test (9)
  655. *
  656. RESULT( 9 ) = ZERO
  657. IF( LINFO.EQ.( MPLUSN+2 ) ) THEN
  658. IF( DIFTRU.GT.ABNRM*ULP )
  659. $ RESULT( 9 ) = ULPINV
  660. IF( ( IFUNC.GT.1 ) .AND. ( DIFEST( 2 ).NE.ZERO ) )
  661. $ RESULT( 9 ) = ULPINV
  662. IF( ( IFUNC.EQ.1 ) .AND. ( PL( 1 ).NE.ZERO ) )
  663. $ RESULT( 9 ) = ULPINV
  664. NTEST = NTEST + 1
  665. END IF
  666. *
  667. NTESTT = NTESTT + NTEST
  668. *
  669. * Print out tests which fail.
  670. *
  671. DO 20 J = 1, 9
  672. IF( RESULT( J ).GE.THRESH ) THEN
  673. *
  674. * If this is the first test to fail,
  675. * print a header to the data file.
  676. *
  677. IF( NERRS.EQ.0 ) THEN
  678. WRITE( NOUT, FMT = 9996 )'CGX'
  679. *
  680. * Matrix types
  681. *
  682. WRITE( NOUT, FMT = 9994 )
  683. *
  684. * Tests performed
  685. *
  686. WRITE( NOUT, FMT = 9993 )'unitary', '''',
  687. $ 'transpose', ( '''', I = 1, 4 )
  688. *
  689. END IF
  690. NERRS = NERRS + 1
  691. IF( RESULT( J ).LT.10000.0 ) THEN
  692. WRITE( NOUT, FMT = 9992 )MPLUSN, PRTYPE,
  693. $ WEIGHT, M, J, RESULT( J )
  694. ELSE
  695. WRITE( NOUT, FMT = 9991 )MPLUSN, PRTYPE,
  696. $ WEIGHT, M, J, RESULT( J )
  697. END IF
  698. END IF
  699. 20 CONTINUE
  700. *
  701. 30 CONTINUE
  702. 40 CONTINUE
  703. 50 CONTINUE
  704. 60 CONTINUE
  705. *
  706. GO TO 150
  707. *
  708. 70 CONTINUE
  709. *
  710. * Read in data from file to check accuracy of condition estimation
  711. * Read input data until N=0
  712. *
  713. NPTKNT = 0
  714. *
  715. 80 CONTINUE
  716. READ( NIN, FMT = *, END = 140 )MPLUSN
  717. IF( MPLUSN.EQ.0 )
  718. $ GO TO 140
  719. READ( NIN, FMT = *, END = 140 )N
  720. DO 90 I = 1, MPLUSN
  721. READ( NIN, FMT = * )( AI( I, J ), J = 1, MPLUSN )
  722. 90 CONTINUE
  723. DO 100 I = 1, MPLUSN
  724. READ( NIN, FMT = * )( BI( I, J ), J = 1, MPLUSN )
  725. 100 CONTINUE
  726. READ( NIN, FMT = * )PLTRU, DIFTRU
  727. *
  728. NPTKNT = NPTKNT + 1
  729. FS = .TRUE.
  730. K = 0
  731. M = MPLUSN - N
  732. *
  733. CALL CLACPY( 'Full', MPLUSN, MPLUSN, AI, LDA, A, LDA )
  734. CALL CLACPY( 'Full', MPLUSN, MPLUSN, BI, LDA, B, LDA )
  735. *
  736. * Compute the Schur factorization while swapping the
  737. * m-by-m (1,1)-blocks with n-by-n (2,2)-blocks.
  738. *
  739. CALL CGGESX( 'V', 'V', 'S', CLCTSX, 'B', MPLUSN, AI, LDA, BI, LDA,
  740. $ MM, ALPHA, BETA, Q, LDA, Z, LDA, PL, DIFEST, WORK,
  741. $ LWORK, RWORK, IWORK, LIWORK, BWORK, LINFO )
  742. *
  743. IF( LINFO.NE.0 .AND. LINFO.NE.MPLUSN+2 ) THEN
  744. RESULT( 1 ) = ULPINV
  745. WRITE( NOUT, FMT = 9998 )'CGGESX', LINFO, MPLUSN, NPTKNT
  746. GO TO 130
  747. END IF
  748. *
  749. * Compute the norm(A, B)
  750. * (should this be norm of (A,B) or (AI,BI)?)
  751. *
  752. CALL CLACPY( 'Full', MPLUSN, MPLUSN, AI, LDA, WORK, MPLUSN )
  753. CALL CLACPY( 'Full', MPLUSN, MPLUSN, BI, LDA,
  754. $ WORK( MPLUSN*MPLUSN+1 ), MPLUSN )
  755. ABNRM = CLANGE( 'Fro', MPLUSN, 2*MPLUSN, WORK, MPLUSN, RWORK )
  756. *
  757. * Do tests (1) to (4)
  758. *
  759. CALL CGET51( 1, MPLUSN, A, LDA, AI, LDA, Q, LDA, Z, LDA, WORK,
  760. $ RWORK, RESULT( 1 ) )
  761. CALL CGET51( 1, MPLUSN, B, LDA, BI, LDA, Q, LDA, Z, LDA, WORK,
  762. $ RWORK, RESULT( 2 ) )
  763. CALL CGET51( 3, MPLUSN, B, LDA, BI, LDA, Q, LDA, Q, LDA, WORK,
  764. $ RWORK, RESULT( 3 ) )
  765. CALL CGET51( 3, MPLUSN, B, LDA, BI, LDA, Z, LDA, Z, LDA, WORK,
  766. $ RWORK, RESULT( 4 ) )
  767. *
  768. * Do tests (5) and (6): check Schur form of A and compare
  769. * eigenvalues with diagonals.
  770. *
  771. NTEST = 6
  772. TEMP1 = ZERO
  773. RESULT( 5 ) = ZERO
  774. RESULT( 6 ) = ZERO
  775. *
  776. DO 110 J = 1, MPLUSN
  777. ILABAD = .FALSE.
  778. TEMP2 = ( ABS1( ALPHA( J )-AI( J, J ) ) /
  779. $ MAX( SMLNUM, ABS1( ALPHA( J ) ), ABS1( AI( J, J ) ) )+
  780. $ ABS1( BETA( J )-BI( J, J ) ) /
  781. $ MAX( SMLNUM, ABS1( BETA( J ) ), ABS1( BI( J, J ) ) ) )
  782. $ / ULP
  783. IF( J.LT.MPLUSN ) THEN
  784. IF( AI( J+1, J ).NE.ZERO ) THEN
  785. ILABAD = .TRUE.
  786. RESULT( 5 ) = ULPINV
  787. END IF
  788. END IF
  789. IF( J.GT.1 ) THEN
  790. IF( AI( J, J-1 ).NE.ZERO ) THEN
  791. ILABAD = .TRUE.
  792. RESULT( 5 ) = ULPINV
  793. END IF
  794. END IF
  795. TEMP1 = MAX( TEMP1, TEMP2 )
  796. IF( ILABAD ) THEN
  797. WRITE( NOUT, FMT = 9997 )J, MPLUSN, NPTKNT
  798. END IF
  799. 110 CONTINUE
  800. RESULT( 6 ) = TEMP1
  801. *
  802. * Test (7) (if sorting worked) <--------- need to be checked.
  803. *
  804. NTEST = 7
  805. RESULT( 7 ) = ZERO
  806. IF( LINFO.EQ.MPLUSN+3 )
  807. $ RESULT( 7 ) = ULPINV
  808. *
  809. * Test (8): compare the estimated value of DIF and its true value.
  810. *
  811. NTEST = 8
  812. RESULT( 8 ) = ZERO
  813. IF( DIFEST( 2 ).EQ.ZERO ) THEN
  814. IF( DIFTRU.GT.ABNRM*ULP )
  815. $ RESULT( 8 ) = ULPINV
  816. ELSE IF( DIFTRU.EQ.ZERO ) THEN
  817. IF( DIFEST( 2 ).GT.ABNRM*ULP )
  818. $ RESULT( 8 ) = ULPINV
  819. ELSE IF( ( DIFTRU.GT.THRSH2*DIFEST( 2 ) ) .OR.
  820. $ ( DIFTRU*THRSH2.LT.DIFEST( 2 ) ) ) THEN
  821. RESULT( 8 ) = MAX( DIFTRU / DIFEST( 2 ), DIFEST( 2 ) / DIFTRU )
  822. END IF
  823. *
  824. * Test (9)
  825. *
  826. NTEST = 9
  827. RESULT( 9 ) = ZERO
  828. IF( LINFO.EQ.( MPLUSN+2 ) ) THEN
  829. IF( DIFTRU.GT.ABNRM*ULP )
  830. $ RESULT( 9 ) = ULPINV
  831. IF( ( IFUNC.GT.1 ) .AND. ( DIFEST( 2 ).NE.ZERO ) )
  832. $ RESULT( 9 ) = ULPINV
  833. IF( ( IFUNC.EQ.1 ) .AND. ( PL( 1 ).NE.ZERO ) )
  834. $ RESULT( 9 ) = ULPINV
  835. END IF
  836. *
  837. * Test (10): compare the estimated value of PL and it true value.
  838. *
  839. NTEST = 10
  840. RESULT( 10 ) = ZERO
  841. IF( PL( 1 ).EQ.ZERO ) THEN
  842. IF( PLTRU.GT.ABNRM*ULP )
  843. $ RESULT( 10 ) = ULPINV
  844. ELSE IF( PLTRU.EQ.ZERO ) THEN
  845. IF( PL( 1 ).GT.ABNRM*ULP )
  846. $ RESULT( 10 ) = ULPINV
  847. ELSE IF( ( PLTRU.GT.THRESH*PL( 1 ) ) .OR.
  848. $ ( PLTRU*THRESH.LT.PL( 1 ) ) ) THEN
  849. RESULT( 10 ) = ULPINV
  850. END IF
  851. *
  852. NTESTT = NTESTT + NTEST
  853. *
  854. * Print out tests which fail.
  855. *
  856. DO 120 J = 1, NTEST
  857. IF( RESULT( J ).GE.THRESH ) THEN
  858. *
  859. * If this is the first test to fail,
  860. * print a header to the data file.
  861. *
  862. IF( NERRS.EQ.0 ) THEN
  863. WRITE( NOUT, FMT = 9996 )'CGX'
  864. *
  865. * Matrix types
  866. *
  867. WRITE( NOUT, FMT = 9995 )
  868. *
  869. * Tests performed
  870. *
  871. WRITE( NOUT, FMT = 9993 )'unitary', '''', 'transpose',
  872. $ ( '''', I = 1, 4 )
  873. *
  874. END IF
  875. NERRS = NERRS + 1
  876. IF( RESULT( J ).LT.10000.0 ) THEN
  877. WRITE( NOUT, FMT = 9990 )NPTKNT, MPLUSN, J, RESULT( J )
  878. ELSE
  879. WRITE( NOUT, FMT = 9989 )NPTKNT, MPLUSN, J, RESULT( J )
  880. END IF
  881. END IF
  882. *
  883. 120 CONTINUE
  884. *
  885. 130 CONTINUE
  886. GO TO 80
  887. 140 CONTINUE
  888. *
  889. 150 CONTINUE
  890. *
  891. * Summary
  892. *
  893. CALL ALASVM( 'CGX', NOUT, NERRS, NTESTT, 0 )
  894. *
  895. WORK( 1 ) = MAXWRK
  896. *
  897. RETURN
  898. *
  899. 9999 FORMAT( ' CDRGSX: ', A, ' returned INFO=', I6, '.', / 9X, 'N=',
  900. $ I6, ', JTYPE=', I6, ')' )
  901. *
  902. 9998 FORMAT( ' CDRGSX: ', A, ' returned INFO=', I6, '.', / 9X, 'N=',
  903. $ I6, ', Input Example #', I2, ')' )
  904. *
  905. 9997 FORMAT( ' CDRGSX: S not in Schur form at eigenvalue ', I6, '.',
  906. $ / 9X, 'N=', I6, ', JTYPE=', I6, ')' )
  907. *
  908. 9996 FORMAT( / 1X, A3, ' -- Complex Expert Generalized Schur form',
  909. $ ' problem driver' )
  910. *
  911. 9995 FORMAT( 'Input Example' )
  912. *
  913. 9994 FORMAT( ' Matrix types: ', /
  914. $ ' 1: A is a block diagonal matrix of Jordan blocks ',
  915. $ 'and B is the identity ', / ' matrix, ',
  916. $ / ' 2: A and B are upper triangular matrices, ',
  917. $ / ' 3: A and B are as type 2, but each second diagonal ',
  918. $ 'block in A_11 and ', /
  919. $ ' each third diagonal block in A_22 are 2x2 blocks,',
  920. $ / ' 4: A and B are block diagonal matrices, ',
  921. $ / ' 5: (A,B) has potentially close or common ',
  922. $ 'eigenvalues.', / )
  923. *
  924. 9993 FORMAT( / ' Tests performed: (S is Schur, T is triangular, ',
  925. $ 'Q and Z are ', A, ',', / 19X,
  926. $ ' a is alpha, b is beta, and ', A, ' means ', A, '.)',
  927. $ / ' 1 = | A - Q S Z', A,
  928. $ ' | / ( |A| n ulp ) 2 = | B - Q T Z', A,
  929. $ ' | / ( |B| n ulp )', / ' 3 = | I - QQ', A,
  930. $ ' | / ( n ulp ) 4 = | I - ZZ', A,
  931. $ ' | / ( n ulp )', / ' 5 = 1/ULP if A is not in ',
  932. $ 'Schur form S', / ' 6 = difference between (alpha,beta)',
  933. $ ' and diagonals of (S,T)', /
  934. $ ' 7 = 1/ULP if SDIM is not the correct number of ',
  935. $ 'selected eigenvalues', /
  936. $ ' 8 = 1/ULP if DIFEST/DIFTRU > 10*THRESH or ',
  937. $ 'DIFTRU/DIFEST > 10*THRESH',
  938. $ / ' 9 = 1/ULP if DIFEST <> 0 or DIFTRU > ULP*norm(A,B) ',
  939. $ 'when reordering fails', /
  940. $ ' 10 = 1/ULP if PLEST/PLTRU > THRESH or ',
  941. $ 'PLTRU/PLEST > THRESH', /
  942. $ ' ( Test 10 is only for input examples )', / )
  943. 9992 FORMAT( ' Matrix order=', I2, ', type=', I2, ', a=', E10.3,
  944. $ ', order(A_11)=', I2, ', result ', I2, ' is ', 0P, F8.2 )
  945. 9991 FORMAT( ' Matrix order=', I2, ', type=', I2, ', a=', E10.3,
  946. $ ', order(A_11)=', I2, ', result ', I2, ' is ', 0P, E10.3 )
  947. 9990 FORMAT( ' Input example #', I2, ', matrix order=', I4, ',',
  948. $ ' result ', I2, ' is', 0P, F8.2 )
  949. 9989 FORMAT( ' Input example #', I2, ', matrix order=', I4, ',',
  950. $ ' result ', I2, ' is', 1P, E10.3 )
  951. *
  952. * End of CDRGSX
  953. *
  954. END