1       SUBROUTINE ZLATB4( PATH, IMAT, M, N, TYPE, KL, KU, ANORM, MODE,
  2      $                   CNDNUM, DIST )
  3 *
  4 *  -- LAPACK test routine (version 3.1) --
  5 *     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
  6 *     November 2006
  7 *
  8 *     .. Scalar Arguments ..
  9       CHARACTER          DIST, TYPE
 10       CHARACTER*3        PATH
 11       INTEGER            IMAT, KL, KU, M, MODE, N
 12       DOUBLE PRECISION   ANORM, CNDNUM
 13 *     ..
 14 *
 15 *  Purpose
 16 *  =======
 17 *
 18 *  ZLATB4 sets parameters for the matrix generator based on the type of
 19 *  matrix to be generated.
 20 *
 21 *  Arguments
 22 *  =========
 23 *
 24 *  PATH    (input) CHARACTER*3
 25 *          The LAPACK path name.
 26 *
 27 *  IMAT    (input) INTEGER
 28 *          An integer key describing which matrix to generate for this
 29 *          path.
 30 *
 31 *  M       (input) INTEGER
 32 *          The number of rows in the matrix to be generated.
 33 *
 34 *  N       (input) INTEGER
 35 *          The number of columns in the matrix to be generated.
 36 *
 37 *  TYPE    (output) CHARACTER*1
 38 *          The type of the matrix to be generated:
 39 *          = 'S':  symmetric matrix
 40 *          = 'P':  symmetric positive (semi)definite matrix
 41 *          = 'N':  nonsymmetric matrix
 42 *
 43 *  KL      (output) INTEGER
 44 *          The lower band width of the matrix to be generated.
 45 *
 46 *  KU      (output) INTEGER
 47 *          The upper band width of the matrix to be generated.
 48 *
 49 *  ANORM   (output) DOUBLE PRECISION
 50 *          The desired norm of the matrix to be generated.  The diagonal
 51 *          matrix of singular values or eigenvalues is scaled by this
 52 *          value.
 53 *
 54 *  MODE    (output) INTEGER
 55 *          A key indicating how to choose the vector of eigenvalues.
 56 *
 57 *  CNDNUM  (output) DOUBLE PRECISION
 58 *          The desired condition number.
 59 *
 60 *  DIST    (output) CHARACTER*1
 61 *          The type of distribution to be used by the random number
 62 *          generator.
 63 *
 64 *  =====================================================================
 65 *
 66 *     .. Parameters ..
 67       DOUBLE PRECISION   SHRINK, TENTH
 68       PARAMETER          ( SHRINK = 0.25D0, TENTH = 0.1D+0 )
 69       DOUBLE PRECISION   ONE
 70       PARAMETER          ( ONE = 1.0D+0 )
 71       DOUBLE PRECISION   TWO
 72       PARAMETER          ( TWO = 2.0D+0 )
 73 *     ..
 74 *     .. Local Scalars ..
 75       LOGICAL            FIRST
 76       CHARACTER*2        C2
 77       INTEGER            MAT
 78       DOUBLE PRECISION   BADC1, BADC2, EPS, LARGE, SMALL
 79 *     ..
 80 *     .. External Functions ..
 81       LOGICAL            LSAMEN
 82       DOUBLE PRECISION   DLAMCH
 83       EXTERNAL           LSAMEN, DLAMCH
 84 *     ..
 85 *     .. Intrinsic Functions ..
 86       INTRINSIC          ABSMAXSQRT
 87 *     ..
 88 *     .. External Subroutines ..
 89       EXTERNAL           DLABAD
 90 *     ..
 91 *     .. Save statement ..
 92       SAVE               EPS, SMALL, LARGE, BADC1, BADC2, FIRST
 93 *     ..
 94 *     .. Data statements ..
 95       DATA               FIRST / .TRUE. /
 96 *     ..
 97 *     .. Executable Statements ..
 98 *
 99 *     Set some constants for use in the subroutine.
