LAPACK  3.4.1
LAPACK: Linear Algebra PACKage
dlatb4.f
Go to the documentation of this file.
00001 *> \brief \b DLATB4
00002 *
00003 *  =========== DOCUMENTATION ===========
00004 *
00005 * Online html documentation available at 
00006 *            http://www.netlib.org/lapack/explore-html/ 
00007 *
00008 *  Definition:
00009 *  ===========
00010 *
00011 *       SUBROUTINE DLATB4( PATH, IMAT, M, N, TYPE, KL, KU, ANORM, MODE,
00012 *                          CNDNUM, DIST )
00013 * 
00014 *       .. Scalar Arguments ..
00015 *       CHARACTER          DIST, TYPE
00016 *       CHARACTER*3        PATH
00017 *       INTEGER            IMAT, KL, KU, M, MODE, N
00018 *       DOUBLE PRECISION   ANORM, CNDNUM
00019 *       ..
00020 *  
00021 *
00022 *> \par Purpose:
00023 *  =============
00024 *>
00025 *> \verbatim
00026 *>
00027 *> DLATB4 sets parameters for the matrix generator based on the type of
00028 *> matrix to be generated.
00029 *> \endverbatim
00030 *
00031 *  Arguments:
00032 *  ==========
00033 *
00034 *> \param[in] PATH
00035 *> \verbatim
00036 *>          PATH is CHARACTER*3
00037 *>          The LAPACK path name.
00038 *> \endverbatim
00039 *>
00040 *> \param[in] IMAT
00041 *> \verbatim
00042 *>          IMAT is INTEGER
00043 *>          An integer key describing which matrix to generate for this
00044 *>          path.
00045 *> \endverbatim
00046 *>
00047 *> \param[in] M
00048 *> \verbatim
00049 *>          M is INTEGER
00050 *>          The number of rows in the matrix to be generated.
00051 *> \endverbatim
00052 *>
00053 *> \param[in] N
00054 *> \verbatim
00055 *>          N is INTEGER
00056 *>          The number of columns in the matrix to be generated.
00057 *> \endverbatim
00058 *>
00059 *> \param[out] TYPE
00060 *> \verbatim
00061 *>          TYPE is CHARACTER*1
00062 *>          The type of the matrix to be generated:
00063 *>          = 'S':  symmetric matrix
00064 *>          = 'P':  symmetric positive (semi)definite matrix
00065 *>          = 'N':  nonsymmetric matrix
00066 *> \endverbatim
00067 *>
00068 *> \param[out] KL
00069 *> \verbatim
00070 *>          KL is INTEGER
00071 *>          The lower band width of the matrix to be generated.
00072 *> \endverbatim
00073 *>
00074 *> \param[out] KU
00075 *> \verbatim
00076 *>          KU is INTEGER
00077 *>          The upper band width of the matrix to be generated.
00078 *> \endverbatim
00079 *>
00080 *> \param[out] ANORM
00081 *> \verbatim
00082 *>          ANORM is DOUBLE PRECISION
00083 *>          The desired norm of the matrix to be generated.  The diagonal
00084 *>          matrix of singular values or eigenvalues is scaled by this
00085 *>          value.
00086 *> \endverbatim
00087 *>
00088 *> \param[out] MODE
00089 *> \verbatim
00090 *>          MODE is INTEGER
00091 *>          A key indicating how to choose the vector of eigenvalues.
00092 *> \endverbatim
00093 *>
00094 *> \param[out] CNDNUM
00095 *> \verbatim
00096 *>          CNDNUM is DOUBLE PRECISION
00097 *>          The desired condition number.
00098 *> \endverbatim
00099 *>
00100 *> \param[out] DIST
00101 *> \verbatim
00102 *>          DIST is CHARACTER*1
00103 *>          The type of distribution to be used by the random number
00104 *>          generator.
00105 *> \endverbatim
00106 *
00107 *  Authors:
00108 *  ========
00109 *
00110 *> \author Univ. of Tennessee 
00111 *> \author Univ. of California Berkeley 
00112 *> \author Univ. of Colorado Denver 
00113 *> \author NAG Ltd. 
00114 *
00115 *> \date November 2011
00116 *
00117 *> \ingroup double_lin
00118 *
00119 *  =====================================================================
00120       SUBROUTINE DLATB4( PATH, IMAT, M, N, TYPE, KL, KU, ANORM, MODE,
00121      $                   CNDNUM, DIST )
00122 *
00123 *  -- LAPACK test routine (version 3.4.0) --
00124 *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
00125 *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
00126 *     November 2011
00127 *
00128 *     .. Scalar Arguments ..
00129       CHARACTER          DIST, TYPE
00130       CHARACTER*3        PATH
00131       INTEGER            IMAT, KL, KU, M, MODE, N
00132       DOUBLE PRECISION   ANORM, CNDNUM
00133 *     ..
00134 *
00135 *  =====================================================================
00136 *
00137 *     .. Parameters ..
00138       DOUBLE PRECISION   SHRINK, TENTH
00139       PARAMETER          ( SHRINK = 0.25D0, TENTH = 0.1D+0 )
00140       DOUBLE PRECISION   ONE
00141       PARAMETER          ( ONE = 1.0D+0 )
00142       DOUBLE PRECISION   TWO
00143       PARAMETER          ( TWO = 2.0D+0 )
00144 *     ..
00145 *     .. Local Scalars ..
00146       LOGICAL            FIRST
00147       CHARACTER*2        C2
00148       INTEGER            MAT
00149       DOUBLE PRECISION   BADC1, BADC2, EPS, LARGE, SMALL
00150 *     ..
00151 *     .. External Functions ..
00152       LOGICAL            LSAMEN
00153       DOUBLE PRECISION   DLAMCH
00154       EXTERNAL           LSAMEN, DLAMCH
00155 *     ..
00156 *     .. Intrinsic Functions ..
00157       INTRINSIC          ABS, MAX, SQRT
00158 *     ..
00159 *     .. External Subroutines ..
00160       EXTERNAL           DLABAD
00161 *     ..
00162 *     .. Save statement ..
00163       SAVE               EPS, SMALL, LARGE, BADC1, BADC2, FIRST
00164 *     ..
00165 *     .. Data statements ..
00166       DATA               FIRST / .TRUE. /
00167 *     ..
00168 *     .. Executable Statements ..
00169 *
00170 *     Set some constants for use in the subroutine.
00171 *
00172       IF( FIRST ) THEN
00173          FIRST = .FALSE.
00174          EPS = DLAMCH( 'Precision' )
00175          BADC2 = TENTH / EPS
00176          BADC1 = SQRT( BADC2 )
00177          SMALL = DLAMCH( 'Safe minimum' )
00178          LARGE = ONE / SMALL
00179 *
00180 *        If it looks like we're on a Cray, take the square root of
00181 *        SMALL and LARGE to avoid overflow and underflow problems.
00182 *
00183          CALL DLABAD( SMALL, LARGE )
00184          SMALL = SHRINK*( SMALL / EPS )
00185          LARGE = ONE / SMALL
00186       END IF
00187 *
00188       C2 = PATH( 2: 3 )
00189 *
00190 *     Set some parameters we don't plan to change.
00191 *
00192       DIST = 'S'
00193       MODE = 3
00194 *
00195       IF( LSAMEN( 2, C2, 'QR' ) .OR. LSAMEN( 2, C2, 'LQ' ) .OR.
00196      $    LSAMEN( 2, C2, 'QL' ) .OR. LSAMEN( 2, C2, 'RQ' ) ) THEN
00197 *
00198 *        xQR, xLQ, xQL, xRQ:  Set parameters to generate a general
00199 *                             M x N matrix.
00200 *
00201 *        Set TYPE, the type of matrix to be generated.
00202 *
00203          TYPE = 'N'
00204 *
00205 *        Set the lower and upper bandwidths.
00206 *
00207          IF( IMAT.EQ.1 ) THEN
00208             KL = 0
00209             KU = 0
00210          ELSE IF( IMAT.EQ.2 ) THEN
00211             KL = 0
00212             KU = MAX( N-1, 0 )
00213          ELSE IF( IMAT.EQ.3 ) THEN
00214             KL = MAX( M-1, 0 )
00215             KU = 0
00216          ELSE
00217             KL = MAX( M-1, 0 )
00218             KU = MAX( N-1, 0 )
00219          END IF
00220 *
00221 *        Set the condition number and norm.
00222 *
00223          IF( IMAT.EQ.5 ) THEN
00224             CNDNUM = BADC1
00225          ELSE IF( IMAT.EQ.6 ) THEN
00226             CNDNUM = BADC2
00227          ELSE
00228             CNDNUM = TWO
00229          END IF
00230 *
00231          IF( IMAT.EQ.7 ) THEN
00232             ANORM = SMALL
00233          ELSE IF( IMAT.EQ.8 ) THEN
00234             ANORM = LARGE
00235          ELSE
00236             ANORM = ONE
00237          END IF
00238 *
00239       ELSE IF( LSAMEN( 2, C2, 'GE' ) ) THEN
00240 *
00241 *        xGE:  Set parameters to generate a general M x N matrix.
00242 *
00243 *        Set TYPE, the type of matrix to be generated.
00244 *
00245          TYPE = 'N'
00246 *
00247 *        Set the lower and upper bandwidths.
00248 *
00249          IF( IMAT.EQ.1 ) THEN
00250             KL = 0
00251             KU = 0
00252          ELSE IF( IMAT.EQ.2 ) THEN
00253             KL = 0
00254             KU = MAX( N-1, 0 )
00255          ELSE IF( IMAT.EQ.3 ) THEN
00256             KL = MAX( M-1, 0 )
00257             KU = 0
00258          ELSE
00259             KL = MAX( M-1, 0 )
00260             KU = MAX( N-1, 0 )
00261          END IF
00262 *
00263 *        Set the condition number and norm.
00264 *
00265          IF( IMAT.EQ.8 ) THEN
00266             CNDNUM = BADC1
00267          ELSE IF( IMAT.EQ.9 ) THEN
00268             CNDNUM = BADC2
00269          ELSE
00270             CNDNUM = TWO
00271          END IF
00272 *
00273          IF( IMAT.EQ.10 ) THEN
00274             ANORM = SMALL
00275          ELSE IF( IMAT.EQ.11 ) THEN
00276             ANORM = LARGE
00277          ELSE
00278             ANORM = ONE
00279          END IF
00280 *
00281       ELSE IF( LSAMEN( 2, C2, 'GB' ) ) THEN
00282 *
00283 *        xGB:  Set parameters to generate a general banded matrix.
00284 *
00285 *        Set TYPE, the type of matrix to be generated.
00286 *
00287          TYPE = 'N'
00288 *
00289 *        Set the condition number and norm.
00290 *
00291          IF( IMAT.EQ.5 ) THEN
00292             CNDNUM = BADC1
00293          ELSE IF( IMAT.EQ.6 ) THEN
00294             CNDNUM = TENTH*BADC2
00295          ELSE
00296             CNDNUM = TWO
00297          END IF
00298 *
00299          IF( IMAT.EQ.7 ) THEN
00300             ANORM = SMALL
00301          ELSE IF( IMAT.EQ.8 ) THEN
00302             ANORM = LARGE
00303          ELSE
00304             ANORM = ONE
00305          END IF
00306 *
00307       ELSE IF( LSAMEN( 2, C2, 'GT' ) ) THEN
00308 *
00309 *        xGT:  Set parameters to generate a general tridiagonal matrix.
00310 *
00311 *        Set TYPE, the type of matrix to be generated.
00312 *
00313          TYPE = 'N'
00314 *
00315 *        Set the lower and upper bandwidths.
00316 *
00317          IF( IMAT.EQ.1 ) THEN
00318             KL = 0
00319          ELSE
00320             KL = 1
00321          END IF
00322          KU = KL
00323 *
00324 *        Set the condition number and norm.
00325 *
00326          IF( IMAT.EQ.3 ) THEN
00327             CNDNUM = BADC1
00328          ELSE IF( IMAT.EQ.4 ) THEN
00329             CNDNUM = BADC2
00330          ELSE
00331             CNDNUM = TWO
00332          END IF
00333 *
00334          IF( IMAT.EQ.5 .OR. IMAT.EQ.11 ) THEN
00335             ANORM = SMALL
00336          ELSE IF( IMAT.EQ.6 .OR. IMAT.EQ.12 ) THEN
00337             ANORM = LARGE
00338          ELSE
00339             ANORM = ONE
00340          END IF
00341 *
00342       ELSE IF( LSAMEN( 2, C2, 'PO' ) .OR. LSAMEN( 2, C2, 'PP' ) .OR.
00343      $         LSAMEN( 2, C2, 'SY' ) .OR. LSAMEN( 2, C2, 'SP' ) ) THEN
00344 *
00345 *        xPO, xPP, xSY, xSP: Set parameters to generate a
00346 *        symmetric matrix.
00347 *
00348 *        Set TYPE, the type of matrix to be generated.
00349 *
00350          TYPE = C2( 1: 1 )
00351 *
00352 *        Set the lower and upper bandwidths.
00353 *
00354          IF( IMAT.EQ.1 ) THEN
00355             KL = 0
00356          ELSE
00357             KL = MAX( N-1, 0 )
00358          END IF
00359          KU = KL
00360 *
00361 *        Set the condition number and norm.
00362 *
00363          IF( IMAT.EQ.6 ) THEN
00364             CNDNUM = BADC1
00365          ELSE IF( IMAT.EQ.7 ) THEN
00366             CNDNUM = BADC2
00367          ELSE
00368             CNDNUM = TWO
00369          END IF
00370 *
00371          IF( IMAT.EQ.8 ) THEN
00372             ANORM = SMALL
00373          ELSE IF( IMAT.EQ.9 ) THEN
00374             ANORM = LARGE
00375          ELSE
00376             ANORM = ONE
00377          END IF
00378 *
00379       ELSE IF( LSAMEN( 2, C2, 'PB' ) ) THEN
00380 *
00381 *        xPB:  Set parameters to generate a symmetric band matrix.
00382 *
00383 *        Set TYPE, the type of matrix to be generated.
00384 *
00385          TYPE = 'P'
00386 *
00387 *        Set the norm and condition number.
00388 *
00389          IF( IMAT.EQ.5 ) THEN
00390             CNDNUM = BADC1
00391          ELSE IF( IMAT.EQ.6 ) THEN
00392             CNDNUM = BADC2
00393          ELSE
00394             CNDNUM = TWO
00395          END IF
00396 *
00397          IF( IMAT.EQ.7 ) THEN
00398             ANORM = SMALL
00399          ELSE IF( IMAT.EQ.8 ) THEN
00400             ANORM = LARGE
00401          ELSE
00402             ANORM = ONE
00403          END IF
00404 *
00405       ELSE IF( LSAMEN( 2, C2, 'PT' ) ) THEN
00406 *
00407 *        xPT:  Set parameters to generate a symmetric positive definite
00408 *        tridiagonal matrix.
00409 *
00410          TYPE = 'P'
00411          IF( IMAT.EQ.1 ) THEN
00412             KL = 0
00413          ELSE
00414             KL = 1
00415          END IF
00416          KU = KL
00417 *
00418 *        Set the condition number and norm.
00419 *
00420          IF( IMAT.EQ.3 ) THEN
00421             CNDNUM = BADC1
00422          ELSE IF( IMAT.EQ.4 ) THEN
00423             CNDNUM = BADC2
00424          ELSE
00425             CNDNUM = TWO
00426          END IF
00427 *
00428          IF( IMAT.EQ.5 .OR. IMAT.EQ.11 ) THEN
00429             ANORM = SMALL
00430          ELSE IF( IMAT.EQ.6 .OR. IMAT.EQ.12 ) THEN
00431             ANORM = LARGE
00432          ELSE
00433             ANORM = ONE
00434          END IF
00435 *
00436       ELSE IF( LSAMEN( 2, C2, 'TR' ) .OR. LSAMEN( 2, C2, 'TP' ) ) THEN
00437 *
00438 *        xTR, xTP:  Set parameters to generate a triangular matrix
00439 *
00440 *        Set TYPE, the type of matrix to be generated.
00441 *
00442          TYPE = 'N'
00443 *
00444 *        Set the lower and upper bandwidths.
00445 *
00446          MAT = ABS( IMAT )
00447          IF( MAT.EQ.1 .OR. MAT.EQ.7 ) THEN
00448             KL = 0
00449             KU = 0
00450          ELSE IF( IMAT.LT.0 ) THEN
00451             KL = MAX( N-1, 0 )
00452             KU = 0
00453          ELSE
00454             KL = 0
00455             KU = MAX( N-1, 0 )
00456          END IF
00457 *
00458 *        Set the condition number and norm.
00459 *
00460          IF( MAT.EQ.3 .OR. MAT.EQ.9 ) THEN
00461             CNDNUM = BADC1
00462          ELSE IF( MAT.EQ.4 ) THEN
00463             CNDNUM = BADC2
00464          ELSE IF( MAT.EQ.10 ) THEN
00465             CNDNUM = BADC2
00466          ELSE
00467             CNDNUM = TWO
00468          END IF
00469 *
00470          IF( MAT.EQ.5 ) THEN
00471             ANORM = SMALL
00472          ELSE IF( MAT.EQ.6 ) THEN
00473             ANORM = LARGE
00474          ELSE
00475             ANORM = ONE
00476          END IF
00477 *
00478       ELSE IF( LSAMEN( 2, C2, 'TB' ) ) THEN
00479 *
00480 *        xTB:  Set parameters to generate a triangular band matrix.
00481 *
00482 *        Set TYPE, the type of matrix to be generated.
00483 *
00484          TYPE = 'N'
00485 *
00486 *        Set the norm and condition number.
00487 *
00488          IF( IMAT.EQ.2 .OR. IMAT.EQ.8 ) THEN
00489             CNDNUM = BADC1
00490          ELSE IF( IMAT.EQ.3 .OR. IMAT.EQ.9 ) THEN
00491             CNDNUM = BADC2
00492          ELSE
00493             CNDNUM = TWO
00494          END IF
00495 *
00496          IF( IMAT.EQ.4 ) THEN
00497             ANORM = SMALL
00498          ELSE IF( IMAT.EQ.5 ) THEN
00499             ANORM = LARGE
00500          ELSE
00501             ANORM = ONE
00502          END IF
00503       END IF
00504       IF( N.LE.1 )
00505      $   CNDNUM = ONE
00506 *
00507       RETURN
00508 *
00509 *     End of DLATB4
00510 *
00511       END
 All Files Functions