SUBROUTINE DLATB4( PATH, IMAT, M, N, TYPE, KL, KU, ANORM, MODE, $ CNDNUM, DIST ) * * -- LAPACK test routine (version 3.1) -- * Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. * November 2006 * * .. Scalar Arguments .. CHARACTER DIST, TYPE CHARACTER*3 PATH INTEGER IMAT, KL, KU, M, MODE, N DOUBLE PRECISION ANORM, CNDNUM * .. * * Purpose * ======= * * DLATB4 sets parameters for the matrix generator based on the type of * matrix to be generated. * * Arguments * ========= * * PATH (input) CHARACTER*3 * The LAPACK path name. * * IMAT (input) INTEGER * An integer key describing which matrix to generate for this * path. * * M (input) INTEGER * The number of rows in the matrix to be generated. * * N (input) INTEGER * The number of columns in the matrix to be generated. * * TYPE (output) CHARACTER*1 * The type of the matrix to be generated: * = 'S': symmetric matrix * = 'P': symmetric positive (semi)definite matrix * = 'N': nonsymmetric matrix * * KL (output) INTEGER * The lower band width of the matrix to be generated. * * KU (output) INTEGER * The upper band width of the matrix to be generated. * * ANORM (output) DOUBLE PRECISION * The desired norm of the matrix to be generated. The diagonal * matrix of singular values or eigenvalues is scaled by this * value. * * MODE (output) INTEGER * A key indicating how to choose the vector of eigenvalues. * * CNDNUM (output) DOUBLE PRECISION * The desired condition number. * * DIST (output) CHARACTER*1 * The type of distribution to be used by the random number * generator. * * ===================================================================== * * .. Parameters .. DOUBLE PRECISION SHRINK, TENTH PARAMETER ( SHRINK = 0.25D0, TENTH = 0.1D+0 ) DOUBLE PRECISION ONE PARAMETER ( ONE = 1.0D+0 ) DOUBLE PRECISION TWO PARAMETER ( TWO = 2.0D+0 ) * .. * .. Local Scalars .. LOGICAL FIRST CHARACTER*2 C2 INTEGER MAT DOUBLE PRECISION BADC1, BADC2, EPS, LARGE, SMALL * .. * .. External Functions .. LOGICAL LSAMEN DOUBLE PRECISION DLAMCH EXTERNAL LSAMEN, DLAMCH * .. * .. Intrinsic Functions .. INTRINSIC ABS, MAX, SQRT * .. * .. External Subroutines .. EXTERNAL DLABAD * .. * .. Save statement .. SAVE EPS, SMALL, LARGE, BADC1, BADC2, FIRST * .. * .. Data statements .. DATA FIRST / .TRUE. / * .. * .. Executable Statements .. * * Set some constants for use in the subroutine. * IF( FIRST ) THEN FIRST = .FALSE. EPS = DLAMCH( 'Precision' ) BADC2 = TENTH / EPS BADC1 = SQRT( BADC2 ) SMALL = DLAMCH( 'Safe minimum' ) LARGE = ONE / SMALL * * If it looks like we're on a Cray, take the square root of * SMALL and LARGE to avoid overflow and underflow problems. * CALL DLABAD( SMALL, LARGE ) SMALL = SHRINK*( SMALL / EPS ) LARGE = ONE / SMALL END IF * C2 = PATH( 2: 3 ) * * Set some parameters we don't plan to change. * DIST = 'S' MODE = 3 * IF( LSAMEN( 2, C2, 'QR' ) .OR. LSAMEN( 2, C2, 'LQ' ) .OR. $ LSAMEN( 2, C2, 'QL' ) .OR. LSAMEN( 2, C2, 'RQ' ) ) THEN * * xQR, xLQ, xQL, xRQ: Set parameters to generate a general * M x N matrix. * * Set TYPE, the type of matrix to be generated. * TYPE = 'N' * * Set the lower and upper bandwidths. * IF( IMAT.EQ.1 ) THEN KL = 0 KU = 0 ELSE IF( IMAT.EQ.2 ) THEN KL = 0 KU = MAX( N-1, 0 ) ELSE IF( IMAT.EQ.3 ) THEN KL = MAX( M-1, 0 ) KU = 0 ELSE KL = MAX( M-1, 0 ) KU = MAX( N-1, 0 ) END IF * * Set the condition number and norm. * IF( IMAT.EQ.5 ) THEN CNDNUM = BADC1 ELSE IF( IMAT.EQ.6 ) THEN CNDNUM = BADC2 ELSE CNDNUM = TWO END IF * IF( IMAT.EQ.7 ) THEN ANORM = SMALL ELSE IF( IMAT.EQ.8 ) THEN ANORM = LARGE ELSE ANORM = ONE END IF * ELSE IF( LSAMEN( 2, C2, 'GE' ) ) THEN * * xGE: Set parameters to generate a general M x N matrix. * * Set TYPE, the type of matrix to be generated. * TYPE = 'N' * * Set the lower and upper bandwidths. * IF( IMAT.EQ.1 ) THEN KL = 0 KU = 0 ELSE IF( IMAT.EQ.2 ) THEN KL = 0 KU = MAX( N-1, 0 ) ELSE IF( IMAT.EQ.3 ) THEN KL = MAX( M-1, 0 ) KU = 0 ELSE KL = MAX( M-1, 0 ) KU = MAX( N-1, 0 ) END IF * * Set the condition number and norm. * IF( IMAT.EQ.8 ) THEN CNDNUM = BADC1 ELSE IF( IMAT.EQ.9 ) THEN CNDNUM = BADC2 ELSE CNDNUM = TWO END IF * IF( IMAT.EQ.10 ) THEN ANORM = SMALL ELSE IF( IMAT.EQ.11 ) THEN ANORM = LARGE ELSE ANORM = ONE END IF * ELSE IF( LSAMEN( 2, C2, 'GB' ) ) THEN * * xGB: Set parameters to generate a general banded matrix. * * Set TYPE, the type of matrix to be generated. * TYPE = 'N' * * Set the condition number and norm. * IF( IMAT.EQ.5 ) THEN CNDNUM = BADC1 ELSE IF( IMAT.EQ.6 ) THEN CNDNUM = TENTH*BADC2 ELSE CNDNUM = TWO END IF * IF( IMAT.EQ.7 ) THEN ANORM = SMALL ELSE IF( IMAT.EQ.8 ) THEN ANORM = LARGE ELSE ANORM = ONE END IF * ELSE IF( LSAMEN( 2, C2, 'GT' ) ) THEN * * xGT: Set parameters to generate a general tridiagonal matrix. * * Set TYPE, the type of matrix to be generated. * TYPE = 'N' * * Set the lower and upper bandwidths. * IF( IMAT.EQ.1 ) THEN KL = 0 ELSE KL = 1 END IF KU = KL * * Set the condition number and norm. * IF( IMAT.EQ.3 ) THEN CNDNUM = BADC1 ELSE IF( IMAT.EQ.4 ) THEN CNDNUM = BADC2 ELSE CNDNUM = TWO END IF * IF( IMAT.EQ.5 .OR. IMAT.EQ.11 ) THEN ANORM = SMALL ELSE IF( IMAT.EQ.6 .OR. IMAT.EQ.12 ) THEN ANORM = LARGE ELSE ANORM = ONE END IF * ELSE IF( LSAMEN( 2, C2, 'PO' ) .OR. LSAMEN( 2, C2, 'PP' ) .OR. $ LSAMEN( 2, C2, 'SY' ) .OR. LSAMEN( 2, C2, 'SP' ) ) THEN * * xPO, xPP, xSY, xSP: Set parameters to generate a * symmetric matrix. * * Set TYPE, the type of matrix to be generated. * TYPE = C2( 1: 1 ) * * Set the lower and upper bandwidths. * IF( IMAT.EQ.1 ) THEN KL = 0 ELSE KL = MAX( N-1, 0 ) END IF KU = KL * * Set the condition number and norm. * IF( IMAT.EQ.6 ) THEN CNDNUM = BADC1 ELSE IF( IMAT.EQ.7 ) THEN CNDNUM = BADC2 ELSE CNDNUM = TWO END IF * IF( IMAT.EQ.8 ) THEN ANORM = SMALL ELSE IF( IMAT.EQ.9 ) THEN ANORM = LARGE ELSE ANORM = ONE END IF * ELSE IF( LSAMEN( 2, C2, 'PB' ) ) THEN * * xPB: Set parameters to generate a symmetric band matrix. * * Set TYPE, the type of matrix to be generated. * TYPE = 'P' * * Set the norm and condition number. * IF( IMAT.EQ.5 ) THEN CNDNUM = BADC1 ELSE IF( IMAT.EQ.6 ) THEN CNDNUM = BADC2 ELSE CNDNUM = TWO END IF * IF( IMAT.EQ.7 ) THEN ANORM = SMALL ELSE IF( IMAT.EQ.8 ) THEN ANORM = LARGE ELSE ANORM = ONE END IF * ELSE IF( LSAMEN( 2, C2, 'PT' ) ) THEN * * xPT: Set parameters to generate a symmetric positive definite * tridiagonal matrix. * TYPE = 'P' IF( IMAT.EQ.1 ) THEN KL = 0 ELSE KL = 1 END IF KU = KL * * Set the condition number and norm. * IF( IMAT.EQ.3 ) THEN CNDNUM = BADC1 ELSE IF( IMAT.EQ.4 ) THEN CNDNUM = BADC2 ELSE CNDNUM = TWO END IF * IF( IMAT.EQ.5 .OR. IMAT.EQ.11 ) THEN ANORM = SMALL ELSE IF( IMAT.EQ.6 .OR. IMAT.EQ.12 ) THEN ANORM = LARGE ELSE ANORM = ONE END IF * ELSE IF( LSAMEN( 2, C2, 'TR' ) .OR. LSAMEN( 2, C2, 'TP' ) ) THEN * * xTR, xTP: Set parameters to generate a triangular matrix * * Set TYPE, the type of matrix to be generated. * TYPE = 'N' * * Set the lower and upper bandwidths. * MAT = ABS( IMAT ) IF( MAT.EQ.1 .OR. MAT.EQ.7 ) THEN KL = 0 KU = 0 ELSE IF( IMAT.LT.0 ) THEN KL = MAX( N-1, 0 ) KU = 0 ELSE KL = 0 KU = MAX( N-1, 0 ) END IF * * Set the condition number and norm. * IF( MAT.EQ.3 .OR. MAT.EQ.9 ) THEN CNDNUM = BADC1 ELSE IF( MAT.EQ.4 ) THEN CNDNUM = BADC2 ELSE IF( MAT.EQ.10 ) THEN CNDNUM = BADC2 ELSE CNDNUM = TWO END IF * IF( MAT.EQ.5 ) THEN ANORM = SMALL ELSE IF( MAT.EQ.6 ) THEN ANORM = LARGE ELSE ANORM = ONE END IF * ELSE IF( LSAMEN( 2, C2, 'TB' ) ) THEN * * xTB: Set parameters to generate a triangular band matrix. * * Set TYPE, the type of matrix to be generated. * TYPE = 'N' * * Set the norm and condition number. * IF( IMAT.EQ.2 .OR. IMAT.EQ.8 ) THEN CNDNUM = BADC1 ELSE IF( IMAT.EQ.3 .OR. IMAT.EQ.9 ) THEN CNDNUM = BADC2 ELSE CNDNUM = TWO END IF * IF( IMAT.EQ.4 ) THEN ANORM = SMALL ELSE IF( IMAT.EQ.5 ) THEN ANORM = LARGE ELSE ANORM = ONE END IF END IF IF( N.LE.1 ) $ CNDNUM = ONE * RETURN * * End of DLATB4 * END