100 *
101       IF( FIRST ) THEN
102          FIRST = .FALSE.
103          EPS = DLAMCH( 'Precision' )
104          BADC2 = TENTH / EPS
105          BADC1 = SQRT( BADC2 )
106          SMALL = DLAMCH( 'Safe minimum' )
107          LARGE = ONE / SMALL
108 *
109 *        If it looks like we're on a Cray, take the square root of
110 *        SMALL and LARGE to avoid overflow and underflow problems.
111 *
112          CALL DLABAD( SMALL, LARGE )
113          SMALL = SHRINK*( SMALL / EPS )
114          LARGE = ONE / SMALL
115       END IF
116 *
117       C2 = PATH( 23 )
118 *
119 *     Set some parameters we don't plan to change.
120 *
121       DIST = 'S'
122       MODE = 3
123 *
124 *     xQR, xLQ, xQL, xRQ:  Set parameters to generate a general
125 *                          M x N matrix.
126 *
127       IF( LSAMEN( 2, C2, 'QR' ) .OR. LSAMEN( 2, C2, 'LQ' ) .OR.
128      $    LSAMEN( 2, C2, 'QL' ) .OR. LSAMEN( 2, C2, 'RQ' ) ) THEN
129 *
130 *        Set TYPE, the type of matrix to be generated.
131 *
132          TYPE = 'N'
133 *
134 *        Set the lower and upper bandwidths.
135 *
136          IF( IMAT.EQ.1 ) THEN
137             KL = 0
138             KU = 0
139          ELSE IF( IMAT.EQ.2 ) THEN
140             KL = 0
141             KU = MAX( N-10 )
142          ELSE IF( IMAT.EQ.3 ) THEN
143             KL = MAX( M-10 )
144             KU = 0
145          ELSE
146             KL = MAX( M-10 )
147             KU = MAX( N-10 )
148          END IF
149 *
150 *        Set the condition number and norm.
151 *
152          IF( IMAT.EQ.5 ) THEN
153             CNDNUM = BADC1
154          ELSE IF( IMAT.EQ.6 ) THEN
155             CNDNUM = BADC2
156          ELSE
157             CNDNUM = TWO
158          END IF
159 *
160          IF( IMAT.EQ.7 ) THEN
161             ANORM = SMALL
162          ELSE IF( IMAT.EQ.8 ) THEN
163             ANORM = LARGE
164          ELSE
165             ANORM = ONE
166          END IF
167 *
168       ELSE IF( LSAMEN( 2, C2, 'GE' ) ) THEN
169 *
170 *        xGE:  Set parameters to generate a general M x N matrix.
171 *
172 *        Set TYPE, the type of matrix to be generated.
173 *
174          TYPE = 'N'
175 *
176 *        Set the lower and upper bandwidths.
177 *
178          IF( IMAT.EQ.1 ) THEN
179             KL = 0
180             KU = 0
181          ELSE IF( IMAT.EQ.2 ) THEN
182             KL = 0
183             KU = MAX( N-10 )
184          ELSE IF( IMAT.EQ.3 ) THEN
185             KL = MAX( M-10 )
186             KU = 0
187          ELSE
188             KL = MAX( M-10 )
189             KU = MAX( N-10 )
190          END IF
191 *
192 *        Set the condition number and norm.
193 *
194          IF( IMAT.EQ.8 ) THEN
195             CNDNUM = BADC1
196          ELSE IF( IMAT.EQ.9 ) THEN
197             CNDNUM = BADC2
198          ELSE
199             CNDNUM = TWO
200          END IF
201 *
202          IF( IMAT.EQ.10 ) THEN
203             ANORM = SMALL
204          ELSE IF( IMAT.EQ.11 ) THEN
205             ANORM = LARGE
206          ELSE
207             ANORM = ONE
208          END IF
209 *
210       ELSE IF( LSAMEN( 2, C2, 'GB' ) ) THEN
211 *
212 *        xGB:  Set parameters to generate a general banded matrix.
213 *
214 *        Set TYPE, the type of matrix to be generated.
215 *
216          TYPE = 'N'
217 *
218 *        Set the condition number and norm.
219 *
220          IF( IMAT.EQ.5 ) THEN
221             CNDNUM = BADC1
222          ELSE IF( IMAT.EQ.6 ) THEN
223             CNDNUM = TENTH*BADC2
224          ELSE
225             CNDNUM = TWO
226          END IF
227 *
228          IF( IMAT.EQ.7 ) THEN
229             ANORM = SMALL
230          ELSE IF( IMAT.EQ.8 ) THEN
231             ANORM = LARGE
232          ELSE
233             ANORM = ONE
234          END IF
235 *
236       ELSE IF( LSAMEN( 2, C2, 'GT' ) ) THEN
237 *
238 *        xGT:  Set parameters to generate a general tridiagonal matrix.
239 *
240 *        Set TYPE, the type of matrix to be generated.
241 *
242          TYPE = 'N'
243 *
244 *        Set the lower and upper bandwidths.
245 *
246          IF( IMAT.EQ.1 ) THEN
247             KL = 0
248          ELSE
249             KL = 1
250          END IF
251          KU = KL
252 *
253 *        Set the condition number and norm.
254 *
255          IF( IMAT.EQ.3 ) THEN
256             CNDNUM = BADC1
257          ELSE IF( IMAT.EQ.4 ) THEN
258             CNDNUM = BADC2
259          ELSE
260             CNDNUM = TWO
261          END IF
262 *
263          IF( IMAT.EQ.5 .OR. IMAT.EQ.11 ) THEN
264             ANORM = SMALL
265          ELSE IF( IMAT.EQ.6 .OR. IMAT.EQ.12 ) THEN
266             ANORM = LARGE
267          ELSE
268             ANORM = ONE
269          END IF
270 *
271       ELSE IF( LSAMEN( 2, C2, 'PO' ) .OR. LSAMEN( 2, C2, 'PP' ) .OR.
272      $         LSAMEN( 2, C2, 'HE' ) .OR. LSAMEN( 2, C2, 'HP' ) .OR.
273      $         LSAMEN( 2, C2, 'SY' ) .OR. LSAMEN( 2, C2, 'SP' ) ) THEN
274 *
275 *        xPO, xPP, xHE, xHP, xSY, xSP: Set parameters to generate a
276 *        symmetric or Hermitian matrix.
277 *
278 *        Set TYPE, the type of matrix to be generated.
279 *
280          TYPE = C2( 11 )
281 *
282 *        Set the lower and upper bandwidths.
283 *
284          IF( IMAT.EQ.1 ) THEN
285             KL = 0
286          ELSE
287             KL = MAX( N-10 )
288          END IF
289          KU = KL
290 *
291 *        Set the condition number and norm.
292 *
293          IF( IMAT.EQ.6 ) THEN
294             CNDNUM = BADC1
295          ELSE IF( IMAT.EQ.7 ) THEN
296             CNDNUM = BADC2
297          ELSE
298             CNDNUM = TWO
299          END IF
300 *
301          IF( IMAT.EQ.8 ) THEN
302             ANORM = SMALL
303          ELSE IF( IMAT.EQ.9 ) THEN
304             ANORM = LARGE
305          ELSE
306             ANORM = ONE
307          END IF
308 *
309       ELSE IF( LSAMEN( 2, C2, 'PB' ) ) THEN
310 *
311 *        xPB:  Set parameters to generate a symmetric band matrix.
312 *
313 *        Set TYPE, the type of matrix to be generated.
314 *
315          TYPE = 'P'
316 *
317 *        Set the norm and condition number.
318 *
319          IF( IMAT.EQ.5 ) THEN
320             CNDNUM = BADC1
321          ELSE IF( IMAT.EQ.6 ) THEN
322             CNDNUM = BADC2
323          ELSE
324             CNDNUM = TWO
325          END IF
326 *
327          IF( IMAT.EQ.7 ) THEN
328             ANORM = SMALL
329          ELSE IF( IMAT.EQ.8 ) THEN
330             ANORM = LARGE
331          ELSE
332             ANORM = ONE
333          END IF
334 *
335       ELSE IF( LSAMEN( 2, C2, 'PT' ) ) THEN
336 *
337 *        xPT:  Set parameters to generate a symmetric positive definite
338 *        tridiagonal matrix.
339 *
340          TYPE = 'P'
341          IF( IMAT.EQ.1 ) THEN
342             KL = 0
343          ELSE
344             KL = 1
345          END IF
346          KU = KL
347 *
348 *        Set the condition number and norm.
349 *
350          IF( IMAT.EQ.3 ) THEN
351             CNDNUM = BADC1
352          ELSE IF( IMAT.EQ.4 ) THEN
353             CNDNUM = BADC2
354          ELSE
355             CNDNUM = TWO
356          END IF
357 *
358          IF( IMAT.EQ.5 .OR. IMAT.EQ.11 ) THEN
359             ANORM = SMALL
360          ELSE IF( IMAT.EQ.6 .OR. IMAT.EQ.12 ) THEN
361             ANORM = LARGE
362          ELSE
363             ANORM = ONE
364          END IF
365 *
366       ELSE IF( LSAMEN( 2, C2, 'TR' ) .OR. LSAMEN( 2, C2, 'TP' ) ) THEN
367 *
368 *        xTR, xTP:  Set parameters to generate a triangular matrix
369 *
370 *        Set TYPE, the type of matrix to be generated.
371 *
372          TYPE = 'N'
373 *
374 *        Set the lower and upper bandwidths.
375 *
376          MAT = ABS( IMAT )
377          IF( MAT.EQ.1 .OR. MAT.EQ.7 ) THEN
378             KL = 0
379             KU = 0
380          ELSE IF( IMAT.LT.0 ) THEN
381             KL = MAX( N-10 )
382             KU = 0
383          ELSE
384             KL = 0
385             KU = MAX( N-10 )
386          END IF
387 *
388 *        Set the condition number and norm.
389 *
390          IF( MAT.EQ.3 .OR. MAT.EQ.9 ) THEN
391             CNDNUM = BADC1
392          ELSE IF( MAT.EQ.4 .OR. MAT.EQ.10 ) THEN
393             CNDNUM = BADC2
394          ELSE
395             CNDNUM = TWO
396          END IF
397 *
398          IF( MAT.EQ.5 ) THEN
399             ANORM = SMALL
400          ELSE IF( MAT.EQ.6 ) THEN
401             ANORM = LARGE
402          ELSE
403             ANORM = ONE
404          END IF
405 *
406       ELSE IF( LSAMEN( 2, C2, 'TB' ) ) THEN
407 *
408 *        xTB:  Set parameters to generate a triangular band matrix.
409 *
410 *        Set TYPE, the type of matrix to be generated.
411 *
412          TYPE = 'N'
413 *
414 *        Set the norm and condition number.
415 *
416          IF( IMAT.EQ.2 .OR. IMAT.EQ.8 ) THEN
417             CNDNUM = BADC1
418          ELSE IF( IMAT.EQ.3 .OR. IMAT.EQ.9 ) THEN
419             CNDNUM = BADC2
420          ELSE
421             CNDNUM = TWO
422          END IF
423 *
424          IF( IMAT.EQ.4 ) THEN
425             ANORM = SMALL
426          ELSE IF( IMAT.EQ.5 ) THEN
427             ANORM = LARGE
428          ELSE
429             ANORM = ONE
430          END IF
431       END IF
432       IF( N.LE.1 )
433      $   CNDNUM = ONE
434 *
435       RETURN
436 *
437 *     End of ZLATB4
438 *
439       END