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.

dlatb4.f 13 kB

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