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.

dlatmr.f 43 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224
  1. *> \brief \b DLATMR
  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 DLATMR( M, N, DIST, ISEED, SYM, D, MODE, COND, DMAX,
  12. * RSIGN, GRADE, DL, MODEL, CONDL, DR, MODER,
  13. * CONDR, PIVTNG, IPIVOT, KL, KU, SPARSE, ANORM,
  14. * PACK, A, LDA, IWORK, INFO )
  15. *
  16. * .. Scalar Arguments ..
  17. * CHARACTER DIST, GRADE, PACK, PIVTNG, RSIGN, SYM
  18. * INTEGER INFO, KL, KU, LDA, M, MODE, MODEL, MODER, N
  19. * DOUBLE PRECISION ANORM, COND, CONDL, CONDR, DMAX, SPARSE
  20. * ..
  21. * .. Array Arguments ..
  22. * INTEGER IPIVOT( * ), ISEED( 4 ), IWORK( * )
  23. * DOUBLE PRECISION A( LDA, * ), D( * ), DL( * ), DR( * )
  24. * ..
  25. *
  26. *
  27. *> \par Purpose:
  28. * =============
  29. *>
  30. *> \verbatim
  31. *>
  32. *> DLATMR generates random matrices of various types for testing
  33. *> LAPACK programs.
  34. *>
  35. *> DLATMR operates by applying the following sequence of
  36. *> operations:
  37. *>
  38. *> Generate a matrix A with random entries of distribution DIST
  39. *> which is symmetric if SYM='S', and nonsymmetric
  40. *> if SYM='N'.
  41. *>
  42. *> Set the diagonal to D, where D may be input or
  43. *> computed according to MODE, COND, DMAX and RSIGN
  44. *> as described below.
  45. *>
  46. *> Grade the matrix, if desired, from the left and/or right
  47. *> as specified by GRADE. The inputs DL, MODEL, CONDL, DR,
  48. *> MODER and CONDR also determine the grading as described
  49. *> below.
  50. *>
  51. *> Permute, if desired, the rows and/or columns as specified by
  52. *> PIVTNG and IPIVOT.
  53. *>
  54. *> Set random entries to zero, if desired, to get a random sparse
  55. *> matrix as specified by SPARSE.
  56. *>
  57. *> Make A a band matrix, if desired, by zeroing out the matrix
  58. *> outside a band of lower bandwidth KL and upper bandwidth KU.
  59. *>
  60. *> Scale A, if desired, to have maximum entry ANORM.
  61. *>
  62. *> Pack the matrix if desired. Options specified by PACK are:
  63. *> no packing
  64. *> zero out upper half (if symmetric)
  65. *> zero out lower half (if symmetric)
  66. *> store the upper half columnwise (if symmetric or
  67. *> square upper triangular)
  68. *> store the lower half columnwise (if symmetric or
  69. *> square lower triangular)
  70. *> same as upper half rowwise if symmetric
  71. *> store the lower triangle in banded format (if symmetric)
  72. *> store the upper triangle in banded format (if symmetric)
  73. *> store the entire matrix in banded format
  74. *>
  75. *> Note: If two calls to DLATMR differ only in the PACK parameter,
  76. *> they will generate mathematically equivalent matrices.
  77. *>
  78. *> If two calls to DLATMR both have full bandwidth (KL = M-1
  79. *> and KU = N-1), and differ only in the PIVTNG and PACK
  80. *> parameters, then the matrices generated will differ only
  81. *> in the order of the rows and/or columns, and otherwise
  82. *> contain the same data. This consistency cannot be and
  83. *> is not maintained with less than full bandwidth.
  84. *> \endverbatim
  85. *
  86. * Arguments:
  87. * ==========
  88. *
  89. *> \param[in] M
  90. *> \verbatim
  91. *> M is INTEGER
  92. *> Number of rows of A. Not modified.
  93. *> \endverbatim
  94. *>
  95. *> \param[in] N
  96. *> \verbatim
  97. *> N is INTEGER
  98. *> Number of columns of A. Not modified.
  99. *> \endverbatim
  100. *>
  101. *> \param[in] DIST
  102. *> \verbatim
  103. *> DIST is CHARACTER*1
  104. *> On entry, DIST specifies the type of distribution to be used
  105. *> to generate a random matrix .
  106. *> 'U' => UNIFORM( 0, 1 ) ( 'U' for uniform )
  107. *> 'S' => UNIFORM( -1, 1 ) ( 'S' for symmetric )
  108. *> 'N' => NORMAL( 0, 1 ) ( 'N' for normal )
  109. *> Not modified.
  110. *> \endverbatim
  111. *>
  112. *> \param[in,out] ISEED
  113. *> \verbatim
  114. *> ISEED is INTEGER array, dimension (4)
  115. *> On entry ISEED specifies the seed of the random number
  116. *> generator. They should lie between 0 and 4095 inclusive,
  117. *> and ISEED(4) should be odd. The random number generator
  118. *> uses a linear congruential sequence limited to small
  119. *> integers, and so should produce machine independent
  120. *> random numbers. The values of ISEED are changed on
  121. *> exit, and can be used in the next call to DLATMR
  122. *> to continue the same random number sequence.
  123. *> Changed on exit.
  124. *> \endverbatim
  125. *>
  126. *> \param[in] SYM
  127. *> \verbatim
  128. *> SYM is CHARACTER*1
  129. *> If SYM='S' or 'H', generated matrix is symmetric.
  130. *> If SYM='N', generated matrix is nonsymmetric.
  131. *> Not modified.
  132. *> \endverbatim
  133. *>
  134. *> \param[in,out] D
  135. *> \verbatim
  136. *> D is DOUBLE PRECISION array, dimension (min(M,N))
  137. *> On entry this array specifies the diagonal entries
  138. *> of the diagonal of A. D may either be specified
  139. *> on entry, or set according to MODE and COND as described
  140. *> below. May be changed on exit if MODE is nonzero.
  141. *> \endverbatim
  142. *>
  143. *> \param[in] MODE
  144. *> \verbatim
  145. *> MODE is INTEGER
  146. *> On entry describes how D is to be used:
  147. *> MODE = 0 means use D as input
  148. *> MODE = 1 sets D(1)=1 and D(2:N)=1.0/COND
  149. *> MODE = 2 sets D(1:N-1)=1 and D(N)=1.0/COND
  150. *> MODE = 3 sets D(I)=COND**(-(I-1)/(N-1))
  151. *> MODE = 4 sets D(i)=1 - (i-1)/(N-1)*(1 - 1/COND)
  152. *> MODE = 5 sets D to random numbers in the range
  153. *> ( 1/COND , 1 ) such that their logarithms
  154. *> are uniformly distributed.
  155. *> MODE = 6 set D to random numbers from same distribution
  156. *> as the rest of the matrix.
  157. *> MODE < 0 has the same meaning as ABS(MODE), except that
  158. *> the order of the elements of D is reversed.
  159. *> Thus if MODE is positive, D has entries ranging from
  160. *> 1 to 1/COND, if negative, from 1/COND to 1,
  161. *> Not modified.
  162. *> \endverbatim
  163. *>
  164. *> \param[in] COND
  165. *> \verbatim
  166. *> COND is DOUBLE PRECISION
  167. *> On entry, used as described under MODE above.
  168. *> If used, it must be >= 1. Not modified.
  169. *> \endverbatim
  170. *>
  171. *> \param[in] DMAX
  172. *> \verbatim
  173. *> DMAX is DOUBLE PRECISION
  174. *> If MODE neither -6, 0 nor 6, the diagonal is scaled by
  175. *> DMAX / max(abs(D(i))), so that maximum absolute entry
  176. *> of diagonal is abs(DMAX). If DMAX is negative (or zero),
  177. *> diagonal will be scaled by a negative number (or zero).
  178. *> \endverbatim
  179. *>
  180. *> \param[in] RSIGN
  181. *> \verbatim
  182. *> RSIGN is CHARACTER*1
  183. *> If MODE neither -6, 0 nor 6, specifies sign of diagonal
  184. *> as follows:
  185. *> 'T' => diagonal entries are multiplied by 1 or -1
  186. *> with probability .5
  187. *> 'F' => diagonal unchanged
  188. *> Not modified.
  189. *> \endverbatim
  190. *>
  191. *> \param[in] GRADE
  192. *> \verbatim
  193. *> GRADE is CHARACTER*1
  194. *> Specifies grading of matrix as follows:
  195. *> 'N' => no grading
  196. *> 'L' => matrix premultiplied by diag( DL )
  197. *> (only if matrix nonsymmetric)
  198. *> 'R' => matrix postmultiplied by diag( DR )
  199. *> (only if matrix nonsymmetric)
  200. *> 'B' => matrix premultiplied by diag( DL ) and
  201. *> postmultiplied by diag( DR )
  202. *> (only if matrix nonsymmetric)
  203. *> 'S' or 'H' => matrix premultiplied by diag( DL ) and
  204. *> postmultiplied by diag( DL )
  205. *> ('S' for symmetric, or 'H' for Hermitian)
  206. *> 'E' => matrix premultiplied by diag( DL ) and
  207. *> postmultiplied by inv( diag( DL ) )
  208. *> ( 'E' for eigenvalue invariance)
  209. *> (only if matrix nonsymmetric)
  210. *> Note: if GRADE='E', then M must equal N.
  211. *> Not modified.
  212. *> \endverbatim
  213. *>
  214. *> \param[in,out] DL
  215. *> \verbatim
  216. *> DL is DOUBLE PRECISION array, dimension (M)
  217. *> If MODEL=0, then on entry this array specifies the diagonal
  218. *> entries of a diagonal matrix used as described under GRADE
  219. *> above. If MODEL is not zero, then DL will be set according
  220. *> to MODEL and CONDL, analogous to the way D is set according
  221. *> to MODE and COND (except there is no DMAX parameter for DL).
  222. *> If GRADE='E', then DL cannot have zero entries.
  223. *> Not referenced if GRADE = 'N' or 'R'. Changed on exit.
  224. *> \endverbatim
  225. *>
  226. *> \param[in] MODEL
  227. *> \verbatim
  228. *> MODEL is INTEGER
  229. *> This specifies how the diagonal array DL is to be computed,
  230. *> just as MODE specifies how D is to be computed.
  231. *> Not modified.
  232. *> \endverbatim
  233. *>
  234. *> \param[in] CONDL
  235. *> \verbatim
  236. *> CONDL is DOUBLE PRECISION
  237. *> When MODEL is not zero, this specifies the condition number
  238. *> of the computed DL. Not modified.
  239. *> \endverbatim
  240. *>
  241. *> \param[in,out] DR
  242. *> \verbatim
  243. *> DR is DOUBLE PRECISION array, dimension (N)
  244. *> If MODER=0, then on entry this array specifies the diagonal
  245. *> entries of a diagonal matrix used as described under GRADE
  246. *> above. If MODER is not zero, then DR will be set according
  247. *> to MODER and CONDR, analogous to the way D is set according
  248. *> to MODE and COND (except there is no DMAX parameter for DR).
  249. *> Not referenced if GRADE = 'N', 'L', 'H', 'S' or 'E'.
  250. *> Changed on exit.
  251. *> \endverbatim
  252. *>
  253. *> \param[in] MODER
  254. *> \verbatim
  255. *> MODER is INTEGER
  256. *> This specifies how the diagonal array DR is to be computed,
  257. *> just as MODE specifies how D is to be computed.
  258. *> Not modified.
  259. *> \endverbatim
  260. *>
  261. *> \param[in] CONDR
  262. *> \verbatim
  263. *> CONDR is DOUBLE PRECISION
  264. *> When MODER is not zero, this specifies the condition number
  265. *> of the computed DR. Not modified.
  266. *> \endverbatim
  267. *>
  268. *> \param[in] PIVTNG
  269. *> \verbatim
  270. *> PIVTNG is CHARACTER*1
  271. *> On entry specifies pivoting permutations as follows:
  272. *> 'N' or ' ' => none.
  273. *> 'L' => left or row pivoting (matrix must be nonsymmetric).
  274. *> 'R' => right or column pivoting (matrix must be
  275. *> nonsymmetric).
  276. *> 'B' or 'F' => both or full pivoting, i.e., on both sides.
  277. *> In this case, M must equal N
  278. *>
  279. *> If two calls to DLATMR both have full bandwidth (KL = M-1
  280. *> and KU = N-1), and differ only in the PIVTNG and PACK
  281. *> parameters, then the matrices generated will differ only
  282. *> in the order of the rows and/or columns, and otherwise
  283. *> contain the same data. This consistency cannot be
  284. *> maintained with less than full bandwidth.
  285. *> \endverbatim
  286. *>
  287. *> \param[in] IPIVOT
  288. *> \verbatim
  289. *> IPIVOT is INTEGER array, dimension (N or M)
  290. *> This array specifies the permutation used. After the
  291. *> basic matrix is generated, the rows, columns, or both
  292. *> are permuted. If, say, row pivoting is selected, DLATMR
  293. *> starts with the *last* row and interchanges the M-th and
  294. *> IPIVOT(M)-th rows, then moves to the next-to-last row,
  295. *> interchanging the (M-1)-th and the IPIVOT(M-1)-th rows,
  296. *> and so on. In terms of "2-cycles", the permutation is
  297. *> (1 IPIVOT(1)) (2 IPIVOT(2)) ... (M IPIVOT(M))
  298. *> where the rightmost cycle is applied first. This is the
  299. *> *inverse* of the effect of pivoting in LINPACK. The idea
  300. *> is that factoring (with pivoting) an identity matrix
  301. *> which has been inverse-pivoted in this way should
  302. *> result in a pivot vector identical to IPIVOT.
  303. *> Not referenced if PIVTNG = 'N'. Not modified.
  304. *> \endverbatim
  305. *>
  306. *> \param[in] KL
  307. *> \verbatim
  308. *> KL is INTEGER
  309. *> On entry specifies the lower bandwidth of the matrix. For
  310. *> example, KL=0 implies upper triangular, KL=1 implies upper
  311. *> Hessenberg, and KL at least M-1 implies the matrix is not
  312. *> banded. Must equal KU if matrix is symmetric.
  313. *> Not modified.
  314. *> \endverbatim
  315. *>
  316. *> \param[in] KU
  317. *> \verbatim
  318. *> KU is INTEGER
  319. *> On entry specifies the upper bandwidth of the matrix. For
  320. *> example, KU=0 implies lower triangular, KU=1 implies lower
  321. *> Hessenberg, and KU at least N-1 implies the matrix is not
  322. *> banded. Must equal KL if matrix is symmetric.
  323. *> Not modified.
  324. *> \endverbatim
  325. *>
  326. *> \param[in] SPARSE
  327. *> \verbatim
  328. *> SPARSE is DOUBLE PRECISION
  329. *> On entry specifies the sparsity of the matrix if a sparse
  330. *> matrix is to be generated. SPARSE should lie between
  331. *> 0 and 1. To generate a sparse matrix, for each matrix entry
  332. *> a uniform ( 0, 1 ) random number x is generated and
  333. *> compared to SPARSE; if x is larger the matrix entry
  334. *> is unchanged and if x is smaller the entry is set
  335. *> to zero. Thus on the average a fraction SPARSE of the
  336. *> entries will be set to zero.
  337. *> Not modified.
  338. *> \endverbatim
  339. *>
  340. *> \param[in] ANORM
  341. *> \verbatim
  342. *> ANORM is DOUBLE PRECISION
  343. *> On entry specifies maximum entry of output matrix
  344. *> (output matrix will by multiplied by a constant so that
  345. *> its largest absolute entry equal ANORM)
  346. *> if ANORM is nonnegative. If ANORM is negative no scaling
  347. *> is done. Not modified.
  348. *> \endverbatim
  349. *>
  350. *> \param[in] PACK
  351. *> \verbatim
  352. *> PACK is CHARACTER*1
  353. *> On entry specifies packing of matrix as follows:
  354. *> 'N' => no packing
  355. *> 'U' => zero out all subdiagonal entries (if symmetric)
  356. *> 'L' => zero out all superdiagonal entries (if symmetric)
  357. *> 'C' => store the upper triangle columnwise
  358. *> (only if matrix symmetric or square upper triangular)
  359. *> 'R' => store the lower triangle columnwise
  360. *> (only if matrix symmetric or square lower triangular)
  361. *> (same as upper half rowwise if symmetric)
  362. *> 'B' => store the lower triangle in band storage scheme
  363. *> (only if matrix symmetric)
  364. *> 'Q' => store the upper triangle in band storage scheme
  365. *> (only if matrix symmetric)
  366. *> 'Z' => store the entire matrix in band storage scheme
  367. *> (pivoting can be provided for by using this
  368. *> option to store A in the trailing rows of
  369. *> the allocated storage)
  370. *>
  371. *> Using these options, the various LAPACK packed and banded
  372. *> storage schemes can be obtained:
  373. *> GB - use 'Z'
  374. *> PB, SB or TB - use 'B' or 'Q'
  375. *> PP, SP or TP - use 'C' or 'R'
  376. *>
  377. *> If two calls to DLATMR differ only in the PACK parameter,
  378. *> they will generate mathematically equivalent matrices.
  379. *> Not modified.
  380. *> \endverbatim
  381. *>
  382. *> \param[out] A
  383. *> \verbatim
  384. *> A is DOUBLE PRECISION array, dimension (LDA,N)
  385. *> On exit A is the desired test matrix. Only those
  386. *> entries of A which are significant on output
  387. *> will be referenced (even if A is in packed or band
  388. *> storage format). The 'unoccupied corners' of A in
  389. *> band format will be zeroed out.
  390. *> \endverbatim
  391. *>
  392. *> \param[in] LDA
  393. *> \verbatim
  394. *> LDA is INTEGER
  395. *> on entry LDA specifies the first dimension of A as
  396. *> declared in the calling program.
  397. *> If PACK='N', 'U' or 'L', LDA must be at least max ( 1, M ).
  398. *> If PACK='C' or 'R', LDA must be at least 1.
  399. *> If PACK='B', or 'Q', LDA must be MIN ( KU+1, N )
  400. *> If PACK='Z', LDA must be at least KUU+KLL+1, where
  401. *> KUU = MIN ( KU, N-1 ) and KLL = MIN ( KL, M-1 )
  402. *> Not modified.
  403. *> \endverbatim
  404. *>
  405. *> \param[out] IWORK
  406. *> \verbatim
  407. *> IWORK is INTEGER array, dimension ( N or M)
  408. *> Workspace. Not referenced if PIVTNG = 'N'. Changed on exit.
  409. *> \endverbatim
  410. *>
  411. *> \param[out] INFO
  412. *> \verbatim
  413. *> INFO is INTEGER
  414. *> Error parameter on exit:
  415. *> 0 => normal return
  416. *> -1 => M negative or unequal to N and SYM='S' or 'H'
  417. *> -2 => N negative
  418. *> -3 => DIST illegal string
  419. *> -5 => SYM illegal string
  420. *> -7 => MODE not in range -6 to 6
  421. *> -8 => COND less than 1.0, and MODE neither -6, 0 nor 6
  422. *> -10 => MODE neither -6, 0 nor 6 and RSIGN illegal string
  423. *> -11 => GRADE illegal string, or GRADE='E' and
  424. *> M not equal to N, or GRADE='L', 'R', 'B' or 'E' and
  425. *> SYM = 'S' or 'H'
  426. *> -12 => GRADE = 'E' and DL contains zero
  427. *> -13 => MODEL not in range -6 to 6 and GRADE= 'L', 'B', 'H',
  428. *> 'S' or 'E'
  429. *> -14 => CONDL less than 1.0, GRADE='L', 'B', 'H', 'S' or 'E',
  430. *> and MODEL neither -6, 0 nor 6
  431. *> -16 => MODER not in range -6 to 6 and GRADE= 'R' or 'B'
  432. *> -17 => CONDR less than 1.0, GRADE='R' or 'B', and
  433. *> MODER neither -6, 0 nor 6
  434. *> -18 => PIVTNG illegal string, or PIVTNG='B' or 'F' and
  435. *> M not equal to N, or PIVTNG='L' or 'R' and SYM='S'
  436. *> or 'H'
  437. *> -19 => IPIVOT contains out of range number and
  438. *> PIVTNG not equal to 'N'
  439. *> -20 => KL negative
  440. *> -21 => KU negative, or SYM='S' or 'H' and KU not equal to KL
  441. *> -22 => SPARSE not in range 0. to 1.
  442. *> -24 => PACK illegal string, or PACK='U', 'L', 'B' or 'Q'
  443. *> and SYM='N', or PACK='C' and SYM='N' and either KL
  444. *> not equal to 0 or N not equal to M, or PACK='R' and
  445. *> SYM='N', and either KU not equal to 0 or N not equal
  446. *> to M
  447. *> -26 => LDA too small
  448. *> 1 => Error return from DLATM1 (computing D)
  449. *> 2 => Cannot scale diagonal to DMAX (max. entry is 0)
  450. *> 3 => Error return from DLATM1 (computing DL)
  451. *> 4 => Error return from DLATM1 (computing DR)
  452. *> 5 => ANORM is positive, but matrix constructed prior to
  453. *> attempting to scale it to have norm ANORM, is zero
  454. *> \endverbatim
  455. *
  456. * Authors:
  457. * ========
  458. *
  459. *> \author Univ. of Tennessee
  460. *> \author Univ. of California Berkeley
  461. *> \author Univ. of Colorado Denver
  462. *> \author NAG Ltd.
  463. *
  464. *> \ingroup double_matgen
  465. *
  466. * =====================================================================
  467. SUBROUTINE DLATMR( M, N, DIST, ISEED, SYM, D, MODE, COND, DMAX,
  468. $ RSIGN, GRADE, DL, MODEL, CONDL, DR, MODER,
  469. $ CONDR, PIVTNG, IPIVOT, KL, KU, SPARSE, ANORM,
  470. $ PACK, A, LDA, IWORK, INFO )
  471. *
  472. * -- LAPACK computational routine --
  473. * -- LAPACK is a software package provided by Univ. of Tennessee, --
  474. * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
  475. *
  476. * .. Scalar Arguments ..
  477. CHARACTER DIST, GRADE, PACK, PIVTNG, RSIGN, SYM
  478. INTEGER INFO, KL, KU, LDA, M, MODE, MODEL, MODER, N
  479. DOUBLE PRECISION ANORM, COND, CONDL, CONDR, DMAX, SPARSE
  480. * ..
  481. * .. Array Arguments ..
  482. INTEGER IPIVOT( * ), ISEED( 4 ), IWORK( * )
  483. DOUBLE PRECISION A( LDA, * ), D( * ), DL( * ), DR( * )
  484. * ..
  485. *
  486. * =====================================================================
  487. *
  488. * .. Parameters ..
  489. DOUBLE PRECISION ZERO
  490. PARAMETER ( ZERO = 0.0D0 )
  491. DOUBLE PRECISION ONE
  492. PARAMETER ( ONE = 1.0D0 )
  493. * ..
  494. * .. Local Scalars ..
  495. LOGICAL BADPVT, DZERO, FULBND
  496. INTEGER I, IDIST, IGRADE, IISUB, IPACK, IPVTNG, IRSIGN,
  497. $ ISUB, ISYM, J, JJSUB, JSUB, K, KLL, KUU, MNMIN,
  498. $ MNSUB, MXSUB, NPVTS
  499. DOUBLE PRECISION ALPHA, ONORM, TEMP
  500. * ..
  501. * .. Local Arrays ..
  502. DOUBLE PRECISION TEMPA( 1 )
  503. * ..
  504. * .. External Functions ..
  505. LOGICAL LSAME
  506. DOUBLE PRECISION DLANGB, DLANGE, DLANSB, DLANSP, DLANSY, DLATM2,
  507. $ DLATM3
  508. EXTERNAL LSAME, DLANGB, DLANGE, DLANSB, DLANSP, DLANSY,
  509. $ DLATM2, DLATM3
  510. * ..
  511. * .. External Subroutines ..
  512. EXTERNAL DLATM1, DSCAL, XERBLA
  513. * ..
  514. * .. Intrinsic Functions ..
  515. INTRINSIC ABS, MAX, MIN, MOD
  516. * ..
  517. * .. Executable Statements ..
  518. *
  519. * 1) Decode and Test the input parameters.
  520. * Initialize flags & seed.
  521. *
  522. INFO = 0
  523. *
  524. * Quick return if possible
  525. *
  526. IF( M.EQ.0 .OR. N.EQ.0 )
  527. $ RETURN
  528. *
  529. * Decode DIST
  530. *
  531. IF( LSAME( DIST, 'U' ) ) THEN
  532. IDIST = 1
  533. ELSE IF( LSAME( DIST, 'S' ) ) THEN
  534. IDIST = 2
  535. ELSE IF( LSAME( DIST, 'N' ) ) THEN
  536. IDIST = 3
  537. ELSE
  538. IDIST = -1
  539. END IF
  540. *
  541. * Decode SYM
  542. *
  543. IF( LSAME( SYM, 'S' ) ) THEN
  544. ISYM = 0
  545. ELSE IF( LSAME( SYM, 'N' ) ) THEN
  546. ISYM = 1
  547. ELSE IF( LSAME( SYM, 'H' ) ) THEN
  548. ISYM = 0
  549. ELSE
  550. ISYM = -1
  551. END IF
  552. *
  553. * Decode RSIGN
  554. *
  555. IF( LSAME( RSIGN, 'F' ) ) THEN
  556. IRSIGN = 0
  557. ELSE IF( LSAME( RSIGN, 'T' ) ) THEN
  558. IRSIGN = 1
  559. ELSE
  560. IRSIGN = -1
  561. END IF
  562. *
  563. * Decode PIVTNG
  564. *
  565. IF( LSAME( PIVTNG, 'N' ) ) THEN
  566. IPVTNG = 0
  567. ELSE IF( LSAME( PIVTNG, ' ' ) ) THEN
  568. IPVTNG = 0
  569. ELSE IF( LSAME( PIVTNG, 'L' ) ) THEN
  570. IPVTNG = 1
  571. NPVTS = M
  572. ELSE IF( LSAME( PIVTNG, 'R' ) ) THEN
  573. IPVTNG = 2
  574. NPVTS = N
  575. ELSE IF( LSAME( PIVTNG, 'B' ) ) THEN
  576. IPVTNG = 3
  577. NPVTS = MIN( N, M )
  578. ELSE IF( LSAME( PIVTNG, 'F' ) ) THEN
  579. IPVTNG = 3
  580. NPVTS = MIN( N, M )
  581. ELSE
  582. IPVTNG = -1
  583. END IF
  584. *
  585. * Decode GRADE
  586. *
  587. IF( LSAME( GRADE, 'N' ) ) THEN
  588. IGRADE = 0
  589. ELSE IF( LSAME( GRADE, 'L' ) ) THEN
  590. IGRADE = 1
  591. ELSE IF( LSAME( GRADE, 'R' ) ) THEN
  592. IGRADE = 2
  593. ELSE IF( LSAME( GRADE, 'B' ) ) THEN
  594. IGRADE = 3
  595. ELSE IF( LSAME( GRADE, 'E' ) ) THEN
  596. IGRADE = 4
  597. ELSE IF( LSAME( GRADE, 'H' ) .OR. LSAME( GRADE, 'S' ) ) THEN
  598. IGRADE = 5
  599. ELSE
  600. IGRADE = -1
  601. END IF
  602. *
  603. * Decode PACK
  604. *
  605. IF( LSAME( PACK, 'N' ) ) THEN
  606. IPACK = 0
  607. ELSE IF( LSAME( PACK, 'U' ) ) THEN
  608. IPACK = 1
  609. ELSE IF( LSAME( PACK, 'L' ) ) THEN
  610. IPACK = 2
  611. ELSE IF( LSAME( PACK, 'C' ) ) THEN
  612. IPACK = 3
  613. ELSE IF( LSAME( PACK, 'R' ) ) THEN
  614. IPACK = 4
  615. ELSE IF( LSAME( PACK, 'B' ) ) THEN
  616. IPACK = 5
  617. ELSE IF( LSAME( PACK, 'Q' ) ) THEN
  618. IPACK = 6
  619. ELSE IF( LSAME( PACK, 'Z' ) ) THEN
  620. IPACK = 7
  621. ELSE
  622. IPACK = -1
  623. END IF
  624. *
  625. * Set certain internal parameters
  626. *
  627. MNMIN = MIN( M, N )
  628. KLL = MIN( KL, M-1 )
  629. KUU = MIN( KU, N-1 )
  630. *
  631. * If inv(DL) is used, check to see if DL has a zero entry.
  632. *
  633. DZERO = .FALSE.
  634. IF( IGRADE.EQ.4 .AND. MODEL.EQ.0 ) THEN
  635. DO 10 I = 1, M
  636. IF( DL( I ).EQ.ZERO )
  637. $ DZERO = .TRUE.
  638. 10 CONTINUE
  639. END IF
  640. *
  641. * Check values in IPIVOT
  642. *
  643. BADPVT = .FALSE.
  644. IF( IPVTNG.GT.0 ) THEN
  645. DO 20 J = 1, NPVTS
  646. IF( IPIVOT( J ).LE.0 .OR. IPIVOT( J ).GT.NPVTS )
  647. $ BADPVT = .TRUE.
  648. 20 CONTINUE
  649. END IF
  650. *
  651. * Set INFO if an error
  652. *
  653. IF( M.LT.0 ) THEN
  654. INFO = -1
  655. ELSE IF( M.NE.N .AND. ISYM.EQ.0 ) THEN
  656. INFO = -1
  657. ELSE IF( N.LT.0 ) THEN
  658. INFO = -2
  659. ELSE IF( IDIST.EQ.-1 ) THEN
  660. INFO = -3
  661. ELSE IF( ISYM.EQ.-1 ) THEN
  662. INFO = -5
  663. ELSE IF( MODE.LT.-6 .OR. MODE.GT.6 ) THEN
  664. INFO = -7
  665. ELSE IF( ( MODE.NE.-6 .AND. MODE.NE.0 .AND. MODE.NE.6 ) .AND.
  666. $ COND.LT.ONE ) THEN
  667. INFO = -8
  668. ELSE IF( ( MODE.NE.-6 .AND. MODE.NE.0 .AND. MODE.NE.6 ) .AND.
  669. $ IRSIGN.EQ.-1 ) THEN
  670. INFO = -10
  671. ELSE IF( IGRADE.EQ.-1 .OR. ( IGRADE.EQ.4 .AND. M.NE.N ) .OR.
  672. $ ( ( IGRADE.GE.1 .AND. IGRADE.LE.4 ) .AND. ISYM.EQ.0 ) )
  673. $ THEN
  674. INFO = -11
  675. ELSE IF( IGRADE.EQ.4 .AND. DZERO ) THEN
  676. INFO = -12
  677. ELSE IF( ( IGRADE.EQ.1 .OR. IGRADE.EQ.3 .OR. IGRADE.EQ.4 .OR.
  678. $ IGRADE.EQ.5 ) .AND. ( MODEL.LT.-6 .OR. MODEL.GT.6 ) )
  679. $ THEN
  680. INFO = -13
  681. ELSE IF( ( IGRADE.EQ.1 .OR. IGRADE.EQ.3 .OR. IGRADE.EQ.4 .OR.
  682. $ IGRADE.EQ.5 ) .AND. ( MODEL.NE.-6 .AND. MODEL.NE.0 .AND.
  683. $ MODEL.NE.6 ) .AND. CONDL.LT.ONE ) THEN
  684. INFO = -14
  685. ELSE IF( ( IGRADE.EQ.2 .OR. IGRADE.EQ.3 ) .AND.
  686. $ ( MODER.LT.-6 .OR. MODER.GT.6 ) ) THEN
  687. INFO = -16
  688. ELSE IF( ( IGRADE.EQ.2 .OR. IGRADE.EQ.3 ) .AND.
  689. $ ( MODER.NE.-6 .AND. MODER.NE.0 .AND. MODER.NE.6 ) .AND.
  690. $ CONDR.LT.ONE ) THEN
  691. INFO = -17
  692. ELSE IF( IPVTNG.EQ.-1 .OR. ( IPVTNG.EQ.3 .AND. M.NE.N ) .OR.
  693. $ ( ( IPVTNG.EQ.1 .OR. IPVTNG.EQ.2 ) .AND. ISYM.EQ.0 ) )
  694. $ THEN
  695. INFO = -18
  696. ELSE IF( IPVTNG.NE.0 .AND. BADPVT ) THEN
  697. INFO = -19
  698. ELSE IF( KL.LT.0 ) THEN
  699. INFO = -20
  700. ELSE IF( KU.LT.0 .OR. ( ISYM.EQ.0 .AND. KL.NE.KU ) ) THEN
  701. INFO = -21
  702. ELSE IF( SPARSE.LT.ZERO .OR. SPARSE.GT.ONE ) THEN
  703. INFO = -22
  704. ELSE IF( IPACK.EQ.-1 .OR. ( ( IPACK.EQ.1 .OR. IPACK.EQ.2 .OR.
  705. $ IPACK.EQ.5 .OR. IPACK.EQ.6 ) .AND. ISYM.EQ.1 ) .OR.
  706. $ ( IPACK.EQ.3 .AND. ISYM.EQ.1 .AND. ( KL.NE.0 .OR. M.NE.
  707. $ N ) ) .OR. ( IPACK.EQ.4 .AND. ISYM.EQ.1 .AND. ( KU.NE.
  708. $ 0 .OR. M.NE.N ) ) ) THEN
  709. INFO = -24
  710. ELSE IF( ( ( IPACK.EQ.0 .OR. IPACK.EQ.1 .OR. IPACK.EQ.2 ) .AND.
  711. $ LDA.LT.MAX( 1, M ) ) .OR. ( ( IPACK.EQ.3 .OR. IPACK.EQ.
  712. $ 4 ) .AND. LDA.LT.1 ) .OR. ( ( IPACK.EQ.5 .OR. IPACK.EQ.
  713. $ 6 ) .AND. LDA.LT.KUU+1 ) .OR.
  714. $ ( IPACK.EQ.7 .AND. LDA.LT.KLL+KUU+1 ) ) THEN
  715. INFO = -26
  716. END IF
  717. *
  718. IF( INFO.NE.0 ) THEN
  719. CALL XERBLA( 'DLATMR', -INFO )
  720. RETURN
  721. END IF
  722. *
  723. * Decide if we can pivot consistently
  724. *
  725. FULBND = .FALSE.
  726. IF( KUU.EQ.N-1 .AND. KLL.EQ.M-1 )
  727. $ FULBND = .TRUE.
  728. *
  729. * Initialize random number generator
  730. *
  731. DO 30 I = 1, 4
  732. ISEED( I ) = MOD( ABS( ISEED( I ) ), 4096 )
  733. 30 CONTINUE
  734. *
  735. ISEED( 4 ) = 2*( ISEED( 4 ) / 2 ) + 1
  736. *
  737. * 2) Set up D, DL, and DR, if indicated.
  738. *
  739. * Compute D according to COND and MODE
  740. *
  741. CALL DLATM1( MODE, COND, IRSIGN, IDIST, ISEED, D, MNMIN, INFO )
  742. IF( INFO.NE.0 ) THEN
  743. INFO = 1
  744. RETURN
  745. END IF
  746. IF( MODE.NE.0 .AND. MODE.NE.-6 .AND. MODE.NE.6 ) THEN
  747. *
  748. * Scale by DMAX
  749. *
  750. TEMP = ABS( D( 1 ) )
  751. DO 40 I = 2, MNMIN
  752. TEMP = MAX( TEMP, ABS( D( I ) ) )
  753. 40 CONTINUE
  754. IF( TEMP.EQ.ZERO .AND. DMAX.NE.ZERO ) THEN
  755. INFO = 2
  756. RETURN
  757. END IF
  758. IF( TEMP.NE.ZERO ) THEN
  759. ALPHA = DMAX / TEMP
  760. ELSE
  761. ALPHA = ONE
  762. END IF
  763. DO 50 I = 1, MNMIN
  764. D( I ) = ALPHA*D( I )
  765. 50 CONTINUE
  766. *
  767. END IF
  768. *
  769. * Compute DL if grading set
  770. *
  771. IF( IGRADE.EQ.1 .OR. IGRADE.EQ.3 .OR. IGRADE.EQ.4 .OR. IGRADE.EQ.
  772. $ 5 ) THEN
  773. CALL DLATM1( MODEL, CONDL, 0, IDIST, ISEED, DL, M, INFO )
  774. IF( INFO.NE.0 ) THEN
  775. INFO = 3
  776. RETURN
  777. END IF
  778. END IF
  779. *
  780. * Compute DR if grading set
  781. *
  782. IF( IGRADE.EQ.2 .OR. IGRADE.EQ.3 ) THEN
  783. CALL DLATM1( MODER, CONDR, 0, IDIST, ISEED, DR, N, INFO )
  784. IF( INFO.NE.0 ) THEN
  785. INFO = 4
  786. RETURN
  787. END IF
  788. END IF
  789. *
  790. * 3) Generate IWORK if pivoting
  791. *
  792. IF( IPVTNG.GT.0 ) THEN
  793. DO 60 I = 1, NPVTS
  794. IWORK( I ) = I
  795. 60 CONTINUE
  796. IF( FULBND ) THEN
  797. DO 70 I = 1, NPVTS
  798. K = IPIVOT( I )
  799. J = IWORK( I )
  800. IWORK( I ) = IWORK( K )
  801. IWORK( K ) = J
  802. 70 CONTINUE
  803. ELSE
  804. DO 80 I = NPVTS, 1, -1
  805. K = IPIVOT( I )
  806. J = IWORK( I )
  807. IWORK( I ) = IWORK( K )
  808. IWORK( K ) = J
  809. 80 CONTINUE
  810. END IF
  811. END IF
  812. *
  813. * 4) Generate matrices for each kind of PACKing
  814. * Always sweep matrix columnwise (if symmetric, upper
  815. * half only) so that matrix generated does not depend
  816. * on PACK
  817. *
  818. IF( FULBND ) THEN
  819. *
  820. * Use DLATM3 so matrices generated with differing PIVOTing only
  821. * differ only in the order of their rows and/or columns.
  822. *
  823. IF( IPACK.EQ.0 ) THEN
  824. IF( ISYM.EQ.0 ) THEN
  825. DO 100 J = 1, N
  826. DO 90 I = 1, J
  827. TEMP = DLATM3( M, N, I, J, ISUB, JSUB, KL, KU,
  828. $ IDIST, ISEED, D, IGRADE, DL, DR, IPVTNG,
  829. $ IWORK, SPARSE )
  830. A( ISUB, JSUB ) = TEMP
  831. A( JSUB, ISUB ) = TEMP
  832. 90 CONTINUE
  833. 100 CONTINUE
  834. ELSE IF( ISYM.EQ.1 ) THEN
  835. DO 120 J = 1, N
  836. DO 110 I = 1, M
  837. TEMP = DLATM3( M, N, I, J, ISUB, JSUB, KL, KU,
  838. $ IDIST, ISEED, D, IGRADE, DL, DR, IPVTNG,
  839. $ IWORK, SPARSE )
  840. A( ISUB, JSUB ) = TEMP
  841. 110 CONTINUE
  842. 120 CONTINUE
  843. END IF
  844. *
  845. ELSE IF( IPACK.EQ.1 ) THEN
  846. *
  847. DO 140 J = 1, N
  848. DO 130 I = 1, J
  849. TEMP = DLATM3( M, N, I, J, ISUB, JSUB, KL, KU, IDIST,
  850. $ ISEED, D, IGRADE, DL, DR, IPVTNG, IWORK,
  851. $ SPARSE )
  852. MNSUB = MIN( ISUB, JSUB )
  853. MXSUB = MAX( ISUB, JSUB )
  854. A( MNSUB, MXSUB ) = TEMP
  855. IF( MNSUB.NE.MXSUB )
  856. $ A( MXSUB, MNSUB ) = ZERO
  857. 130 CONTINUE
  858. 140 CONTINUE
  859. *
  860. ELSE IF( IPACK.EQ.2 ) THEN
  861. *
  862. DO 160 J = 1, N
  863. DO 150 I = 1, J
  864. TEMP = DLATM3( M, N, I, J, ISUB, JSUB, KL, KU, IDIST,
  865. $ ISEED, D, IGRADE, DL, DR, IPVTNG, IWORK,
  866. $ SPARSE )
  867. MNSUB = MIN( ISUB, JSUB )
  868. MXSUB = MAX( ISUB, JSUB )
  869. A( MXSUB, MNSUB ) = TEMP
  870. IF( MNSUB.NE.MXSUB )
  871. $ A( MNSUB, MXSUB ) = ZERO
  872. 150 CONTINUE
  873. 160 CONTINUE
  874. *
  875. ELSE IF( IPACK.EQ.3 ) THEN
  876. *
  877. DO 180 J = 1, N
  878. DO 170 I = 1, J
  879. TEMP = DLATM3( M, N, I, J, ISUB, JSUB, KL, KU, IDIST,
  880. $ ISEED, D, IGRADE, DL, DR, IPVTNG, IWORK,
  881. $ SPARSE )
  882. *
  883. * Compute K = location of (ISUB,JSUB) entry in packed
  884. * array
  885. *
  886. MNSUB = MIN( ISUB, JSUB )
  887. MXSUB = MAX( ISUB, JSUB )
  888. K = MXSUB*( MXSUB-1 ) / 2 + MNSUB
  889. *
  890. * Convert K to (IISUB,JJSUB) location
  891. *
  892. JJSUB = ( K-1 ) / LDA + 1
  893. IISUB = K - LDA*( JJSUB-1 )
  894. *
  895. A( IISUB, JJSUB ) = TEMP
  896. 170 CONTINUE
  897. 180 CONTINUE
  898. *
  899. ELSE IF( IPACK.EQ.4 ) THEN
  900. *
  901. DO 200 J = 1, N
  902. DO 190 I = 1, J
  903. TEMP = DLATM3( M, N, I, J, ISUB, JSUB, KL, KU, IDIST,
  904. $ ISEED, D, IGRADE, DL, DR, IPVTNG, IWORK,
  905. $ SPARSE )
  906. *
  907. * Compute K = location of (I,J) entry in packed array
  908. *
  909. MNSUB = MIN( ISUB, JSUB )
  910. MXSUB = MAX( ISUB, JSUB )
  911. IF( MNSUB.EQ.1 ) THEN
  912. K = MXSUB
  913. ELSE
  914. K = N*( N+1 ) / 2 - ( N-MNSUB+1 )*( N-MNSUB+2 ) /
  915. $ 2 + MXSUB - MNSUB + 1
  916. END IF
  917. *
  918. * Convert K to (IISUB,JJSUB) location
  919. *
  920. JJSUB = ( K-1 ) / LDA + 1
  921. IISUB = K - LDA*( JJSUB-1 )
  922. *
  923. A( IISUB, JJSUB ) = TEMP
  924. 190 CONTINUE
  925. 200 CONTINUE
  926. *
  927. ELSE IF( IPACK.EQ.5 ) THEN
  928. *
  929. DO 220 J = 1, N
  930. DO 210 I = J - KUU, J
  931. IF( I.LT.1 ) THEN
  932. A( J-I+1, I+N ) = ZERO
  933. ELSE
  934. TEMP = DLATM3( M, N, I, J, ISUB, JSUB, KL, KU,
  935. $ IDIST, ISEED, D, IGRADE, DL, DR, IPVTNG,
  936. $ IWORK, SPARSE )
  937. MNSUB = MIN( ISUB, JSUB )
  938. MXSUB = MAX( ISUB, JSUB )
  939. A( MXSUB-MNSUB+1, MNSUB ) = TEMP
  940. END IF
  941. 210 CONTINUE
  942. 220 CONTINUE
  943. *
  944. ELSE IF( IPACK.EQ.6 ) THEN
  945. *
  946. DO 240 J = 1, N
  947. DO 230 I = J - KUU, J
  948. TEMP = DLATM3( M, N, I, J, ISUB, JSUB, KL, KU, IDIST,
  949. $ ISEED, D, IGRADE, DL, DR, IPVTNG, IWORK,
  950. $ SPARSE )
  951. MNSUB = MIN( ISUB, JSUB )
  952. MXSUB = MAX( ISUB, JSUB )
  953. A( MNSUB-MXSUB+KUU+1, MXSUB ) = TEMP
  954. 230 CONTINUE
  955. 240 CONTINUE
  956. *
  957. ELSE IF( IPACK.EQ.7 ) THEN
  958. *
  959. IF( ISYM.EQ.0 ) THEN
  960. DO 260 J = 1, N
  961. DO 250 I = J - KUU, J
  962. TEMP = DLATM3( M, N, I, J, ISUB, JSUB, KL, KU,
  963. $ IDIST, ISEED, D, IGRADE, DL, DR, IPVTNG,
  964. $ IWORK, SPARSE )
  965. MNSUB = MIN( ISUB, JSUB )
  966. MXSUB = MAX( ISUB, JSUB )
  967. A( MNSUB-MXSUB+KUU+1, MXSUB ) = TEMP
  968. IF( I.LT.1 )
  969. $ A( J-I+1+KUU, I+N ) = ZERO
  970. IF( I.GE.1 .AND. MNSUB.NE.MXSUB )
  971. $ A( MXSUB-MNSUB+1+KUU, MNSUB ) = TEMP
  972. 250 CONTINUE
  973. 260 CONTINUE
  974. ELSE IF( ISYM.EQ.1 ) THEN
  975. DO 280 J = 1, N
  976. DO 270 I = J - KUU, J + KLL
  977. TEMP = DLATM3( M, N, I, J, ISUB, JSUB, KL, KU,
  978. $ IDIST, ISEED, D, IGRADE, DL, DR, IPVTNG,
  979. $ IWORK, SPARSE )
  980. A( ISUB-JSUB+KUU+1, JSUB ) = TEMP
  981. 270 CONTINUE
  982. 280 CONTINUE
  983. END IF
  984. *
  985. END IF
  986. *
  987. ELSE
  988. *
  989. * Use DLATM2
  990. *
  991. IF( IPACK.EQ.0 ) THEN
  992. IF( ISYM.EQ.0 ) THEN
  993. DO 300 J = 1, N
  994. DO 290 I = 1, J
  995. A( I, J ) = DLATM2( M, N, I, J, KL, KU, IDIST,
  996. $ ISEED, D, IGRADE, DL, DR, IPVTNG,
  997. $ IWORK, SPARSE )
  998. A( J, I ) = A( I, J )
  999. 290 CONTINUE
  1000. 300 CONTINUE
  1001. ELSE IF( ISYM.EQ.1 ) THEN
  1002. DO 320 J = 1, N
  1003. DO 310 I = 1, M
  1004. A( I, J ) = DLATM2( M, N, I, J, KL, KU, IDIST,
  1005. $ ISEED, D, IGRADE, DL, DR, IPVTNG,
  1006. $ IWORK, SPARSE )
  1007. 310 CONTINUE
  1008. 320 CONTINUE
  1009. END IF
  1010. *
  1011. ELSE IF( IPACK.EQ.1 ) THEN
  1012. *
  1013. DO 340 J = 1, N
  1014. DO 330 I = 1, J
  1015. A( I, J ) = DLATM2( M, N, I, J, KL, KU, IDIST, ISEED,
  1016. $ D, IGRADE, DL, DR, IPVTNG, IWORK, SPARSE )
  1017. IF( I.NE.J )
  1018. $ A( J, I ) = ZERO
  1019. 330 CONTINUE
  1020. 340 CONTINUE
  1021. *
  1022. ELSE IF( IPACK.EQ.2 ) THEN
  1023. *
  1024. DO 360 J = 1, N
  1025. DO 350 I = 1, J
  1026. A( J, I ) = DLATM2( M, N, I, J, KL, KU, IDIST, ISEED,
  1027. $ D, IGRADE, DL, DR, IPVTNG, IWORK, SPARSE )
  1028. IF( I.NE.J )
  1029. $ A( I, J ) = ZERO
  1030. 350 CONTINUE
  1031. 360 CONTINUE
  1032. *
  1033. ELSE IF( IPACK.EQ.3 ) THEN
  1034. *
  1035. ISUB = 0
  1036. JSUB = 1
  1037. DO 380 J = 1, N
  1038. DO 370 I = 1, J
  1039. ISUB = ISUB + 1
  1040. IF( ISUB.GT.LDA ) THEN
  1041. ISUB = 1
  1042. JSUB = JSUB + 1
  1043. END IF
  1044. A( ISUB, JSUB ) = DLATM2( M, N, I, J, KL, KU, IDIST,
  1045. $ ISEED, D, IGRADE, DL, DR, IPVTNG,
  1046. $ IWORK, SPARSE )
  1047. 370 CONTINUE
  1048. 380 CONTINUE
  1049. *
  1050. ELSE IF( IPACK.EQ.4 ) THEN
  1051. *
  1052. IF( ISYM.EQ.0 ) THEN
  1053. DO 400 J = 1, N
  1054. DO 390 I = 1, J
  1055. *
  1056. * Compute K = location of (I,J) entry in packed array
  1057. *
  1058. IF( I.EQ.1 ) THEN
  1059. K = J
  1060. ELSE
  1061. K = N*( N+1 ) / 2 - ( N-I+1 )*( N-I+2 ) / 2 +
  1062. $ J - I + 1
  1063. END IF
  1064. *
  1065. * Convert K to (ISUB,JSUB) location
  1066. *
  1067. JSUB = ( K-1 ) / LDA + 1
  1068. ISUB = K - LDA*( JSUB-1 )
  1069. *
  1070. A( ISUB, JSUB ) = DLATM2( M, N, I, J, KL, KU,
  1071. $ IDIST, ISEED, D, IGRADE, DL, DR,
  1072. $ IPVTNG, IWORK, SPARSE )
  1073. 390 CONTINUE
  1074. 400 CONTINUE
  1075. ELSE
  1076. ISUB = 0
  1077. JSUB = 1
  1078. DO 420 J = 1, N
  1079. DO 410 I = J, M
  1080. ISUB = ISUB + 1
  1081. IF( ISUB.GT.LDA ) THEN
  1082. ISUB = 1
  1083. JSUB = JSUB + 1
  1084. END IF
  1085. A( ISUB, JSUB ) = DLATM2( M, N, I, J, KL, KU,
  1086. $ IDIST, ISEED, D, IGRADE, DL, DR,
  1087. $ IPVTNG, IWORK, SPARSE )
  1088. 410 CONTINUE
  1089. 420 CONTINUE
  1090. END IF
  1091. *
  1092. ELSE IF( IPACK.EQ.5 ) THEN
  1093. *
  1094. DO 440 J = 1, N
  1095. DO 430 I = J - KUU, J
  1096. IF( I.LT.1 ) THEN
  1097. A( J-I+1, I+N ) = ZERO
  1098. ELSE
  1099. A( J-I+1, I ) = DLATM2( M, N, I, J, KL, KU, IDIST,
  1100. $ ISEED, D, IGRADE, DL, DR, IPVTNG,
  1101. $ IWORK, SPARSE )
  1102. END IF
  1103. 430 CONTINUE
  1104. 440 CONTINUE
  1105. *
  1106. ELSE IF( IPACK.EQ.6 ) THEN
  1107. *
  1108. DO 460 J = 1, N
  1109. DO 450 I = J - KUU, J
  1110. A( I-J+KUU+1, J ) = DLATM2( M, N, I, J, KL, KU, IDIST,
  1111. $ ISEED, D, IGRADE, DL, DR, IPVTNG,
  1112. $ IWORK, SPARSE )
  1113. 450 CONTINUE
  1114. 460 CONTINUE
  1115. *
  1116. ELSE IF( IPACK.EQ.7 ) THEN
  1117. *
  1118. IF( ISYM.EQ.0 ) THEN
  1119. DO 480 J = 1, N
  1120. DO 470 I = J - KUU, J
  1121. A( I-J+KUU+1, J ) = DLATM2( M, N, I, J, KL, KU,
  1122. $ IDIST, ISEED, D, IGRADE, DL,
  1123. $ DR, IPVTNG, IWORK, SPARSE )
  1124. IF( I.LT.1 )
  1125. $ A( J-I+1+KUU, I+N ) = ZERO
  1126. IF( I.GE.1 .AND. I.NE.J )
  1127. $ A( J-I+1+KUU, I ) = A( I-J+KUU+1, J )
  1128. 470 CONTINUE
  1129. 480 CONTINUE
  1130. ELSE IF( ISYM.EQ.1 ) THEN
  1131. DO 500 J = 1, N
  1132. DO 490 I = J - KUU, J + KLL
  1133. A( I-J+KUU+1, J ) = DLATM2( M, N, I, J, KL, KU,
  1134. $ IDIST, ISEED, D, IGRADE, DL,
  1135. $ DR, IPVTNG, IWORK, SPARSE )
  1136. 490 CONTINUE
  1137. 500 CONTINUE
  1138. END IF
  1139. *
  1140. END IF
  1141. *
  1142. END IF
  1143. *
  1144. * 5) Scaling the norm
  1145. *
  1146. IF( IPACK.EQ.0 ) THEN
  1147. ONORM = DLANGE( 'M', M, N, A, LDA, TEMPA )
  1148. ELSE IF( IPACK.EQ.1 ) THEN
  1149. ONORM = DLANSY( 'M', 'U', N, A, LDA, TEMPA )
  1150. ELSE IF( IPACK.EQ.2 ) THEN
  1151. ONORM = DLANSY( 'M', 'L', N, A, LDA, TEMPA )
  1152. ELSE IF( IPACK.EQ.3 ) THEN
  1153. ONORM = DLANSP( 'M', 'U', N, A, TEMPA )
  1154. ELSE IF( IPACK.EQ.4 ) THEN
  1155. ONORM = DLANSP( 'M', 'L', N, A, TEMPA )
  1156. ELSE IF( IPACK.EQ.5 ) THEN
  1157. ONORM = DLANSB( 'M', 'L', N, KLL, A, LDA, TEMPA )
  1158. ELSE IF( IPACK.EQ.6 ) THEN
  1159. ONORM = DLANSB( 'M', 'U', N, KUU, A, LDA, TEMPA )
  1160. ELSE IF( IPACK.EQ.7 ) THEN
  1161. ONORM = DLANGB( 'M', N, KLL, KUU, A, LDA, TEMPA )
  1162. END IF
  1163. *
  1164. IF( ANORM.GE.ZERO ) THEN
  1165. *
  1166. IF( ANORM.GT.ZERO .AND. ONORM.EQ.ZERO ) THEN
  1167. *
  1168. * Desired scaling impossible
  1169. *
  1170. INFO = 5
  1171. RETURN
  1172. *
  1173. ELSE IF( ( ANORM.GT.ONE .AND. ONORM.LT.ONE ) .OR.
  1174. $ ( ANORM.LT.ONE .AND. ONORM.GT.ONE ) ) THEN
  1175. *
  1176. * Scale carefully to avoid over / underflow
  1177. *
  1178. IF( IPACK.LE.2 ) THEN
  1179. DO 510 J = 1, N
  1180. CALL DSCAL( M, ONE / ONORM, A( 1, J ), 1 )
  1181. CALL DSCAL( M, ANORM, A( 1, J ), 1 )
  1182. 510 CONTINUE
  1183. *
  1184. ELSE IF( IPACK.EQ.3 .OR. IPACK.EQ.4 ) THEN
  1185. *
  1186. CALL DSCAL( N*( N+1 ) / 2, ONE / ONORM, A, 1 )
  1187. CALL DSCAL( N*( N+1 ) / 2, ANORM, A, 1 )
  1188. *
  1189. ELSE IF( IPACK.GE.5 ) THEN
  1190. *
  1191. DO 520 J = 1, N
  1192. CALL DSCAL( KLL+KUU+1, ONE / ONORM, A( 1, J ), 1 )
  1193. CALL DSCAL( KLL+KUU+1, ANORM, A( 1, J ), 1 )
  1194. 520 CONTINUE
  1195. *
  1196. END IF
  1197. *
  1198. ELSE
  1199. *
  1200. * Scale straightforwardly
  1201. *
  1202. IF( IPACK.LE.2 ) THEN
  1203. DO 530 J = 1, N
  1204. CALL DSCAL( M, ANORM / ONORM, A( 1, J ), 1 )
  1205. 530 CONTINUE
  1206. *
  1207. ELSE IF( IPACK.EQ.3 .OR. IPACK.EQ.4 ) THEN
  1208. *
  1209. CALL DSCAL( N*( N+1 ) / 2, ANORM / ONORM, A, 1 )
  1210. *
  1211. ELSE IF( IPACK.GE.5 ) THEN
  1212. *
  1213. DO 540 J = 1, N
  1214. CALL DSCAL( KLL+KUU+1, ANORM / ONORM, A( 1, J ), 1 )
  1215. 540 CONTINUE
  1216. END IF
  1217. *
  1218. END IF
  1219. *
  1220. END IF
  1221. *
  1222. * End of DLATMR
  1223. *
  1224. END