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