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 15 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640
  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. * .. Save statement ..
  158. SAVE EPS, SMALL, LARGE, BADC1, BADC2, FIRST
  159. * ..
  160. * .. Data statements ..
  161. DATA FIRST / .TRUE. /
  162. * ..
  163. * .. Executable Statements ..
  164. *
  165. * Set some constants for use in the subroutine.
  166. *
  167. IF( FIRST ) THEN
  168. FIRST = .FALSE.
  169. EPS = SLAMCH( 'Precision' )
  170. BADC2 = TENTH / EPS
  171. BADC1 = SQRT( BADC2 )
  172. SMALL = SLAMCH( 'Safe minimum' )
  173. LARGE = ONE / SMALL
  174. SMALL = SHRINK*( SMALL / EPS )
  175. LARGE = ONE / SMALL
  176. END IF
  177. *
  178. C2 = PATH( 2: 3 )
  179. *
  180. * Set some parameters we don't plan to change.
  181. *
  182. DIST = 'S'
  183. MODE = 3
  184. *
  185. * xQR, xLQ, xQL, xRQ: Set parameters to generate a general
  186. * M x N matrix.
  187. *
  188. IF( LSAMEN( 2, C2, 'QR' ) .OR. LSAMEN( 2, C2, 'LQ' ) .OR.
  189. $ LSAMEN( 2, C2, 'QL' ) .OR. LSAMEN( 2, C2, 'RQ' ) ) THEN
  190. *
  191. * Set TYPE, the type of matrix to be generated.
  192. *
  193. TYPE = 'N'
  194. *
  195. * Set the lower and upper bandwidths.
  196. *
  197. IF( IMAT.EQ.1 ) THEN
  198. KL = 0
  199. KU = 0
  200. ELSE IF( IMAT.EQ.2 ) THEN
  201. KL = 0
  202. KU = MAX( N-1, 0 )
  203. ELSE IF( IMAT.EQ.3 ) THEN
  204. KL = MAX( M-1, 0 )
  205. KU = 0
  206. ELSE
  207. KL = MAX( M-1, 0 )
  208. KU = MAX( N-1, 0 )
  209. END IF
  210. *
  211. * Set the condition number and norm.
  212. *
  213. IF( IMAT.EQ.5 ) THEN
  214. CNDNUM = BADC1
  215. ELSE IF( IMAT.EQ.6 ) THEN
  216. CNDNUM = BADC2
  217. ELSE
  218. CNDNUM = TWO
  219. END IF
  220. *
  221. IF( IMAT.EQ.7 ) THEN
  222. ANORM = SMALL
  223. ELSE IF( IMAT.EQ.8 ) THEN
  224. ANORM = LARGE
  225. ELSE
  226. ANORM = ONE
  227. END IF
  228. *
  229. ELSE IF( LSAMEN( 2, C2, 'QK' ) ) THEN
  230. *
  231. * xQK: truncated QR with pivoting.
  232. * Set parameters to generate a general
  233. * M x N matrix.
  234. *
  235. * Set TYPE, the type of matrix to be generated. 'N' is nonsymmetric.
  236. *
  237. TYPE = 'N'
  238. *
  239. * Set DIST, the type of distribution for the random
  240. * number generator. 'S' is
  241. *
  242. DIST = 'S'
  243. *
  244. * Set the lower and upper bandwidths.
  245. *
  246. IF( IMAT.EQ.2 ) THEN
  247. *
  248. * 2. Random, Diagonal, CNDNUM = 2
  249. *
  250. KL = 0
  251. KU = 0
  252. CNDNUM = TWO
  253. ANORM = ONE
  254. MODE = 3
  255. ELSE IF( IMAT.EQ.3 ) THEN
  256. *
  257. * 3. Random, Upper triangular, CNDNUM = 2
  258. *
  259. KL = 0
  260. KU = MAX( N-1, 0 )
  261. CNDNUM = TWO
  262. ANORM = ONE
  263. MODE = 3
  264. ELSE IF( IMAT.EQ.4 ) THEN
  265. *
  266. * 4. Random, Lower triangular, CNDNUM = 2
  267. *
  268. KL = MAX( M-1, 0 )
  269. KU = 0
  270. CNDNUM = TWO
  271. ANORM = ONE
  272. MODE = 3
  273. ELSE
  274. *
  275. * 5.-19. Rectangular matrix
  276. *
  277. KL = MAX( M-1, 0 )
  278. KU = MAX( N-1, 0 )
  279. *
  280. IF( IMAT.GE.5 .AND. IMAT.LE.14 ) THEN
  281. *
  282. * 5.-14. Random, CNDNUM = 2.
  283. *
  284. CNDNUM = TWO
  285. ANORM = ONE
  286. MODE = 3
  287. *
  288. ELSE IF( IMAT.EQ.15 ) THEN
  289. *
  290. * 15. Random, CNDNUM = sqrt(0.1/EPS)
  291. *
  292. CNDNUM = BADC1
  293. ANORM = ONE
  294. MODE = 3
  295. *
  296. ELSE IF( IMAT.EQ.16 ) THEN
  297. *
  298. * 16. Random, CNDNUM = 0.1/EPS
  299. *
  300. CNDNUM = BADC2
  301. ANORM = ONE
  302. MODE = 3
  303. *
  304. ELSE IF( IMAT.EQ.17 ) THEN
  305. *
  306. * 17. Random, CNDNUM = 0.1/EPS,
  307. * one small singular value S(N)=1/CNDNUM
  308. *
  309. CNDNUM = BADC2
  310. ANORM = ONE
  311. MODE = 2
  312. *
  313. ELSE IF( IMAT.EQ.18 ) THEN
  314. *
  315. * 18. Random, scaled near underflow
  316. *
  317. CNDNUM = TWO
  318. ANORM = SMALL
  319. MODE = 3
  320. *
  321. ELSE IF( IMAT.EQ.19 ) THEN
  322. *
  323. * 19. Random, scaled near overflow
  324. *
  325. CNDNUM = TWO
  326. ANORM = LARGE
  327. MODE = 3
  328. *
  329. END IF
  330. *
  331. END IF
  332. *
  333. ELSE IF( LSAMEN( 2, C2, 'GE' ) ) THEN
  334. *
  335. * xGE: Set parameters to generate a general M x N matrix.
  336. *
  337. * Set TYPE, the type of matrix to be generated.
  338. *
  339. TYPE = 'N'
  340. *
  341. * Set the lower and upper bandwidths.
  342. *
  343. IF( IMAT.EQ.1 ) THEN
  344. KL = 0
  345. KU = 0
  346. ELSE IF( IMAT.EQ.2 ) THEN
  347. KL = 0
  348. KU = MAX( N-1, 0 )
  349. ELSE IF( IMAT.EQ.3 ) THEN
  350. KL = MAX( M-1, 0 )
  351. KU = 0
  352. ELSE
  353. KL = MAX( M-1, 0 )
  354. KU = MAX( N-1, 0 )
  355. END IF
  356. *
  357. * Set the condition number and norm.
  358. *
  359. IF( IMAT.EQ.8 ) THEN
  360. CNDNUM = BADC1
  361. ELSE IF( IMAT.EQ.9 ) THEN
  362. CNDNUM = BADC2
  363. ELSE
  364. CNDNUM = TWO
  365. END IF
  366. *
  367. IF( IMAT.EQ.10 ) THEN
  368. ANORM = SMALL
  369. ELSE IF( IMAT.EQ.11 ) THEN
  370. ANORM = LARGE
  371. ELSE
  372. ANORM = ONE
  373. END IF
  374. *
  375. ELSE IF( LSAMEN( 2, C2, 'GB' ) ) THEN
  376. *
  377. * xGB: Set parameters to generate a general banded matrix.
  378. *
  379. * Set TYPE, the type of matrix to be generated.
  380. *
  381. TYPE = 'N'
  382. *
  383. * Set the condition number and norm.
  384. *
  385. IF( IMAT.EQ.5 ) THEN
  386. CNDNUM = BADC1
  387. ELSE IF( IMAT.EQ.6 ) THEN
  388. CNDNUM = TENTH*BADC2
  389. ELSE
  390. CNDNUM = TWO
  391. END IF
  392. *
  393. IF( IMAT.EQ.7 ) THEN
  394. ANORM = SMALL
  395. ELSE IF( IMAT.EQ.8 ) THEN
  396. ANORM = LARGE
  397. ELSE
  398. ANORM = ONE
  399. END IF
  400. *
  401. ELSE IF( LSAMEN( 2, C2, 'GT' ) ) THEN
  402. *
  403. * xGT: Set parameters to generate a general tridiagonal matrix.
  404. *
  405. * Set TYPE, the type of matrix to be generated.
  406. *
  407. TYPE = 'N'
  408. *
  409. * Set the lower and upper bandwidths.
  410. *
  411. IF( IMAT.EQ.1 ) THEN
  412. KL = 0
  413. ELSE
  414. KL = 1
  415. END IF
  416. KU = KL
  417. *
  418. * Set the condition number and norm.
  419. *
  420. IF( IMAT.EQ.3 ) THEN
  421. CNDNUM = BADC1
  422. ELSE IF( IMAT.EQ.4 ) THEN
  423. CNDNUM = BADC2
  424. ELSE
  425. CNDNUM = TWO
  426. END IF
  427. *
  428. IF( IMAT.EQ.5 .OR. IMAT.EQ.11 ) THEN
  429. ANORM = SMALL
  430. ELSE IF( IMAT.EQ.6 .OR. IMAT.EQ.12 ) THEN
  431. ANORM = LARGE
  432. ELSE
  433. ANORM = ONE
  434. END IF
  435. *
  436. ELSE IF( LSAMEN( 2, C2, 'PO' ) .OR. LSAMEN( 2, C2, 'PP' ) ) THEN
  437. *
  438. * xPO, xPP: Set parameters to generate a
  439. * symmetric or Hermitian positive definite matrix.
  440. *
  441. * Set TYPE, the type of matrix to be generated.
  442. *
  443. TYPE = C2( 1: 1 )
  444. *
  445. * Set the lower and upper bandwidths.
  446. *
  447. IF( IMAT.EQ.1 ) THEN
  448. KL = 0
  449. ELSE
  450. KL = MAX( N-1, 0 )
  451. END IF
  452. KU = KL
  453. *
  454. * Set the condition number and norm.
  455. *
  456. IF( IMAT.EQ.6 ) THEN
  457. CNDNUM = BADC1
  458. ELSE IF( IMAT.EQ.7 ) THEN
  459. CNDNUM = BADC2
  460. ELSE
  461. CNDNUM = TWO
  462. END IF
  463. *
  464. IF( IMAT.EQ.8 ) THEN
  465. ANORM = SMALL
  466. ELSE IF( IMAT.EQ.9 ) THEN
  467. ANORM = LARGE
  468. ELSE
  469. ANORM = ONE
  470. END IF
  471. *
  472. ELSE IF( LSAMEN( 2, C2, 'HE' ) .OR. LSAMEN( 2, C2, 'HP' ) .OR.
  473. $ LSAMEN( 2, C2, 'SY' ) .OR. LSAMEN( 2, C2, 'SP' ) ) THEN
  474. *
  475. * xHE, xHP, xSY, xSP: Set parameters to generate a
  476. * symmetric or Hermitian matrix.
  477. *
  478. * Set TYPE, the type of matrix to be generated.
  479. *
  480. TYPE = C2( 1: 1 )
  481. *
  482. * Set the lower and upper bandwidths.
  483. *
  484. IF( IMAT.EQ.1 ) THEN
  485. KL = 0
  486. ELSE
  487. KL = MAX( N-1, 0 )
  488. END IF
  489. KU = KL
  490. *
  491. * Set the condition number and norm.
  492. *
  493. IF( IMAT.EQ.7 ) THEN
  494. CNDNUM = BADC1
  495. ELSE IF( IMAT.EQ.8 ) THEN
  496. CNDNUM = BADC2
  497. ELSE
  498. CNDNUM = TWO
  499. END IF
  500. *
  501. IF( IMAT.EQ.9 ) THEN
  502. ANORM = SMALL
  503. ELSE IF( IMAT.EQ.10 ) THEN
  504. ANORM = LARGE
  505. ELSE
  506. ANORM = ONE
  507. END IF
  508. *
  509. ELSE IF( LSAMEN( 2, C2, 'PB' ) ) THEN
  510. *
  511. * xPB: Set parameters to generate a symmetric band matrix.
  512. *
  513. * Set TYPE, the type of matrix to be generated.
  514. *
  515. TYPE = 'P'
  516. *
  517. * Set the norm and condition number.
  518. *
  519. IF( IMAT.EQ.5 ) THEN
  520. CNDNUM = BADC1
  521. ELSE IF( IMAT.EQ.6 ) THEN
  522. CNDNUM = BADC2
  523. ELSE
  524. CNDNUM = TWO
  525. END IF
  526. *
  527. IF( IMAT.EQ.7 ) THEN
  528. ANORM = SMALL
  529. ELSE IF( IMAT.EQ.8 ) THEN
  530. ANORM = LARGE
  531. ELSE
  532. ANORM = ONE
  533. END IF
  534. *
  535. ELSE IF( LSAMEN( 2, C2, 'PT' ) ) THEN
  536. *
  537. * xPT: Set parameters to generate a symmetric positive definite
  538. * tridiagonal matrix.
  539. *
  540. TYPE = 'P'
  541. IF( IMAT.EQ.1 ) THEN
  542. KL = 0
  543. ELSE
  544. KL = 1
  545. END IF
  546. KU = KL
  547. *
  548. * Set the condition number and norm.
  549. *
  550. IF( IMAT.EQ.3 ) THEN
  551. CNDNUM = BADC1
  552. ELSE IF( IMAT.EQ.4 ) THEN
  553. CNDNUM = BADC2
  554. ELSE
  555. CNDNUM = TWO
  556. END IF
  557. *
  558. IF( IMAT.EQ.5 .OR. IMAT.EQ.11 ) THEN
  559. ANORM = SMALL
  560. ELSE IF( IMAT.EQ.6 .OR. IMAT.EQ.12 ) THEN
  561. ANORM = LARGE
  562. ELSE
  563. ANORM = ONE
  564. END IF
  565. *
  566. ELSE IF( LSAMEN( 2, C2, 'TR' ) .OR. LSAMEN( 2, C2, 'TP' ) ) THEN
  567. *
  568. * xTR, xTP: Set parameters to generate a triangular matrix
  569. *
  570. * Set TYPE, the type of matrix to be generated.
  571. *
  572. TYPE = 'N'
  573. *
  574. * Set the lower and upper bandwidths.
  575. *
  576. MAT = ABS( IMAT )
  577. IF( MAT.EQ.1 .OR. MAT.EQ.7 ) THEN
  578. KL = 0
  579. KU = 0
  580. ELSE IF( IMAT.LT.0 ) THEN
  581. KL = MAX( N-1, 0 )
  582. KU = 0
  583. ELSE
  584. KL = 0
  585. KU = MAX( N-1, 0 )
  586. END IF
  587. *
  588. * Set the condition number and norm.
  589. *
  590. IF( MAT.EQ.3 .OR. MAT.EQ.9 ) THEN
  591. CNDNUM = BADC1
  592. ELSE IF( MAT.EQ.4 .OR. MAT.EQ.10 ) THEN
  593. CNDNUM = BADC2
  594. ELSE
  595. CNDNUM = TWO
  596. END IF
  597. *
  598. IF( MAT.EQ.5 ) THEN
  599. ANORM = SMALL
  600. ELSE IF( MAT.EQ.6 ) THEN
  601. ANORM = LARGE
  602. ELSE
  603. ANORM = ONE
  604. END IF
  605. *
  606. ELSE IF( LSAMEN( 2, C2, 'TB' ) ) THEN
  607. *
  608. * xTB: Set parameters to generate a triangular band matrix.
  609. *
  610. * Set TYPE, the type of matrix to be generated.
  611. *
  612. TYPE = 'N'
  613. *
  614. * Set the norm and condition number.
  615. *
  616. MAT = ABS( IMAT )
  617. IF( MAT.EQ.2 .OR. MAT.EQ.8 ) THEN
  618. CNDNUM = BADC1
  619. ELSE IF( MAT.EQ.3 .OR. MAT.EQ.9 ) THEN
  620. CNDNUM = BADC2
  621. ELSE
  622. CNDNUM = TWO
  623. END IF
  624. *
  625. IF( MAT.EQ.4 ) THEN
  626. ANORM = SMALL
  627. ELSE IF( MAT.EQ.5 ) THEN
  628. ANORM = LARGE
  629. ELSE
  630. ANORM = ONE
  631. END IF
  632. END IF
  633. IF( N.LE.1 )
  634. $ CNDNUM = ONE
  635. *
  636. RETURN
  637. *
  638. * End of CLATB4
  639. *
  640. END