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.

clattr.f 23 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732
  1. *> \brief \b CLATTR
  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 CLATTR( IMAT, UPLO, TRANS, DIAG, ISEED, N, A, LDA, B,
  12. * WORK, RWORK, INFO )
  13. *
  14. * .. Scalar Arguments ..
  15. * CHARACTER DIAG, TRANS, UPLO
  16. * INTEGER IMAT, INFO, LDA, N
  17. * ..
  18. * .. Array Arguments ..
  19. * INTEGER ISEED( 4 )
  20. * REAL RWORK( * )
  21. * COMPLEX A( LDA, * ), B( * ), WORK( * )
  22. * ..
  23. *
  24. *
  25. *> \par Purpose:
  26. * =============
  27. *>
  28. *> \verbatim
  29. *>
  30. *> CLATTR generates a triangular test matrix in 2-dimensional storage.
  31. *> IMAT and UPLO uniquely specify the properties of the test matrix,
  32. *> which is returned in the array A.
  33. *> \endverbatim
  34. *
  35. * Arguments:
  36. * ==========
  37. *
  38. *> \param[in] IMAT
  39. *> \verbatim
  40. *> IMAT is INTEGER
  41. *> An integer key describing which matrix to generate for this
  42. *> path.
  43. *> \endverbatim
  44. *>
  45. *> \param[in] UPLO
  46. *> \verbatim
  47. *> UPLO is CHARACTER*1
  48. *> Specifies whether the matrix A will be upper or lower
  49. *> triangular.
  50. *> = 'U': Upper triangular
  51. *> = 'L': Lower triangular
  52. *> \endverbatim
  53. *>
  54. *> \param[in] TRANS
  55. *> \verbatim
  56. *> TRANS is CHARACTER*1
  57. *> Specifies whether the matrix or its transpose will be used.
  58. *> = 'N': No transpose
  59. *> = 'T': Transpose
  60. *> = 'C': Conjugate transpose
  61. *> \endverbatim
  62. *>
  63. *> \param[out] DIAG
  64. *> \verbatim
  65. *> DIAG is CHARACTER*1
  66. *> Specifies whether or not the matrix A is unit triangular.
  67. *> = 'N': Non-unit triangular
  68. *> = 'U': Unit triangular
  69. *> \endverbatim
  70. *>
  71. *> \param[in,out] ISEED
  72. *> \verbatim
  73. *> ISEED is INTEGER array, dimension (4)
  74. *> The seed vector for the random number generator (used in
  75. *> CLATMS). Modified on exit.
  76. *> \endverbatim
  77. *>
  78. *> \param[in] N
  79. *> \verbatim
  80. *> N is INTEGER
  81. *> The order of the matrix to be generated.
  82. *> \endverbatim
  83. *>
  84. *> \param[out] A
  85. *> \verbatim
  86. *> A is COMPLEX array, dimension (LDA,N)
  87. *> The triangular matrix A. If UPLO = 'U', the leading N x N
  88. *> upper triangular part of the array A contains the upper
  89. *> triangular matrix, and the strictly lower triangular part of
  90. *> A is not referenced. If UPLO = 'L', the leading N x N lower
  91. *> triangular part of the array A contains the lower triangular
  92. *> matrix and the strictly upper triangular part of A is not
  93. *> referenced.
  94. *> \endverbatim
  95. *>
  96. *> \param[in] LDA
  97. *> \verbatim
  98. *> LDA is INTEGER
  99. *> The leading dimension of the array A. LDA >= max(1,N).
  100. *> \endverbatim
  101. *>
  102. *> \param[out] B
  103. *> \verbatim
  104. *> B is COMPLEX array, dimension (N)
  105. *> The right hand side vector, if IMAT > 10.
  106. *> \endverbatim
  107. *>
  108. *> \param[out] WORK
  109. *> \verbatim
  110. *> WORK is COMPLEX array, dimension (2*N)
  111. *> \endverbatim
  112. *>
  113. *> \param[out] RWORK
  114. *> \verbatim
  115. *> RWORK is REAL array, dimension (N)
  116. *> \endverbatim
  117. *>
  118. *> \param[out] INFO
  119. *> \verbatim
  120. *> INFO is INTEGER
  121. *> = 0: successful exit
  122. *> < 0: if INFO = -i, the i-th argument had an illegal value
  123. *> \endverbatim
  124. *
  125. * Authors:
  126. * ========
  127. *
  128. *> \author Univ. of Tennessee
  129. *> \author Univ. of California Berkeley
  130. *> \author Univ. of Colorado Denver
  131. *> \author NAG Ltd.
  132. *
  133. *> \ingroup complex_lin
  134. *
  135. * =====================================================================
  136. SUBROUTINE CLATTR( IMAT, UPLO, TRANS, DIAG, ISEED, N, A, LDA, B,
  137. $ WORK, RWORK, INFO )
  138. *
  139. * -- LAPACK test routine --
  140. * -- LAPACK is a software package provided by Univ. of Tennessee, --
  141. * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
  142. *
  143. * .. Scalar Arguments ..
  144. CHARACTER DIAG, TRANS, UPLO
  145. INTEGER IMAT, INFO, LDA, N
  146. * ..
  147. * .. Array Arguments ..
  148. INTEGER ISEED( 4 )
  149. REAL RWORK( * )
  150. COMPLEX A( LDA, * ), B( * ), WORK( * )
  151. * ..
  152. *
  153. * =====================================================================
  154. *
  155. * .. Parameters ..
  156. REAL ONE, TWO, ZERO
  157. PARAMETER ( ONE = 1.0E+0, TWO = 2.0E+0, ZERO = 0.0E+0 )
  158. * ..
  159. * .. Local Scalars ..
  160. LOGICAL UPPER
  161. CHARACTER DIST, TYPE
  162. CHARACTER*3 PATH
  163. INTEGER I, IY, J, JCOUNT, KL, KU, MODE
  164. REAL ANORM, BIGNUM, BNORM, BSCAL, C, CNDNUM, REXP,
  165. $ SFAC, SMLNUM, TEXP, TLEFT, TSCAL, ULP, UNFL, X,
  166. $ Y, Z
  167. COMPLEX PLUS1, PLUS2, RA, RB, S, STAR1
  168. * ..
  169. * .. External Functions ..
  170. LOGICAL LSAME
  171. INTEGER ICAMAX
  172. REAL SLAMCH, SLARND
  173. COMPLEX CLARND
  174. EXTERNAL LSAME, ICAMAX, SLAMCH, SLARND, CLARND
  175. * ..
  176. * .. External Subroutines ..
  177. EXTERNAL CCOPY, CLARNV, CLATB4, CLATMS, CROT, CROTG,
  178. $ CSSCAL, CSWAP, SLABAD, SLARNV
  179. * ..
  180. * .. Intrinsic Functions ..
  181. INTRINSIC ABS, CMPLX, CONJG, MAX, REAL, SQRT
  182. * ..
  183. * .. Executable Statements ..
  184. *
  185. PATH( 1: 1 ) = 'Complex precision'
  186. PATH( 2: 3 ) = 'TR'
  187. UNFL = SLAMCH( 'Safe minimum' )
  188. ULP = SLAMCH( 'Epsilon' )*SLAMCH( 'Base' )
  189. SMLNUM = UNFL
  190. BIGNUM = ( ONE-ULP ) / SMLNUM
  191. CALL SLABAD( SMLNUM, BIGNUM )
  192. IF( ( IMAT.GE.7 .AND. IMAT.LE.10 ) .OR. IMAT.EQ.18 ) THEN
  193. DIAG = 'U'
  194. ELSE
  195. DIAG = 'N'
  196. END IF
  197. INFO = 0
  198. *
  199. * Quick return if N.LE.0.
  200. *
  201. IF( N.LE.0 )
  202. $ RETURN
  203. *
  204. * Call CLATB4 to set parameters for CLATMS.
  205. *
  206. UPPER = LSAME( UPLO, 'U' )
  207. IF( UPPER ) THEN
  208. CALL CLATB4( PATH, IMAT, N, N, TYPE, KL, KU, ANORM, MODE,
  209. $ CNDNUM, DIST )
  210. ELSE
  211. CALL CLATB4( PATH, -IMAT, N, N, TYPE, KL, KU, ANORM, MODE,
  212. $ CNDNUM, DIST )
  213. END IF
  214. *
  215. * IMAT <= 6: Non-unit triangular matrix
  216. *
  217. IF( IMAT.LE.6 ) THEN
  218. CALL CLATMS( N, N, DIST, ISEED, TYPE, RWORK, MODE, CNDNUM,
  219. $ ANORM, KL, KU, 'No packing', A, LDA, WORK, INFO )
  220. *
  221. * IMAT > 6: Unit triangular matrix
  222. * The diagonal is deliberately set to something other than 1.
  223. *
  224. * IMAT = 7: Matrix is the identity
  225. *
  226. ELSE IF( IMAT.EQ.7 ) THEN
  227. IF( UPPER ) THEN
  228. DO 20 J = 1, N
  229. DO 10 I = 1, J - 1
  230. A( I, J ) = ZERO
  231. 10 CONTINUE
  232. A( J, J ) = J
  233. 20 CONTINUE
  234. ELSE
  235. DO 40 J = 1, N
  236. A( J, J ) = J
  237. DO 30 I = J + 1, N
  238. A( I, J ) = ZERO
  239. 30 CONTINUE
  240. 40 CONTINUE
  241. END IF
  242. *
  243. * IMAT > 7: Non-trivial unit triangular matrix
  244. *
  245. * Generate a unit triangular matrix T with condition CNDNUM by
  246. * forming a triangular matrix with known singular values and
  247. * filling in the zero entries with Givens rotations.
  248. *
  249. ELSE IF( IMAT.LE.10 ) THEN
  250. IF( UPPER ) THEN
  251. DO 60 J = 1, N
  252. DO 50 I = 1, J - 1
  253. A( I, J ) = ZERO
  254. 50 CONTINUE
  255. A( J, J ) = J
  256. 60 CONTINUE
  257. ELSE
  258. DO 80 J = 1, N
  259. A( J, J ) = J
  260. DO 70 I = J + 1, N
  261. A( I, J ) = ZERO
  262. 70 CONTINUE
  263. 80 CONTINUE
  264. END IF
  265. *
  266. * Since the trace of a unit triangular matrix is 1, the product
  267. * of its singular values must be 1. Let s = sqrt(CNDNUM),
  268. * x = sqrt(s) - 1/sqrt(s), y = sqrt(2/(n-2))*x, and z = x**2.
  269. * The following triangular matrix has singular values s, 1, 1,
  270. * ..., 1, 1/s:
  271. *
  272. * 1 y y y ... y y z
  273. * 1 0 0 ... 0 0 y
  274. * 1 0 ... 0 0 y
  275. * . ... . . .
  276. * . . . .
  277. * 1 0 y
  278. * 1 y
  279. * 1
  280. *
  281. * To fill in the zeros, we first multiply by a matrix with small
  282. * condition number of the form
  283. *
  284. * 1 0 0 0 0 ...
  285. * 1 + * 0 0 ...
  286. * 1 + 0 0 0
  287. * 1 + * 0 0
  288. * 1 + 0 0
  289. * ...
  290. * 1 + 0
  291. * 1 0
  292. * 1
  293. *
  294. * Each element marked with a '*' is formed by taking the product
  295. * of the adjacent elements marked with '+'. The '*'s can be
  296. * chosen freely, and the '+'s are chosen so that the inverse of
  297. * T will have elements of the same magnitude as T. If the *'s in
  298. * both T and inv(T) have small magnitude, T is well conditioned.
  299. * The two offdiagonals of T are stored in WORK.
  300. *
  301. * The product of these two matrices has the form
  302. *
  303. * 1 y y y y y . y y z
  304. * 1 + * 0 0 . 0 0 y
  305. * 1 + 0 0 . 0 0 y
  306. * 1 + * . . . .
  307. * 1 + . . . .
  308. * . . . . .
  309. * . . . .
  310. * 1 + y
  311. * 1 y
  312. * 1
  313. *
  314. * Now we multiply by Givens rotations, using the fact that
  315. *
  316. * [ c s ] [ 1 w ] [ -c -s ] = [ 1 -w ]
  317. * [ -s c ] [ 0 1 ] [ s -c ] [ 0 1 ]
  318. * and
  319. * [ -c -s ] [ 1 0 ] [ c s ] = [ 1 0 ]
  320. * [ s -c ] [ w 1 ] [ -s c ] [ -w 1 ]
  321. *
  322. * where c = w / sqrt(w**2+4) and s = 2 / sqrt(w**2+4).
  323. *
  324. STAR1 = 0.25*CLARND( 5, ISEED )
  325. SFAC = 0.5
  326. PLUS1 = SFAC*CLARND( 5, ISEED )
  327. DO 90 J = 1, N, 2
  328. PLUS2 = STAR1 / PLUS1
  329. WORK( J ) = PLUS1
  330. WORK( N+J ) = STAR1
  331. IF( J+1.LE.N ) THEN
  332. WORK( J+1 ) = PLUS2
  333. WORK( N+J+1 ) = ZERO
  334. PLUS1 = STAR1 / PLUS2
  335. REXP = SLARND( 2, ISEED )
  336. IF( REXP.LT.ZERO ) THEN
  337. STAR1 = -SFAC**( ONE-REXP )*CLARND( 5, ISEED )
  338. ELSE
  339. STAR1 = SFAC**( ONE+REXP )*CLARND( 5, ISEED )
  340. END IF
  341. END IF
  342. 90 CONTINUE
  343. *
  344. X = SQRT( CNDNUM ) - 1 / SQRT( CNDNUM )
  345. IF( N.GT.2 ) THEN
  346. Y = SQRT( 2. / ( N-2 ) )*X
  347. ELSE
  348. Y = ZERO
  349. END IF
  350. Z = X*X
  351. *
  352. IF( UPPER ) THEN
  353. IF( N.GT.3 ) THEN
  354. CALL CCOPY( N-3, WORK, 1, A( 2, 3 ), LDA+1 )
  355. IF( N.GT.4 )
  356. $ CALL CCOPY( N-4, WORK( N+1 ), 1, A( 2, 4 ), LDA+1 )
  357. END IF
  358. DO 100 J = 2, N - 1
  359. A( 1, J ) = Y
  360. A( J, N ) = Y
  361. 100 CONTINUE
  362. A( 1, N ) = Z
  363. ELSE
  364. IF( N.GT.3 ) THEN
  365. CALL CCOPY( N-3, WORK, 1, A( 3, 2 ), LDA+1 )
  366. IF( N.GT.4 )
  367. $ CALL CCOPY( N-4, WORK( N+1 ), 1, A( 4, 2 ), LDA+1 )
  368. END IF
  369. DO 110 J = 2, N - 1
  370. A( J, 1 ) = Y
  371. A( N, J ) = Y
  372. 110 CONTINUE
  373. A( N, 1 ) = Z
  374. END IF
  375. *
  376. * Fill in the zeros using Givens rotations.
  377. *
  378. IF( UPPER ) THEN
  379. DO 120 J = 1, N - 1
  380. RA = A( J, J+1 )
  381. RB = 2.0
  382. CALL CROTG( RA, RB, C, S )
  383. *
  384. * Multiply by [ c s; -conjg(s) c] on the left.
  385. *
  386. IF( N.GT.J+1 )
  387. $ CALL CROT( N-J-1, A( J, J+2 ), LDA, A( J+1, J+2 ),
  388. $ LDA, C, S )
  389. *
  390. * Multiply by [-c -s; conjg(s) -c] on the right.
  391. *
  392. IF( J.GT.1 )
  393. $ CALL CROT( J-1, A( 1, J+1 ), 1, A( 1, J ), 1, -C, -S )
  394. *
  395. * Negate A(J,J+1).
  396. *
  397. A( J, J+1 ) = -A( J, J+1 )
  398. 120 CONTINUE
  399. ELSE
  400. DO 130 J = 1, N - 1
  401. RA = A( J+1, J )
  402. RB = 2.0
  403. CALL CROTG( RA, RB, C, S )
  404. S = CONJG( S )
  405. *
  406. * Multiply by [ c -s; conjg(s) c] on the right.
  407. *
  408. IF( N.GT.J+1 )
  409. $ CALL CROT( N-J-1, A( J+2, J+1 ), 1, A( J+2, J ), 1, C,
  410. $ -S )
  411. *
  412. * Multiply by [-c s; -conjg(s) -c] on the left.
  413. *
  414. IF( J.GT.1 )
  415. $ CALL CROT( J-1, A( J, 1 ), LDA, A( J+1, 1 ), LDA, -C,
  416. $ S )
  417. *
  418. * Negate A(J+1,J).
  419. *
  420. A( J+1, J ) = -A( J+1, J )
  421. 130 CONTINUE
  422. END IF
  423. *
  424. * IMAT > 10: Pathological test cases. These triangular matrices
  425. * are badly scaled or badly conditioned, so when used in solving a
  426. * triangular system they may cause overflow in the solution vector.
  427. *
  428. ELSE IF( IMAT.EQ.11 ) THEN
  429. *
  430. * Type 11: Generate a triangular matrix with elements between
  431. * -1 and 1. Give the diagonal norm 2 to make it well-conditioned.
  432. * Make the right hand side large so that it requires scaling.
  433. *
  434. IF( UPPER ) THEN
  435. DO 140 J = 1, N
  436. CALL CLARNV( 4, ISEED, J-1, A( 1, J ) )
  437. A( J, J ) = CLARND( 5, ISEED )*TWO
  438. 140 CONTINUE
  439. ELSE
  440. DO 150 J = 1, N
  441. IF( J.LT.N )
  442. $ CALL CLARNV( 4, ISEED, N-J, A( J+1, J ) )
  443. A( J, J ) = CLARND( 5, ISEED )*TWO
  444. 150 CONTINUE
  445. END IF
  446. *
  447. * Set the right hand side so that the largest value is BIGNUM.
  448. *
  449. CALL CLARNV( 2, ISEED, N, B )
  450. IY = ICAMAX( N, B, 1 )
  451. BNORM = ABS( B( IY ) )
  452. BSCAL = BIGNUM / MAX( ONE, BNORM )
  453. CALL CSSCAL( N, BSCAL, B, 1 )
  454. *
  455. ELSE IF( IMAT.EQ.12 ) THEN
  456. *
  457. * Type 12: Make the first diagonal element in the solve small to
  458. * cause immediate overflow when dividing by T(j,j).
  459. * In type 12, the offdiagonal elements are small (CNORM(j) < 1).
  460. *
  461. CALL CLARNV( 2, ISEED, N, B )
  462. TSCAL = ONE / MAX( ONE, REAL( N-1 ) )
  463. IF( UPPER ) THEN
  464. DO 160 J = 1, N
  465. CALL CLARNV( 4, ISEED, J-1, A( 1, J ) )
  466. CALL CSSCAL( J-1, TSCAL, A( 1, J ), 1 )
  467. A( J, J ) = CLARND( 5, ISEED )
  468. 160 CONTINUE
  469. A( N, N ) = SMLNUM*A( N, N )
  470. ELSE
  471. DO 170 J = 1, N
  472. IF( J.LT.N ) THEN
  473. CALL CLARNV( 4, ISEED, N-J, A( J+1, J ) )
  474. CALL CSSCAL( N-J, TSCAL, A( J+1, J ), 1 )
  475. END IF
  476. A( J, J ) = CLARND( 5, ISEED )
  477. 170 CONTINUE
  478. A( 1, 1 ) = SMLNUM*A( 1, 1 )
  479. END IF
  480. *
  481. ELSE IF( IMAT.EQ.13 ) THEN
  482. *
  483. * Type 13: Make the first diagonal element in the solve small to
  484. * cause immediate overflow when dividing by T(j,j).
  485. * In type 13, the offdiagonal elements are O(1) (CNORM(j) > 1).
  486. *
  487. CALL CLARNV( 2, ISEED, N, B )
  488. IF( UPPER ) THEN
  489. DO 180 J = 1, N
  490. CALL CLARNV( 4, ISEED, J-1, A( 1, J ) )
  491. A( J, J ) = CLARND( 5, ISEED )
  492. 180 CONTINUE
  493. A( N, N ) = SMLNUM*A( N, N )
  494. ELSE
  495. DO 190 J = 1, N
  496. IF( J.LT.N )
  497. $ CALL CLARNV( 4, ISEED, N-J, A( J+1, J ) )
  498. A( J, J ) = CLARND( 5, ISEED )
  499. 190 CONTINUE
  500. A( 1, 1 ) = SMLNUM*A( 1, 1 )
  501. END IF
  502. *
  503. ELSE IF( IMAT.EQ.14 ) THEN
  504. *
  505. * Type 14: T is diagonal with small numbers on the diagonal to
  506. * make the growth factor underflow, but a small right hand side
  507. * chosen so that the solution does not overflow.
  508. *
  509. IF( UPPER ) THEN
  510. JCOUNT = 1
  511. DO 210 J = N, 1, -1
  512. DO 200 I = 1, J - 1
  513. A( I, J ) = ZERO
  514. 200 CONTINUE
  515. IF( JCOUNT.LE.2 ) THEN
  516. A( J, J ) = SMLNUM*CLARND( 5, ISEED )
  517. ELSE
  518. A( J, J ) = CLARND( 5, ISEED )
  519. END IF
  520. JCOUNT = JCOUNT + 1
  521. IF( JCOUNT.GT.4 )
  522. $ JCOUNT = 1
  523. 210 CONTINUE
  524. ELSE
  525. JCOUNT = 1
  526. DO 230 J = 1, N
  527. DO 220 I = J + 1, N
  528. A( I, J ) = ZERO
  529. 220 CONTINUE
  530. IF( JCOUNT.LE.2 ) THEN
  531. A( J, J ) = SMLNUM*CLARND( 5, ISEED )
  532. ELSE
  533. A( J, J ) = CLARND( 5, ISEED )
  534. END IF
  535. JCOUNT = JCOUNT + 1
  536. IF( JCOUNT.GT.4 )
  537. $ JCOUNT = 1
  538. 230 CONTINUE
  539. END IF
  540. *
  541. * Set the right hand side alternately zero and small.
  542. *
  543. IF( UPPER ) THEN
  544. B( 1 ) = ZERO
  545. DO 240 I = N, 2, -2
  546. B( I ) = ZERO
  547. B( I-1 ) = SMLNUM*CLARND( 5, ISEED )
  548. 240 CONTINUE
  549. ELSE
  550. B( N ) = ZERO
  551. DO 250 I = 1, N - 1, 2
  552. B( I ) = ZERO
  553. B( I+1 ) = SMLNUM*CLARND( 5, ISEED )
  554. 250 CONTINUE
  555. END IF
  556. *
  557. ELSE IF( IMAT.EQ.15 ) THEN
  558. *
  559. * Type 15: Make the diagonal elements small to cause gradual
  560. * overflow when dividing by T(j,j). To control the amount of
  561. * scaling needed, the matrix is bidiagonal.
  562. *
  563. TEXP = ONE / MAX( ONE, REAL( N-1 ) )
  564. TSCAL = SMLNUM**TEXP
  565. CALL CLARNV( 4, ISEED, N, B )
  566. IF( UPPER ) THEN
  567. DO 270 J = 1, N
  568. DO 260 I = 1, J - 2
  569. A( I, J ) = 0.
  570. 260 CONTINUE
  571. IF( J.GT.1 )
  572. $ A( J-1, J ) = CMPLX( -ONE, -ONE )
  573. A( J, J ) = TSCAL*CLARND( 5, ISEED )
  574. 270 CONTINUE
  575. B( N ) = CMPLX( ONE, ONE )
  576. ELSE
  577. DO 290 J = 1, N
  578. DO 280 I = J + 2, N
  579. A( I, J ) = 0.
  580. 280 CONTINUE
  581. IF( J.LT.N )
  582. $ A( J+1, J ) = CMPLX( -ONE, -ONE )
  583. A( J, J ) = TSCAL*CLARND( 5, ISEED )
  584. 290 CONTINUE
  585. B( 1 ) = CMPLX( ONE, ONE )
  586. END IF
  587. *
  588. ELSE IF( IMAT.EQ.16 ) THEN
  589. *
  590. * Type 16: One zero diagonal element.
  591. *
  592. IY = N / 2 + 1
  593. IF( UPPER ) THEN
  594. DO 300 J = 1, N
  595. CALL CLARNV( 4, ISEED, J-1, A( 1, J ) )
  596. IF( J.NE.IY ) THEN
  597. A( J, J ) = CLARND( 5, ISEED )*TWO
  598. ELSE
  599. A( J, J ) = ZERO
  600. END IF
  601. 300 CONTINUE
  602. ELSE
  603. DO 310 J = 1, N
  604. IF( J.LT.N )
  605. $ CALL CLARNV( 4, ISEED, N-J, A( J+1, J ) )
  606. IF( J.NE.IY ) THEN
  607. A( J, J ) = CLARND( 5, ISEED )*TWO
  608. ELSE
  609. A( J, J ) = ZERO
  610. END IF
  611. 310 CONTINUE
  612. END IF
  613. CALL CLARNV( 2, ISEED, N, B )
  614. CALL CSSCAL( N, TWO, B, 1 )
  615. *
  616. ELSE IF( IMAT.EQ.17 ) THEN
  617. *
  618. * Type 17: Make the offdiagonal elements large to cause overflow
  619. * when adding a column of T. In the non-transposed case, the
  620. * matrix is constructed to cause overflow when adding a column in
  621. * every other step.
  622. *
  623. TSCAL = UNFL / ULP
  624. TSCAL = ( ONE-ULP ) / TSCAL
  625. DO 330 J = 1, N
  626. DO 320 I = 1, N
  627. A( I, J ) = 0.
  628. 320 CONTINUE
  629. 330 CONTINUE
  630. TEXP = ONE
  631. IF( UPPER ) THEN
  632. DO 340 J = N, 2, -2
  633. A( 1, J ) = -TSCAL / REAL( N+1 )
  634. A( J, J ) = ONE
  635. B( J ) = TEXP*( ONE-ULP )
  636. A( 1, J-1 ) = -( TSCAL / REAL( N+1 ) ) / REAL( N+2 )
  637. A( J-1, J-1 ) = ONE
  638. B( J-1 ) = TEXP*REAL( N*N+N-1 )
  639. TEXP = TEXP*2.
  640. 340 CONTINUE
  641. B( 1 ) = ( REAL( N+1 ) / REAL( N+2 ) )*TSCAL
  642. ELSE
  643. DO 350 J = 1, N - 1, 2
  644. A( N, J ) = -TSCAL / REAL( N+1 )
  645. A( J, J ) = ONE
  646. B( J ) = TEXP*( ONE-ULP )
  647. A( N, J+1 ) = -( TSCAL / REAL( N+1 ) ) / REAL( N+2 )
  648. A( J+1, J+1 ) = ONE
  649. B( J+1 ) = TEXP*REAL( N*N+N-1 )
  650. TEXP = TEXP*2.
  651. 350 CONTINUE
  652. B( N ) = ( REAL( N+1 ) / REAL( N+2 ) )*TSCAL
  653. END IF
  654. *
  655. ELSE IF( IMAT.EQ.18 ) THEN
  656. *
  657. * Type 18: Generate a unit triangular matrix with elements
  658. * between -1 and 1, and make the right hand side large so that it
  659. * requires scaling.
  660. *
  661. IF( UPPER ) THEN
  662. DO 360 J = 1, N
  663. CALL CLARNV( 4, ISEED, J-1, A( 1, J ) )
  664. A( J, J ) = ZERO
  665. 360 CONTINUE
  666. ELSE
  667. DO 370 J = 1, N
  668. IF( J.LT.N )
  669. $ CALL CLARNV( 4, ISEED, N-J, A( J+1, J ) )
  670. A( J, J ) = ZERO
  671. 370 CONTINUE
  672. END IF
  673. *
  674. * Set the right hand side so that the largest value is BIGNUM.
  675. *
  676. CALL CLARNV( 2, ISEED, N, B )
  677. IY = ICAMAX( N, B, 1 )
  678. BNORM = ABS( B( IY ) )
  679. BSCAL = BIGNUM / MAX( ONE, BNORM )
  680. CALL CSSCAL( N, BSCAL, B, 1 )
  681. *
  682. ELSE IF( IMAT.EQ.19 ) THEN
  683. *
  684. * Type 19: Generate a triangular matrix with elements between
  685. * BIGNUM/(n-1) and BIGNUM so that at least one of the column
  686. * norms will exceed BIGNUM.
  687. * 1/3/91: CLATRS no longer can handle this case
  688. *
  689. TLEFT = BIGNUM / MAX( ONE, REAL( N-1 ) )
  690. TSCAL = BIGNUM*( REAL( N-1 ) / MAX( ONE, REAL( N ) ) )
  691. IF( UPPER ) THEN
  692. DO 390 J = 1, N
  693. CALL CLARNV( 5, ISEED, J, A( 1, J ) )
  694. CALL SLARNV( 1, ISEED, J, RWORK )
  695. DO 380 I = 1, J
  696. A( I, J ) = A( I, J )*( TLEFT+RWORK( I )*TSCAL )
  697. 380 CONTINUE
  698. 390 CONTINUE
  699. ELSE
  700. DO 410 J = 1, N
  701. CALL CLARNV( 5, ISEED, N-J+1, A( J, J ) )
  702. CALL SLARNV( 1, ISEED, N-J+1, RWORK )
  703. DO 400 I = J, N
  704. A( I, J ) = A( I, J )*( TLEFT+RWORK( I-J+1 )*TSCAL )
  705. 400 CONTINUE
  706. 410 CONTINUE
  707. END IF
  708. CALL CLARNV( 2, ISEED, N, B )
  709. CALL CSSCAL( N, TWO, B, 1 )
  710. END IF
  711. *
  712. * Flip the matrix if the transpose will be used.
  713. *
  714. IF( .NOT.LSAME( TRANS, 'N' ) ) THEN
  715. IF( UPPER ) THEN
  716. DO 420 J = 1, N / 2
  717. CALL CSWAP( N-2*J+1, A( J, J ), LDA, A( J+1, N-J+1 ),
  718. $ -1 )
  719. 420 CONTINUE
  720. ELSE
  721. DO 430 J = 1, N / 2
  722. CALL CSWAP( N-2*J+1, A( J, J ), 1, A( N-J+1, J+1 ),
  723. $ -LDA )
  724. 430 CONTINUE
  725. END IF
  726. END IF
  727. *
  728. RETURN
  729. *
  730. * End of CLATTR
  731. *
  732. END