1       SUBROUTINE SLATB4( 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       REAL               ANORM, CNDNUM
 13 *     ..
 14 *
 15 *  Purpose
 16 *  =======
 17 *
 18 *  SLATB4 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) REAL
 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) REAL
 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       REAL               SHRINK, TENTH
 68       PARAMETER          ( SHRINK = 0.25E0, TENTH = 0.1E+0 )
 69       REAL               ONE
 70       PARAMETER          ( ONE = 1.0E+0 )
 71       REAL               TWO
 72       PARAMETER          ( TWO = 2.0E+0 )
 73 *     ..
 74 *     .. Local Scalars ..
 75       LOGICAL            FIRST
 76       CHARACTER*2        C2
 77       INTEGER            MAT
 78       REAL               BADC1, BADC2, EPS, LARGE, SMALL
 79 *     ..
 80 *     .. External Functions ..
 81       LOGICAL            LSAMEN
 82       REAL               SLAMCH
 83       EXTERNAL           LSAMEN, SLAMCH
 84 *     ..
 85 *     .. Intrinsic Functions ..
 86       INTRINSIC          ABSMAXSQRT
 87 *     ..
 88 *     .. External Subroutines ..
 89       EXTERNAL           SLABAD
 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 = SLAMCH( 'Precision' )
104          BADC2 = TENTH / EPS
105          BADC1 = SQRT( BADC2 )
106          SMALL = SLAMCH( '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 SLABAD( 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       IF( LSAMEN( 2, C2, 'QR' ) .OR. LSAMEN( 2, C2, 'LQ' ) .OR.
125      $    LSAMEN( 2, C2, 'QL' ) .OR. LSAMEN( 2, C2, 'RQ' ) ) THEN
126 *
127 *        xQR, xLQ, xQL, xRQ:  Set parameters to generate a general
128 *                             M x N matrix.
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, 'SY' ) .OR. LSAMEN( 2, C2, 'SP' ) ) THEN
273 *
274 *        xPO, xPP, xSY, xSP: Set parameters to generate a
275 *        symmetric matrix.
276 *
277 *        Set TYPE, the type of matrix to be generated.
278 *
279          TYPE = C2( 11 )
280 *
281 *        Set the lower and upper bandwidths.
282 *
283          IF( IMAT.EQ.1 ) THEN
284             KL = 0
285          ELSE
286             KL = MAX( N-10 )
287          END IF
288          KU = KL
289 *
290 *        Set the condition number and norm.
291 *
292          IF( IMAT.EQ.6 ) THEN
293             CNDNUM = BADC1
294          ELSE IF( IMAT.EQ.7 ) THEN
295             CNDNUM = BADC2
296          ELSE
297             CNDNUM = TWO
298          END IF
299 *
300          IF( IMAT.EQ.8 ) THEN
301             ANORM = SMALL
302          ELSE IF( IMAT.EQ.9 ) THEN
303             ANORM = LARGE
304          ELSE
305             ANORM = ONE
306          END IF
307 *
308       ELSE IF( LSAMEN( 2, C2, 'PB' ) ) THEN
309 *
310 *        xPB:  Set parameters to generate a symmetric band matrix.
311 *
312 *        Set TYPE, the type of matrix to be generated.
313 *
314          TYPE = 'P'
315 *
316 *        Set the norm and condition number.
317 *
318          IF( IMAT.EQ.5 ) THEN
319             CNDNUM = BADC1
320          ELSE IF( IMAT.EQ.6 ) THEN
321             CNDNUM = BADC2
322          ELSE
323             CNDNUM = TWO
324          END IF
325 *
326          IF( IMAT.EQ.7 ) THEN
327             ANORM = SMALL
328          ELSE IF( IMAT.EQ.8 ) THEN
329             ANORM = LARGE
330          ELSE
331             ANORM = ONE
332          END IF
333 *
334       ELSE IF( LSAMEN( 2, C2, 'PT' ) ) THEN
335 *
336 *        xPT:  Set parameters to generate a symmetric positive definite
337 *        tridiagonal matrix.
338 *
339          TYPE = 'P'
340          IF( IMAT.EQ.1 ) THEN
341             KL = 0
342          ELSE
343             KL = 1
344          END IF
345          KU = KL
346 *
347 *        Set the condition number and norm.
348 *
349          IF( IMAT.EQ.3 ) THEN
350             CNDNUM = BADC1
351          ELSE IF( IMAT.EQ.4 ) THEN
352             CNDNUM = BADC2
353          ELSE
354             CNDNUM = TWO
355          END IF
356 *
357          IF( IMAT.EQ.5 .OR. IMAT.EQ.11 ) THEN
358             ANORM = SMALL
359          ELSE IF( IMAT.EQ.6 .OR. IMAT.EQ.12 ) THEN
360             ANORM = LARGE
361          ELSE
362             ANORM = ONE
363          END IF
364 *
365       ELSE IF( LSAMEN( 2, C2, 'TR' ) .OR. LSAMEN( 2, C2, 'TP' ) ) THEN
366 *
367 *        xTR, xTP:  Set parameters to generate a triangular matrix
368 *
369 *        Set TYPE, the type of matrix to be generated.
370 *
371          TYPE = 'N'
372 *
373 *        Set the lower and upper bandwidths.
374 *
375          MAT = ABS( IMAT )
376          IF( MAT.EQ.1 .OR. MAT.EQ.7 ) THEN
377             KL = 0
378             KU = 0
379          ELSE IF( IMAT.LT.0 ) THEN
380             KL = MAX( N-10 )
381             KU = 0
382          ELSE
383             KL = 0
384             KU = MAX( N-10 )
385          END IF
386 *
387 *        Set the condition number and norm.
388 *
389          IF( MAT.EQ.3 .OR. MAT.EQ.9 ) THEN
390             CNDNUM = BADC1
391          ELSE IF( MAT.EQ.4 ) THEN
392             CNDNUM = BADC2
393          ELSE IF( MAT.EQ.10 ) THEN
394             CNDNUM = BADC2
395          ELSE
396             CNDNUM = TWO
397          END IF
398 *
399          IF( MAT.EQ.5 ) THEN
400             ANORM = SMALL
401          ELSE IF( MAT.EQ.6 ) THEN
402             ANORM = LARGE
403          ELSE
404             ANORM = ONE
405          END IF
406 *
407       ELSE IF( LSAMEN( 2, C2, 'TB' ) ) THEN
408 *
409 *        xTB:  Set parameters to generate a triangular band matrix.
410 *
411 *        Set TYPE, the type of matrix to be generated.
412 *
413          TYPE = 'N'
414 *
415 *        Set the norm and condition number.
416 *
417          IF( IMAT.EQ.2 .OR. IMAT.EQ.8 ) THEN
418             CNDNUM = BADC1
419          ELSE IF( IMAT.EQ.3 .OR. IMAT.EQ.9 ) THEN
420             CNDNUM = BADC2
421          ELSE
422             CNDNUM = TWO
423          END IF
424 *
425          IF( IMAT.EQ.4 ) THEN
426             ANORM = SMALL
427          ELSE IF( IMAT.EQ.5 ) THEN
428             ANORM = LARGE
429          ELSE
430             ANORM = ONE
431          END IF
432       END IF
433       IF( N.LE.1 )
434      $   CNDNUM = ONE
435 *
436       RETURN
437 *
438 *     End of SLATB4
439 *
440       END