LAPACK  3.4.1
LAPACK: Linear Algebra PACKage
clatb4.f
Go to the documentation of this file.
00001 *> \brief \b CLATB4
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 CLATB4( 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 *       REAL               ANORM, CNDNUM
00019 *       ..
00020 *  
00021 *
00022 *> \par Purpose:
00023 *  =============
00024 *>
00025 *> \verbatim
00026 *>
00027 *> CLATB4 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 REAL
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 REAL
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 complex_lin
00118 *
00119 *  =====================================================================
00120       SUBROUTINE CLATB4( 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       REAL               ANORM, CNDNUM
00133 *     ..
00134 *
00135 *  =====================================================================
00136 *
00137 *     .. Parameters ..
00138       REAL               SHRINK, TENTH
00139       PARAMETER          ( SHRINK = 0.25E0, TENTH = 0.1E+0 )
00140       REAL               ONE
00141       PARAMETER          ( ONE = 1.0E+0 )
00142       REAL               TWO
00143       PARAMETER          ( TWO = 2.0E+0 )
00144 *     ..
00145 *     .. Local Scalars ..
00146       LOGICAL            FIRST
00147       CHARACTER*2        C2
00148       INTEGER            MAT
00149       REAL               BADC1, BADC2, EPS, LARGE, SMALL
00150 *     ..
00151 *     .. External Functions ..
00152       LOGICAL            LSAMEN
00153       REAL               SLAMCH
00154       EXTERNAL           LSAMEN, SLAMCH
00155 *     ..
00156 *     .. Intrinsic Functions ..
00157       INTRINSIC          ABS, MAX, SQRT
00158 *     ..
00159 *     .. External Subroutines ..
00160       EXTERNAL           SLABAD
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 = SLAMCH( 'Precision' )
00175          BADC2 = TENTH / EPS
00176          BADC1 = SQRT( BADC2 )
00177          SMALL = SLAMCH( '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 SLABAD( 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 *     xQR, xLQ, xQL, xRQ:  Set parameters to generate a general
00196 *                          M x N matrix.
00197 *
00198       IF( LSAMEN( 2, C2, 'QR' ) .OR. LSAMEN( 2, C2, 'LQ' ) .OR.
00199      $    LSAMEN( 2, C2, 'QL' ) .OR. LSAMEN( 2, C2, 'RQ' ) ) THEN
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, 'HE' ) .OR. LSAMEN( 2, C2, 'HP' ) .OR.
00344      $         LSAMEN( 2, C2, 'SY' ) .OR. LSAMEN( 2, C2, 'SP' ) ) THEN
00345 *
00346 *        xPO, xPP, xHE, xHP, xSY, xSP: Set parameters to generate a
00347 *        symmetric or Hermitian matrix.
00348 *
00349 *        Set TYPE, the type of matrix to be generated.
00350 *
00351          TYPE = C2( 1: 1 )
00352 *
00353 *        Set the lower and upper bandwidths.
00354 *
00355          IF( IMAT.EQ.1 ) THEN
00356             KL = 0
00357          ELSE
00358             KL = MAX( N-1, 0 )
00359          END IF
00360          KU = KL
00361 *
00362 *        Set the condition number and norm.
00363 *
00364          IF( IMAT.EQ.6 ) THEN
00365             CNDNUM = BADC1
00366          ELSE IF( IMAT.EQ.7 ) THEN
00367             CNDNUM = BADC2
00368          ELSE
00369             CNDNUM = TWO
00370          END IF
00371 *
00372          IF( IMAT.EQ.8 ) THEN
00373             ANORM = SMALL
00374          ELSE IF( IMAT.EQ.9 ) THEN
00375             ANORM = LARGE
00376          ELSE
00377             ANORM = ONE
00378          END IF
00379 *
00380       ELSE IF( LSAMEN( 2, C2, 'PB' ) ) THEN
00381 *
00382 *        xPB:  Set parameters to generate a symmetric band matrix.
00383 *
00384 *        Set TYPE, the type of matrix to be generated.
00385 *
00386          TYPE = 'P'
00387 *
00388 *        Set the norm and condition number.
00389 *
00390          IF( IMAT.EQ.5 ) THEN
00391             CNDNUM = BADC1
00392          ELSE IF( IMAT.EQ.6 ) THEN
00393             CNDNUM = BADC2
00394          ELSE
00395             CNDNUM = TWO
00396          END IF
00397 *
00398          IF( IMAT.EQ.7 ) THEN
00399             ANORM = SMALL
00400          ELSE IF( IMAT.EQ.8 ) THEN
00401             ANORM = LARGE
00402          ELSE
00403             ANORM = ONE
00404          END IF
00405 *
00406       ELSE IF( LSAMEN( 2, C2, 'PT' ) ) THEN
00407 *
00408 *        xPT:  Set parameters to generate a symmetric positive definite
00409 *        tridiagonal matrix.
00410 *
00411          TYPE = 'P'
00412          IF( IMAT.EQ.1 ) THEN
00413             KL = 0
00414          ELSE
00415             KL = 1
00416          END IF
00417          KU = KL
00418 *
00419 *        Set the condition number and norm.
00420 *
00421          IF( IMAT.EQ.3 ) THEN
00422             CNDNUM = BADC1
00423          ELSE IF( IMAT.EQ.4 ) THEN
00424             CNDNUM = BADC2
00425          ELSE
00426             CNDNUM = TWO
00427          END IF
00428 *
00429          IF( IMAT.EQ.5 .OR. IMAT.EQ.11 ) THEN
00430             ANORM = SMALL
00431          ELSE IF( IMAT.EQ.6 .OR. IMAT.EQ.12 ) THEN
00432             ANORM = LARGE
00433          ELSE
00434             ANORM = ONE
00435          END IF
00436 *
00437       ELSE IF( LSAMEN( 2, C2, 'TR' ) .OR. LSAMEN( 2, C2, 'TP' ) ) THEN
00438 *
00439 *        xTR, xTP:  Set parameters to generate a triangular matrix
00440 *
00441 *        Set TYPE, the type of matrix to be generated.
00442 *
00443          TYPE = 'N'
00444 *
00445 *        Set the lower and upper bandwidths.
00446 *
00447          MAT = ABS( IMAT )
00448          IF( MAT.EQ.1 .OR. MAT.EQ.7 ) THEN
00449             KL = 0
00450             KU = 0
00451          ELSE IF( IMAT.LT.0 ) THEN
00452             KL = MAX( N-1, 0 )
00453             KU = 0
00454          ELSE
00455             KL = 0
00456             KU = MAX( N-1, 0 )
00457          END IF
00458 *
00459 *        Set the condition number and norm.
00460 *
00461          IF( MAT.EQ.3 .OR. MAT.EQ.9 ) THEN
00462             CNDNUM = BADC1
00463          ELSE IF( MAT.EQ.4 .OR. MAT.EQ.10 ) THEN
00464             CNDNUM = BADC2
00465          ELSE
00466             CNDNUM = TWO
00467          END IF
00468 *
00469          IF( MAT.EQ.5 ) THEN
00470             ANORM = SMALL
00471          ELSE IF( MAT.EQ.6 ) THEN
00472             ANORM = LARGE
00473          ELSE
00474             ANORM = ONE
00475          END IF
00476 *
00477       ELSE IF( LSAMEN( 2, C2, 'TB' ) ) THEN
00478 *
00479 *        xTB:  Set parameters to generate a triangular band matrix.
00480 *
00481 *        Set TYPE, the type of matrix to be generated.
00482 *
00483          TYPE = 'N'
00484 *
00485 *        Set the norm and condition number.
00486 *
00487          IF( IMAT.EQ.2 .OR. IMAT.EQ.8 ) THEN
00488             CNDNUM = BADC1
00489          ELSE IF( IMAT.EQ.3 .OR. IMAT.EQ.9 ) THEN
00490             CNDNUM = BADC2
00491          ELSE
00492             CNDNUM = TWO
00493          END IF
00494 *
00495          IF( IMAT.EQ.4 ) THEN
00496             ANORM = SMALL
00497          ELSE IF( IMAT.EQ.5 ) THEN
00498             ANORM = LARGE
00499          ELSE
00500             ANORM = ONE
00501          END IF
00502       END IF
00503       IF( N.LE.1 )
00504      $   CNDNUM = ONE
00505 *
00506       RETURN
00507 *
00508 *     End of CLATB4
00509 *
00510       END
 All Files Functions