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.

slatms.f 40 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125
  1. *> \brief \b SLATMS
  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 SLATMS( M, N, DIST, ISEED, SYM, D, MODE, COND, DMAX,
  12. * KL, KU, PACK, A, LDA, WORK, INFO )
  13. *
  14. * .. Scalar Arguments ..
  15. * CHARACTER DIST, PACK, SYM
  16. * INTEGER INFO, KL, KU, LDA, M, MODE, N
  17. * REAL COND, DMAX
  18. * ..
  19. * .. Array Arguments ..
  20. * INTEGER ISEED( 4 )
  21. * REAL A( LDA, * ), D( * ), WORK( * )
  22. * ..
  23. *
  24. *
  25. *> \par Purpose:
  26. * =============
  27. *>
  28. *> \verbatim
  29. *>
  30. *> SLATMS generates random matrices with specified singular values
  31. *> (or symmetric/hermitian with specified eigenvalues)
  32. *> for testing LAPACK programs.
  33. *>
  34. *> SLATMS operates by applying the following sequence of
  35. *> operations:
  36. *>
  37. *> Set the diagonal to D, where D may be input or
  38. *> computed according to MODE, COND, DMAX, and SYM
  39. *> as described below.
  40. *>
  41. *> Generate a matrix with the appropriate band structure, by one
  42. *> of two methods:
  43. *>
  44. *> Method A:
  45. *> Generate a dense M x N matrix by multiplying D on the left
  46. *> and the right by random unitary matrices, then:
  47. *>
  48. *> Reduce the bandwidth according to KL and KU, using
  49. *> Householder transformations.
  50. *>
  51. *> Method B:
  52. *> Convert the bandwidth-0 (i.e., diagonal) matrix to a
  53. *> bandwidth-1 matrix using Givens rotations, "chasing"
  54. *> out-of-band elements back, much as in QR; then
  55. *> convert the bandwidth-1 to a bandwidth-2 matrix, etc.
  56. *> Note that for reasonably small bandwidths (relative to
  57. *> M and N) this requires less storage, as a dense matrix
  58. *> is not generated. Also, for symmetric matrices, only
  59. *> one triangle is generated.
  60. *>
  61. *> Method A is chosen if the bandwidth is a large fraction of the
  62. *> order of the matrix, and LDA is at least M (so a dense
  63. *> matrix can be stored.) Method B is chosen if the bandwidth
  64. *> is small (< 1/2 N for symmetric, < .3 N+M for
  65. *> non-symmetric), or LDA is less than M and not less than the
  66. *> bandwidth.
  67. *>
  68. *> Pack the matrix if desired. Options specified by PACK are:
  69. *> no packing
  70. *> zero out upper half (if symmetric)
  71. *> zero out lower half (if symmetric)
  72. *> store the upper half columnwise (if symmetric or upper
  73. *> triangular)
  74. *> store the lower half columnwise (if symmetric or lower
  75. *> triangular)
  76. *> store the lower triangle in banded format (if symmetric
  77. *> or lower triangular)
  78. *> store the upper triangle in banded format (if symmetric
  79. *> or upper triangular)
  80. *> store the entire matrix in banded format
  81. *> If Method B is chosen, and band format is specified, then the
  82. *> matrix will be generated in the band format, so no repacking
  83. *> will be necessary.
  84. *> \endverbatim
  85. *
  86. * Arguments:
  87. * ==========
  88. *
  89. *> \param[in] M
  90. *> \verbatim
  91. *> M is INTEGER
  92. *> The number of rows of A. Not modified.
  93. *> \endverbatim
  94. *>
  95. *> \param[in] N
  96. *> \verbatim
  97. *> N is INTEGER
  98. *> The 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 the random eigen-/singular values.
  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 SLATMS
  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', the generated matrix is symmetric, with
  130. *> eigenvalues specified by D, COND, MODE, and DMAX; they
  131. *> may be positive, negative, or zero.
  132. *> If SYM='P', the generated matrix is symmetric, with
  133. *> eigenvalues (= singular values) specified by D, COND,
  134. *> MODE, and DMAX; they will not be negative.
  135. *> If SYM='N', the generated matrix is nonsymmetric, with
  136. *> singular values specified by D, COND, MODE, and DMAX;
  137. *> they will not be negative.
  138. *> Not modified.
  139. *> \endverbatim
  140. *>
  141. *> \param[in,out] D
  142. *> \verbatim
  143. *> D is REAL array, dimension ( MIN( M , N ) )
  144. *> This array is used to specify the singular values or
  145. *> eigenvalues of A (see SYM, above.) If MODE=0, then D is
  146. *> assumed to contain the singular/eigenvalues, otherwise
  147. *> they will be computed according to MODE, COND, and DMAX,
  148. *> and placed in D.
  149. *> Modified if MODE is nonzero.
  150. *> \endverbatim
  151. *>
  152. *> \param[in] MODE
  153. *> \verbatim
  154. *> MODE is INTEGER
  155. *> On entry this describes how the singular/eigenvalues are to
  156. *> be specified:
  157. *> MODE = 0 means use D as input
  158. *> MODE = 1 sets D(1)=1 and D(2:N)=1.0/COND
  159. *> MODE = 2 sets D(1:N-1)=1 and D(N)=1.0/COND
  160. *> MODE = 3 sets D(I)=COND**(-(I-1)/(N-1))
  161. *> MODE = 4 sets D(i)=1 - (i-1)/(N-1)*(1 - 1/COND)
  162. *> MODE = 5 sets D to random numbers in the range
  163. *> ( 1/COND , 1 ) such that their logarithms
  164. *> are uniformly distributed.
  165. *> MODE = 6 set D to random numbers from same distribution
  166. *> as the rest of the matrix.
  167. *> MODE < 0 has the same meaning as ABS(MODE), except that
  168. *> the order of the elements of D is reversed.
  169. *> Thus if MODE is positive, D has entries ranging from
  170. *> 1 to 1/COND, if negative, from 1/COND to 1,
  171. *> If SYM='S' or 'H', and MODE is neither 0, 6, nor -6, then
  172. *> the elements of D will also be multiplied by a random
  173. *> sign (i.e., +1 or -1.)
  174. *> Not modified.
  175. *> \endverbatim
  176. *>
  177. *> \param[in] COND
  178. *> \verbatim
  179. *> COND is REAL
  180. *> On entry, this is used as described under MODE above.
  181. *> If used, it must be >= 1. Not modified.
  182. *> \endverbatim
  183. *>
  184. *> \param[in] DMAX
  185. *> \verbatim
  186. *> DMAX is REAL
  187. *> If MODE is neither -6, 0 nor 6, the contents of D, as
  188. *> computed according to MODE and COND, will be scaled by
  189. *> DMAX / max(abs(D(i))); thus, the maximum absolute eigen- or
  190. *> singular value (which is to say the norm) will be abs(DMAX).
  191. *> Note that DMAX need not be positive: if DMAX is negative
  192. *> (or zero), D will be scaled by a negative number (or zero).
  193. *> Not modified.
  194. *> \endverbatim
  195. *>
  196. *> \param[in] KL
  197. *> \verbatim
  198. *> KL is INTEGER
  199. *> This specifies the lower bandwidth of the matrix. For
  200. *> example, KL=0 implies upper triangular, KL=1 implies upper
  201. *> Hessenberg, and KL being at least M-1 means that the matrix
  202. *> has full lower bandwidth. KL must equal KU if the matrix
  203. *> is symmetric.
  204. *> Not modified.
  205. *> \endverbatim
  206. *>
  207. *> \param[in] KU
  208. *> \verbatim
  209. *> KU is INTEGER
  210. *> This specifies the upper bandwidth of the matrix. For
  211. *> example, KU=0 implies lower triangular, KU=1 implies lower
  212. *> Hessenberg, and KU being at least N-1 means that the matrix
  213. *> has full upper bandwidth. KL must equal KU if the matrix
  214. *> is symmetric.
  215. *> Not modified.
  216. *> \endverbatim
  217. *>
  218. *> \param[in] PACK
  219. *> \verbatim
  220. *> PACK is CHARACTER*1
  221. *> This specifies packing of matrix as follows:
  222. *> 'N' => no packing
  223. *> 'U' => zero out all subdiagonal entries (if symmetric)
  224. *> 'L' => zero out all superdiagonal entries (if symmetric)
  225. *> 'C' => store the upper triangle columnwise
  226. *> (only if the matrix is symmetric or upper triangular)
  227. *> 'R' => store the lower triangle columnwise
  228. *> (only if the matrix is symmetric or lower triangular)
  229. *> 'B' => store the lower triangle in band storage scheme
  230. *> (only if matrix symmetric or lower triangular)
  231. *> 'Q' => store the upper triangle in band storage scheme
  232. *> (only if matrix symmetric or upper triangular)
  233. *> 'Z' => store the entire matrix in band storage scheme
  234. *> (pivoting can be provided for by using this
  235. *> option to store A in the trailing rows of
  236. *> the allocated storage)
  237. *>
  238. *> Using these options, the various LAPACK packed and banded
  239. *> storage schemes can be obtained:
  240. *> GB - use 'Z'
  241. *> PB, SB or TB - use 'B' or 'Q'
  242. *> PP, SP or TP - use 'C' or 'R'
  243. *>
  244. *> If two calls to SLATMS differ only in the PACK parameter,
  245. *> they will generate mathematically equivalent matrices.
  246. *> Not modified.
  247. *> \endverbatim
  248. *>
  249. *> \param[in,out] A
  250. *> \verbatim
  251. *> A is REAL array, dimension ( LDA, N )
  252. *> On exit A is the desired test matrix. A is first generated
  253. *> in full (unpacked) form, and then packed, if so specified
  254. *> by PACK. Thus, the first M elements of the first N
  255. *> columns will always be modified. If PACK specifies a
  256. *> packed or banded storage scheme, all LDA elements of the
  257. *> first N columns will be modified; the elements of the
  258. *> array which do not correspond to elements of the generated
  259. *> matrix are set to zero.
  260. *> Modified.
  261. *> \endverbatim
  262. *>
  263. *> \param[in] LDA
  264. *> \verbatim
  265. *> LDA is INTEGER
  266. *> LDA specifies the first dimension of A as declared in the
  267. *> calling program. If PACK='N', 'U', 'L', 'C', or 'R', then
  268. *> LDA must be at least M. If PACK='B' or 'Q', then LDA must
  269. *> be at least MIN( KL, M-1) (which is equal to MIN(KU,N-1)).
  270. *> If PACK='Z', LDA must be large enough to hold the packed
  271. *> array: MIN( KU, N-1) + MIN( KL, M-1) + 1.
  272. *> Not modified.
  273. *> \endverbatim
  274. *>
  275. *> \param[out] WORK
  276. *> \verbatim
  277. *> WORK is REAL array, dimension ( 3*MAX( N , M ) )
  278. *> Workspace.
  279. *> Modified.
  280. *> \endverbatim
  281. *>
  282. *> \param[out] INFO
  283. *> \verbatim
  284. *> INFO is INTEGER
  285. *> Error code. On exit, INFO will be set to one of the
  286. *> following values:
  287. *> 0 => normal return
  288. *> -1 => M negative or unequal to N and SYM='S', 'H', or 'P'
  289. *> -2 => N negative
  290. *> -3 => DIST illegal string
  291. *> -5 => SYM illegal string
  292. *> -7 => MODE not in range -6 to 6
  293. *> -8 => COND less than 1.0, and MODE neither -6, 0 nor 6
  294. *> -10 => KL negative
  295. *> -11 => KU negative, or SYM='S' or 'H' and KU not equal to KL
  296. *> -12 => PACK illegal string, or PACK='U' or 'L', and SYM='N';
  297. *> or PACK='C' or 'Q' and SYM='N' and KL is not zero;
  298. *> or PACK='R' or 'B' and SYM='N' and KU is not zero;
  299. *> or PACK='U', 'L', 'C', 'R', 'B', or 'Q', and M is not
  300. *> N.
  301. *> -14 => LDA is less than M, or PACK='Z' and LDA is less than
  302. *> MIN(KU,N-1) + MIN(KL,M-1) + 1.
  303. *> 1 => Error return from SLATM1
  304. *> 2 => Cannot scale to DMAX (max. sing. value is 0)
  305. *> 3 => Error return from SLAGGE or SLAGSY
  306. *> \endverbatim
  307. *
  308. * Authors:
  309. * ========
  310. *
  311. *> \author Univ. of Tennessee
  312. *> \author Univ. of California Berkeley
  313. *> \author Univ. of Colorado Denver
  314. *> \author NAG Ltd.
  315. *
  316. *> \ingroup real_matgen
  317. *
  318. * =====================================================================
  319. SUBROUTINE SLATMS( M, N, DIST, ISEED, SYM, D, MODE, COND, DMAX,
  320. $ KL, KU, PACK, A, LDA, WORK, INFO )
  321. *
  322. * -- LAPACK computational routine --
  323. * -- LAPACK is a software package provided by Univ. of Tennessee, --
  324. * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
  325. *
  326. * .. Scalar Arguments ..
  327. CHARACTER DIST, PACK, SYM
  328. INTEGER INFO, KL, KU, LDA, M, MODE, N
  329. REAL COND, DMAX
  330. * ..
  331. * .. Array Arguments ..
  332. INTEGER ISEED( 4 )
  333. REAL A( LDA, * ), D( * ), WORK( * )
  334. * ..
  335. *
  336. * =====================================================================
  337. *
  338. * .. Parameters ..
  339. REAL ZERO
  340. PARAMETER ( ZERO = 0.0E0 )
  341. REAL ONE
  342. PARAMETER ( ONE = 1.0E0 )
  343. REAL TWOPI
  344. PARAMETER ( TWOPI = 6.28318530717958647692528676655900576839E+0 )
  345. * ..
  346. * .. Local Scalars ..
  347. LOGICAL GIVENS, ILEXTR, ILTEMP, TOPDWN
  348. INTEGER I, IC, ICOL, IDIST, IENDCH, IINFO, IL, ILDA,
  349. $ IOFFG, IOFFST, IPACK, IPACKG, IR, IR1, IR2,
  350. $ IROW, IRSIGN, ISKEW, ISYM, ISYMPK, J, JC, JCH,
  351. $ JKL, JKU, JR, K, LLB, MINLDA, MNMIN, MR, NC,
  352. $ UUB
  353. REAL ALPHA, ANGLE, C, DUMMY, EXTRA, S, TEMP
  354. * ..
  355. * .. External Functions ..
  356. LOGICAL LSAME
  357. REAL SLARND
  358. EXTERNAL LSAME, SLARND
  359. * ..
  360. * .. External Subroutines ..
  361. EXTERNAL SCOPY, SLAGGE, SLAGSY, SLAROT, SLARTG, SLATM1,
  362. $ SLASET, SSCAL, XERBLA
  363. * ..
  364. * .. Intrinsic Functions ..
  365. INTRINSIC ABS, COS, MAX, MIN, MOD, REAL, SIN
  366. * ..
  367. * .. Executable Statements ..
  368. *
  369. * 1) Decode and Test the input parameters.
  370. * Initialize flags & seed.
  371. *
  372. INFO = 0
  373. *
  374. * Quick return if possible
  375. *
  376. IF( M.EQ.0 .OR. N.EQ.0 )
  377. $ RETURN
  378. *
  379. * Decode DIST
  380. *
  381. IF( LSAME( DIST, 'U' ) ) THEN
  382. IDIST = 1
  383. ELSE IF( LSAME( DIST, 'S' ) ) THEN
  384. IDIST = 2
  385. ELSE IF( LSAME( DIST, 'N' ) ) THEN
  386. IDIST = 3
  387. ELSE
  388. IDIST = -1
  389. END IF
  390. *
  391. * Decode SYM
  392. *
  393. IF( LSAME( SYM, 'N' ) ) THEN
  394. ISYM = 1
  395. IRSIGN = 0
  396. ELSE IF( LSAME( SYM, 'P' ) ) THEN
  397. ISYM = 2
  398. IRSIGN = 0
  399. ELSE IF( LSAME( SYM, 'S' ) ) THEN
  400. ISYM = 2
  401. IRSIGN = 1
  402. ELSE IF( LSAME( SYM, 'H' ) ) THEN
  403. ISYM = 2
  404. IRSIGN = 1
  405. ELSE
  406. ISYM = -1
  407. END IF
  408. *
  409. * Decode PACK
  410. *
  411. ISYMPK = 0
  412. IF( LSAME( PACK, 'N' ) ) THEN
  413. IPACK = 0
  414. ELSE IF( LSAME( PACK, 'U' ) ) THEN
  415. IPACK = 1
  416. ISYMPK = 1
  417. ELSE IF( LSAME( PACK, 'L' ) ) THEN
  418. IPACK = 2
  419. ISYMPK = 1
  420. ELSE IF( LSAME( PACK, 'C' ) ) THEN
  421. IPACK = 3
  422. ISYMPK = 2
  423. ELSE IF( LSAME( PACK, 'R' ) ) THEN
  424. IPACK = 4
  425. ISYMPK = 3
  426. ELSE IF( LSAME( PACK, 'B' ) ) THEN
  427. IPACK = 5
  428. ISYMPK = 3
  429. ELSE IF( LSAME( PACK, 'Q' ) ) THEN
  430. IPACK = 6
  431. ISYMPK = 2
  432. ELSE IF( LSAME( PACK, 'Z' ) ) THEN
  433. IPACK = 7
  434. ELSE
  435. IPACK = -1
  436. END IF
  437. *
  438. * Set certain internal parameters
  439. *
  440. MNMIN = MIN( M, N )
  441. LLB = MIN( KL, M-1 )
  442. UUB = MIN( KU, N-1 )
  443. MR = MIN( M, N+LLB )
  444. NC = MIN( N, M+UUB )
  445. *
  446. IF( IPACK.EQ.5 .OR. IPACK.EQ.6 ) THEN
  447. MINLDA = UUB + 1
  448. ELSE IF( IPACK.EQ.7 ) THEN
  449. MINLDA = LLB + UUB + 1
  450. ELSE
  451. MINLDA = M
  452. END IF
  453. *
  454. * Use Givens rotation method if bandwidth small enough,
  455. * or if LDA is too small to store the matrix unpacked.
  456. *
  457. GIVENS = .FALSE.
  458. IF( ISYM.EQ.1 ) THEN
  459. IF( REAL( LLB+UUB ).LT.0.3*REAL( MAX( 1, MR+NC ) ) )
  460. $ GIVENS = .TRUE.
  461. ELSE
  462. IF( 2*LLB.LT.M )
  463. $ GIVENS = .TRUE.
  464. END IF
  465. IF( LDA.LT.M .AND. LDA.GE.MINLDA )
  466. $ GIVENS = .TRUE.
  467. *
  468. * Set INFO if an error
  469. *
  470. IF( M.LT.0 ) THEN
  471. INFO = -1
  472. ELSE IF( M.NE.N .AND. ISYM.NE.1 ) THEN
  473. INFO = -1
  474. ELSE IF( N.LT.0 ) THEN
  475. INFO = -2
  476. ELSE IF( IDIST.EQ.-1 ) THEN
  477. INFO = -3
  478. ELSE IF( ISYM.EQ.-1 ) THEN
  479. INFO = -5
  480. ELSE IF( ABS( MODE ).GT.6 ) THEN
  481. INFO = -7
  482. ELSE IF( ( MODE.NE.0 .AND. ABS( MODE ).NE.6 ) .AND. COND.LT.ONE )
  483. $ THEN
  484. INFO = -8
  485. ELSE IF( KL.LT.0 ) THEN
  486. INFO = -10
  487. ELSE IF( KU.LT.0 .OR. ( ISYM.NE.1 .AND. KL.NE.KU ) ) THEN
  488. INFO = -11
  489. ELSE IF( IPACK.EQ.-1 .OR. ( ISYMPK.EQ.1 .AND. ISYM.EQ.1 ) .OR.
  490. $ ( ISYMPK.EQ.2 .AND. ISYM.EQ.1 .AND. KL.GT.0 ) .OR.
  491. $ ( ISYMPK.EQ.3 .AND. ISYM.EQ.1 .AND. KU.GT.0 ) .OR.
  492. $ ( ISYMPK.NE.0 .AND. M.NE.N ) ) THEN
  493. INFO = -12
  494. ELSE IF( LDA.LT.MAX( 1, MINLDA ) ) THEN
  495. INFO = -14
  496. END IF
  497. *
  498. IF( INFO.NE.0 ) THEN
  499. CALL XERBLA( 'SLATMS', -INFO )
  500. RETURN
  501. END IF
  502. *
  503. * Initialize random number generator
  504. *
  505. DO 10 I = 1, 4
  506. ISEED( I ) = MOD( ABS( ISEED( I ) ), 4096 )
  507. 10 CONTINUE
  508. *
  509. IF( MOD( ISEED( 4 ), 2 ).NE.1 )
  510. $ ISEED( 4 ) = ISEED( 4 ) + 1
  511. *
  512. * 2) Set up D if indicated.
  513. *
  514. * Compute D according to COND and MODE
  515. *
  516. CALL SLATM1( MODE, COND, IRSIGN, IDIST, ISEED, D, MNMIN, IINFO )
  517. IF( IINFO.NE.0 ) THEN
  518. INFO = 1
  519. RETURN
  520. END IF
  521. *
  522. * Choose Top-Down if D is (apparently) increasing,
  523. * Bottom-Up if D is (apparently) decreasing.
  524. *
  525. IF( ABS( D( 1 ) ).LE.ABS( D( MNMIN ) ) ) THEN
  526. TOPDWN = .TRUE.
  527. ELSE
  528. TOPDWN = .FALSE.
  529. END IF
  530. *
  531. IF( MODE.NE.0 .AND. ABS( MODE ).NE.6 ) THEN
  532. *
  533. * Scale by DMAX
  534. *
  535. TEMP = ABS( D( 1 ) )
  536. DO 20 I = 2, MNMIN
  537. TEMP = MAX( TEMP, ABS( D( I ) ) )
  538. 20 CONTINUE
  539. *
  540. IF( TEMP.GT.ZERO ) THEN
  541. ALPHA = DMAX / TEMP
  542. ELSE
  543. INFO = 2
  544. RETURN
  545. END IF
  546. *
  547. CALL SSCAL( MNMIN, ALPHA, D, 1 )
  548. *
  549. END IF
  550. *
  551. * 3) Generate Banded Matrix using Givens rotations.
  552. * Also the special case of UUB=LLB=0
  553. *
  554. * Compute Addressing constants to cover all
  555. * storage formats. Whether GE, SY, GB, or SB,
  556. * upper or lower triangle or both,
  557. * the (i,j)-th element is in
  558. * A( i - ISKEW*j + IOFFST, j )
  559. *
  560. IF( IPACK.GT.4 ) THEN
  561. ILDA = LDA - 1
  562. ISKEW = 1
  563. IF( IPACK.GT.5 ) THEN
  564. IOFFST = UUB + 1
  565. ELSE
  566. IOFFST = 1
  567. END IF
  568. ELSE
  569. ILDA = LDA
  570. ISKEW = 0
  571. IOFFST = 0
  572. END IF
  573. *
  574. * IPACKG is the format that the matrix is generated in. If this is
  575. * different from IPACK, then the matrix must be repacked at the
  576. * end. It also signals how to compute the norm, for scaling.
  577. *
  578. IPACKG = 0
  579. CALL SLASET( 'Full', LDA, N, ZERO, ZERO, A, LDA )
  580. *
  581. * Diagonal Matrix -- We are done, unless it
  582. * is to be stored SP/PP/TP (PACK='R' or 'C')
  583. *
  584. IF( LLB.EQ.0 .AND. UUB.EQ.0 ) THEN
  585. CALL SCOPY( MNMIN, D, 1, A( 1-ISKEW+IOFFST, 1 ), ILDA+1 )
  586. IF( IPACK.LE.2 .OR. IPACK.GE.5 )
  587. $ IPACKG = IPACK
  588. *
  589. ELSE IF( GIVENS ) THEN
  590. *
  591. * Check whether to use Givens rotations,
  592. * Householder transformations, or nothing.
  593. *
  594. IF( ISYM.EQ.1 ) THEN
  595. *
  596. * Non-symmetric -- A = U D V
  597. *
  598. IF( IPACK.GT.4 ) THEN
  599. IPACKG = IPACK
  600. ELSE
  601. IPACKG = 0
  602. END IF
  603. *
  604. CALL SCOPY( MNMIN, D, 1, A( 1-ISKEW+IOFFST, 1 ), ILDA+1 )
  605. *
  606. IF( TOPDWN ) THEN
  607. JKL = 0
  608. DO 50 JKU = 1, UUB
  609. *
  610. * Transform from bandwidth JKL, JKU-1 to JKL, JKU
  611. *
  612. * Last row actually rotated is M
  613. * Last column actually rotated is MIN( M+JKU, N )
  614. *
  615. DO 40 JR = 1, MIN( M+JKU, N ) + JKL - 1
  616. EXTRA = ZERO
  617. ANGLE = TWOPI*SLARND( 1, ISEED )
  618. C = COS( ANGLE )
  619. S = SIN( ANGLE )
  620. ICOL = MAX( 1, JR-JKL )
  621. IF( JR.LT.M ) THEN
  622. IL = MIN( N, JR+JKU ) + 1 - ICOL
  623. CALL SLAROT( .TRUE., JR.GT.JKL, .FALSE., IL, C,
  624. $ S, A( JR-ISKEW*ICOL+IOFFST, ICOL ),
  625. $ ILDA, EXTRA, DUMMY )
  626. END IF
  627. *
  628. * Chase "EXTRA" back up
  629. *
  630. IR = JR
  631. IC = ICOL
  632. DO 30 JCH = JR - JKL, 1, -JKL - JKU
  633. IF( IR.LT.M ) THEN
  634. CALL SLARTG( A( IR+1-ISKEW*( IC+1 )+IOFFST,
  635. $ IC+1 ), EXTRA, C, S, DUMMY )
  636. END IF
  637. IROW = MAX( 1, JCH-JKU )
  638. IL = IR + 2 - IROW
  639. TEMP = ZERO
  640. ILTEMP = JCH.GT.JKU
  641. CALL SLAROT( .FALSE., ILTEMP, .TRUE., IL, C, -S,
  642. $ A( IROW-ISKEW*IC+IOFFST, IC ),
  643. $ ILDA, TEMP, EXTRA )
  644. IF( ILTEMP ) THEN
  645. CALL SLARTG( A( IROW+1-ISKEW*( IC+1 )+IOFFST,
  646. $ IC+1 ), TEMP, C, S, DUMMY )
  647. ICOL = MAX( 1, JCH-JKU-JKL )
  648. IL = IC + 2 - ICOL
  649. EXTRA = ZERO
  650. CALL SLAROT( .TRUE., JCH.GT.JKU+JKL, .TRUE.,
  651. $ IL, C, -S, A( IROW-ISKEW*ICOL+
  652. $ IOFFST, ICOL ), ILDA, EXTRA,
  653. $ TEMP )
  654. IC = ICOL
  655. IR = IROW
  656. END IF
  657. 30 CONTINUE
  658. 40 CONTINUE
  659. 50 CONTINUE
  660. *
  661. JKU = UUB
  662. DO 80 JKL = 1, LLB
  663. *
  664. * Transform from bandwidth JKL-1, JKU to JKL, JKU
  665. *
  666. DO 70 JC = 1, MIN( N+JKL, M ) + JKU - 1
  667. EXTRA = ZERO
  668. ANGLE = TWOPI*SLARND( 1, ISEED )
  669. C = COS( ANGLE )
  670. S = SIN( ANGLE )
  671. IROW = MAX( 1, JC-JKU )
  672. IF( JC.LT.N ) THEN
  673. IL = MIN( M, JC+JKL ) + 1 - IROW
  674. CALL SLAROT( .FALSE., JC.GT.JKU, .FALSE., IL, C,
  675. $ S, A( IROW-ISKEW*JC+IOFFST, JC ),
  676. $ ILDA, EXTRA, DUMMY )
  677. END IF
  678. *
  679. * Chase "EXTRA" back up
  680. *
  681. IC = JC
  682. IR = IROW
  683. DO 60 JCH = JC - JKU, 1, -JKL - JKU
  684. IF( IC.LT.N ) THEN
  685. CALL SLARTG( A( IR+1-ISKEW*( IC+1 )+IOFFST,
  686. $ IC+1 ), EXTRA, C, S, DUMMY )
  687. END IF
  688. ICOL = MAX( 1, JCH-JKL )
  689. IL = IC + 2 - ICOL
  690. TEMP = ZERO
  691. ILTEMP = JCH.GT.JKL
  692. CALL SLAROT( .TRUE., ILTEMP, .TRUE., IL, C, -S,
  693. $ A( IR-ISKEW*ICOL+IOFFST, ICOL ),
  694. $ ILDA, TEMP, EXTRA )
  695. IF( ILTEMP ) THEN
  696. CALL SLARTG( A( IR+1-ISKEW*( ICOL+1 )+IOFFST,
  697. $ ICOL+1 ), TEMP, C, S, DUMMY )
  698. IROW = MAX( 1, JCH-JKL-JKU )
  699. IL = IR + 2 - IROW
  700. EXTRA = ZERO
  701. CALL SLAROT( .FALSE., JCH.GT.JKL+JKU, .TRUE.,
  702. $ IL, C, -S, A( IROW-ISKEW*ICOL+
  703. $ IOFFST, ICOL ), ILDA, EXTRA,
  704. $ TEMP )
  705. IC = ICOL
  706. IR = IROW
  707. END IF
  708. 60 CONTINUE
  709. 70 CONTINUE
  710. 80 CONTINUE
  711. *
  712. ELSE
  713. *
  714. * Bottom-Up -- Start at the bottom right.
  715. *
  716. JKL = 0
  717. DO 110 JKU = 1, UUB
  718. *
  719. * Transform from bandwidth JKL, JKU-1 to JKL, JKU
  720. *
  721. * First row actually rotated is M
  722. * First column actually rotated is MIN( M+JKU, N )
  723. *
  724. IENDCH = MIN( M, N+JKL ) - 1
  725. DO 100 JC = MIN( M+JKU, N ) - 1, 1 - JKL, -1
  726. EXTRA = ZERO
  727. ANGLE = TWOPI*SLARND( 1, ISEED )
  728. C = COS( ANGLE )
  729. S = SIN( ANGLE )
  730. IROW = MAX( 1, JC-JKU+1 )
  731. IF( JC.GT.0 ) THEN
  732. IL = MIN( M, JC+JKL+1 ) + 1 - IROW
  733. CALL SLAROT( .FALSE., .FALSE., JC+JKL.LT.M, IL,
  734. $ C, S, A( IROW-ISKEW*JC+IOFFST,
  735. $ JC ), ILDA, DUMMY, EXTRA )
  736. END IF
  737. *
  738. * Chase "EXTRA" back down
  739. *
  740. IC = JC
  741. DO 90 JCH = JC + JKL, IENDCH, JKL + JKU
  742. ILEXTR = IC.GT.0
  743. IF( ILEXTR ) THEN
  744. CALL SLARTG( A( JCH-ISKEW*IC+IOFFST, IC ),
  745. $ EXTRA, C, S, DUMMY )
  746. END IF
  747. IC = MAX( 1, IC )
  748. ICOL = MIN( N-1, JCH+JKU )
  749. ILTEMP = JCH + JKU.LT.N
  750. TEMP = ZERO
  751. CALL SLAROT( .TRUE., ILEXTR, ILTEMP, ICOL+2-IC,
  752. $ C, S, A( JCH-ISKEW*IC+IOFFST, IC ),
  753. $ ILDA, EXTRA, TEMP )
  754. IF( ILTEMP ) THEN
  755. CALL SLARTG( A( JCH-ISKEW*ICOL+IOFFST,
  756. $ ICOL ), TEMP, C, S, DUMMY )
  757. IL = MIN( IENDCH, JCH+JKL+JKU ) + 2 - JCH
  758. EXTRA = ZERO
  759. CALL SLAROT( .FALSE., .TRUE.,
  760. $ JCH+JKL+JKU.LE.IENDCH, IL, C, S,
  761. $ A( JCH-ISKEW*ICOL+IOFFST,
  762. $ ICOL ), ILDA, TEMP, EXTRA )
  763. IC = ICOL
  764. END IF
  765. 90 CONTINUE
  766. 100 CONTINUE
  767. 110 CONTINUE
  768. *
  769. JKU = UUB
  770. DO 140 JKL = 1, LLB
  771. *
  772. * Transform from bandwidth JKL-1, JKU to JKL, JKU
  773. *
  774. * First row actually rotated is MIN( N+JKL, M )
  775. * First column actually rotated is N
  776. *
  777. IENDCH = MIN( N, M+JKU ) - 1
  778. DO 130 JR = MIN( N+JKL, M ) - 1, 1 - JKU, -1
  779. EXTRA = ZERO
  780. ANGLE = TWOPI*SLARND( 1, ISEED )
  781. C = COS( ANGLE )
  782. S = SIN( ANGLE )
  783. ICOL = MAX( 1, JR-JKL+1 )
  784. IF( JR.GT.0 ) THEN
  785. IL = MIN( N, JR+JKU+1 ) + 1 - ICOL
  786. CALL SLAROT( .TRUE., .FALSE., JR+JKU.LT.N, IL,
  787. $ C, S, A( JR-ISKEW*ICOL+IOFFST,
  788. $ ICOL ), ILDA, DUMMY, EXTRA )
  789. END IF
  790. *
  791. * Chase "EXTRA" back down
  792. *
  793. IR = JR
  794. DO 120 JCH = JR + JKU, IENDCH, JKL + JKU
  795. ILEXTR = IR.GT.0
  796. IF( ILEXTR ) THEN
  797. CALL SLARTG( A( IR-ISKEW*JCH+IOFFST, JCH ),
  798. $ EXTRA, C, S, DUMMY )
  799. END IF
  800. IR = MAX( 1, IR )
  801. IROW = MIN( M-1, JCH+JKL )
  802. ILTEMP = JCH + JKL.LT.M
  803. TEMP = ZERO
  804. CALL SLAROT( .FALSE., ILEXTR, ILTEMP, IROW+2-IR,
  805. $ C, S, A( IR-ISKEW*JCH+IOFFST,
  806. $ JCH ), ILDA, EXTRA, TEMP )
  807. IF( ILTEMP ) THEN
  808. CALL SLARTG( A( IROW-ISKEW*JCH+IOFFST, JCH ),
  809. $ TEMP, C, S, DUMMY )
  810. IL = MIN( IENDCH, JCH+JKL+JKU ) + 2 - JCH
  811. EXTRA = ZERO
  812. CALL SLAROT( .TRUE., .TRUE.,
  813. $ JCH+JKL+JKU.LE.IENDCH, IL, C, S,
  814. $ A( IROW-ISKEW*JCH+IOFFST, JCH ),
  815. $ ILDA, TEMP, EXTRA )
  816. IR = IROW
  817. END IF
  818. 120 CONTINUE
  819. 130 CONTINUE
  820. 140 CONTINUE
  821. END IF
  822. *
  823. ELSE
  824. *
  825. * Symmetric -- A = U D U'
  826. *
  827. IPACKG = IPACK
  828. IOFFG = IOFFST
  829. *
  830. IF( TOPDWN ) THEN
  831. *
  832. * Top-Down -- Generate Upper triangle only
  833. *
  834. IF( IPACK.GE.5 ) THEN
  835. IPACKG = 6
  836. IOFFG = UUB + 1
  837. ELSE
  838. IPACKG = 1
  839. END IF
  840. CALL SCOPY( MNMIN, D, 1, A( 1-ISKEW+IOFFG, 1 ), ILDA+1 )
  841. *
  842. DO 170 K = 1, UUB
  843. DO 160 JC = 1, N - 1
  844. IROW = MAX( 1, JC-K )
  845. IL = MIN( JC+1, K+2 )
  846. EXTRA = ZERO
  847. TEMP = A( JC-ISKEW*( JC+1 )+IOFFG, JC+1 )
  848. ANGLE = TWOPI*SLARND( 1, ISEED )
  849. C = COS( ANGLE )
  850. S = SIN( ANGLE )
  851. CALL SLAROT( .FALSE., JC.GT.K, .TRUE., IL, C, S,
  852. $ A( IROW-ISKEW*JC+IOFFG, JC ), ILDA,
  853. $ EXTRA, TEMP )
  854. CALL SLAROT( .TRUE., .TRUE., .FALSE.,
  855. $ MIN( K, N-JC )+1, C, S,
  856. $ A( ( 1-ISKEW )*JC+IOFFG, JC ), ILDA,
  857. $ TEMP, DUMMY )
  858. *
  859. * Chase EXTRA back up the matrix
  860. *
  861. ICOL = JC
  862. DO 150 JCH = JC - K, 1, -K
  863. CALL SLARTG( A( JCH+1-ISKEW*( ICOL+1 )+IOFFG,
  864. $ ICOL+1 ), EXTRA, C, S, DUMMY )
  865. TEMP = A( JCH-ISKEW*( JCH+1 )+IOFFG, JCH+1 )
  866. CALL SLAROT( .TRUE., .TRUE., .TRUE., K+2, C, -S,
  867. $ A( ( 1-ISKEW )*JCH+IOFFG, JCH ),
  868. $ ILDA, TEMP, EXTRA )
  869. IROW = MAX( 1, JCH-K )
  870. IL = MIN( JCH+1, K+2 )
  871. EXTRA = ZERO
  872. CALL SLAROT( .FALSE., JCH.GT.K, .TRUE., IL, C,
  873. $ -S, A( IROW-ISKEW*JCH+IOFFG, JCH ),
  874. $ ILDA, EXTRA, TEMP )
  875. ICOL = JCH
  876. 150 CONTINUE
  877. 160 CONTINUE
  878. 170 CONTINUE
  879. *
  880. * If we need lower triangle, copy from upper. Note that
  881. * the order of copying is chosen to work for 'q' -> 'b'
  882. *
  883. IF( IPACK.NE.IPACKG .AND. IPACK.NE.3 ) THEN
  884. DO 190 JC = 1, N
  885. IROW = IOFFST - ISKEW*JC
  886. DO 180 JR = JC, MIN( N, JC+UUB )
  887. A( JR+IROW, JC ) = A( JC-ISKEW*JR+IOFFG, JR )
  888. 180 CONTINUE
  889. 190 CONTINUE
  890. IF( IPACK.EQ.5 ) THEN
  891. DO 210 JC = N - UUB + 1, N
  892. DO 200 JR = N + 2 - JC, UUB + 1
  893. A( JR, JC ) = ZERO
  894. 200 CONTINUE
  895. 210 CONTINUE
  896. END IF
  897. IF( IPACKG.EQ.6 ) THEN
  898. IPACKG = IPACK
  899. ELSE
  900. IPACKG = 0
  901. END IF
  902. END IF
  903. ELSE
  904. *
  905. * Bottom-Up -- Generate Lower triangle only
  906. *
  907. IF( IPACK.GE.5 ) THEN
  908. IPACKG = 5
  909. IF( IPACK.EQ.6 )
  910. $ IOFFG = 1
  911. ELSE
  912. IPACKG = 2
  913. END IF
  914. CALL SCOPY( MNMIN, D, 1, A( 1-ISKEW+IOFFG, 1 ), ILDA+1 )
  915. *
  916. DO 240 K = 1, UUB
  917. DO 230 JC = N - 1, 1, -1
  918. IL = MIN( N+1-JC, K+2 )
  919. EXTRA = ZERO
  920. TEMP = A( 1+( 1-ISKEW )*JC+IOFFG, JC )
  921. ANGLE = TWOPI*SLARND( 1, ISEED )
  922. C = COS( ANGLE )
  923. S = -SIN( ANGLE )
  924. CALL SLAROT( .FALSE., .TRUE., N-JC.GT.K, IL, C, S,
  925. $ A( ( 1-ISKEW )*JC+IOFFG, JC ), ILDA,
  926. $ TEMP, EXTRA )
  927. ICOL = MAX( 1, JC-K+1 )
  928. CALL SLAROT( .TRUE., .FALSE., .TRUE., JC+2-ICOL, C,
  929. $ S, A( JC-ISKEW*ICOL+IOFFG, ICOL ),
  930. $ ILDA, DUMMY, TEMP )
  931. *
  932. * Chase EXTRA back down the matrix
  933. *
  934. ICOL = JC
  935. DO 220 JCH = JC + K, N - 1, K
  936. CALL SLARTG( A( JCH-ISKEW*ICOL+IOFFG, ICOL ),
  937. $ EXTRA, C, S, DUMMY )
  938. TEMP = A( 1+( 1-ISKEW )*JCH+IOFFG, JCH )
  939. CALL SLAROT( .TRUE., .TRUE., .TRUE., K+2, C, S,
  940. $ A( JCH-ISKEW*ICOL+IOFFG, ICOL ),
  941. $ ILDA, EXTRA, TEMP )
  942. IL = MIN( N+1-JCH, K+2 )
  943. EXTRA = ZERO
  944. CALL SLAROT( .FALSE., .TRUE., N-JCH.GT.K, IL, C,
  945. $ S, A( ( 1-ISKEW )*JCH+IOFFG, JCH ),
  946. $ ILDA, TEMP, EXTRA )
  947. ICOL = JCH
  948. 220 CONTINUE
  949. 230 CONTINUE
  950. 240 CONTINUE
  951. *
  952. * If we need upper triangle, copy from lower. Note that
  953. * the order of copying is chosen to work for 'b' -> 'q'
  954. *
  955. IF( IPACK.NE.IPACKG .AND. IPACK.NE.4 ) THEN
  956. DO 260 JC = N, 1, -1
  957. IROW = IOFFST - ISKEW*JC
  958. DO 250 JR = JC, MAX( 1, JC-UUB ), -1
  959. A( JR+IROW, JC ) = A( JC-ISKEW*JR+IOFFG, JR )
  960. 250 CONTINUE
  961. 260 CONTINUE
  962. IF( IPACK.EQ.6 ) THEN
  963. DO 280 JC = 1, UUB
  964. DO 270 JR = 1, UUB + 1 - JC
  965. A( JR, JC ) = ZERO
  966. 270 CONTINUE
  967. 280 CONTINUE
  968. END IF
  969. IF( IPACKG.EQ.5 ) THEN
  970. IPACKG = IPACK
  971. ELSE
  972. IPACKG = 0
  973. END IF
  974. END IF
  975. END IF
  976. END IF
  977. *
  978. ELSE
  979. *
  980. * 4) Generate Banded Matrix by first
  981. * Rotating by random Unitary matrices,
  982. * then reducing the bandwidth using Householder
  983. * transformations.
  984. *
  985. * Note: we should get here only if LDA .ge. N
  986. *
  987. IF( ISYM.EQ.1 ) THEN
  988. *
  989. * Non-symmetric -- A = U D V
  990. *
  991. CALL SLAGGE( MR, NC, LLB, UUB, D, A, LDA, ISEED, WORK,
  992. $ IINFO )
  993. ELSE
  994. *
  995. * Symmetric -- A = U D U'
  996. *
  997. CALL SLAGSY( M, LLB, D, A, LDA, ISEED, WORK, IINFO )
  998. *
  999. END IF
  1000. IF( IINFO.NE.0 ) THEN
  1001. INFO = 3
  1002. RETURN
  1003. END IF
  1004. END IF
  1005. *
  1006. * 5) Pack the matrix
  1007. *
  1008. IF( IPACK.NE.IPACKG ) THEN
  1009. IF( IPACK.EQ.1 ) THEN
  1010. *
  1011. * 'U' -- Upper triangular, not packed
  1012. *
  1013. DO 300 J = 1, M
  1014. DO 290 I = J + 1, M
  1015. A( I, J ) = ZERO
  1016. 290 CONTINUE
  1017. 300 CONTINUE
  1018. *
  1019. ELSE IF( IPACK.EQ.2 ) THEN
  1020. *
  1021. * 'L' -- Lower triangular, not packed
  1022. *
  1023. DO 320 J = 2, M
  1024. DO 310 I = 1, J - 1
  1025. A( I, J ) = ZERO
  1026. 310 CONTINUE
  1027. 320 CONTINUE
  1028. *
  1029. ELSE IF( IPACK.EQ.3 ) THEN
  1030. *
  1031. * 'C' -- Upper triangle packed Columnwise.
  1032. *
  1033. ICOL = 1
  1034. IROW = 0
  1035. DO 340 J = 1, M
  1036. DO 330 I = 1, J
  1037. IROW = IROW + 1
  1038. IF( IROW.GT.LDA ) THEN
  1039. IROW = 1
  1040. ICOL = ICOL + 1
  1041. END IF
  1042. A( IROW, ICOL ) = A( I, J )
  1043. 330 CONTINUE
  1044. 340 CONTINUE
  1045. *
  1046. ELSE IF( IPACK.EQ.4 ) THEN
  1047. *
  1048. * 'R' -- Lower triangle packed Columnwise.
  1049. *
  1050. ICOL = 1
  1051. IROW = 0
  1052. DO 360 J = 1, M
  1053. DO 350 I = J, M
  1054. IROW = IROW + 1
  1055. IF( IROW.GT.LDA ) THEN
  1056. IROW = 1
  1057. ICOL = ICOL + 1
  1058. END IF
  1059. A( IROW, ICOL ) = A( I, J )
  1060. 350 CONTINUE
  1061. 360 CONTINUE
  1062. *
  1063. ELSE IF( IPACK.GE.5 ) THEN
  1064. *
  1065. * 'B' -- The lower triangle is packed as a band matrix.
  1066. * 'Q' -- The upper triangle is packed as a band matrix.
  1067. * 'Z' -- The whole matrix is packed as a band matrix.
  1068. *
  1069. IF( IPACK.EQ.5 )
  1070. $ UUB = 0
  1071. IF( IPACK.EQ.6 )
  1072. $ LLB = 0
  1073. *
  1074. DO 380 J = 1, UUB
  1075. DO 370 I = MIN( J+LLB, M ), 1, -1
  1076. A( I-J+UUB+1, J ) = A( I, J )
  1077. 370 CONTINUE
  1078. 380 CONTINUE
  1079. *
  1080. DO 400 J = UUB + 2, N
  1081. DO 390 I = J - UUB, MIN( J+LLB, M )
  1082. A( I-J+UUB+1, J ) = A( I, J )
  1083. 390 CONTINUE
  1084. 400 CONTINUE
  1085. END IF
  1086. *
  1087. * If packed, zero out extraneous elements.
  1088. *
  1089. * Symmetric/Triangular Packed --
  1090. * zero out everything after A(IROW,ICOL)
  1091. *
  1092. IF( IPACK.EQ.3 .OR. IPACK.EQ.4 ) THEN
  1093. DO 420 JC = ICOL, M
  1094. DO 410 JR = IROW + 1, LDA
  1095. A( JR, JC ) = ZERO
  1096. 410 CONTINUE
  1097. IROW = 0
  1098. 420 CONTINUE
  1099. *
  1100. ELSE IF( IPACK.GE.5 ) THEN
  1101. *
  1102. * Packed Band --
  1103. * 1st row is now in A( UUB+2-j, j), zero above it
  1104. * m-th row is now in A( M+UUB-j,j), zero below it
  1105. * last non-zero diagonal is now in A( UUB+LLB+1,j ),
  1106. * zero below it, too.
  1107. *
  1108. IR1 = UUB + LLB + 2
  1109. IR2 = UUB + M + 2
  1110. DO 450 JC = 1, N
  1111. DO 430 JR = 1, UUB + 1 - JC
  1112. A( JR, JC ) = ZERO
  1113. 430 CONTINUE
  1114. DO 440 JR = MAX( 1, MIN( IR1, IR2-JC ) ), LDA
  1115. A( JR, JC ) = ZERO
  1116. 440 CONTINUE
  1117. 450 CONTINUE
  1118. END IF
  1119. END IF
  1120. *
  1121. RETURN
  1122. *
  1123. * End of SLATMS
  1124. *
  1125. END