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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958
  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. *> \date June 2016
  344. *
  345. *> \ingroup complex_eig
  346. *
  347. * =====================================================================
  348. SUBROUTINE CDRGSX( NSIZE, NCMAX, THRESH, NIN, NOUT, A, LDA, B,
  349. $ AI, BI, Z, Q, ALPHA, BETA, C, LDC, S, WORK,
  350. $ LWORK, RWORK, IWORK, LIWORK, BWORK, INFO )
  351. *
  352. * -- LAPACK test routine (version 3.7.0) --
  353. * -- LAPACK is a software package provided by Univ. of Tennessee, --
  354. * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
  355. * June 2016
  356. *
  357. * .. Scalar Arguments ..
  358. INTEGER INFO, LDA, LDC, LIWORK, LWORK, NCMAX, NIN,
  359. $ NOUT, NSIZE
  360. REAL THRESH
  361. * ..
  362. * .. Array Arguments ..
  363. LOGICAL BWORK( * )
  364. INTEGER IWORK( * )
  365. REAL RWORK( * ), S( * )
  366. COMPLEX A( LDA, * ), AI( LDA, * ), ALPHA( * ),
  367. $ B( LDA, * ), BETA( * ), BI( LDA, * ),
  368. $ C( LDC, * ), Q( LDA, * ), WORK( * ),
  369. $ Z( LDA, * )
  370. * ..
  371. *
  372. * =====================================================================
  373. *
  374. * .. Parameters ..
  375. REAL ZERO, ONE, TEN
  376. PARAMETER ( ZERO = 0.0E+0, ONE = 1.0E+0, TEN = 1.0E+1 )
  377. COMPLEX CZERO
  378. PARAMETER ( CZERO = ( 0.0E+0, 0.0E+0 ) )
  379. * ..
  380. * .. Local Scalars ..
  381. LOGICAL ILABAD
  382. CHARACTER SENSE
  383. INTEGER BDSPAC, I, IFUNC, J, LINFO, MAXWRK, MINWRK, MM,
  384. $ MN2, NERRS, NPTKNT, NTEST, NTESTT, PRTYPE, QBA,
  385. $ QBB
  386. REAL ABNRM, BIGNUM, DIFTRU, PLTRU, SMLNUM, TEMP1,
  387. $ TEMP2, THRSH2, ULP, ULPINV, WEIGHT
  388. COMPLEX X
  389. * ..
  390. * .. Local Arrays ..
  391. REAL DIFEST( 2 ), PL( 2 ), RESULT( 10 )
  392. * ..
  393. * .. External Functions ..
  394. LOGICAL CLCTSX
  395. INTEGER ILAENV
  396. REAL CLANGE, SLAMCH
  397. EXTERNAL CLCTSX, ILAENV, CLANGE, SLAMCH
  398. * ..
  399. * .. External Subroutines ..
  400. EXTERNAL ALASVM, CGESVD, CGET51, CGGESX, CLACPY, CLAKF2,
  401. $ CLASET, CLATM5, SLABAD, XERBLA
  402. * ..
  403. * .. Scalars in Common ..
  404. LOGICAL FS
  405. INTEGER K, M, MPLUSN, N
  406. * ..
  407. * .. Common blocks ..
  408. COMMON / MN / M, N, MPLUSN, K, FS
  409. * ..
  410. * .. Intrinsic Functions ..
  411. INTRINSIC ABS, AIMAG, MAX, REAL, SQRT
  412. * ..
  413. * .. Statement Functions ..
  414. REAL ABS1
  415. * ..
  416. * .. Statement Function definitions ..
  417. ABS1( X ) = ABS( REAL( X ) ) + ABS( AIMAG( X ) )
  418. * ..
  419. * .. Executable Statements ..
  420. *
  421. * Check for errors
  422. *
  423. IF( NSIZE.LT.0 ) THEN
  424. INFO = -1
  425. ELSE IF( THRESH.LT.ZERO ) THEN
  426. INFO = -2
  427. ELSE IF( NIN.LE.0 ) THEN
  428. INFO = -3
  429. ELSE IF( NOUT.LE.0 ) THEN
  430. INFO = -4
  431. ELSE IF( LDA.LT.1 .OR. LDA.LT.NSIZE ) THEN
  432. INFO = -6
  433. ELSE IF( LDC.LT.1 .OR. LDC.LT.NSIZE*NSIZE / 2 ) THEN
  434. INFO = -15
  435. ELSE IF( LIWORK.LT.NSIZE+2 ) THEN
  436. INFO = -21
  437. END IF
  438. *
  439. * Compute workspace
  440. * (Note: Comments in the code beginning "Workspace:" describe the
  441. * minimal amount of workspace needed at that point in the code,
  442. * as well as the preferred amount for good performance.
  443. * NB refers to the optimal block size for the immediately
  444. * following subroutine, as returned by ILAENV.)
  445. *
  446. MINWRK = 1
  447. IF( INFO.EQ.0 .AND. LWORK.GE.1 ) THEN
  448. MINWRK = 3*NSIZE*NSIZE / 2
  449. *
  450. * workspace for cggesx
  451. *
  452. MAXWRK = NSIZE*( 1+ILAENV( 1, 'CGEQRF', ' ', NSIZE, 1, NSIZE,
  453. $ 0 ) )
  454. MAXWRK = MAX( MAXWRK, NSIZE*( 1+ILAENV( 1, 'CUNGQR', ' ',
  455. $ NSIZE, 1, NSIZE, -1 ) ) )
  456. *
  457. * workspace for cgesvd
  458. *
  459. BDSPAC = 3*NSIZE*NSIZE / 2
  460. MAXWRK = MAX( MAXWRK, NSIZE*NSIZE*
  461. $ ( 1+ILAENV( 1, 'CGEBRD', ' ', NSIZE*NSIZE / 2,
  462. $ NSIZE*NSIZE / 2, -1, -1 ) ) )
  463. MAXWRK = MAX( MAXWRK, BDSPAC )
  464. *
  465. MAXWRK = MAX( MAXWRK, MINWRK )
  466. *
  467. WORK( 1 ) = MAXWRK
  468. END IF
  469. *
  470. IF( LWORK.LT.MINWRK )
  471. $ INFO = -18
  472. *
  473. IF( INFO.NE.0 ) THEN
  474. CALL XERBLA( 'CDRGSX', -INFO )
  475. RETURN
  476. END IF
  477. *
  478. * Important constants
  479. *
  480. ULP = SLAMCH( 'P' )
  481. ULPINV = ONE / ULP
  482. SMLNUM = SLAMCH( 'S' ) / ULP
  483. BIGNUM = ONE / SMLNUM
  484. CALL SLABAD( SMLNUM, BIGNUM )
  485. THRSH2 = TEN*THRESH
  486. NTESTT = 0
  487. NERRS = 0
  488. *
  489. * Go to the tests for read-in matrix pairs
  490. *
  491. IFUNC = 0
  492. IF( NSIZE.EQ.0 )
  493. $ GO TO 70
  494. *
  495. * Test the built-in matrix pairs.
  496. * Loop over different functions (IFUNC) of CGGESX, types (PRTYPE)
  497. * of test matrices, different size (M+N)
  498. *
  499. PRTYPE = 0
  500. QBA = 3
  501. QBB = 4
  502. WEIGHT = SQRT( ULP )
  503. *
  504. DO 60 IFUNC = 0, 3
  505. DO 50 PRTYPE = 1, 5
  506. DO 40 M = 1, NSIZE - 1
  507. DO 30 N = 1, NSIZE - M
  508. *
  509. WEIGHT = ONE / WEIGHT
  510. MPLUSN = M + N
  511. *
  512. * Generate test matrices
  513. *
  514. FS = .TRUE.
  515. K = 0
  516. *
  517. CALL CLASET( 'Full', MPLUSN, MPLUSN, CZERO, CZERO, AI,
  518. $ LDA )
  519. CALL CLASET( 'Full', MPLUSN, MPLUSN, CZERO, CZERO, BI,
  520. $ LDA )
  521. *
  522. CALL CLATM5( PRTYPE, M, N, AI, LDA, AI( M+1, M+1 ),
  523. $ LDA, AI( 1, M+1 ), LDA, BI, LDA,
  524. $ BI( M+1, M+1 ), LDA, BI( 1, M+1 ), LDA,
  525. $ Q, LDA, Z, LDA, WEIGHT, QBA, QBB )
  526. *
  527. * Compute the Schur factorization and swapping the
  528. * m-by-m (1,1)-blocks with n-by-n (2,2)-blocks.
  529. * Swapping is accomplished via the function CLCTSX
  530. * which is supplied below.
  531. *
  532. IF( IFUNC.EQ.0 ) THEN
  533. SENSE = 'N'
  534. ELSE IF( IFUNC.EQ.1 ) THEN
  535. SENSE = 'E'
  536. ELSE IF( IFUNC.EQ.2 ) THEN
  537. SENSE = 'V'
  538. ELSE IF( IFUNC.EQ.3 ) THEN
  539. SENSE = 'B'
  540. END IF
  541. *
  542. CALL CLACPY( 'Full', MPLUSN, MPLUSN, AI, LDA, A, LDA )
  543. CALL CLACPY( 'Full', MPLUSN, MPLUSN, BI, LDA, B, LDA )
  544. *
  545. CALL CGGESX( 'V', 'V', 'S', CLCTSX, SENSE, MPLUSN, AI,
  546. $ LDA, BI, LDA, MM, ALPHA, BETA, Q, LDA, Z,
  547. $ LDA, PL, DIFEST, WORK, LWORK, RWORK,
  548. $ IWORK, LIWORK, BWORK, LINFO )
  549. *
  550. IF( LINFO.NE.0 .AND. LINFO.NE.MPLUSN+2 ) THEN
  551. RESULT( 1 ) = ULPINV
  552. WRITE( NOUT, FMT = 9999 )'CGGESX', LINFO, MPLUSN,
  553. $ PRTYPE
  554. INFO = LINFO
  555. GO TO 30
  556. END IF
  557. *
  558. * Compute the norm(A, B)
  559. *
  560. CALL CLACPY( 'Full', MPLUSN, MPLUSN, AI, LDA, WORK,
  561. $ MPLUSN )
  562. CALL CLACPY( 'Full', MPLUSN, MPLUSN, BI, LDA,
  563. $ WORK( MPLUSN*MPLUSN+1 ), MPLUSN )
  564. ABNRM = CLANGE( 'Fro', MPLUSN, 2*MPLUSN, WORK, MPLUSN,
  565. $ RWORK )
  566. *
  567. * Do tests (1) to (4)
  568. *
  569. RESULT( 2 ) = ZERO
  570. CALL CGET51( 1, MPLUSN, A, LDA, AI, LDA, Q, LDA, Z,
  571. $ LDA, WORK, RWORK, RESULT( 1 ) )
  572. CALL CGET51( 1, MPLUSN, B, LDA, BI, LDA, Q, LDA, Z,
  573. $ LDA, WORK, RWORK, RESULT( 2 ) )
  574. CALL CGET51( 3, MPLUSN, B, LDA, BI, LDA, Q, LDA, Q,
  575. $ LDA, WORK, RWORK, RESULT( 3 ) )
  576. CALL CGET51( 3, MPLUSN, B, LDA, BI, LDA, Z, LDA, Z,
  577. $ LDA, WORK, RWORK, RESULT( 4 ) )
  578. NTEST = 4
  579. *
  580. * Do tests (5) and (6): check Schur form of A and
  581. * compare eigenvalues with diagonals.
  582. *
  583. TEMP1 = ZERO
  584. RESULT( 5 ) = ZERO
  585. RESULT( 6 ) = ZERO
  586. *
  587. DO 10 J = 1, MPLUSN
  588. ILABAD = .FALSE.
  589. TEMP2 = ( ABS1( ALPHA( J )-AI( J, J ) ) /
  590. $ MAX( SMLNUM, ABS1( ALPHA( J ) ),
  591. $ ABS1( AI( J, J ) ) )+
  592. $ ABS1( BETA( J )-BI( J, J ) ) /
  593. $ MAX( SMLNUM, ABS1( BETA( J ) ),
  594. $ ABS1( BI( J, J ) ) ) ) / ULP
  595. IF( J.LT.MPLUSN ) THEN
  596. IF( AI( J+1, J ).NE.ZERO ) THEN
  597. ILABAD = .TRUE.
  598. RESULT( 5 ) = ULPINV
  599. END IF
  600. END IF
  601. IF( J.GT.1 ) THEN
  602. IF( AI( J, J-1 ).NE.ZERO ) THEN
  603. ILABAD = .TRUE.
  604. RESULT( 5 ) = ULPINV
  605. END IF
  606. END IF
  607. TEMP1 = MAX( TEMP1, TEMP2 )
  608. IF( ILABAD ) THEN
  609. WRITE( NOUT, FMT = 9997 )J, MPLUSN, PRTYPE
  610. END IF
  611. 10 CONTINUE
  612. RESULT( 6 ) = TEMP1
  613. NTEST = NTEST + 2
  614. *
  615. * Test (7) (if sorting worked)
  616. *
  617. RESULT( 7 ) = ZERO
  618. IF( LINFO.EQ.MPLUSN+3 ) THEN
  619. RESULT( 7 ) = ULPINV
  620. ELSE IF( MM.NE.N ) THEN
  621. RESULT( 7 ) = ULPINV
  622. END IF
  623. NTEST = NTEST + 1
  624. *
  625. * Test (8): compare the estimated value DIF and its
  626. * value. first, compute the exact DIF.
  627. *
  628. RESULT( 8 ) = ZERO
  629. MN2 = MM*( MPLUSN-MM )*2
  630. IF( IFUNC.GE.2 .AND. MN2.LE.NCMAX*NCMAX ) THEN
  631. *
  632. * Note: for either following two cases, there are
  633. * almost same number of test cases fail the test.
  634. *
  635. CALL CLAKF2( MM, MPLUSN-MM, AI, LDA,
  636. $ AI( MM+1, MM+1 ), BI,
  637. $ BI( MM+1, MM+1 ), C, LDC )
  638. *
  639. CALL CGESVD( 'N', 'N', MN2, MN2, C, LDC, S, WORK,
  640. $ 1, WORK( 2 ), 1, WORK( 3 ), LWORK-2,
  641. $ RWORK, INFO )
  642. DIFTRU = S( MN2 )
  643. *
  644. IF( DIFEST( 2 ).EQ.ZERO ) THEN
  645. IF( DIFTRU.GT.ABNRM*ULP )
  646. $ RESULT( 8 ) = ULPINV
  647. ELSE IF( DIFTRU.EQ.ZERO ) THEN
  648. IF( DIFEST( 2 ).GT.ABNRM*ULP )
  649. $ RESULT( 8 ) = ULPINV
  650. ELSE IF( ( DIFTRU.GT.THRSH2*DIFEST( 2 ) ) .OR.
  651. $ ( DIFTRU*THRSH2.LT.DIFEST( 2 ) ) ) THEN
  652. RESULT( 8 ) = MAX( DIFTRU / DIFEST( 2 ),
  653. $ DIFEST( 2 ) / DIFTRU )
  654. END IF
  655. NTEST = NTEST + 1
  656. END IF
  657. *
  658. * Test (9)
  659. *
  660. RESULT( 9 ) = ZERO
  661. IF( LINFO.EQ.( MPLUSN+2 ) ) THEN
  662. IF( DIFTRU.GT.ABNRM*ULP )
  663. $ RESULT( 9 ) = ULPINV
  664. IF( ( IFUNC.GT.1 ) .AND. ( DIFEST( 2 ).NE.ZERO ) )
  665. $ RESULT( 9 ) = ULPINV
  666. IF( ( IFUNC.EQ.1 ) .AND. ( PL( 1 ).NE.ZERO ) )
  667. $ RESULT( 9 ) = ULPINV
  668. NTEST = NTEST + 1
  669. END IF
  670. *
  671. NTESTT = NTESTT + NTEST
  672. *
  673. * Print out tests which fail.
  674. *
  675. DO 20 J = 1, 9
  676. IF( RESULT( J ).GE.THRESH ) THEN
  677. *
  678. * If this is the first test to fail,
  679. * print a header to the data file.
  680. *
  681. IF( NERRS.EQ.0 ) THEN
  682. WRITE( NOUT, FMT = 9996 )'CGX'
  683. *
  684. * Matrix types
  685. *
  686. WRITE( NOUT, FMT = 9994 )
  687. *
  688. * Tests performed
  689. *
  690. WRITE( NOUT, FMT = 9993 )'unitary', '''',
  691. $ 'transpose', ( '''', I = 1, 4 )
  692. *
  693. END IF
  694. NERRS = NERRS + 1
  695. IF( RESULT( J ).LT.10000.0 ) THEN
  696. WRITE( NOUT, FMT = 9992 )MPLUSN, PRTYPE,
  697. $ WEIGHT, M, J, RESULT( J )
  698. ELSE
  699. WRITE( NOUT, FMT = 9991 )MPLUSN, PRTYPE,
  700. $ WEIGHT, M, J, RESULT( J )
  701. END IF
  702. END IF
  703. 20 CONTINUE
  704. *
  705. 30 CONTINUE
  706. 40 CONTINUE
  707. 50 CONTINUE
  708. 60 CONTINUE
  709. *
  710. GO TO 150
  711. *
  712. 70 CONTINUE
  713. *
  714. * Read in data from file to check accuracy of condition estimation
  715. * Read input data until N=0
  716. *
  717. NPTKNT = 0
  718. *
  719. 80 CONTINUE
  720. READ( NIN, FMT = *, END = 140 )MPLUSN
  721. IF( MPLUSN.EQ.0 )
  722. $ GO TO 140
  723. READ( NIN, FMT = *, END = 140 )N
  724. DO 90 I = 1, MPLUSN
  725. READ( NIN, FMT = * )( AI( I, J ), J = 1, MPLUSN )
  726. 90 CONTINUE
  727. DO 100 I = 1, MPLUSN
  728. READ( NIN, FMT = * )( BI( I, J ), J = 1, MPLUSN )
  729. 100 CONTINUE
  730. READ( NIN, FMT = * )PLTRU, DIFTRU
  731. *
  732. NPTKNT = NPTKNT + 1
  733. FS = .TRUE.
  734. K = 0
  735. M = MPLUSN - N
  736. *
  737. CALL CLACPY( 'Full', MPLUSN, MPLUSN, AI, LDA, A, LDA )
  738. CALL CLACPY( 'Full', MPLUSN, MPLUSN, BI, LDA, B, LDA )
  739. *
  740. * Compute the Schur factorization while swaping the
  741. * m-by-m (1,1)-blocks with n-by-n (2,2)-blocks.
  742. *
  743. CALL CGGESX( 'V', 'V', 'S', CLCTSX, 'B', MPLUSN, AI, LDA, BI, LDA,
  744. $ MM, ALPHA, BETA, Q, LDA, Z, LDA, PL, DIFEST, WORK,
  745. $ LWORK, RWORK, IWORK, LIWORK, BWORK, LINFO )
  746. *
  747. IF( LINFO.NE.0 .AND. LINFO.NE.MPLUSN+2 ) THEN
  748. RESULT( 1 ) = ULPINV
  749. WRITE( NOUT, FMT = 9998 )'CGGESX', LINFO, MPLUSN, NPTKNT
  750. GO TO 130
  751. END IF
  752. *
  753. * Compute the norm(A, B)
  754. * (should this be norm of (A,B) or (AI,BI)?)
  755. *
  756. CALL CLACPY( 'Full', MPLUSN, MPLUSN, AI, LDA, WORK, MPLUSN )
  757. CALL CLACPY( 'Full', MPLUSN, MPLUSN, BI, LDA,
  758. $ WORK( MPLUSN*MPLUSN+1 ), MPLUSN )
  759. ABNRM = CLANGE( 'Fro', MPLUSN, 2*MPLUSN, WORK, MPLUSN, RWORK )
  760. *
  761. * Do tests (1) to (4)
  762. *
  763. CALL CGET51( 1, MPLUSN, A, LDA, AI, LDA, Q, LDA, Z, LDA, WORK,
  764. $ RWORK, RESULT( 1 ) )
  765. CALL CGET51( 1, MPLUSN, B, LDA, BI, LDA, Q, LDA, Z, LDA, WORK,
  766. $ RWORK, RESULT( 2 ) )
  767. CALL CGET51( 3, MPLUSN, B, LDA, BI, LDA, Q, LDA, Q, LDA, WORK,
  768. $ RWORK, RESULT( 3 ) )
  769. CALL CGET51( 3, MPLUSN, B, LDA, BI, LDA, Z, LDA, Z, LDA, WORK,
  770. $ RWORK, RESULT( 4 ) )
  771. *
  772. * Do tests (5) and (6): check Schur form of A and compare
  773. * eigenvalues with diagonals.
  774. *
  775. NTEST = 6
  776. TEMP1 = ZERO
  777. RESULT( 5 ) = ZERO
  778. RESULT( 6 ) = ZERO
  779. *
  780. DO 110 J = 1, MPLUSN
  781. ILABAD = .FALSE.
  782. TEMP2 = ( ABS1( ALPHA( J )-AI( J, J ) ) /
  783. $ MAX( SMLNUM, ABS1( ALPHA( J ) ), ABS1( AI( J, J ) ) )+
  784. $ ABS1( BETA( J )-BI( J, J ) ) /
  785. $ MAX( SMLNUM, ABS1( BETA( J ) ), ABS1( BI( J, J ) ) ) )
  786. $ / ULP
  787. IF( J.LT.MPLUSN ) THEN
  788. IF( AI( J+1, J ).NE.ZERO ) THEN
  789. ILABAD = .TRUE.
  790. RESULT( 5 ) = ULPINV
  791. END IF
  792. END IF
  793. IF( J.GT.1 ) THEN
  794. IF( AI( J, J-1 ).NE.ZERO ) THEN
  795. ILABAD = .TRUE.
  796. RESULT( 5 ) = ULPINV
  797. END IF
  798. END IF
  799. TEMP1 = MAX( TEMP1, TEMP2 )
  800. IF( ILABAD ) THEN
  801. WRITE( NOUT, FMT = 9997 )J, MPLUSN, NPTKNT
  802. END IF
  803. 110 CONTINUE
  804. RESULT( 6 ) = TEMP1
  805. *
  806. * Test (7) (if sorting worked) <--------- need to be checked.
  807. *
  808. NTEST = 7
  809. RESULT( 7 ) = ZERO
  810. IF( LINFO.EQ.MPLUSN+3 )
  811. $ RESULT( 7 ) = ULPINV
  812. *
  813. * Test (8): compare the estimated value of DIF and its true value.
  814. *
  815. NTEST = 8
  816. RESULT( 8 ) = ZERO
  817. IF( DIFEST( 2 ).EQ.ZERO ) THEN
  818. IF( DIFTRU.GT.ABNRM*ULP )
  819. $ RESULT( 8 ) = ULPINV
  820. ELSE IF( DIFTRU.EQ.ZERO ) THEN
  821. IF( DIFEST( 2 ).GT.ABNRM*ULP )
  822. $ RESULT( 8 ) = ULPINV
  823. ELSE IF( ( DIFTRU.GT.THRSH2*DIFEST( 2 ) ) .OR.
  824. $ ( DIFTRU*THRSH2.LT.DIFEST( 2 ) ) ) THEN
  825. RESULT( 8 ) = MAX( DIFTRU / DIFEST( 2 ), DIFEST( 2 ) / DIFTRU )
  826. END IF
  827. *
  828. * Test (9)
  829. *
  830. NTEST = 9
  831. RESULT( 9 ) = ZERO
  832. IF( LINFO.EQ.( MPLUSN+2 ) ) THEN
  833. IF( DIFTRU.GT.ABNRM*ULP )
  834. $ RESULT( 9 ) = ULPINV
  835. IF( ( IFUNC.GT.1 ) .AND. ( DIFEST( 2 ).NE.ZERO ) )
  836. $ RESULT( 9 ) = ULPINV
  837. IF( ( IFUNC.EQ.1 ) .AND. ( PL( 1 ).NE.ZERO ) )
  838. $ RESULT( 9 ) = ULPINV
  839. END IF
  840. *
  841. * Test (10): compare the estimated value of PL and it true value.
  842. *
  843. NTEST = 10
  844. RESULT( 10 ) = ZERO
  845. IF( PL( 1 ).EQ.ZERO ) THEN
  846. IF( PLTRU.GT.ABNRM*ULP )
  847. $ RESULT( 10 ) = ULPINV
  848. ELSE IF( PLTRU.EQ.ZERO ) THEN
  849. IF( PL( 1 ).GT.ABNRM*ULP )
  850. $ RESULT( 10 ) = ULPINV
  851. ELSE IF( ( PLTRU.GT.THRESH*PL( 1 ) ) .OR.
  852. $ ( PLTRU*THRESH.LT.PL( 1 ) ) ) THEN
  853. RESULT( 10 ) = ULPINV
  854. END IF
  855. *
  856. NTESTT = NTESTT + NTEST
  857. *
  858. * Print out tests which fail.
  859. *
  860. DO 120 J = 1, NTEST
  861. IF( RESULT( J ).GE.THRESH ) THEN
  862. *
  863. * If this is the first test to fail,
  864. * print a header to the data file.
  865. *
  866. IF( NERRS.EQ.0 ) THEN
  867. WRITE( NOUT, FMT = 9996 )'CGX'
  868. *
  869. * Matrix types
  870. *
  871. WRITE( NOUT, FMT = 9995 )
  872. *
  873. * Tests performed
  874. *
  875. WRITE( NOUT, FMT = 9993 )'unitary', '''', 'transpose',
  876. $ ( '''', I = 1, 4 )
  877. *
  878. END IF
  879. NERRS = NERRS + 1
  880. IF( RESULT( J ).LT.10000.0 ) THEN
  881. WRITE( NOUT, FMT = 9990 )NPTKNT, MPLUSN, J, RESULT( J )
  882. ELSE
  883. WRITE( NOUT, FMT = 9989 )NPTKNT, MPLUSN, J, RESULT( J )
  884. END IF
  885. END IF
  886. *
  887. 120 CONTINUE
  888. *
  889. 130 CONTINUE
  890. GO TO 80
  891. 140 CONTINUE
  892. *
  893. 150 CONTINUE
  894. *
  895. * Summary
  896. *
  897. CALL ALASVM( 'CGX', NOUT, NERRS, NTESTT, 0 )
  898. *
  899. WORK( 1 ) = MAXWRK
  900. *
  901. RETURN
  902. *
  903. 9999 FORMAT( ' CDRGSX: ', A, ' returned INFO=', I6, '.', / 9X, 'N=',
  904. $ I6, ', JTYPE=', I6, ')' )
  905. *
  906. 9998 FORMAT( ' CDRGSX: ', A, ' returned INFO=', I6, '.', / 9X, 'N=',
  907. $ I6, ', Input Example #', I2, ')' )
  908. *
  909. 9997 FORMAT( ' CDRGSX: S not in Schur form at eigenvalue ', I6, '.',
  910. $ / 9X, 'N=', I6, ', JTYPE=', I6, ')' )
  911. *
  912. 9996 FORMAT( / 1X, A3, ' -- Complex Expert Generalized Schur form',
  913. $ ' problem driver' )
  914. *
  915. 9995 FORMAT( 'Input Example' )
  916. *
  917. 9994 FORMAT( ' Matrix types: ', /
  918. $ ' 1: A is a block diagonal matrix of Jordan blocks ',
  919. $ 'and B is the identity ', / ' matrix, ',
  920. $ / ' 2: A and B are upper triangular matrices, ',
  921. $ / ' 3: A and B are as type 2, but each second diagonal ',
  922. $ 'block in A_11 and ', /
  923. $ ' each third diaongal block in A_22 are 2x2 blocks,',
  924. $ / ' 4: A and B are block diagonal matrices, ',
  925. $ / ' 5: (A,B) has potentially close or common ',
  926. $ 'eigenvalues.', / )
  927. *
  928. 9993 FORMAT( / ' Tests performed: (S is Schur, T is triangular, ',
  929. $ 'Q and Z are ', A, ',', / 19X,
  930. $ ' a is alpha, b is beta, and ', A, ' means ', A, '.)',
  931. $ / ' 1 = | A - Q S Z', A,
  932. $ ' | / ( |A| n ulp ) 2 = | B - Q T Z', A,
  933. $ ' | / ( |B| n ulp )', / ' 3 = | I - QQ', A,
  934. $ ' | / ( n ulp ) 4 = | I - ZZ', A,
  935. $ ' | / ( n ulp )', / ' 5 = 1/ULP if A is not in ',
  936. $ 'Schur form S', / ' 6 = difference between (alpha,beta)',
  937. $ ' and diagonals of (S,T)', /
  938. $ ' 7 = 1/ULP if SDIM is not the correct number of ',
  939. $ 'selected eigenvalues', /
  940. $ ' 8 = 1/ULP if DIFEST/DIFTRU > 10*THRESH or ',
  941. $ 'DIFTRU/DIFEST > 10*THRESH',
  942. $ / ' 9 = 1/ULP if DIFEST <> 0 or DIFTRU > ULP*norm(A,B) ',
  943. $ 'when reordering fails', /
  944. $ ' 10 = 1/ULP if PLEST/PLTRU > THRESH or ',
  945. $ 'PLTRU/PLEST > THRESH', /
  946. $ ' ( Test 10 is only for input examples )', / )
  947. 9992 FORMAT( ' Matrix order=', I2, ', type=', I2, ', a=', E10.3,
  948. $ ', order(A_11)=', I2, ', result ', I2, ' is ', 0P, F8.2 )
  949. 9991 FORMAT( ' Matrix order=', I2, ', type=', I2, ', a=', E10.3,
  950. $ ', order(A_11)=', I2, ', result ', I2, ' is ', 0P, E10.3 )
  951. 9990 FORMAT( ' Input example #', I2, ', matrix order=', I4, ',',
  952. $ ' result ', I2, ' is', 0P, F8.2 )
  953. 9989 FORMAT( ' Input example #', I2, ', matrix order=', I4, ',',
  954. $ ' result ', I2, ' is', 1P, E10.3 )
  955. *
  956. * End of CDRGSX
  957. *
  958. END