|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547 |
- *> \brief \b DLATB4
- *
- * =========== DOCUMENTATION ===========
- *
- * Online html documentation available at
- * http://www.netlib.org/lapack/explore-html/
- *
- * Definition:
- * ===========
- *
- * SUBROUTINE DLATB4( PATH, IMAT, M, N, TYPE, KL, KU, ANORM, MODE,
- * CNDNUM, DIST )
- *
- * .. Scalar Arguments ..
- * CHARACTER DIST, TYPE
- * CHARACTER*3 PATH
- * INTEGER IMAT, KL, KU, M, MODE, N
- * DOUBLE PRECISION ANORM, CNDNUM
- * ..
- *
- *
- *> \par Purpose:
- * =============
- *>
- *> \verbatim
- *>
- *> DLATB4 sets parameters for the matrix generator based on the type of
- *> matrix to be generated.
- *> \endverbatim
- *
- * Arguments:
- * ==========
- *
- *> \param[in] PATH
- *> \verbatim
- *> PATH is CHARACTER*3
- *> The LAPACK path name.
- *> \endverbatim
- *>
- *> \param[in] IMAT
- *> \verbatim
- *> IMAT is INTEGER
- *> An integer key describing which matrix to generate for this
- *> path.
- *> \endverbatim
- *>
- *> \param[in] M
- *> \verbatim
- *> M is INTEGER
- *> The number of rows in the matrix to be generated.
- *> \endverbatim
- *>
- *> \param[in] N
- *> \verbatim
- *> N is INTEGER
- *> The number of columns in the matrix to be generated.
- *> \endverbatim
- *>
- *> \param[out] TYPE
- *> \verbatim
- *> TYPE is CHARACTER*1
- *> The type of the matrix to be generated:
- *> = 'S': symmetric matrix
- *> = 'P': symmetric positive (semi)definite matrix
- *> = 'N': nonsymmetric matrix
- *> \endverbatim
- *>
- *> \param[out] KL
- *> \verbatim
- *> KL is INTEGER
- *> The lower band width of the matrix to be generated.
- *> \endverbatim
- *>
- *> \param[out] KU
- *> \verbatim
- *> KU is INTEGER
- *> The upper band width of the matrix to be generated.
- *> \endverbatim
- *>
- *> \param[out] ANORM
- *> \verbatim
- *> ANORM is DOUBLE PRECISION
- *> The desired norm of the matrix to be generated. The diagonal
- *> matrix of singular values or eigenvalues is scaled by this
- *> value.
- *> \endverbatim
- *>
- *> \param[out] MODE
- *> \verbatim
- *> MODE is INTEGER
- *> A key indicating how to choose the vector of eigenvalues.
- *> \endverbatim
- *>
- *> \param[out] CNDNUM
- *> \verbatim
- *> CNDNUM is DOUBLE PRECISION
- *> The desired condition number.
- *> \endverbatim
- *>
- *> \param[out] DIST
- *> \verbatim
- *> DIST is CHARACTER*1
- *> The type of distribution to be used by the random number
- *> generator.
- *> \endverbatim
- *
- * Authors:
- * ========
- *
- *> \author Univ. of Tennessee
- *> \author Univ. of California Berkeley
- *> \author Univ. of Colorado Denver
- *> \author NAG Ltd.
- *
- *> \date December 2016
- *
- *> \ingroup double_lin
- *
- * =====================================================================
- SUBROUTINE DLATB4( PATH, IMAT, M, N, TYPE, KL, KU, ANORM, MODE,
- $ CNDNUM, DIST )
- *
- * -- LAPACK test routine (version 3.7.0) --
- * -- LAPACK is a software package provided by Univ. of Tennessee, --
- * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
- * December 2016
- *
- * .. Scalar Arguments ..
- CHARACTER DIST, TYPE
- CHARACTER*3 PATH
- INTEGER IMAT, KL, KU, M, MODE, N
- DOUBLE PRECISION ANORM, CNDNUM
- * ..
- *
- * =====================================================================
- *
- * .. 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' ) ) THEN
- *
- * xPO, xPP: Set parameters to generate a
- * symmetric positive definite 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, 'SY' ) .OR. LSAMEN( 2, C2, 'SP' ) ) THEN
- *
- * 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.7 ) THEN
- CNDNUM = BADC1
- ELSE IF( IMAT.EQ.8 ) THEN
- CNDNUM = BADC2
- ELSE
- CNDNUM = TWO
- END IF
- *
- IF( IMAT.EQ.9 ) THEN
- ANORM = SMALL
- ELSE IF( IMAT.EQ.10 ) 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
|