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.

zlatms.f 46 kB

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