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.

sdrgvx.f 25 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764
  1. *> \brief \b SDRGVX
  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 SDRGVX( NSIZE, THRESH, NIN, NOUT, A, LDA, B, AI, BI,
  12. * ALPHAR, ALPHAI, BETA, VL, VR, ILO, IHI, LSCALE,
  13. * RSCALE, S, STRU, DIF, DIFTRU, WORK, LWORK,
  14. * IWORK, LIWORK, RESULT, BWORK, INFO )
  15. *
  16. * .. Scalar Arguments ..
  17. * INTEGER IHI, ILO, INFO, LDA, LIWORK, LWORK, NIN, NOUT,
  18. * $ NSIZE
  19. * REAL THRESH
  20. * ..
  21. * .. Array Arguments ..
  22. * LOGICAL BWORK( * )
  23. * INTEGER IWORK( * )
  24. * REAL A( LDA, * ), AI( LDA, * ), ALPHAI( * ),
  25. * $ ALPHAR( * ), B( LDA, * ), BETA( * ),
  26. * $ BI( LDA, * ), DIF( * ), DIFTRU( * ),
  27. * $ LSCALE( * ), RESULT( 4 ), RSCALE( * ), S( * ),
  28. * $ STRU( * ), VL( LDA, * ), VR( LDA, * ),
  29. * $ WORK( * )
  30. * ..
  31. *
  32. *
  33. *> \par Purpose:
  34. * =============
  35. *>
  36. *> \verbatim
  37. *>
  38. *> SDRGVX checks the nonsymmetric generalized eigenvalue problem
  39. *> expert driver SGGEVX.
  40. *>
  41. *> SGGEVX computes the generalized eigenvalues, (optionally) the left
  42. *> and/or right eigenvectors, (optionally) computes a balancing
  43. *> transformation to improve the conditioning, and (optionally)
  44. *> reciprocal condition numbers for the eigenvalues and eigenvectors.
  45. *>
  46. *> When SDRGVX is called with NSIZE > 0, two types of test matrix pairs
  47. *> are generated by the subroutine SLATM6 and test the driver SGGEVX.
  48. *> The test matrices have the known exact condition numbers for
  49. *> eigenvalues. For the condition numbers of the eigenvectors
  50. *> corresponding the first and last eigenvalues are also know
  51. *> ``exactly'' (see SLATM6).
  52. *>
  53. *> For each matrix pair, the following tests will be performed and
  54. *> compared with the threshold THRESH.
  55. *>
  56. *> (1) max over all left eigenvalue/-vector pairs (beta/alpha,l) of
  57. *>
  58. *> | l**H * (beta A - alpha B) | / ( ulp max( |beta A|, |alpha B| ) )
  59. *>
  60. *> where l**H is the conjugate tranpose of l.
  61. *>
  62. *> (2) max over all right eigenvalue/-vector pairs (beta/alpha,r) of
  63. *>
  64. *> | (beta A - alpha B) r | / ( ulp max( |beta A|, |alpha B| ) )
  65. *>
  66. *> (3) The condition number S(i) of eigenvalues computed by SGGEVX
  67. *> differs less than a factor THRESH from the exact S(i) (see
  68. *> SLATM6).
  69. *>
  70. *> (4) DIF(i) computed by STGSNA differs less than a factor 10*THRESH
  71. *> from the exact value (for the 1st and 5th vectors only).
  72. *>
  73. *> Test Matrices
  74. *> =============
  75. *>
  76. *> Two kinds of test matrix pairs
  77. *>
  78. *> (A, B) = inverse(YH) * (Da, Db) * inverse(X)
  79. *>
  80. *> are used in the tests:
  81. *>
  82. *> 1: Da = 1+a 0 0 0 0 Db = 1 0 0 0 0
  83. *> 0 2+a 0 0 0 0 1 0 0 0
  84. *> 0 0 3+a 0 0 0 0 1 0 0
  85. *> 0 0 0 4+a 0 0 0 0 1 0
  86. *> 0 0 0 0 5+a , 0 0 0 0 1 , and
  87. *>
  88. *> 2: Da = 1 -1 0 0 0 Db = 1 0 0 0 0
  89. *> 1 1 0 0 0 0 1 0 0 0
  90. *> 0 0 1 0 0 0 0 1 0 0
  91. *> 0 0 0 1+a 1+b 0 0 0 1 0
  92. *> 0 0 0 -1-b 1+a , 0 0 0 0 1 .
  93. *>
  94. *> In both cases the same inverse(YH) and inverse(X) are used to compute
  95. *> (A, B), giving the exact eigenvectors to (A,B) as (YH, X):
  96. *>
  97. *> YH: = 1 0 -y y -y X = 1 0 -x -x x
  98. *> 0 1 -y y -y 0 1 x -x -x
  99. *> 0 0 1 0 0 0 0 1 0 0
  100. *> 0 0 0 1 0 0 0 0 1 0
  101. *> 0 0 0 0 1, 0 0 0 0 1 , where
  102. *>
  103. *> a, b, x and y will have all values independently of each other from
  104. *> { sqrt(sqrt(ULP)), 0.1, 1, 10, 1/sqrt(sqrt(ULP)) }.
  105. *> \endverbatim
  106. *
  107. * Arguments:
  108. * ==========
  109. *
  110. *> \param[in] NSIZE
  111. *> \verbatim
  112. *> NSIZE is INTEGER
  113. *> The number of sizes of matrices to use. NSIZE must be at
  114. *> least zero. If it is zero, no randomly generated matrices
  115. *> are tested, but any test matrices read from NIN will be
  116. *> tested.
  117. *> \endverbatim
  118. *>
  119. *> \param[in] THRESH
  120. *> \verbatim
  121. *> THRESH is REAL
  122. *> A test will count as "failed" if the "error", computed as
  123. *> described above, exceeds THRESH. Note that the error
  124. *> is scaled to be O(1), so THRESH should be a reasonably
  125. *> small multiple of 1, e.g., 10 or 100. In particular,
  126. *> it should not depend on the precision (single vs. double)
  127. *> or the size of the matrix. It must be at least zero.
  128. *> \endverbatim
  129. *>
  130. *> \param[in] NIN
  131. *> \verbatim
  132. *> NIN is INTEGER
  133. *> The FORTRAN unit number for reading in the data file of
  134. *> problems to solve.
  135. *> \endverbatim
  136. *>
  137. *> \param[in] NOUT
  138. *> \verbatim
  139. *> NOUT is INTEGER
  140. *> The FORTRAN unit number for printing out error messages
  141. *> (e.g., if a routine returns IINFO not equal to 0.)
  142. *> \endverbatim
  143. *>
  144. *> \param[out] A
  145. *> \verbatim
  146. *> A is REAL array, dimension (LDA, NSIZE)
  147. *> Used to hold the matrix whose eigenvalues are to be
  148. *> computed. On exit, A contains the last matrix actually used.
  149. *> \endverbatim
  150. *>
  151. *> \param[in] LDA
  152. *> \verbatim
  153. *> LDA is INTEGER
  154. *> The leading dimension of A, B, AI, BI, Ao, and Bo.
  155. *> It must be at least 1 and at least NSIZE.
  156. *> \endverbatim
  157. *>
  158. *> \param[out] B
  159. *> \verbatim
  160. *> B is REAL array, dimension (LDA, NSIZE)
  161. *> Used to hold the matrix whose eigenvalues are to be
  162. *> computed. On exit, B contains the last matrix actually used.
  163. *> \endverbatim
  164. *>
  165. *> \param[out] AI
  166. *> \verbatim
  167. *> AI is REAL array, dimension (LDA, NSIZE)
  168. *> Copy of A, modified by SGGEVX.
  169. *> \endverbatim
  170. *>
  171. *> \param[out] BI
  172. *> \verbatim
  173. *> BI is REAL array, dimension (LDA, NSIZE)
  174. *> Copy of B, modified by SGGEVX.
  175. *> \endverbatim
  176. *>
  177. *> \param[out] ALPHAR
  178. *> \verbatim
  179. *> ALPHAR is REAL array, dimension (NSIZE)
  180. *> \endverbatim
  181. *>
  182. *> \param[out] ALPHAI
  183. *> \verbatim
  184. *> ALPHAI is REAL array, dimension (NSIZE)
  185. *> \endverbatim
  186. *>
  187. *> \param[out] BETA
  188. *> \verbatim
  189. *> BETA is REAL array, dimension (NSIZE)
  190. *>
  191. *> On exit, (ALPHAR + ALPHAI*i)/BETA are the eigenvalues.
  192. *> \endverbatim
  193. *>
  194. *> \param[out] VL
  195. *> \verbatim
  196. *> VL is REAL array, dimension (LDA, NSIZE)
  197. *> VL holds the left eigenvectors computed by SGGEVX.
  198. *> \endverbatim
  199. *>
  200. *> \param[out] VR
  201. *> \verbatim
  202. *> VR is REAL array, dimension (LDA, NSIZE)
  203. *> VR holds the right eigenvectors computed by SGGEVX.
  204. *> \endverbatim
  205. *>
  206. *> \param[out] ILO
  207. *> \verbatim
  208. *> ILO is INTEGER
  209. *> \endverbatim
  210. *>
  211. *> \param[out] IHI
  212. *> \verbatim
  213. *> IHI is INTEGER
  214. *> \endverbatim
  215. *>
  216. *> \param[out] LSCALE
  217. *> \verbatim
  218. *> LSCALE is REAL array, dimension (N)
  219. *> \endverbatim
  220. *>
  221. *> \param[out] RSCALE
  222. *> \verbatim
  223. *> RSCALE is REAL array, dimension (N)
  224. *> \endverbatim
  225. *>
  226. *> \param[out] S
  227. *> \verbatim
  228. *> S is REAL array, dimension (N)
  229. *> \endverbatim
  230. *>
  231. *> \param[out] STRU
  232. *> \verbatim
  233. *> STRU is REAL array, dimension (N)
  234. *> \endverbatim
  235. *>
  236. *> \param[out] DIF
  237. *> \verbatim
  238. *> DIF is REAL array, dimension (N)
  239. *> \endverbatim
  240. *>
  241. *> \param[out] DIFTRU
  242. *> \verbatim
  243. *> DIFTRU is REAL array, dimension (N)
  244. *> \endverbatim
  245. *>
  246. *> \param[out] WORK
  247. *> \verbatim
  248. *> WORK is REAL array, dimension (LWORK)
  249. *> \endverbatim
  250. *>
  251. *> \param[in] LWORK
  252. *> \verbatim
  253. *> LWORK is INTEGER
  254. *> Leading dimension of WORK. LWORK >= 2*N*N+12*N+16.
  255. *> \endverbatim
  256. *>
  257. *> \param[out] IWORK
  258. *> \verbatim
  259. *> IWORK is INTEGER array, dimension (LIWORK)
  260. *> \endverbatim
  261. *>
  262. *> \param[in] LIWORK
  263. *> \verbatim
  264. *> LIWORK is INTEGER
  265. *> Leading dimension of IWORK. Must be at least N+6.
  266. *> \endverbatim
  267. *>
  268. *> \param[out] RESULT
  269. *> \verbatim
  270. *> RESULT is REAL array, dimension (4)
  271. *> \endverbatim
  272. *>
  273. *> \param[out] BWORK
  274. *> \verbatim
  275. *> BWORK is LOGICAL array, dimension (N)
  276. *> \endverbatim
  277. *>
  278. *> \param[out] INFO
  279. *> \verbatim
  280. *> INFO is INTEGER
  281. *> = 0: successful exit
  282. *> < 0: if INFO = -i, the i-th argument had an illegal value.
  283. *> > 0: A routine returned an error code.
  284. *> \endverbatim
  285. *
  286. * Authors:
  287. * ========
  288. *
  289. *> \author Univ. of Tennessee
  290. *> \author Univ. of California Berkeley
  291. *> \author Univ. of Colorado Denver
  292. *> \author NAG Ltd.
  293. *
  294. *> \date June 2016
  295. *
  296. *> \ingroup single_eig
  297. *
  298. * =====================================================================
  299. SUBROUTINE SDRGVX( NSIZE, THRESH, NIN, NOUT, A, LDA, B, AI, BI,
  300. $ ALPHAR, ALPHAI, BETA, VL, VR, ILO, IHI, LSCALE,
  301. $ RSCALE, S, STRU, DIF, DIFTRU, WORK, LWORK,
  302. $ IWORK, LIWORK, RESULT, BWORK, INFO )
  303. *
  304. * -- LAPACK test routine (version 3.7.0) --
  305. * -- LAPACK is a software package provided by Univ. of Tennessee, --
  306. * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
  307. * June 2016
  308. *
  309. * .. Scalar Arguments ..
  310. INTEGER IHI, ILO, INFO, LDA, LIWORK, LWORK, NIN, NOUT,
  311. $ NSIZE
  312. REAL THRESH
  313. * ..
  314. * .. Array Arguments ..
  315. LOGICAL BWORK( * )
  316. INTEGER IWORK( * )
  317. REAL A( LDA, * ), AI( LDA, * ), ALPHAI( * ),
  318. $ ALPHAR( * ), B( LDA, * ), BETA( * ),
  319. $ BI( LDA, * ), DIF( * ), DIFTRU( * ),
  320. $ LSCALE( * ), RESULT( 4 ), RSCALE( * ), S( * ),
  321. $ STRU( * ), VL( LDA, * ), VR( LDA, * ),
  322. $ WORK( * )
  323. * ..
  324. *
  325. * =====================================================================
  326. *
  327. * .. Parameters ..
  328. REAL ZERO, ONE, TEN, TNTH, HALF
  329. PARAMETER ( ZERO = 0.0E+0, ONE = 1.0E+0, TEN = 1.0E+1,
  330. $ TNTH = 1.0E-1, HALF = 0.5D+0 )
  331. * ..
  332. * .. Local Scalars ..
  333. INTEGER I, IPTYPE, IWA, IWB, IWX, IWY, J, LINFO,
  334. $ MAXWRK, MINWRK, N, NERRS, NMAX, NPTKNT, NTESTT
  335. REAL ABNORM, ANORM, BNORM, RATIO1, RATIO2, THRSH2,
  336. $ ULP, ULPINV
  337. * ..
  338. * .. Local Arrays ..
  339. REAL WEIGHT( 5 )
  340. * ..
  341. * .. External Functions ..
  342. INTEGER ILAENV
  343. REAL SLAMCH, SLANGE
  344. EXTERNAL ILAENV, SLAMCH, SLANGE
  345. * ..
  346. * .. External Subroutines ..
  347. EXTERNAL ALASVM, SGET52, SGGEVX, SLACPY, SLATM6, XERBLA
  348. * ..
  349. * .. Intrinsic Functions ..
  350. INTRINSIC ABS, MAX, SQRT
  351. * ..
  352. * .. Executable Statements ..
  353. *
  354. * Check for errors
  355. *
  356. INFO = 0
  357. *
  358. NMAX = 5
  359. *
  360. IF( NSIZE.LT.0 ) THEN
  361. INFO = -1
  362. ELSE IF( THRESH.LT.ZERO ) THEN
  363. INFO = -2
  364. ELSE IF( NIN.LE.0 ) THEN
  365. INFO = -3
  366. ELSE IF( NOUT.LE.0 ) THEN
  367. INFO = -4
  368. ELSE IF( LDA.LT.1 .OR. LDA.LT.NMAX ) THEN
  369. INFO = -6
  370. ELSE IF( LIWORK.LT.NMAX+6 ) THEN
  371. INFO = -26
  372. END IF
  373. *
  374. * Compute workspace
  375. * (Note: Comments in the code beginning "Workspace:" describe the
  376. * minimal amount of workspace needed at that point in the code,
  377. * as well as the preferred amount for good performance.
  378. * NB refers to the optimal block size for the immediately
  379. * following subroutine, as returned by ILAENV.)
  380. *
  381. MINWRK = 1
  382. IF( INFO.EQ.0 .AND. LWORK.GE.1 ) THEN
  383. MINWRK = 2*NMAX*NMAX + 12*NMAX + 16
  384. MAXWRK = 6*NMAX + NMAX*ILAENV( 1, 'SGEQRF', ' ', NMAX, 1, NMAX,
  385. $ 0 )
  386. MAXWRK = MAX( MAXWRK, 2*NMAX*NMAX+12*NMAX+16 )
  387. WORK( 1 ) = MAXWRK
  388. END IF
  389. *
  390. IF( LWORK.LT.MINWRK )
  391. $ INFO = -24
  392. *
  393. IF( INFO.NE.0 ) THEN
  394. CALL XERBLA( 'SDRGVX', -INFO )
  395. RETURN
  396. END IF
  397. *
  398. N = 5
  399. ULP = SLAMCH( 'P' )
  400. ULPINV = ONE / ULP
  401. THRSH2 = TEN*THRESH
  402. NERRS = 0
  403. NPTKNT = 0
  404. NTESTT = 0
  405. *
  406. IF( NSIZE.EQ.0 )
  407. $ GO TO 90
  408. *
  409. * Parameters used for generating test matrices.
  410. *
  411. WEIGHT( 1 ) = TNTH
  412. WEIGHT( 2 ) = HALF
  413. WEIGHT( 3 ) = ONE
  414. WEIGHT( 4 ) = ONE / WEIGHT( 2 )
  415. WEIGHT( 5 ) = ONE / WEIGHT( 1 )
  416. *
  417. DO 80 IPTYPE = 1, 2
  418. DO 70 IWA = 1, 5
  419. DO 60 IWB = 1, 5
  420. DO 50 IWX = 1, 5
  421. DO 40 IWY = 1, 5
  422. *
  423. * generated a test matrix pair
  424. *
  425. CALL SLATM6( IPTYPE, 5, A, LDA, B, VR, LDA, VL,
  426. $ LDA, WEIGHT( IWA ), WEIGHT( IWB ),
  427. $ WEIGHT( IWX ), WEIGHT( IWY ), STRU,
  428. $ DIFTRU )
  429. *
  430. * Compute eigenvalues/eigenvectors of (A, B).
  431. * Compute eigenvalue/eigenvector condition numbers
  432. * using computed eigenvectors.
  433. *
  434. CALL SLACPY( 'F', N, N, A, LDA, AI, LDA )
  435. CALL SLACPY( 'F', N, N, B, LDA, BI, LDA )
  436. *
  437. CALL SGGEVX( 'N', 'V', 'V', 'B', N, AI, LDA, BI,
  438. $ LDA, ALPHAR, ALPHAI, BETA, VL, LDA,
  439. $ VR, LDA, ILO, IHI, LSCALE, RSCALE,
  440. $ ANORM, BNORM, S, DIF, WORK, LWORK,
  441. $ IWORK, BWORK, LINFO )
  442. IF( LINFO.NE.0 ) THEN
  443. RESULT( 1 ) = ULPINV
  444. WRITE( NOUT, FMT = 9999 )'SGGEVX', LINFO, N,
  445. $ IPTYPE
  446. GO TO 30
  447. END IF
  448. *
  449. * Compute the norm(A, B)
  450. *
  451. CALL SLACPY( 'Full', N, N, AI, LDA, WORK, N )
  452. CALL SLACPY( 'Full', N, N, BI, LDA, WORK( N*N+1 ),
  453. $ N )
  454. ABNORM = SLANGE( 'Fro', N, 2*N, WORK, N, WORK )
  455. *
  456. * Tests (1) and (2)
  457. *
  458. RESULT( 1 ) = ZERO
  459. CALL SGET52( .TRUE., N, A, LDA, B, LDA, VL, LDA,
  460. $ ALPHAR, ALPHAI, BETA, WORK,
  461. $ RESULT( 1 ) )
  462. IF( RESULT( 2 ).GT.THRESH ) THEN
  463. WRITE( NOUT, FMT = 9998 )'Left', 'SGGEVX',
  464. $ RESULT( 2 ), N, IPTYPE, IWA, IWB, IWX, IWY
  465. END IF
  466. *
  467. RESULT( 2 ) = ZERO
  468. CALL SGET52( .FALSE., N, A, LDA, B, LDA, VR, LDA,
  469. $ ALPHAR, ALPHAI, BETA, WORK,
  470. $ RESULT( 2 ) )
  471. IF( RESULT( 3 ).GT.THRESH ) THEN
  472. WRITE( NOUT, FMT = 9998 )'Right', 'SGGEVX',
  473. $ RESULT( 3 ), N, IPTYPE, IWA, IWB, IWX, IWY
  474. END IF
  475. *
  476. * Test (3)
  477. *
  478. RESULT( 3 ) = ZERO
  479. DO 10 I = 1, N
  480. IF( S( I ).EQ.ZERO ) THEN
  481. IF( STRU( I ).GT.ABNORM*ULP )
  482. $ RESULT( 3 ) = ULPINV
  483. ELSE IF( STRU( I ).EQ.ZERO ) THEN
  484. IF( S( I ).GT.ABNORM*ULP )
  485. $ RESULT( 3 ) = ULPINV
  486. ELSE
  487. WORK( I ) = MAX( ABS( STRU( I ) / S( I ) ),
  488. $ ABS( S( I ) / STRU( I ) ) )
  489. RESULT( 3 ) = MAX( RESULT( 3 ), WORK( I ) )
  490. END IF
  491. 10 CONTINUE
  492. *
  493. * Test (4)
  494. *
  495. RESULT( 4 ) = ZERO
  496. IF( DIF( 1 ).EQ.ZERO ) THEN
  497. IF( DIFTRU( 1 ).GT.ABNORM*ULP )
  498. $ RESULT( 4 ) = ULPINV
  499. ELSE IF( DIFTRU( 1 ).EQ.ZERO ) THEN
  500. IF( DIF( 1 ).GT.ABNORM*ULP )
  501. $ RESULT( 4 ) = ULPINV
  502. ELSE IF( DIF( 5 ).EQ.ZERO ) THEN
  503. IF( DIFTRU( 5 ).GT.ABNORM*ULP )
  504. $ RESULT( 4 ) = ULPINV
  505. ELSE IF( DIFTRU( 5 ).EQ.ZERO ) THEN
  506. IF( DIF( 5 ).GT.ABNORM*ULP )
  507. $ RESULT( 4 ) = ULPINV
  508. ELSE
  509. RATIO1 = MAX( ABS( DIFTRU( 1 ) / DIF( 1 ) ),
  510. $ ABS( DIF( 1 ) / DIFTRU( 1 ) ) )
  511. RATIO2 = MAX( ABS( DIFTRU( 5 ) / DIF( 5 ) ),
  512. $ ABS( DIF( 5 ) / DIFTRU( 5 ) ) )
  513. RESULT( 4 ) = MAX( RATIO1, RATIO2 )
  514. END IF
  515. *
  516. NTESTT = NTESTT + 4
  517. *
  518. * Print out tests which fail.
  519. *
  520. DO 20 J = 1, 4
  521. IF( ( RESULT( J ).GE.THRSH2 .AND. J.GE.4 ) .OR.
  522. $ ( RESULT( J ).GE.THRESH .AND. J.LE.3 ) )
  523. $ THEN
  524. *
  525. * If this is the first test to fail,
  526. * print a header to the data file.
  527. *
  528. IF( NERRS.EQ.0 ) THEN
  529. WRITE( NOUT, FMT = 9997 )'SXV'
  530. *
  531. * Print out messages for built-in examples
  532. *
  533. * Matrix types
  534. *
  535. WRITE( NOUT, FMT = 9995 )
  536. WRITE( NOUT, FMT = 9994 )
  537. WRITE( NOUT, FMT = 9993 )
  538. *
  539. * Tests performed
  540. *
  541. WRITE( NOUT, FMT = 9992 )'''',
  542. $ 'transpose', ''''
  543. *
  544. END IF
  545. NERRS = NERRS + 1
  546. IF( RESULT( J ).LT.10000.0 ) THEN
  547. WRITE( NOUT, FMT = 9991 )IPTYPE, IWA,
  548. $ IWB, IWX, IWY, J, RESULT( J )
  549. ELSE
  550. WRITE( NOUT, FMT = 9990 )IPTYPE, IWA,
  551. $ IWB, IWX, IWY, J, RESULT( J )
  552. END IF
  553. END IF
  554. 20 CONTINUE
  555. *
  556. 30 CONTINUE
  557. *
  558. 40 CONTINUE
  559. 50 CONTINUE
  560. 60 CONTINUE
  561. 70 CONTINUE
  562. 80 CONTINUE
  563. *
  564. GO TO 150
  565. *
  566. 90 CONTINUE
  567. *
  568. * Read in data from file to check accuracy of condition estimation
  569. * Read input data until N=0
  570. *
  571. READ( NIN, FMT = *, END = 150 )N
  572. IF( N.EQ.0 )
  573. $ GO TO 150
  574. DO 100 I = 1, N
  575. READ( NIN, FMT = * )( A( I, J ), J = 1, N )
  576. 100 CONTINUE
  577. DO 110 I = 1, N
  578. READ( NIN, FMT = * )( B( I, J ), J = 1, N )
  579. 110 CONTINUE
  580. READ( NIN, FMT = * )( STRU( I ), I = 1, N )
  581. READ( NIN, FMT = * )( DIFTRU( I ), I = 1, N )
  582. *
  583. NPTKNT = NPTKNT + 1
  584. *
  585. * Compute eigenvalues/eigenvectors of (A, B).
  586. * Compute eigenvalue/eigenvector condition numbers
  587. * using computed eigenvectors.
  588. *
  589. CALL SLACPY( 'F', N, N, A, LDA, AI, LDA )
  590. CALL SLACPY( 'F', N, N, B, LDA, BI, LDA )
  591. *
  592. CALL SGGEVX( 'N', 'V', 'V', 'B', N, AI, LDA, BI, LDA, ALPHAR,
  593. $ ALPHAI, BETA, VL, LDA, VR, LDA, ILO, IHI, LSCALE,
  594. $ RSCALE, ANORM, BNORM, S, DIF, WORK, LWORK, IWORK,
  595. $ BWORK, LINFO )
  596. *
  597. IF( LINFO.NE.0 ) THEN
  598. RESULT( 1 ) = ULPINV
  599. WRITE( NOUT, FMT = 9987 )'SGGEVX', LINFO, N, NPTKNT
  600. GO TO 140
  601. END IF
  602. *
  603. * Compute the norm(A, B)
  604. *
  605. CALL SLACPY( 'Full', N, N, AI, LDA, WORK, N )
  606. CALL SLACPY( 'Full', N, N, BI, LDA, WORK( N*N+1 ), N )
  607. ABNORM = SLANGE( 'Fro', N, 2*N, WORK, N, WORK )
  608. *
  609. * Tests (1) and (2)
  610. *
  611. RESULT( 1 ) = ZERO
  612. CALL SGET52( .TRUE., N, A, LDA, B, LDA, VL, LDA, ALPHAR, ALPHAI,
  613. $ BETA, WORK, RESULT( 1 ) )
  614. IF( RESULT( 2 ).GT.THRESH ) THEN
  615. WRITE( NOUT, FMT = 9986 )'Left', 'SGGEVX', RESULT( 2 ), N,
  616. $ NPTKNT
  617. END IF
  618. *
  619. RESULT( 2 ) = ZERO
  620. CALL SGET52( .FALSE., N, A, LDA, B, LDA, VR, LDA, ALPHAR, ALPHAI,
  621. $ BETA, WORK, RESULT( 2 ) )
  622. IF( RESULT( 3 ).GT.THRESH ) THEN
  623. WRITE( NOUT, FMT = 9986 )'Right', 'SGGEVX', RESULT( 3 ), N,
  624. $ NPTKNT
  625. END IF
  626. *
  627. * Test (3)
  628. *
  629. RESULT( 3 ) = ZERO
  630. DO 120 I = 1, N
  631. IF( S( I ).EQ.ZERO ) THEN
  632. IF( STRU( I ).GT.ABNORM*ULP )
  633. $ RESULT( 3 ) = ULPINV
  634. ELSE IF( STRU( I ).EQ.ZERO ) THEN
  635. IF( S( I ).GT.ABNORM*ULP )
  636. $ RESULT( 3 ) = ULPINV
  637. ELSE
  638. WORK( I ) = MAX( ABS( STRU( I ) / S( I ) ),
  639. $ ABS( S( I ) / STRU( I ) ) )
  640. RESULT( 3 ) = MAX( RESULT( 3 ), WORK( I ) )
  641. END IF
  642. 120 CONTINUE
  643. *
  644. * Test (4)
  645. *
  646. RESULT( 4 ) = ZERO
  647. IF( DIF( 1 ).EQ.ZERO ) THEN
  648. IF( DIFTRU( 1 ).GT.ABNORM*ULP )
  649. $ RESULT( 4 ) = ULPINV
  650. ELSE IF( DIFTRU( 1 ).EQ.ZERO ) THEN
  651. IF( DIF( 1 ).GT.ABNORM*ULP )
  652. $ RESULT( 4 ) = ULPINV
  653. ELSE IF( DIF( 5 ).EQ.ZERO ) THEN
  654. IF( DIFTRU( 5 ).GT.ABNORM*ULP )
  655. $ RESULT( 4 ) = ULPINV
  656. ELSE IF( DIFTRU( 5 ).EQ.ZERO ) THEN
  657. IF( DIF( 5 ).GT.ABNORM*ULP )
  658. $ RESULT( 4 ) = ULPINV
  659. ELSE
  660. RATIO1 = MAX( ABS( DIFTRU( 1 ) / DIF( 1 ) ),
  661. $ ABS( DIF( 1 ) / DIFTRU( 1 ) ) )
  662. RATIO2 = MAX( ABS( DIFTRU( 5 ) / DIF( 5 ) ),
  663. $ ABS( DIF( 5 ) / DIFTRU( 5 ) ) )
  664. RESULT( 4 ) = MAX( RATIO1, RATIO2 )
  665. END IF
  666. *
  667. NTESTT = NTESTT + 4
  668. *
  669. * Print out tests which fail.
  670. *
  671. DO 130 J = 1, 4
  672. IF( RESULT( J ).GE.THRSH2 ) 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 = 9997 )'SXV'
  679. *
  680. * Print out messages for built-in examples
  681. *
  682. * Matrix types
  683. *
  684. WRITE( NOUT, FMT = 9996 )
  685. *
  686. * Tests performed
  687. *
  688. WRITE( NOUT, FMT = 9992 )'''', 'transpose', ''''
  689. *
  690. END IF
  691. NERRS = NERRS + 1
  692. IF( RESULT( J ).LT.10000.0 ) THEN
  693. WRITE( NOUT, FMT = 9989 )NPTKNT, N, J, RESULT( J )
  694. ELSE
  695. WRITE( NOUT, FMT = 9988 )NPTKNT, N, J, RESULT( J )
  696. END IF
  697. END IF
  698. 130 CONTINUE
  699. *
  700. 140 CONTINUE
  701. *
  702. GO TO 90
  703. 150 CONTINUE
  704. *
  705. * Summary
  706. *
  707. CALL ALASVM( 'SXV', NOUT, NERRS, NTESTT, 0 )
  708. *
  709. WORK( 1 ) = MAXWRK
  710. *
  711. RETURN
  712. *
  713. 9999 FORMAT( ' SDRGVX: ', A, ' returned INFO=', I6, '.', / 9X, 'N=',
  714. $ I6, ', JTYPE=', I6, ')' )
  715. *
  716. 9998 FORMAT( ' SDRGVX: ', A, ' Eigenvectors from ', A, ' incorrectly ',
  717. $ 'normalized.', / ' Bits of error=', 0P, G10.3, ',', 9X,
  718. $ 'N=', I6, ', JTYPE=', I6, ', IWA=', I5, ', IWB=', I5,
  719. $ ', IWX=', I5, ', IWY=', I5 )
  720. *
  721. 9997 FORMAT( / 1X, A3, ' -- Real Expert Eigenvalue/vector',
  722. $ ' problem driver' )
  723. *
  724. 9996 FORMAT( ' Input Example' )
  725. *
  726. 9995 FORMAT( ' Matrix types: ', / )
  727. *
  728. 9994 FORMAT( ' TYPE 1: Da is diagonal, Db is identity, ',
  729. $ / ' A = Y^(-H) Da X^(-1), B = Y^(-H) Db X^(-1) ',
  730. $ / ' YH and X are left and right eigenvectors. ', / )
  731. *
  732. 9993 FORMAT( ' TYPE 2: Da is quasi-diagonal, Db is identity, ',
  733. $ / ' A = Y^(-H) Da X^(-1), B = Y^(-H) Db X^(-1) ',
  734. $ / ' YH and X are left and right eigenvectors. ', / )
  735. *
  736. 9992 FORMAT( / ' Tests performed: ', / 4X,
  737. $ ' a is alpha, b is beta, l is a left eigenvector, ', / 4X,
  738. $ ' r is a right eigenvector and ', A, ' means ', A, '.',
  739. $ / ' 1 = max | ( b A - a B )', A, ' l | / const.',
  740. $ / ' 2 = max | ( b A - a B ) r | / const.',
  741. $ / ' 3 = max ( Sest/Stru, Stru/Sest ) ',
  742. $ ' over all eigenvalues', /
  743. $ ' 4 = max( DIFest/DIFtru, DIFtru/DIFest ) ',
  744. $ ' over the 1st and 5th eigenvectors', / )
  745. *
  746. 9991 FORMAT( ' Type=', I2, ',', ' IWA=', I2, ', IWB=', I2, ', IWX=',
  747. $ I2, ', IWY=', I2, ', result ', I2, ' is', 0P, F8.2 )
  748. 9990 FORMAT( ' Type=', I2, ',', ' IWA=', I2, ', IWB=', I2, ', IWX=',
  749. $ I2, ', IWY=', I2, ', result ', I2, ' is', 1P, E10.3 )
  750. 9989 FORMAT( ' Input example #', I2, ', matrix order=', I4, ',',
  751. $ ' result ', I2, ' is', 0P, F8.2 )
  752. 9988 FORMAT( ' Input example #', I2, ', matrix order=', I4, ',',
  753. $ ' result ', I2, ' is', 1P, E10.3 )
  754. 9987 FORMAT( ' SDRGVX: ', A, ' returned INFO=', I6, '.', / 9X, 'N=',
  755. $ I6, ', Input example #', I2, ')' )
  756. *
  757. 9986 FORMAT( ' SDRGVX: ', A, ' Eigenvectors from ', A, ' incorrectly ',
  758. $ 'normalized.', / ' Bits of error=', 0P, G10.3, ',', 9X,
  759. $ 'N=', I6, ', Input Example #', I2, ')' )
  760. *
  761. *
  762. * End of SDRGVX
  763. *
  764. END