1*> \brief \b DLATB4
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 DLATB4( 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*       DOUBLE PRECISION   ANORM, CNDNUM
19*       ..
20*
21*
22*> \par Purpose:
23*  =============
24*>
25*> \verbatim
26*>
27*> DLATB4 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 DOUBLE PRECISION
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 DOUBLE PRECISION
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 December 2016
116*
117*> \ingroup double_lin
118*
119*  =====================================================================
120      SUBROUTINE DLATB4( PATH, IMAT, M, N, TYPE, KL, KU, ANORM, MODE,
121     $                   CNDNUM, DIST )
122*
123*  -- LAPACK test routine (version 3.7.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*     December 2016
127*
128*     .. Scalar Arguments ..
129      CHARACTER          DIST, TYPE
130      CHARACTER*3        PATH
131      INTEGER            IMAT, KL, KU, M, MODE, N
132      DOUBLE PRECISION   ANORM, CNDNUM
133*     ..
134*
135*  =====================================================================
136*
137*     .. Parameters ..
138      DOUBLE PRECISION   SHRINK, TENTH
139      PARAMETER          ( SHRINK = 0.25D0, TENTH = 0.1D+0 )
140      DOUBLE PRECISION   ONE
141      PARAMETER          ( ONE = 1.0D+0 )
142      DOUBLE PRECISION   TWO
143      PARAMETER          ( TWO = 2.0D+0 )
144*     ..
145*     .. Local Scalars ..
146      LOGICAL            FIRST
147      CHARACTER*2        C2
148      INTEGER            MAT
149      DOUBLE PRECISION   BADC1, BADC2, EPS, LARGE, SMALL
150*     ..
151*     .. External Functions ..
152      LOGICAL            LSAMEN
153      DOUBLE PRECISION   DLAMCH
154      EXTERNAL           LSAMEN, DLAMCH
155*     ..
156*     .. Intrinsic Functions ..
157      INTRINSIC          ABS, MAX, SQRT
158*     ..
159*     .. External Subroutines ..
160      EXTERNAL           DLABAD
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 = DLAMCH( 'Precision' )
175         BADC2 = TENTH / EPS
176         BADC1 = SQRT( BADC2 )
177         SMALL = DLAMCH( '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 DLABAD( 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' ) ) THEN
343*
344*        xPO, xPP: Set parameters to generate a
345*        symmetric positive definite matrix.
346*
347*        Set TYPE, the type of matrix to be generated.
348*
349         TYPE = C2( 1: 1 )
350*
351*        Set the lower and upper bandwidths.
352*
353         IF( IMAT.EQ.1 ) THEN
354            KL = 0
355         ELSE
356            KL = MAX( N-1, 0 )
357         END IF
358         KU = KL
359*
360*        Set the condition number and norm.
361*
362         IF( IMAT.EQ.6 ) THEN
363            CNDNUM = BADC1
364         ELSE IF( IMAT.EQ.7 ) THEN
365            CNDNUM = BADC2
366         ELSE
367            CNDNUM = TWO
368         END IF
369*
370         IF( IMAT.EQ.8 ) THEN
371            ANORM = SMALL
372         ELSE IF( IMAT.EQ.9 ) THEN
373            ANORM = LARGE
374         ELSE
375            ANORM = ONE
376         END IF
377*
378*
379      ELSE IF( LSAMEN( 2, C2, 'SY' ) .OR. LSAMEN( 2, C2, 'SP' ) ) THEN
380*
381*        xSY, xSP: Set parameters to generate a
382*        symmetric matrix.
383*
384*        Set TYPE, the type of matrix to be generated.
385*
386         TYPE = C2( 1: 1 )
387*
388*        Set the lower and upper bandwidths.
389*
390         IF( IMAT.EQ.1 ) THEN
391            KL = 0
392         ELSE
393            KL = MAX( N-1, 0 )
394         END IF
395         KU = KL
396*
397*        Set the condition number and norm.
398*
399         IF( IMAT.EQ.7 ) THEN
400            CNDNUM = BADC1
401         ELSE IF( IMAT.EQ.8 ) THEN
402            CNDNUM = BADC2
403         ELSE
404            CNDNUM = TWO
405         END IF
406*
407         IF( IMAT.EQ.9 ) THEN
408            ANORM = SMALL
409         ELSE IF( IMAT.EQ.10 ) THEN
410            ANORM = LARGE
411         ELSE
412            ANORM = ONE
413         END IF
414*
415      ELSE IF( LSAMEN( 2, C2, 'PB' ) ) THEN
416*
417*        xPB:  Set parameters to generate a symmetric band matrix.
418*
419*        Set TYPE, the type of matrix to be generated.
420*
421         TYPE = 'P'
422*
423*        Set the norm and condition number.
424*
425         IF( IMAT.EQ.5 ) THEN
426            CNDNUM = BADC1
427         ELSE IF( IMAT.EQ.6 ) THEN
428            CNDNUM = BADC2
429         ELSE
430            CNDNUM = TWO
431         END IF
432*
433         IF( IMAT.EQ.7 ) THEN
434            ANORM = SMALL
435         ELSE IF( IMAT.EQ.8 ) THEN
436            ANORM = LARGE
437         ELSE
438            ANORM = ONE
439         END IF
440*
441      ELSE IF( LSAMEN( 2, C2, 'PT' ) ) THEN
442*
443*        xPT:  Set parameters to generate a symmetric positive definite
444*        tridiagonal matrix.
445*
446         TYPE = 'P'
447         IF( IMAT.EQ.1 ) THEN
448            KL = 0
449         ELSE
450            KL = 1
451         END IF
452         KU = KL
453*
454*        Set the condition number and norm.
455*
456         IF( IMAT.EQ.3 ) THEN
457            CNDNUM = BADC1
458         ELSE IF( IMAT.EQ.4 ) THEN
459            CNDNUM = BADC2
460         ELSE
461            CNDNUM = TWO
462         END IF
463*
464         IF( IMAT.EQ.5 .OR. IMAT.EQ.11 ) THEN
465            ANORM = SMALL
466         ELSE IF( IMAT.EQ.6 .OR. IMAT.EQ.12 ) THEN
467            ANORM = LARGE
468         ELSE
469            ANORM = ONE
470         END IF
471*
472      ELSE IF( LSAMEN( 2, C2, 'TR' ) .OR. LSAMEN( 2, C2, 'TP' ) ) THEN
473*
474*        xTR, xTP:  Set parameters to generate a triangular matrix
475*
476*        Set TYPE, the type of matrix to be generated.
477*
478         TYPE = 'N'
479*
480*        Set the lower and upper bandwidths.
481*
482         MAT = ABS( IMAT )
483         IF( MAT.EQ.1 .OR. MAT.EQ.7 ) THEN
484            KL = 0
485            KU = 0
486         ELSE IF( IMAT.LT.0 ) THEN
487            KL = MAX( N-1, 0 )
488            KU = 0
489         ELSE
490            KL = 0
491            KU = MAX( N-1, 0 )
492         END IF
493*
494*        Set the condition number and norm.
495*
496         IF( MAT.EQ.3 .OR. MAT.EQ.9 ) THEN
497            CNDNUM = BADC1
498         ELSE IF( MAT.EQ.4 ) THEN
499            CNDNUM = BADC2
500         ELSE IF( MAT.EQ.10 ) THEN
501            CNDNUM = BADC2
502         ELSE
503            CNDNUM = TWO
504         END IF
505*
506         IF( MAT.EQ.5 ) THEN
507            ANORM = SMALL
508         ELSE IF( MAT.EQ.6 ) THEN
509            ANORM = LARGE
510         ELSE
511            ANORM = ONE
512         END IF
513*
514      ELSE IF( LSAMEN( 2, C2, 'TB' ) ) THEN
515*
516*        xTB:  Set parameters to generate a triangular band matrix.
517*
518*        Set TYPE, the type of matrix to be generated.
519*
520         TYPE = 'N'
521*
522*        Set the norm and condition number.
523*
524         IF( IMAT.EQ.2 .OR. IMAT.EQ.8 ) THEN
525            CNDNUM = BADC1
526         ELSE IF( IMAT.EQ.3 .OR. IMAT.EQ.9 ) THEN
527            CNDNUM = BADC2
528         ELSE
529            CNDNUM = TWO
530         END IF
531*
532         IF( IMAT.EQ.4 ) THEN
533            ANORM = SMALL
534         ELSE IF( IMAT.EQ.5 ) THEN
535            ANORM = LARGE
536         ELSE
537            ANORM = ONE
538         END IF
539      END IF
540      IF( N.LE.1 )
541     $   CNDNUM = ONE
542*
543      RETURN
544*
545*     End of DLATB4
546*
547      END
548