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.

zchkhb2stg.f 32 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891
  1. *> \brief \b ZCHKHB2STG
  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 ZCHKHB2STG( NSIZES, NN, NWDTHS, KK, NTYPES, DOTYPE,
  12. * ISEED, THRESH, NOUNIT, A, LDA, SD, SE, D1,
  13. * D2, D3, U, LDU, WORK, LWORK, RWORK RESULT,
  14. * INFO )
  15. *
  16. * .. Scalar Arguments ..
  17. * INTEGER INFO, LDA, LDU, LWORK, NOUNIT, NSIZES, NTYPES,
  18. * $ NWDTHS
  19. * DOUBLE PRECISION THRESH
  20. * ..
  21. * .. Array Arguments ..
  22. * LOGICAL DOTYPE( * )
  23. * INTEGER ISEED( 4 ), KK( * ), NN( * )
  24. * DOUBLE PRECISION RESULT( * ), RWORK( * ), SD( * ), SE( * ),
  25. * $ D1( * ), D2( * ), D3( * )
  26. * COMPLEX*16 A( LDA, * ), U( LDU, * ), WORK( * )
  27. * ..
  28. *
  29. *
  30. *> \par Purpose:
  31. * =============
  32. *>
  33. *> \verbatim
  34. *>
  35. *> ZCHKHB2STG tests the reduction of a Hermitian band matrix to tridiagonal
  36. *> from, used with the Hermitian eigenvalue problem.
  37. *>
  38. *> ZHBTRD factors a Hermitian band matrix A as U S U* , where * means
  39. *> conjugate transpose, S is symmetric tridiagonal, and U is unitary.
  40. *> ZHBTRD can use either just the lower or just the upper triangle
  41. *> of A; ZCHKHB2STG checks both cases.
  42. *>
  43. *> ZHETRD_HB2ST factors a Hermitian band matrix A as U S U* ,
  44. *> where * means conjugate transpose, S is symmetric tridiagonal, and U is
  45. *> unitary. ZHETRD_HB2ST can use either just the lower or just
  46. *> the upper triangle of A; ZCHKHB2STG checks both cases.
  47. *>
  48. *> DSTEQR factors S as Z D1 Z'.
  49. *> D1 is the matrix of eigenvalues computed when Z is not computed
  50. *> and from the S resulting of DSBTRD "U" (used as reference for DSYTRD_SB2ST)
  51. *> D2 is the matrix of eigenvalues computed when Z is not computed
  52. *> and from the S resulting of DSYTRD_SB2ST "U".
  53. *> D3 is the matrix of eigenvalues computed when Z is not computed
  54. *> and from the S resulting of DSYTRD_SB2ST "L".
  55. *>
  56. *> When ZCHKHB2STG is called, a number of matrix "sizes" ("n's"), a number
  57. *> of bandwidths ("k's"), and a number of matrix "types" are
  58. *> specified. For each size ("n"), each bandwidth ("k") less than or
  59. *> equal to "n", and each type of matrix, one matrix will be generated
  60. *> and used to test the hermitian banded reduction routine. For each
  61. *> matrix, a number of tests will be performed:
  62. *>
  63. *> (1) | A - V S V* | / ( |A| n ulp ) computed by ZHBTRD with
  64. *> UPLO='U'
  65. *>
  66. *> (2) | I - UU* | / ( n ulp )
  67. *>
  68. *> (3) | A - V S V* | / ( |A| n ulp ) computed by ZHBTRD with
  69. *> UPLO='L'
  70. *>
  71. *> (4) | I - UU* | / ( n ulp )
  72. *>
  73. *> (5) | D1 - D2 | / ( |D1| ulp ) where D1 is computed by
  74. *> DSBTRD with UPLO='U' and
  75. *> D2 is computed by
  76. *> ZHETRD_HB2ST with UPLO='U'
  77. *>
  78. *> (6) | D1 - D3 | / ( |D1| ulp ) where D1 is computed by
  79. *> DSBTRD with UPLO='U' and
  80. *> D3 is computed by
  81. *> ZHETRD_HB2ST with UPLO='L'
  82. *>
  83. *> The "sizes" are specified by an array NN(1:NSIZES); the value of
  84. *> each element NN(j) specifies one size.
  85. *> The "types" are specified by a logical array DOTYPE( 1:NTYPES );
  86. *> if DOTYPE(j) is .TRUE., then matrix type "j" will be generated.
  87. *> Currently, the list of possible types is:
  88. *>
  89. *> (1) The zero matrix.
  90. *> (2) The identity matrix.
  91. *>
  92. *> (3) A diagonal matrix with evenly spaced entries
  93. *> 1, ..., ULP and random signs.
  94. *> (ULP = (first number larger than 1) - 1 )
  95. *> (4) A diagonal matrix with geometrically spaced entries
  96. *> 1, ..., ULP and random signs.
  97. *> (5) A diagonal matrix with "clustered" entries 1, ULP, ..., ULP
  98. *> and random signs.
  99. *>
  100. *> (6) Same as (4), but multiplied by SQRT( overflow threshold )
  101. *> (7) Same as (4), but multiplied by SQRT( underflow threshold )
  102. *>
  103. *> (8) A matrix of the form U* D U, where U is unitary and
  104. *> D has evenly spaced entries 1, ..., ULP with random signs
  105. *> on the diagonal.
  106. *>
  107. *> (9) A matrix of the form U* D U, where U is unitary and
  108. *> D has geometrically spaced entries 1, ..., ULP with random
  109. *> signs on the diagonal.
  110. *>
  111. *> (10) A matrix of the form U* D U, where U is unitary and
  112. *> D has "clustered" entries 1, ULP,..., ULP with random
  113. *> signs on the diagonal.
  114. *>
  115. *> (11) Same as (8), but multiplied by SQRT( overflow threshold )
  116. *> (12) Same as (8), but multiplied by SQRT( underflow threshold )
  117. *>
  118. *> (13) Hermitian matrix with random entries chosen from (-1,1).
  119. *> (14) Same as (13), but multiplied by SQRT( overflow threshold )
  120. *> (15) Same as (13), but multiplied by SQRT( underflow threshold )
  121. *> \endverbatim
  122. *
  123. * Arguments:
  124. * ==========
  125. *
  126. *> \param[in] NSIZES
  127. *> \verbatim
  128. *> NSIZES is INTEGER
  129. *> The number of sizes of matrices to use. If it is zero,
  130. *> ZCHKHB2STG does nothing. It must be at least zero.
  131. *> \endverbatim
  132. *>
  133. *> \param[in] NN
  134. *> \verbatim
  135. *> NN is INTEGER array, dimension (NSIZES)
  136. *> An array containing the sizes to be used for the matrices.
  137. *> Zero values will be skipped. The values must be at least
  138. *> zero.
  139. *> \endverbatim
  140. *>
  141. *> \param[in] NWDTHS
  142. *> \verbatim
  143. *> NWDTHS is INTEGER
  144. *> The number of bandwidths to use. If it is zero,
  145. *> ZCHKHB2STG does nothing. It must be at least zero.
  146. *> \endverbatim
  147. *>
  148. *> \param[in] KK
  149. *> \verbatim
  150. *> KK is INTEGER array, dimension (NWDTHS)
  151. *> An array containing the bandwidths to be used for the band
  152. *> matrices. The values must be at least zero.
  153. *> \endverbatim
  154. *>
  155. *> \param[in] NTYPES
  156. *> \verbatim
  157. *> NTYPES is INTEGER
  158. *> The number of elements in DOTYPE. If it is zero, ZCHKHB2STG
  159. *> does nothing. It must be at least zero. If it is MAXTYP+1
  160. *> and NSIZES is 1, then an additional type, MAXTYP+1 is
  161. *> defined, which is to use whatever matrix is in A. This
  162. *> is only useful if DOTYPE(1:MAXTYP) is .FALSE. and
  163. *> DOTYPE(MAXTYP+1) is .TRUE. .
  164. *> \endverbatim
  165. *>
  166. *> \param[in] DOTYPE
  167. *> \verbatim
  168. *> DOTYPE is LOGICAL array, dimension (NTYPES)
  169. *> If DOTYPE(j) is .TRUE., then for each size in NN a
  170. *> matrix of that size and of type j will be generated.
  171. *> If NTYPES is smaller than the maximum number of types
  172. *> defined (PARAMETER MAXTYP), then types NTYPES+1 through
  173. *> MAXTYP will not be generated. If NTYPES is larger
  174. *> than MAXTYP, DOTYPE(MAXTYP+1) through DOTYPE(NTYPES)
  175. *> will be ignored.
  176. *> \endverbatim
  177. *>
  178. *> \param[in,out] ISEED
  179. *> \verbatim
  180. *> ISEED is INTEGER array, dimension (4)
  181. *> On entry ISEED specifies the seed of the random number
  182. *> generator. The array elements should be between 0 and 4095;
  183. *> if not they will be reduced mod 4096. Also, ISEED(4) must
  184. *> be odd. The random number generator uses a linear
  185. *> congruential sequence limited to small integers, and so
  186. *> should produce machine independent random numbers. The
  187. *> values of ISEED are changed on exit, and can be used in the
  188. *> next call to ZCHKHB2STG to continue the same random number
  189. *> sequence.
  190. *> \endverbatim
  191. *>
  192. *> \param[in] THRESH
  193. *> \verbatim
  194. *> THRESH is DOUBLE PRECISION
  195. *> A test will count as "failed" if the "error", computed as
  196. *> described above, exceeds THRESH. Note that the error
  197. *> is scaled to be O(1), so THRESH should be a reasonably
  198. *> small multiple of 1, e.g., 10 or 100. In particular,
  199. *> it should not depend on the precision (single vs. double)
  200. *> or the size of the matrix. It must be at least zero.
  201. *> \endverbatim
  202. *>
  203. *> \param[in] NOUNIT
  204. *> \verbatim
  205. *> NOUNIT is INTEGER
  206. *> The FORTRAN unit number for printing out error messages
  207. *> (e.g., if a routine returns IINFO not equal to 0.)
  208. *> \endverbatim
  209. *>
  210. *> \param[in,out] A
  211. *> \verbatim
  212. *> A is COMPLEX*16 array, dimension
  213. *> (LDA, max(NN))
  214. *> Used to hold the matrix whose eigenvalues are to be
  215. *> computed.
  216. *> \endverbatim
  217. *>
  218. *> \param[in] LDA
  219. *> \verbatim
  220. *> LDA is INTEGER
  221. *> The leading dimension of A. It must be at least 2 (not 1!)
  222. *> and at least max( KK )+1.
  223. *> \endverbatim
  224. *>
  225. *> \param[out] SD
  226. *> \verbatim
  227. *> SD is DOUBLE PRECISION array, dimension (max(NN))
  228. *> Used to hold the diagonal of the tridiagonal matrix computed
  229. *> by ZHBTRD.
  230. *> \endverbatim
  231. *>
  232. *> \param[out] SE
  233. *> \verbatim
  234. *> SE is DOUBLE PRECISION array, dimension (max(NN))
  235. *> Used to hold the off-diagonal of the tridiagonal matrix
  236. *> computed by ZHBTRD.
  237. *> \endverbatim
  238. *>
  239. *> \param[out] D1
  240. *> \verbatim
  241. *> D1 is DOUBLE PRECISION array, dimension (max(NN))
  242. *> \endverbatim
  243. *>
  244. *> \param[out] D2
  245. *> \verbatim
  246. *> D2 is DOUBLE PRECISION array, dimension (max(NN))
  247. *> \endverbatim
  248. *>*> \param[out] D3
  249. *> \verbatim
  250. *> D3 is DOUBLE PRECISION array, dimension (max(NN))
  251. *> \endverbatim
  252. *>
  253. *> \param[out] U
  254. *> \verbatim
  255. *> U is COMPLEX*16 array, dimension (LDU, max(NN))
  256. *> Used to hold the unitary matrix computed by ZHBTRD.
  257. *> \endverbatim
  258. *>
  259. *> \param[in] LDU
  260. *> \verbatim
  261. *> LDU is INTEGER
  262. *> The leading dimension of U. It must be at least 1
  263. *> and at least max( NN ).
  264. *> \endverbatim
  265. *>
  266. *> \param[out] WORK
  267. *> \verbatim
  268. *> WORK is COMPLEX*16 array, dimension (LWORK)
  269. *> \endverbatim
  270. *>
  271. *> \param[in] LWORK
  272. *> \verbatim
  273. *> LWORK is INTEGER
  274. *> The number of entries in WORK. This must be at least
  275. *> max( LDA+1, max(NN)+1 )*max(NN).
  276. *> \endverbatim
  277. *>
  278. *> \param[out] RWORK
  279. *> \verbatim
  280. *> RWORK is DOUBLE PRECISION array
  281. *> \endverbatim
  282. *>
  283. *> \param[out] RESULT
  284. *> \verbatim
  285. *> RESULT is DOUBLE PRECISION array, dimension (4)
  286. *> The values computed by the tests described above.
  287. *> The values are currently limited to 1/ulp, to avoid
  288. *> overflow.
  289. *> \endverbatim
  290. *>
  291. *> \param[out] INFO
  292. *> \verbatim
  293. *> INFO is INTEGER
  294. *> If 0, then everything ran OK.
  295. *>
  296. *>-----------------------------------------------------------------------
  297. *>
  298. *> Some Local Variables and Parameters:
  299. *> ---- ----- --------- --- ----------
  300. *> ZERO, ONE Real 0 and 1.
  301. *> MAXTYP The number of types defined.
  302. *> NTEST The number of tests performed, or which can
  303. *> be performed so far, for the current matrix.
  304. *> NTESTT The total number of tests performed so far.
  305. *> NMAX Largest value in NN.
  306. *> NMATS The number of matrices generated so far.
  307. *> NERRS The number of tests which have exceeded THRESH
  308. *> so far.
  309. *> COND, IMODE Values to be passed to the matrix generators.
  310. *> ANORM Norm of A; passed to matrix generators.
  311. *>
  312. *> OVFL, UNFL Overflow and underflow thresholds.
  313. *> ULP, ULPINV Finest relative precision and its inverse.
  314. *> RTOVFL, RTUNFL Square roots of the previous 2 values.
  315. *> The following four arrays decode JTYPE:
  316. *> KTYPE(j) The general type (1-10) for type "j".
  317. *> KMODE(j) The MODE value to be passed to the matrix
  318. *> generator for type "j".
  319. *> KMAGN(j) The order of magnitude ( O(1),
  320. *> O(overflow^(1/2) ), O(underflow^(1/2) )
  321. *> \endverbatim
  322. *
  323. * Authors:
  324. * ========
  325. *
  326. *> \author Univ. of Tennessee
  327. *> \author Univ. of California Berkeley
  328. *> \author Univ. of Colorado Denver
  329. *> \author NAG Ltd.
  330. *
  331. *> \ingroup complex16_eig
  332. *
  333. * =====================================================================
  334. SUBROUTINE ZCHKHB2STG( NSIZES, NN, NWDTHS, KK, NTYPES, DOTYPE,
  335. $ ISEED, THRESH, NOUNIT, A, LDA, SD, SE, D1,
  336. $ D2, D3, U, LDU, WORK, LWORK, RWORK, RESULT,
  337. $ INFO )
  338. *
  339. * -- LAPACK test routine --
  340. * -- LAPACK is a software package provided by Univ. of Tennessee, --
  341. * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
  342. *
  343. * .. Scalar Arguments ..
  344. INTEGER INFO, LDA, LDU, LWORK, NOUNIT, NSIZES, NTYPES,
  345. $ NWDTHS
  346. DOUBLE PRECISION THRESH
  347. * ..
  348. * .. Array Arguments ..
  349. LOGICAL DOTYPE( * )
  350. INTEGER ISEED( 4 ), KK( * ), NN( * )
  351. DOUBLE PRECISION RESULT( * ), RWORK( * ), SD( * ), SE( * ),
  352. $ D1( * ), D2( * ), D3( * )
  353. COMPLEX*16 A( LDA, * ), U( LDU, * ), WORK( * )
  354. * ..
  355. *
  356. * =====================================================================
  357. *
  358. * .. Parameters ..
  359. COMPLEX*16 CZERO, CONE
  360. PARAMETER ( CZERO = ( 0.0D+0, 0.0D+0 ),
  361. $ CONE = ( 1.0D+0, 0.0D+0 ) )
  362. DOUBLE PRECISION ZERO, ONE, TWO, TEN
  363. PARAMETER ( ZERO = 0.0D+0, ONE = 1.0D+0, TWO = 2.0D+0,
  364. $ TEN = 10.0D+0 )
  365. DOUBLE PRECISION HALF
  366. PARAMETER ( HALF = ONE / TWO )
  367. INTEGER MAXTYP
  368. PARAMETER ( MAXTYP = 15 )
  369. * ..
  370. * .. Local Scalars ..
  371. LOGICAL BADNN, BADNNB
  372. INTEGER I, IINFO, IMODE, ITYPE, J, JC, JCOL, JR, JSIZE,
  373. $ JTYPE, JWIDTH, K, KMAX, LH, LW, MTYPES, N,
  374. $ NERRS, NMATS, NMAX, NTEST, NTESTT
  375. DOUBLE PRECISION ANINV, ANORM, COND, OVFL, RTOVFL, RTUNFL,
  376. $ TEMP1, TEMP2, TEMP3, TEMP4, ULP, ULPINV, UNFL
  377. * ..
  378. * .. Local Arrays ..
  379. INTEGER IDUMMA( 1 ), IOLDSD( 4 ), KMAGN( MAXTYP ),
  380. $ KMODE( MAXTYP ), KTYPE( MAXTYP )
  381. * ..
  382. * .. External Functions ..
  383. DOUBLE PRECISION DLAMCH
  384. EXTERNAL DLAMCH
  385. * ..
  386. * .. External Subroutines ..
  387. EXTERNAL DLASUM, XERBLA, ZHBT21, ZHBTRD, ZLACPY, ZLASET,
  388. $ ZLATMR, ZLATMS, ZHETRD_HB2ST, ZSTEQR
  389. * ..
  390. * .. Intrinsic Functions ..
  391. INTRINSIC ABS, DBLE, DCONJG, MAX, MIN, SQRT
  392. * ..
  393. * .. Data statements ..
  394. DATA KTYPE / 1, 2, 5*4, 5*5, 3*8 /
  395. DATA KMAGN / 2*1, 1, 1, 1, 2, 3, 1, 1, 1, 2, 3, 1,
  396. $ 2, 3 /
  397. DATA KMODE / 2*0, 4, 3, 1, 4, 4, 4, 3, 1, 4, 4, 0,
  398. $ 0, 0 /
  399. * ..
  400. * .. Executable Statements ..
  401. *
  402. * Check for errors
  403. *
  404. NTESTT = 0
  405. INFO = 0
  406. *
  407. * Important constants
  408. *
  409. BADNN = .FALSE.
  410. NMAX = 1
  411. DO 10 J = 1, NSIZES
  412. NMAX = MAX( NMAX, NN( J ) )
  413. IF( NN( J ).LT.0 )
  414. $ BADNN = .TRUE.
  415. 10 CONTINUE
  416. *
  417. BADNNB = .FALSE.
  418. KMAX = 0
  419. DO 20 J = 1, NSIZES
  420. KMAX = MAX( KMAX, KK( J ) )
  421. IF( KK( J ).LT.0 )
  422. $ BADNNB = .TRUE.
  423. 20 CONTINUE
  424. KMAX = MIN( NMAX-1, KMAX )
  425. *
  426. * Check for errors
  427. *
  428. IF( NSIZES.LT.0 ) THEN
  429. INFO = -1
  430. ELSE IF( BADNN ) THEN
  431. INFO = -2
  432. ELSE IF( NWDTHS.LT.0 ) THEN
  433. INFO = -3
  434. ELSE IF( BADNNB ) THEN
  435. INFO = -4
  436. ELSE IF( NTYPES.LT.0 ) THEN
  437. INFO = -5
  438. ELSE IF( LDA.LT.KMAX+1 ) THEN
  439. INFO = -11
  440. ELSE IF( LDU.LT.NMAX ) THEN
  441. INFO = -15
  442. ELSE IF( ( MAX( LDA, NMAX )+1 )*NMAX.GT.LWORK ) THEN
  443. INFO = -17
  444. END IF
  445. *
  446. IF( INFO.NE.0 ) THEN
  447. CALL XERBLA( 'ZCHKHB2STG', -INFO )
  448. RETURN
  449. END IF
  450. *
  451. * Quick return if possible
  452. *
  453. IF( NSIZES.EQ.0 .OR. NTYPES.EQ.0 .OR. NWDTHS.EQ.0 )
  454. $ RETURN
  455. *
  456. * More Important constants
  457. *
  458. UNFL = DLAMCH( 'Safe minimum' )
  459. OVFL = ONE / UNFL
  460. ULP = DLAMCH( 'Epsilon' )*DLAMCH( 'Base' )
  461. ULPINV = ONE / ULP
  462. RTUNFL = SQRT( UNFL )
  463. RTOVFL = SQRT( OVFL )
  464. *
  465. * Loop over sizes, types
  466. *
  467. NERRS = 0
  468. NMATS = 0
  469. *
  470. DO 190 JSIZE = 1, NSIZES
  471. N = NN( JSIZE )
  472. ANINV = ONE / DBLE( MAX( 1, N ) )
  473. *
  474. DO 180 JWIDTH = 1, NWDTHS
  475. K = KK( JWIDTH )
  476. IF( K.GT.N )
  477. $ GO TO 180
  478. K = MAX( 0, MIN( N-1, K ) )
  479. *
  480. IF( NSIZES.NE.1 ) THEN
  481. MTYPES = MIN( MAXTYP, NTYPES )
  482. ELSE
  483. MTYPES = MIN( MAXTYP+1, NTYPES )
  484. END IF
  485. *
  486. DO 170 JTYPE = 1, MTYPES
  487. IF( .NOT.DOTYPE( JTYPE ) )
  488. $ GO TO 170
  489. NMATS = NMATS + 1
  490. NTEST = 0
  491. *
  492. DO 30 J = 1, 4
  493. IOLDSD( J ) = ISEED( J )
  494. 30 CONTINUE
  495. *
  496. * Compute "A".
  497. * Store as "Upper"; later, we will copy to other format.
  498. *
  499. * Control parameters:
  500. *
  501. * KMAGN KMODE KTYPE
  502. * =1 O(1) clustered 1 zero
  503. * =2 large clustered 2 identity
  504. * =3 small exponential (none)
  505. * =4 arithmetic diagonal, (w/ eigenvalues)
  506. * =5 random log hermitian, w/ eigenvalues
  507. * =6 random (none)
  508. * =7 random diagonal
  509. * =8 random hermitian
  510. * =9 positive definite
  511. * =10 diagonally dominant tridiagonal
  512. *
  513. IF( MTYPES.GT.MAXTYP )
  514. $ GO TO 100
  515. *
  516. ITYPE = KTYPE( JTYPE )
  517. IMODE = KMODE( JTYPE )
  518. *
  519. * Compute norm
  520. *
  521. GO TO ( 40, 50, 60 )KMAGN( JTYPE )
  522. *
  523. 40 CONTINUE
  524. ANORM = ONE
  525. GO TO 70
  526. *
  527. 50 CONTINUE
  528. ANORM = ( RTOVFL*ULP )*ANINV
  529. GO TO 70
  530. *
  531. 60 CONTINUE
  532. ANORM = RTUNFL*N*ULPINV
  533. GO TO 70
  534. *
  535. 70 CONTINUE
  536. *
  537. CALL ZLASET( 'Full', LDA, N, CZERO, CZERO, A, LDA )
  538. IINFO = 0
  539. IF( JTYPE.LE.15 ) THEN
  540. COND = ULPINV
  541. ELSE
  542. COND = ULPINV*ANINV / TEN
  543. END IF
  544. *
  545. * Special Matrices -- Identity & Jordan block
  546. *
  547. * Zero
  548. *
  549. IF( ITYPE.EQ.1 ) THEN
  550. IINFO = 0
  551. *
  552. ELSE IF( ITYPE.EQ.2 ) THEN
  553. *
  554. * Identity
  555. *
  556. DO 80 JCOL = 1, N
  557. A( K+1, JCOL ) = ANORM
  558. 80 CONTINUE
  559. *
  560. ELSE IF( ITYPE.EQ.4 ) THEN
  561. *
  562. * Diagonal Matrix, [Eigen]values Specified
  563. *
  564. CALL ZLATMS( N, N, 'S', ISEED, 'H', RWORK, IMODE,
  565. $ COND, ANORM, 0, 0, 'Q', A( K+1, 1 ), LDA,
  566. $ WORK, IINFO )
  567. *
  568. ELSE IF( ITYPE.EQ.5 ) THEN
  569. *
  570. * Hermitian, eigenvalues specified
  571. *
  572. CALL ZLATMS( N, N, 'S', ISEED, 'H', RWORK, IMODE,
  573. $ COND, ANORM, K, K, 'Q', A, LDA, WORK,
  574. $ IINFO )
  575. *
  576. ELSE IF( ITYPE.EQ.7 ) THEN
  577. *
  578. * Diagonal, random eigenvalues
  579. *
  580. CALL ZLATMR( N, N, 'S', ISEED, 'H', WORK, 6, ONE,
  581. $ CONE, 'T', 'N', WORK( N+1 ), 1, ONE,
  582. $ WORK( 2*N+1 ), 1, ONE, 'N', IDUMMA, 0, 0,
  583. $ ZERO, ANORM, 'Q', A( K+1, 1 ), LDA,
  584. $ IDUMMA, IINFO )
  585. *
  586. ELSE IF( ITYPE.EQ.8 ) THEN
  587. *
  588. * Hermitian, random eigenvalues
  589. *
  590. CALL ZLATMR( N, N, 'S', ISEED, 'H', WORK, 6, ONE,
  591. $ CONE, 'T', 'N', WORK( N+1 ), 1, ONE,
  592. $ WORK( 2*N+1 ), 1, ONE, 'N', IDUMMA, K, K,
  593. $ ZERO, ANORM, 'Q', A, LDA, IDUMMA, IINFO )
  594. *
  595. ELSE IF( ITYPE.EQ.9 ) THEN
  596. *
  597. * Positive definite, eigenvalues specified.
  598. *
  599. CALL ZLATMS( N, N, 'S', ISEED, 'P', RWORK, IMODE,
  600. $ COND, ANORM, K, K, 'Q', A, LDA,
  601. $ WORK( N+1 ), IINFO )
  602. *
  603. ELSE IF( ITYPE.EQ.10 ) THEN
  604. *
  605. * Positive definite tridiagonal, eigenvalues specified.
  606. *
  607. IF( N.GT.1 )
  608. $ K = MAX( 1, K )
  609. CALL ZLATMS( N, N, 'S', ISEED, 'P', RWORK, IMODE,
  610. $ COND, ANORM, 1, 1, 'Q', A( K, 1 ), LDA,
  611. $ WORK, IINFO )
  612. DO 90 I = 2, N
  613. TEMP1 = ABS( A( K, I ) ) /
  614. $ SQRT( ABS( A( K+1, I-1 )*A( K+1, I ) ) )
  615. IF( TEMP1.GT.HALF ) THEN
  616. A( K, I ) = HALF*SQRT( ABS( A( K+1,
  617. $ I-1 )*A( K+1, I ) ) )
  618. END IF
  619. 90 CONTINUE
  620. *
  621. ELSE
  622. *
  623. IINFO = 1
  624. END IF
  625. *
  626. IF( IINFO.NE.0 ) THEN
  627. WRITE( NOUNIT, FMT = 9999 )'Generator', IINFO, N,
  628. $ JTYPE, IOLDSD
  629. INFO = ABS( IINFO )
  630. RETURN
  631. END IF
  632. *
  633. 100 CONTINUE
  634. *
  635. * Call ZHBTRD to compute S and U from upper triangle.
  636. *
  637. CALL ZLACPY( ' ', K+1, N, A, LDA, WORK, LDA )
  638. *
  639. NTEST = 1
  640. CALL ZHBTRD( 'V', 'U', N, K, WORK, LDA, SD, SE, U, LDU,
  641. $ WORK( LDA*N+1 ), IINFO )
  642. *
  643. IF( IINFO.NE.0 ) THEN
  644. WRITE( NOUNIT, FMT = 9999 )'ZHBTRD(U)', IINFO, N,
  645. $ JTYPE, IOLDSD
  646. INFO = ABS( IINFO )
  647. IF( IINFO.LT.0 ) THEN
  648. RETURN
  649. ELSE
  650. RESULT( 1 ) = ULPINV
  651. GO TO 150
  652. END IF
  653. END IF
  654. *
  655. * Do tests 1 and 2
  656. *
  657. CALL ZHBT21( 'Upper', N, K, 1, A, LDA, SD, SE, U, LDU,
  658. $ WORK, RWORK, RESULT( 1 ) )
  659. *
  660. * Before converting A into lower for DSBTRD, run DSYTRD_SB2ST
  661. * otherwise matrix A will be converted to lower and then need
  662. * to be converted back to upper in order to run the upper case
  663. * ofDSYTRD_SB2ST
  664. *
  665. * Compute D1 the eigenvalues resulting from the tridiagonal
  666. * form using the DSBTRD and used as reference to compare
  667. * with the DSYTRD_SB2ST routine
  668. *
  669. * Compute D1 from the DSBTRD and used as reference for the
  670. * DSYTRD_SB2ST
  671. *
  672. CALL DCOPY( N, SD, 1, D1, 1 )
  673. IF( N.GT.0 )
  674. $ CALL DCOPY( N-1, SE, 1, RWORK, 1 )
  675. *
  676. CALL ZSTEQR( 'N', N, D1, RWORK, WORK, LDU,
  677. $ RWORK( N+1 ), IINFO )
  678. IF( IINFO.NE.0 ) THEN
  679. WRITE( NOUNIT, FMT = 9999 )'ZSTEQR(N)', IINFO, N,
  680. $ JTYPE, IOLDSD
  681. INFO = ABS( IINFO )
  682. IF( IINFO.LT.0 ) THEN
  683. RETURN
  684. ELSE
  685. RESULT( 5 ) = ULPINV
  686. GO TO 150
  687. END IF
  688. END IF
  689. *
  690. * DSYTRD_SB2ST Upper case is used to compute D2.
  691. * Note to set SD and SE to zero to be sure not reusing
  692. * the one from above. Compare it with D1 computed
  693. * using the DSBTRD.
  694. *
  695. CALL DLASET( 'Full', N, 1, ZERO, ZERO, SD, N )
  696. CALL DLASET( 'Full', N, 1, ZERO, ZERO, SE, N )
  697. CALL ZLACPY( ' ', K+1, N, A, LDA, U, LDU )
  698. LH = MAX(1, 4*N)
  699. LW = LWORK - LH
  700. CALL ZHETRD_HB2ST( 'N', 'N', "U", N, K, U, LDU, SD, SE,
  701. $ WORK, LH, WORK( LH+1 ), LW, IINFO )
  702. *
  703. * Compute D2 from the DSYTRD_SB2ST Upper case
  704. *
  705. CALL DCOPY( N, SD, 1, D2, 1 )
  706. IF( N.GT.0 )
  707. $ CALL DCOPY( N-1, SE, 1, RWORK, 1 )
  708. *
  709. CALL ZSTEQR( 'N', N, D2, RWORK, WORK, LDU,
  710. $ RWORK( N+1 ), IINFO )
  711. IF( IINFO.NE.0 ) THEN
  712. WRITE( NOUNIT, FMT = 9999 )'ZSTEQR(N)', IINFO, N,
  713. $ JTYPE, IOLDSD
  714. INFO = ABS( IINFO )
  715. IF( IINFO.LT.0 ) THEN
  716. RETURN
  717. ELSE
  718. RESULT( 5 ) = ULPINV
  719. GO TO 150
  720. END IF
  721. END IF
  722. *
  723. * Convert A from Upper-Triangle-Only storage to
  724. * Lower-Triangle-Only storage.
  725. *
  726. DO 120 JC = 1, N
  727. DO 110 JR = 0, MIN( K, N-JC )
  728. A( JR+1, JC ) = DCONJG( A( K+1-JR, JC+JR ) )
  729. 110 CONTINUE
  730. 120 CONTINUE
  731. DO 140 JC = N + 1 - K, N
  732. DO 130 JR = MIN( K, N-JC ) + 1, K
  733. A( JR+1, JC ) = ZERO
  734. 130 CONTINUE
  735. 140 CONTINUE
  736. *
  737. * Call ZHBTRD to compute S and U from lower triangle
  738. *
  739. CALL ZLACPY( ' ', K+1, N, A, LDA, WORK, LDA )
  740. *
  741. NTEST = 3
  742. CALL ZHBTRD( 'V', 'L', N, K, WORK, LDA, SD, SE, U, LDU,
  743. $ WORK( LDA*N+1 ), IINFO )
  744. *
  745. IF( IINFO.NE.0 ) THEN
  746. WRITE( NOUNIT, FMT = 9999 )'ZHBTRD(L)', IINFO, N,
  747. $ JTYPE, IOLDSD
  748. INFO = ABS( IINFO )
  749. IF( IINFO.LT.0 ) THEN
  750. RETURN
  751. ELSE
  752. RESULT( 3 ) = ULPINV
  753. GO TO 150
  754. END IF
  755. END IF
  756. NTEST = 4
  757. *
  758. * Do tests 3 and 4
  759. *
  760. CALL ZHBT21( 'Lower', N, K, 1, A, LDA, SD, SE, U, LDU,
  761. $ WORK, RWORK, RESULT( 3 ) )
  762. *
  763. * DSYTRD_SB2ST Lower case is used to compute D3.
  764. * Note to set SD and SE to zero to be sure not reusing
  765. * the one from above. Compare it with D1 computed
  766. * using the DSBTRD.
  767. *
  768. CALL DLASET( 'Full', N, 1, ZERO, ZERO, SD, N )
  769. CALL DLASET( 'Full', N, 1, ZERO, ZERO, SE, N )
  770. CALL ZLACPY( ' ', K+1, N, A, LDA, U, LDU )
  771. LH = MAX(1, 4*N)
  772. LW = LWORK - LH
  773. CALL ZHETRD_HB2ST( 'N', 'N', "L", N, K, U, LDU, SD, SE,
  774. $ WORK, LH, WORK( LH+1 ), LW, IINFO )
  775. *
  776. * Compute D3 from the 2-stage Upper case
  777. *
  778. CALL DCOPY( N, SD, 1, D3, 1 )
  779. IF( N.GT.0 )
  780. $ CALL DCOPY( N-1, SE, 1, RWORK, 1 )
  781. *
  782. CALL ZSTEQR( 'N', N, D3, RWORK, WORK, LDU,
  783. $ RWORK( N+1 ), IINFO )
  784. IF( IINFO.NE.0 ) THEN
  785. WRITE( NOUNIT, FMT = 9999 )'ZSTEQR(N)', IINFO, N,
  786. $ JTYPE, IOLDSD
  787. INFO = ABS( IINFO )
  788. IF( IINFO.LT.0 ) THEN
  789. RETURN
  790. ELSE
  791. RESULT( 6 ) = ULPINV
  792. GO TO 150
  793. END IF
  794. END IF
  795. *
  796. *
  797. * Do Tests 3 and 4 which are similar to 11 and 12 but with the
  798. * D1 computed using the standard 1-stage reduction as reference
  799. *
  800. NTEST = 6
  801. TEMP1 = ZERO
  802. TEMP2 = ZERO
  803. TEMP3 = ZERO
  804. TEMP4 = ZERO
  805. *
  806. DO 151 J = 1, N
  807. TEMP1 = MAX( TEMP1, ABS( D1( J ) ), ABS( D2( J ) ) )
  808. TEMP2 = MAX( TEMP2, ABS( D1( J )-D2( J ) ) )
  809. TEMP3 = MAX( TEMP3, ABS( D1( J ) ), ABS( D3( J ) ) )
  810. TEMP4 = MAX( TEMP4, ABS( D1( J )-D3( J ) ) )
  811. 151 CONTINUE
  812. *
  813. RESULT(5) = TEMP2 / MAX( UNFL, ULP*MAX( TEMP1, TEMP2 ) )
  814. RESULT(6) = TEMP4 / MAX( UNFL, ULP*MAX( TEMP3, TEMP4 ) )
  815. *
  816. * End of Loop -- Check for RESULT(j) > THRESH
  817. *
  818. 150 CONTINUE
  819. NTESTT = NTESTT + NTEST
  820. *
  821. * Print out tests which fail.
  822. *
  823. DO 160 JR = 1, NTEST
  824. IF( RESULT( JR ).GE.THRESH ) THEN
  825. *
  826. * If this is the first test to fail,
  827. * print a header to the data file.
  828. *
  829. IF( NERRS.EQ.0 ) THEN
  830. WRITE( NOUNIT, FMT = 9998 )'ZHB'
  831. WRITE( NOUNIT, FMT = 9997 )
  832. WRITE( NOUNIT, FMT = 9996 )
  833. WRITE( NOUNIT, FMT = 9995 )'Hermitian'
  834. WRITE( NOUNIT, FMT = 9994 )'unitary', '*',
  835. $ 'conjugate transpose', ( '*', J = 1, 6 )
  836. END IF
  837. NERRS = NERRS + 1
  838. WRITE( NOUNIT, FMT = 9993 )N, K, IOLDSD, JTYPE,
  839. $ JR, RESULT( JR )
  840. END IF
  841. 160 CONTINUE
  842. *
  843. 170 CONTINUE
  844. 180 CONTINUE
  845. 190 CONTINUE
  846. *
  847. * Summary
  848. *
  849. CALL DLASUM( 'ZHB', NOUNIT, NERRS, NTESTT )
  850. RETURN
  851. *
  852. 9999 FORMAT( ' ZCHKHB2STG: ', A, ' returned INFO=', I6, '.', / 9X,
  853. $ 'N=', I6, ', JTYPE=', I6, ', ISEED=(', 3( I5, ',' ), I5,
  854. $ ')' )
  855. 9998 FORMAT( / 1X, A3,
  856. $ ' -- Complex Hermitian Banded Tridiagonal Reduction Routines'
  857. $ )
  858. 9997 FORMAT( ' Matrix types (see DCHK23 for details): ' )
  859. *
  860. 9996 FORMAT( / ' Special Matrices:',
  861. $ / ' 1=Zero matrix. ',
  862. $ ' 5=Diagonal: clustered entries.',
  863. $ / ' 2=Identity matrix. ',
  864. $ ' 6=Diagonal: large, evenly spaced.',
  865. $ / ' 3=Diagonal: evenly spaced entries. ',
  866. $ ' 7=Diagonal: small, evenly spaced.',
  867. $ / ' 4=Diagonal: geometr. spaced entries.' )
  868. 9995 FORMAT( ' Dense ', A, ' Banded Matrices:',
  869. $ / ' 8=Evenly spaced eigenvals. ',
  870. $ ' 12=Small, evenly spaced eigenvals.',
  871. $ / ' 9=Geometrically spaced eigenvals. ',
  872. $ ' 13=Matrix with random O(1) entries.',
  873. $ / ' 10=Clustered eigenvalues. ',
  874. $ ' 14=Matrix with large random entries.',
  875. $ / ' 11=Large, evenly spaced eigenvals. ',
  876. $ ' 15=Matrix with small random entries.' )
  877. *
  878. 9994 FORMAT( / ' Tests performed: (S is Tridiag, U is ', A, ',',
  879. $ / 20X, A, ' means ', A, '.', / ' UPLO=''U'':',
  880. $ / ' 1= | A - U S U', A1, ' | / ( |A| n ulp ) ',
  881. $ ' 2= | I - U U', A1, ' | / ( n ulp )', / ' UPLO=''L'':',
  882. $ / ' 3= | A - U S U', A1, ' | / ( |A| n ulp ) ',
  883. $ ' 4= | I - U U', A1, ' | / ( n ulp )' / ' Eig check:',
  884. $ /' 5= | D1 - D2', '', ' | / ( |D1| ulp ) ',
  885. $ ' 6= | D1 - D3', '', ' | / ( |D1| ulp ) ' )
  886. 9993 FORMAT( ' N=', I5, ', K=', I4, ', seed=', 4( I4, ',' ), ' type ',
  887. $ I2, ', test(', I2, ')=', G10.3 )
  888. *
  889. * End of ZCHKHB2STG
  890. *
  891. END