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.

clatb4.f 13 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543
  1. *> \brief \b CLATB4
  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 CLATB4( PATH, IMAT, M, N, TYPE, KL, KU, ANORM, MODE,
  12. * CNDNUM, DIST )
  13. *
  14. * .. Scalar Arguments ..
  15. * CHARACTER DIST, TYPE
  16. * CHARACTER*3 PATH
  17. * INTEGER IMAT, KL, KU, M, MODE, N
  18. * REAL ANORM, CNDNUM
  19. * ..
  20. *
  21. *
  22. *> \par Purpose:
  23. * =============
  24. *>
  25. *> \verbatim
  26. *>
  27. *> CLATB4 sets parameters for the matrix generator based on the type of
  28. *> matrix to be generated.
  29. *> \endverbatim
  30. *
  31. * Arguments:
  32. * ==========
  33. *
  34. *> \param[in] PATH
  35. *> \verbatim
  36. *> PATH is CHARACTER*3
  37. *> The LAPACK path name.
  38. *> \endverbatim
  39. *>
  40. *> \param[in] IMAT
  41. *> \verbatim
  42. *> IMAT is INTEGER
  43. *> An integer key describing which matrix to generate for this
  44. *> path.
  45. *> \endverbatim
  46. *>
  47. *> \param[in] M
  48. *> \verbatim
  49. *> M is INTEGER
  50. *> The number of rows in the matrix to be generated.
  51. *> \endverbatim
  52. *>
  53. *> \param[in] N
  54. *> \verbatim
  55. *> N is INTEGER
  56. *> The number of columns in the matrix to be generated.
  57. *> \endverbatim
  58. *>
  59. *> \param[out] TYPE
  60. *> \verbatim
  61. *> TYPE is CHARACTER*1
  62. *> The type of the matrix to be generated:
  63. *> = 'S': symmetric matrix
  64. *> = 'H': Hermitian matrix
  65. *> = 'P': Hermitian positive (semi)definite matrix
  66. *> = 'N': nonsymmetric matrix
  67. *> \endverbatim
  68. *>
  69. *> \param[out] KL
  70. *> \verbatim
  71. *> KL is INTEGER
  72. *> The lower band width of the matrix to be generated.
  73. *> \endverbatim
  74. *>
  75. *> \param[out] KU
  76. *> \verbatim
  77. *> KU is INTEGER
  78. *> The upper band width of the matrix to be generated.
  79. *> \endverbatim
  80. *>
  81. *> \param[out] ANORM
  82. *> \verbatim
  83. *> ANORM is REAL
  84. *> The desired norm of the matrix to be generated. The diagonal
  85. *> matrix of singular values or eigenvalues is scaled by this
  86. *> value.
  87. *> \endverbatim
  88. *>
  89. *> \param[out] MODE
  90. *> \verbatim
  91. *> MODE is INTEGER
  92. *> A key indicating how to choose the vector of eigenvalues.
  93. *> \endverbatim
  94. *>
  95. *> \param[out] CNDNUM
  96. *> \verbatim
  97. *> CNDNUM is REAL
  98. *> The desired condition number.
  99. *> \endverbatim
  100. *>
  101. *> \param[out] DIST
  102. *> \verbatim
  103. *> DIST is CHARACTER*1
  104. *> The type of distribution to be used by the random number
  105. *> generator.
  106. *> \endverbatim
  107. *
  108. * Authors:
  109. * ========
  110. *
  111. *> \author Univ. of Tennessee
  112. *> \author Univ. of California Berkeley
  113. *> \author Univ. of Colorado Denver
  114. *> \author NAG Ltd.
  115. *
  116. *> \ingroup complex_lin
  117. *
  118. * =====================================================================
  119. SUBROUTINE CLATB4( PATH, IMAT, M, N, TYPE, KL, KU, ANORM, MODE,
  120. $ CNDNUM, DIST )
  121. *
  122. * -- LAPACK test routine --
  123. * -- LAPACK is a software package provided by Univ. of Tennessee, --
  124. * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
  125. *
  126. * .. Scalar Arguments ..
  127. CHARACTER DIST, TYPE
  128. CHARACTER*3 PATH
  129. INTEGER IMAT, KL, KU, M, MODE, N
  130. REAL ANORM, CNDNUM
  131. * ..
  132. *
  133. * =====================================================================
  134. *
  135. * .. Parameters ..
  136. REAL SHRINK, TENTH
  137. PARAMETER ( SHRINK = 0.25E0, TENTH = 0.1E+0 )
  138. REAL ONE
  139. PARAMETER ( ONE = 1.0E+0 )
  140. REAL TWO
  141. PARAMETER ( TWO = 2.0E+0 )
  142. * ..
  143. * .. Local Scalars ..
  144. LOGICAL FIRST
  145. CHARACTER*2 C2
  146. INTEGER MAT
  147. REAL BADC1, BADC2, EPS, LARGE, SMALL
  148. * ..
  149. * .. External Functions ..
  150. LOGICAL LSAMEN
  151. REAL SLAMCH
  152. EXTERNAL LSAMEN, SLAMCH
  153. * ..
  154. * .. Intrinsic Functions ..
  155. INTRINSIC ABS, MAX, SQRT
  156. * ..
  157. * .. External Subroutines ..
  158. EXTERNAL SLABAD
  159. * ..
  160. * .. Save statement ..
  161. SAVE EPS, SMALL, LARGE, BADC1, BADC2, FIRST
  162. * ..
  163. * .. Data statements ..
  164. DATA FIRST / .TRUE. /
  165. * ..
  166. * .. Executable Statements ..
  167. *
  168. * Set some constants for use in the subroutine.
  169. *
  170. IF( FIRST ) THEN
  171. FIRST = .FALSE.
  172. EPS = SLAMCH( 'Precision' )
  173. BADC2 = TENTH / EPS
  174. BADC1 = SQRT( BADC2 )
  175. SMALL = SLAMCH( 'Safe minimum' )
  176. LARGE = ONE / SMALL
  177. *
  178. * If it looks like we're on a Cray, take the square root of
  179. * SMALL and LARGE to avoid overflow and underflow problems.
  180. *
  181. CALL SLABAD( SMALL, LARGE )
  182. SMALL = SHRINK*( SMALL / EPS )
  183. LARGE = ONE / SMALL
  184. END IF
  185. *
  186. C2 = PATH( 2: 3 )
  187. *
  188. * Set some parameters we don't plan to change.
  189. *
  190. DIST = 'S'
  191. MODE = 3
  192. *
  193. * xQR, xLQ, xQL, xRQ: Set parameters to generate a general
  194. * M x N matrix.
  195. *
  196. IF( LSAMEN( 2, C2, 'QR' ) .OR. LSAMEN( 2, C2, 'LQ' ) .OR.
  197. $ LSAMEN( 2, C2, 'QL' ) .OR. LSAMEN( 2, C2, 'RQ' ) ) THEN
  198. *
  199. * Set TYPE, the type of matrix to be generated.
  200. *
  201. TYPE = 'N'
  202. *
  203. * Set the lower and upper bandwidths.
  204. *
  205. IF( IMAT.EQ.1 ) THEN
  206. KL = 0
  207. KU = 0
  208. ELSE IF( IMAT.EQ.2 ) THEN
  209. KL = 0
  210. KU = MAX( N-1, 0 )
  211. ELSE IF( IMAT.EQ.3 ) THEN
  212. KL = MAX( M-1, 0 )
  213. KU = 0
  214. ELSE
  215. KL = MAX( M-1, 0 )
  216. KU = MAX( N-1, 0 )
  217. END IF
  218. *
  219. * Set the condition number and norm.
  220. *
  221. IF( IMAT.EQ.5 ) THEN
  222. CNDNUM = BADC1
  223. ELSE IF( IMAT.EQ.6 ) THEN
  224. CNDNUM = BADC2
  225. ELSE
  226. CNDNUM = TWO
  227. END IF
  228. *
  229. IF( IMAT.EQ.7 ) THEN
  230. ANORM = SMALL
  231. ELSE IF( IMAT.EQ.8 ) THEN
  232. ANORM = LARGE
  233. ELSE
  234. ANORM = ONE
  235. END IF
  236. *
  237. ELSE IF( LSAMEN( 2, C2, 'GE' ) ) THEN
  238. *
  239. * xGE: Set parameters to generate a general M x N matrix.
  240. *
  241. * Set TYPE, the type of matrix to be generated.
  242. *
  243. TYPE = 'N'
  244. *
  245. * Set the lower and upper bandwidths.
  246. *
  247. IF( IMAT.EQ.1 ) THEN
  248. KL = 0
  249. KU = 0
  250. ELSE IF( IMAT.EQ.2 ) THEN
  251. KL = 0
  252. KU = MAX( N-1, 0 )
  253. ELSE IF( IMAT.EQ.3 ) THEN
  254. KL = MAX( M-1, 0 )
  255. KU = 0
  256. ELSE
  257. KL = MAX( M-1, 0 )
  258. KU = MAX( N-1, 0 )
  259. END IF
  260. *
  261. * Set the condition number and norm.
  262. *
  263. IF( IMAT.EQ.8 ) THEN
  264. CNDNUM = BADC1
  265. ELSE IF( IMAT.EQ.9 ) THEN
  266. CNDNUM = BADC2
  267. ELSE
  268. CNDNUM = TWO
  269. END IF
  270. *
  271. IF( IMAT.EQ.10 ) THEN
  272. ANORM = SMALL
  273. ELSE IF( IMAT.EQ.11 ) THEN
  274. ANORM = LARGE
  275. ELSE
  276. ANORM = ONE
  277. END IF
  278. *
  279. ELSE IF( LSAMEN( 2, C2, 'GB' ) ) THEN
  280. *
  281. * xGB: Set parameters to generate a general banded matrix.
  282. *
  283. * Set TYPE, the type of matrix to be generated.
  284. *
  285. TYPE = 'N'
  286. *
  287. * Set the condition number and norm.
  288. *
  289. IF( IMAT.EQ.5 ) THEN
  290. CNDNUM = BADC1
  291. ELSE IF( IMAT.EQ.6 ) THEN
  292. CNDNUM = TENTH*BADC2
  293. ELSE
  294. CNDNUM = TWO
  295. END IF
  296. *
  297. IF( IMAT.EQ.7 ) THEN
  298. ANORM = SMALL
  299. ELSE IF( IMAT.EQ.8 ) THEN
  300. ANORM = LARGE
  301. ELSE
  302. ANORM = ONE
  303. END IF
  304. *
  305. ELSE IF( LSAMEN( 2, C2, 'GT' ) ) THEN
  306. *
  307. * xGT: Set parameters to generate a general tridiagonal matrix.
  308. *
  309. * Set TYPE, the type of matrix to be generated.
  310. *
  311. TYPE = 'N'
  312. *
  313. * Set the lower and upper bandwidths.
  314. *
  315. IF( IMAT.EQ.1 ) THEN
  316. KL = 0
  317. ELSE
  318. KL = 1
  319. END IF
  320. KU = KL
  321. *
  322. * Set the condition number and norm.
  323. *
  324. IF( IMAT.EQ.3 ) THEN
  325. CNDNUM = BADC1
  326. ELSE IF( IMAT.EQ.4 ) THEN
  327. CNDNUM = BADC2
  328. ELSE
  329. CNDNUM = TWO
  330. END IF
  331. *
  332. IF( IMAT.EQ.5 .OR. IMAT.EQ.11 ) THEN
  333. ANORM = SMALL
  334. ELSE IF( IMAT.EQ.6 .OR. IMAT.EQ.12 ) THEN
  335. ANORM = LARGE
  336. ELSE
  337. ANORM = ONE
  338. END IF
  339. *
  340. ELSE IF( LSAMEN( 2, C2, 'PO' ) .OR. LSAMEN( 2, C2, 'PP' ) ) THEN
  341. *
  342. * xPO, xPP: Set parameters to generate a
  343. * symmetric or Hermitian positive definite matrix.
  344. *
  345. * Set TYPE, the type of matrix to be generated.
  346. *
  347. TYPE = C2( 1: 1 )
  348. *
  349. * Set the lower and upper bandwidths.
  350. *
  351. IF( IMAT.EQ.1 ) THEN
  352. KL = 0
  353. ELSE
  354. KL = MAX( N-1, 0 )
  355. END IF
  356. KU = KL
  357. *
  358. * Set the condition number and norm.
  359. *
  360. IF( IMAT.EQ.6 ) THEN
  361. CNDNUM = BADC1
  362. ELSE IF( IMAT.EQ.7 ) THEN
  363. CNDNUM = BADC2
  364. ELSE
  365. CNDNUM = TWO
  366. END IF
  367. *
  368. IF( IMAT.EQ.8 ) THEN
  369. ANORM = SMALL
  370. ELSE IF( IMAT.EQ.9 ) THEN
  371. ANORM = LARGE
  372. ELSE
  373. ANORM = ONE
  374. END IF
  375. *
  376. ELSE IF( LSAMEN( 2, C2, 'HE' ) .OR. LSAMEN( 2, C2, 'HP' ) .OR.
  377. $ LSAMEN( 2, C2, 'SY' ) .OR. LSAMEN( 2, C2, 'SP' ) ) THEN
  378. *
  379. * xHE, xHP, xSY, xSP: Set parameters to generate a
  380. * symmetric or Hermitian matrix.
  381. *
  382. * Set TYPE, the type of matrix to be generated.
  383. *
  384. TYPE = C2( 1: 1 )
  385. *
  386. * Set the lower and upper bandwidths.
  387. *
  388. IF( IMAT.EQ.1 ) THEN
  389. KL = 0
  390. ELSE
  391. KL = MAX( N-1, 0 )
  392. END IF
  393. KU = KL
  394. *
  395. * Set the condition number and norm.
  396. *
  397. IF( IMAT.EQ.7 ) THEN
  398. CNDNUM = BADC1
  399. ELSE IF( IMAT.EQ.8 ) THEN
  400. CNDNUM = BADC2
  401. ELSE
  402. CNDNUM = TWO
  403. END IF
  404. *
  405. IF( IMAT.EQ.9 ) THEN
  406. ANORM = SMALL
  407. ELSE IF( IMAT.EQ.10 ) THEN
  408. ANORM = LARGE
  409. ELSE
  410. ANORM = ONE
  411. END IF
  412. *
  413. ELSE IF( LSAMEN( 2, C2, 'PB' ) ) THEN
  414. *
  415. * xPB: Set parameters to generate a symmetric band matrix.
  416. *
  417. * Set TYPE, the type of matrix to be generated.
  418. *
  419. TYPE = 'P'
  420. *
  421. * Set the norm and condition number.
  422. *
  423. IF( IMAT.EQ.5 ) THEN
  424. CNDNUM = BADC1
  425. ELSE IF( IMAT.EQ.6 ) THEN
  426. CNDNUM = BADC2
  427. ELSE
  428. CNDNUM = TWO
  429. END IF
  430. *
  431. IF( IMAT.EQ.7 ) THEN
  432. ANORM = SMALL
  433. ELSE IF( IMAT.EQ.8 ) THEN
  434. ANORM = LARGE
  435. ELSE
  436. ANORM = ONE
  437. END IF
  438. *
  439. ELSE IF( LSAMEN( 2, C2, 'PT' ) ) THEN
  440. *
  441. * xPT: Set parameters to generate a symmetric positive definite
  442. * tridiagonal matrix.
  443. *
  444. TYPE = 'P'
  445. IF( IMAT.EQ.1 ) THEN
  446. KL = 0
  447. ELSE
  448. KL = 1
  449. END IF
  450. KU = KL
  451. *
  452. * Set the condition number and norm.
  453. *
  454. IF( IMAT.EQ.3 ) THEN
  455. CNDNUM = BADC1
  456. ELSE IF( IMAT.EQ.4 ) THEN
  457. CNDNUM = BADC2
  458. ELSE
  459. CNDNUM = TWO
  460. END IF
  461. *
  462. IF( IMAT.EQ.5 .OR. IMAT.EQ.11 ) THEN
  463. ANORM = SMALL
  464. ELSE IF( IMAT.EQ.6 .OR. IMAT.EQ.12 ) THEN
  465. ANORM = LARGE
  466. ELSE
  467. ANORM = ONE
  468. END IF
  469. *
  470. ELSE IF( LSAMEN( 2, C2, 'TR' ) .OR. LSAMEN( 2, C2, 'TP' ) ) THEN
  471. *
  472. * xTR, xTP: Set parameters to generate a triangular matrix
  473. *
  474. * Set TYPE, the type of matrix to be generated.
  475. *
  476. TYPE = 'N'
  477. *
  478. * Set the lower and upper bandwidths.
  479. *
  480. MAT = ABS( IMAT )
  481. IF( MAT.EQ.1 .OR. MAT.EQ.7 ) THEN
  482. KL = 0
  483. KU = 0
  484. ELSE IF( IMAT.LT.0 ) THEN
  485. KL = MAX( N-1, 0 )
  486. KU = 0
  487. ELSE
  488. KL = 0
  489. KU = MAX( N-1, 0 )
  490. END IF
  491. *
  492. * Set the condition number and norm.
  493. *
  494. IF( MAT.EQ.3 .OR. MAT.EQ.9 ) THEN
  495. CNDNUM = BADC1
  496. ELSE IF( MAT.EQ.4 .OR. MAT.EQ.10 ) THEN
  497. CNDNUM = BADC2
  498. ELSE
  499. CNDNUM = TWO
  500. END IF
  501. *
  502. IF( MAT.EQ.5 ) THEN
  503. ANORM = SMALL
  504. ELSE IF( MAT.EQ.6 ) THEN
  505. ANORM = LARGE
  506. ELSE
  507. ANORM = ONE
  508. END IF
  509. *
  510. ELSE IF( LSAMEN( 2, C2, 'TB' ) ) THEN
  511. *
  512. * xTB: Set parameters to generate a triangular band matrix.
  513. *
  514. * Set TYPE, the type of matrix to be generated.
  515. *
  516. TYPE = 'N'
  517. *
  518. * Set the norm and condition number.
  519. *
  520. IF( IMAT.EQ.2 .OR. IMAT.EQ.8 ) THEN
  521. CNDNUM = BADC1
  522. ELSE IF( IMAT.EQ.3 .OR. IMAT.EQ.9 ) THEN
  523. CNDNUM = BADC2
  524. ELSE
  525. CNDNUM = TWO
  526. END IF
  527. *
  528. IF( IMAT.EQ.4 ) THEN
  529. ANORM = SMALL
  530. ELSE IF( IMAT.EQ.5 ) THEN
  531. ANORM = LARGE
  532. ELSE
  533. ANORM = ONE
  534. END IF
  535. END IF
  536. IF( N.LE.1 )
  537. $ CNDNUM = ONE
  538. *
  539. RETURN
  540. *
  541. * End of CLATB4
  542. *
  543. END