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.

clatmt.f 46 kB

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