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.

dlattr.f 22 kB

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