LAPACK 3.3.1
Linear Algebra PACKage

clatm2.f

Go to the documentation of this file.
00001       COMPLEX FUNCTION CLATM2( M, N, I, J, KL, KU, IDIST, ISEED, D,
00002      $                         IGRADE, DL, DR, IPVTNG, IWORK, SPARSE )
00003 *
00004 *  -- LAPACK auxiliary test routine (version 3.1) --
00005 *     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
00006 *     June 2010
00007 *
00008 *     .. Scalar Arguments ..
00009 *
00010       INTEGER            I, IDIST, IGRADE, IPVTNG, J, KL, KU, M, N
00011       REAL               SPARSE
00012 *     ..
00013 *
00014 *     .. Array Arguments ..
00015 *
00016       INTEGER            ISEED( 4 ), IWORK( * )
00017       COMPLEX            D( * ), DL( * ), DR( * )
00018 *     ..
00019 *
00020 *  Purpose
00021 *  =======
00022 *
00023 *     CLATM2 returns the (I,J) entry of a random matrix of dimension
00024 *     (M, N) described by the other paramters. It is called by the
00025 *     CLATMR routine in order to build random test matrices. No error
00026 *     checking on parameters is done, because this routine is called in
00027 *     a tight loop by CLATMR which has already checked the parameters.
00028 *
00029 *     Use of CLATM2 differs from CLATM3 in the order in which the random
00030 *     number generator is called to fill in random matrix entries.
00031 *     With CLATM2, the generator is called to fill in the pivoted matrix
00032 *     columnwise. With CLATM3, the generator is called to fill in the
00033 *     matrix columnwise, after which it is pivoted. Thus, CLATM3 can
00034 *     be used to construct random matrices which differ only in their
00035 *     order of rows and/or columns. CLATM2 is used to construct band
00036 *     matrices while avoiding calling the random number generator for
00037 *     entries outside the band (and therefore generating random numbers
00038 *
00039 *     The matrix whose (I,J) entry is returned is constructed as
00040 *     follows (this routine only computes one entry):
00041 *
00042 *       If I is outside (1..M) or J is outside (1..N), return zero
00043 *          (this is convenient for generating matrices in band format).
00044 *
00045 *       Generate a matrix A with random entries of distribution IDIST.
00046 *
00047 *       Set the diagonal to D.
00048 *
00049 *       Grade the matrix, if desired, from the left (by DL) and/or
00050 *          from the right (by DR or DL) as specified by IGRADE.
00051 *
00052 *       Permute, if desired, the rows and/or columns as specified by
00053 *          IPVTNG and IWORK.
00054 *
00055 *       Band the matrix to have lower bandwidth KL and upper
00056 *          bandwidth KU.
00057 *
00058 *       Set random entries to zero as specified by SPARSE.
00059 *
00060 *  Arguments
00061 *  =========
00062 *
00063 *  M        (input) INTEGER
00064 *           Number of rows of matrix. Not modified.
00065 *
00066 *  N        (input) INTEGER
00067 *           Number of columns of matrix. Not modified.
00068 *
00069 *  I        (input) INTEGER
00070 *           Row of entry to be returned. Not modified.
00071 *
00072 *  J        (input) INTEGER
00073 *           Column of entry to be returned. Not modified.
00074 *
00075 *  KL       (input) INTEGER
00076 *           Lower bandwidth. Not modified.
00077 *
00078 *  KU       (input) INTEGER
00079 *           Upper bandwidth. Not modified.
00080 *
00081 *  IDIST    (input) INTEGER
00082 *           On entry, IDIST specifies the type of distribution to be
00083 *           used to generate a random matrix .
00084 *           1 => real and imaginary parts each UNIFORM( 0, 1 )
00085 *           2 => real and imaginary parts each UNIFORM( -1, 1 )
00086 *           3 => real and imaginary parts each NORMAL( 0, 1 )
00087 *           4 => complex number uniform in DISK( 0 , 1 )
00088 *           Not modified.
00089 *
00090 *  ISEED    (input/output) INTEGER array of dimension ( 4 )
00091 *           Seed for random number generator.
00092 *           Changed on exit.
00093 *
00094 *  D        (input) COMPLEX array of dimension ( MIN( I , J ) )
00095 *           Diagonal entries of matrix. Not modified.
00096 *
00097 *  IGRADE   (input) INTEGER
00098 *           Specifies grading of matrix as follows:
00099 *           0  => no grading
00100 *           1  => matrix premultiplied by diag( DL )
00101 *           2  => matrix postmultiplied by diag( DR )
00102 *           3  => matrix premultiplied by diag( DL ) and
00103 *                         postmultiplied by diag( DR )
00104 *           4  => matrix premultiplied by diag( DL ) and
00105 *                         postmultiplied by inv( diag( DL ) )
00106 *           5  => matrix premultiplied by diag( DL ) and
00107 *                         postmultiplied by diag( CONJG(DL) )
00108 *           6  => matrix premultiplied by diag( DL ) and
00109 *                         postmultiplied by diag( DL )
00110 *           Not modified.
00111 *
00112 *  DL       (input) COMPLEX array ( I or J, as appropriate )
00113 *           Left scale factors for grading matrix.  Not modified.
00114 *
00115 *  DR       (input) COMPLEX array ( I or J, as appropriate )
00116 *           Right scale factors for grading matrix.  Not modified.
00117 *
00118 *  IPVTNG   (input) INTEGER
00119 *           On entry specifies pivoting permutations as follows:
00120 *           0 => none.
00121 *           1 => row pivoting.
00122 *           2 => column pivoting.
00123 *           3 => full pivoting, i.e., on both sides.
00124 *           Not modified.
00125 *
00126 *  IWORK    (workspace) INTEGER array ( I or J, as appropriate )
00127 *           This array specifies the permutation used. The
00128 *           row (or column) in position K was originally in
00129 *           position IWORK( K ).
00130 *           This differs from IWORK for CLATM3. Not modified.
00131 *
00132 *  SPARSE   (input) REAL 
00133 *           Value between 0. and 1.
00134 *           On entry specifies the sparsity of the matrix
00135 *           if sparse matix is to be generated.
00136 *           SPARSE should lie between 0 and 1.
00137 *           A uniform ( 0, 1 ) random number x is generated and
00138 *           compared to SPARSE; if x is larger the matrix entry
00139 *           is unchanged and if x is smaller the entry is set
00140 *           to zero. Thus on the average a fraction SPARSE of the
00141 *           entries will be set to zero.
00142 *           Not modified.
00143 *
00144 *  =====================================================================
00145 *
00146 *     .. Parameters ..
00147 *
00148       COMPLEX            CZERO
00149       PARAMETER          ( CZERO = ( 0.0E0, 0.0E0 ) )
00150       REAL               ZERO
00151       PARAMETER          ( ZERO = 0.0E0 )
00152 *     ..
00153 *
00154 *     .. Local Scalars ..
00155 *
00156       INTEGER            ISUB, JSUB
00157       COMPLEX            CTEMP
00158 *     ..
00159 *
00160 *     .. External Functions ..
00161 *
00162       REAL               SLARAN
00163       COMPLEX            CLARND
00164       EXTERNAL           SLARAN, CLARND
00165 *     ..
00166 *
00167 *     .. Intrinsic Functions ..
00168 *
00169       INTRINSIC          CONJG
00170 *     ..
00171 *
00172 *-----------------------------------------------------------------------
00173 *
00174 *     .. Executable Statements ..
00175 *
00176 *
00177 *     Check for I and J in range
00178 *
00179       IF( I.LT.1 .OR. I.GT.M .OR. J.LT.1 .OR. J.GT.N ) THEN
00180          CLATM2 = CZERO
00181          RETURN
00182       END IF
00183 *
00184 *     Check for banding
00185 *
00186       IF( J.GT.I+KU .OR. J.LT.I-KL ) THEN
00187          CLATM2 = CZERO
00188          RETURN
00189       END IF
00190 *
00191 *     Check for sparsity
00192 *
00193       IF( SPARSE.GT.ZERO ) THEN
00194          IF( SLARAN( ISEED ).LT.SPARSE ) THEN
00195             CLATM2 = CZERO
00196             RETURN
00197          END IF
00198       END IF
00199 *
00200 *     Compute subscripts depending on IPVTNG
00201 *
00202       IF( IPVTNG.EQ.0 ) THEN
00203          ISUB = I
00204          JSUB = J
00205       ELSE IF( IPVTNG.EQ.1 ) THEN
00206          ISUB = IWORK( I )
00207          JSUB = J
00208       ELSE IF( IPVTNG.EQ.2 ) THEN
00209          ISUB = I
00210          JSUB = IWORK( J )
00211       ELSE IF( IPVTNG.EQ.3 ) THEN
00212          ISUB = IWORK( I )
00213          JSUB = IWORK( J )
00214       END IF
00215 *
00216 *     Compute entry and grade it according to IGRADE
00217 *
00218       IF( ISUB.EQ.JSUB ) THEN
00219          CTEMP = D( ISUB )
00220       ELSE
00221          CTEMP = CLARND( IDIST, ISEED )
00222       END IF
00223       IF( IGRADE.EQ.1 ) THEN
00224          CTEMP = CTEMP*DL( ISUB )
00225       ELSE IF( IGRADE.EQ.2 ) THEN
00226          CTEMP = CTEMP*DR( JSUB )
00227       ELSE IF( IGRADE.EQ.3 ) THEN
00228          CTEMP = CTEMP*DL( ISUB )*DR( JSUB )
00229       ELSE IF( IGRADE.EQ.4 .AND. ISUB.NE.JSUB ) THEN
00230          CTEMP = CTEMP*DL( ISUB ) / DL( JSUB )
00231       ELSE IF( IGRADE.EQ.5 ) THEN
00232          CTEMP = CTEMP*DL( ISUB )*CONJG( DL( JSUB ) )
00233       ELSE IF( IGRADE.EQ.6 ) THEN
00234          CTEMP = CTEMP*DL( ISUB )*DL( JSUB )
00235       END IF
00236       CLATM2 = CTEMP
00237       RETURN
00238 *
00239 *     End of CLATM2
00240 *
00241       END
 All Files Functions