LAPACK 3.3.1
Linear Algebra PACKage
|
00001 SUBROUTINE SLATMR( M, N, DIST, ISEED, SYM, D, MODE, COND, DMAX, 00002 $ RSIGN, GRADE, DL, MODEL, CONDL, DR, MODER, 00003 $ CONDR, PIVTNG, IPIVOT, KL, KU, SPARSE, ANORM, 00004 $ PACK, A, LDA, IWORK, INFO ) 00005 * 00006 * -- LAPACK test routine (version 3.1) -- 00007 * Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. 00008 * June 2010 00009 * 00010 * .. Scalar Arguments .. 00011 CHARACTER DIST, GRADE, PACK, PIVTNG, RSIGN, SYM 00012 INTEGER INFO, KL, KU, LDA, M, MODE, MODEL, MODER, N 00013 REAL ANORM, COND, CONDL, CONDR, DMAX, SPARSE 00014 * .. 00015 * .. Array Arguments .. 00016 INTEGER IPIVOT( * ), ISEED( 4 ), IWORK( * ) 00017 REAL A( LDA, * ), D( * ), DL( * ), DR( * ) 00018 * .. 00019 * 00020 * Purpose 00021 * ======= 00022 * 00023 * SLATMR generates random matrices of various types for testing 00024 * LAPACK programs. 00025 * 00026 * SLATMR operates by applying the following sequence of 00027 * operations: 00028 * 00029 * Generate a matrix A with random entries of distribution DIST 00030 * which is symmetric if SYM='S', and nonsymmetric 00031 * if SYM='N'. 00032 * 00033 * Set the diagonal to D, where D may be input or 00034 * computed according to MODE, COND, DMAX and RSIGN 00035 * as described below. 00036 * 00037 * Grade the matrix, if desired, from the left and/or right 00038 * as specified by GRADE. The inputs DL, MODEL, CONDL, DR, 00039 * MODER and CONDR also determine the grading as described 00040 * below. 00041 * 00042 * Permute, if desired, the rows and/or columns as specified by 00043 * PIVTNG and IPIVOT. 00044 * 00045 * Set random entries to zero, if desired, to get a random sparse 00046 * matrix as specified by SPARSE. 00047 * 00048 * Make A a band matrix, if desired, by zeroing out the matrix 00049 * outside a band of lower bandwidth KL and upper bandwidth KU. 00050 * 00051 * Scale A, if desired, to have maximum entry ANORM. 00052 * 00053 * Pack the matrix if desired. Options specified by PACK are: 00054 * no packing 00055 * zero out upper half (if symmetric) 00056 * zero out lower half (if symmetric) 00057 * store the upper half columnwise (if symmetric or 00058 * square upper triangular) 00059 * store the lower half columnwise (if symmetric or 00060 * square lower triangular) 00061 * same as upper half rowwise if symmetric 00062 * store the lower triangle in banded format (if symmetric) 00063 * store the upper triangle in banded format (if symmetric) 00064 * store the entire matrix in banded format 00065 * 00066 * Note: If two calls to SLATMR differ only in the PACK parameter, 00067 * they will generate mathematically equivalent matrices. 00068 * 00069 * If two calls to SLATMR both have full bandwidth (KL = M-1 00070 * and KU = N-1), and differ only in the PIVTNG and PACK 00071 * parameters, then the matrices generated will differ only 00072 * in the order of the rows and/or columns, and otherwise 00073 * contain the same data. This consistency cannot be and 00074 * is not maintained with less than full bandwidth. 00075 * 00076 * Arguments 00077 * ========= 00078 * 00079 * M (input) INTEGER 00080 * Number of rows of A. Not modified. 00081 * 00082 * N (input) INTEGER 00083 * Number of columns of A. Not modified. 00084 * 00085 * DIST (input) CHARACTER*1 00086 * On entry, DIST specifies the type of distribution to be used 00087 * to generate a random matrix . 00088 * 'U' => UNIFORM( 0, 1 ) ( 'U' for uniform ) 00089 * 'S' => UNIFORM( -1, 1 ) ( 'S' for symmetric ) 00090 * 'N' => NORMAL( 0, 1 ) ( 'N' for normal ) 00091 * Not modified. 00092 * 00093 * ISEED (input/output) INTEGER array, dimension (4) 00094 * On entry ISEED specifies the seed of the random number 00095 * generator. They should lie between 0 and 4095 inclusive, 00096 * and ISEED(4) should be odd. The random number generator 00097 * uses a linear congruential sequence limited to small 00098 * integers, and so should produce machine independent 00099 * random numbers. The values of ISEED are changed on 00100 * exit, and can be used in the next call to SLATMR 00101 * to continue the same random number sequence. 00102 * Changed on exit. 00103 * 00104 * SYM (input) CHARACTER*1 00105 * If SYM='S' or 'H', generated matrix is symmetric. 00106 * If SYM='N', generated matrix is nonsymmetric. 00107 * Not modified. 00108 * 00109 * D (input) REAL array, dimension (min(M,N)) 00110 * On entry this array specifies the diagonal entries 00111 * of the diagonal of A. D may either be specified 00112 * on entry, or set according to MODE and COND as described 00113 * below. May be changed on exit if MODE is nonzero. 00114 * 00115 * MODE (input) INTEGER 00116 * On entry describes how D is to be used: 00117 * MODE = 0 means use D as input 00118 * MODE = 1 sets D(1)=1 and D(2:N)=1.0/COND 00119 * MODE = 2 sets D(1:N-1)=1 and D(N)=1.0/COND 00120 * MODE = 3 sets D(I)=COND**(-(I-1)/(N-1)) 00121 * MODE = 4 sets D(i)=1 - (i-1)/(N-1)*(1 - 1/COND) 00122 * MODE = 5 sets D to random numbers in the range 00123 * ( 1/COND , 1 ) such that their logarithms 00124 * are uniformly distributed. 00125 * MODE = 6 set D to random numbers from same distribution 00126 * as the rest of the matrix. 00127 * MODE < 0 has the same meaning as ABS(MODE), except that 00128 * the order of the elements of D is reversed. 00129 * Thus if MODE is positive, D has entries ranging from 00130 * 1 to 1/COND, if negative, from 1/COND to 1, 00131 * Not modified. 00132 * 00133 * COND (input) REAL 00134 * On entry, used as described under MODE above. 00135 * If used, it must be >= 1. Not modified. 00136 * 00137 * DMAX (input) REAL 00138 * If MODE neither -6, 0 nor 6, the diagonal is scaled by 00139 * DMAX / max(abs(D(i))), so that maximum absolute entry 00140 * of diagonal is abs(DMAX). If DMAX is negative (or zero), 00141 * diagonal will be scaled by a negative number (or zero). 00142 * 00143 * RSIGN (input) CHARACTER*1 00144 * If MODE neither -6, 0 nor 6, specifies sign of diagonal 00145 * as follows: 00146 * 'T' => diagonal entries are multiplied by 1 or -1 00147 * with probability .5 00148 * 'F' => diagonal unchanged 00149 * Not modified. 00150 * 00151 * GRADE (input) CHARACTER*1 00152 * Specifies grading of matrix as follows: 00153 * 'N' => no grading 00154 * 'L' => matrix premultiplied by diag( DL ) 00155 * (only if matrix nonsymmetric) 00156 * 'R' => matrix postmultiplied by diag( DR ) 00157 * (only if matrix nonsymmetric) 00158 * 'B' => matrix premultiplied by diag( DL ) and 00159 * postmultiplied by diag( DR ) 00160 * (only if matrix nonsymmetric) 00161 * 'S' or 'H' => matrix premultiplied by diag( DL ) and 00162 * postmultiplied by diag( DL ) 00163 * ('S' for symmetric, or 'H' for Hermitian) 00164 * 'E' => matrix premultiplied by diag( DL ) and 00165 * postmultiplied by inv( diag( DL ) ) 00166 * ( 'E' for eigenvalue invariance) 00167 * (only if matrix nonsymmetric) 00168 * Note: if GRADE='E', then M must equal N. 00169 * Not modified. 00170 * 00171 * DL (input/output) REAL array, dimension (M) 00172 * If MODEL=0, then on entry this array specifies the diagonal 00173 * entries of a diagonal matrix used as described under GRADE 00174 * above. If MODEL is not zero, then DL will be set according 00175 * to MODEL and CONDL, analogous to the way D is set according 00176 * to MODE and COND (except there is no DMAX parameter for DL). 00177 * If GRADE='E', then DL cannot have zero entries. 00178 * Not referenced if GRADE = 'N' or 'R'. Changed on exit. 00179 * 00180 * MODEL (input) INTEGER 00181 * This specifies how the diagonal array DL is to be computed, 00182 * just as MODE specifies how D is to be computed. 00183 * Not modified. 00184 * 00185 * CONDL (input) REAL 00186 * When MODEL is not zero, this specifies the condition number 00187 * of the computed DL. Not modified. 00188 * 00189 * DR (input/output) REAL array, dimension (N) 00190 * If MODER=0, then on entry this array specifies the diagonal 00191 * entries of a diagonal matrix used as described under GRADE 00192 * above. If MODER is not zero, then DR will be set according 00193 * to MODER and CONDR, analogous to the way D is set according 00194 * to MODE and COND (except there is no DMAX parameter for DR). 00195 * Not referenced if GRADE = 'N', 'L', 'H', 'S' or 'E'. 00196 * Changed on exit. 00197 * 00198 * MODER (input) INTEGER 00199 * This specifies how the diagonal array DR is to be computed, 00200 * just as MODE specifies how D is to be computed. 00201 * Not modified. 00202 * 00203 * CONDR (input) REAL 00204 * When MODER is not zero, this specifies the condition number 00205 * of the computed DR. Not modified. 00206 * 00207 * PIVTNG (input) CHARACTER*1 00208 * On entry specifies pivoting permutations as follows: 00209 * 'N' or ' ' => none. 00210 * 'L' => left or row pivoting (matrix must be nonsymmetric). 00211 * 'R' => right or column pivoting (matrix must be 00212 * nonsymmetric). 00213 * 'B' or 'F' => both or full pivoting, i.e., on both sides. 00214 * In this case, M must equal N 00215 * 00216 * If two calls to SLATMR both have full bandwidth (KL = M-1 00217 * and KU = N-1), and differ only in the PIVTNG and PACK 00218 * parameters, then the matrices generated will differ only 00219 * in the order of the rows and/or columns, and otherwise 00220 * contain the same data. This consistency cannot be 00221 * maintained with less than full bandwidth. 00222 * 00223 * IPIVOT (input) INTEGER array, dimension (N or M) 00224 * This array specifies the permutation used. After the 00225 * basic matrix is generated, the rows, columns, or both 00226 * are permuted. If, say, row pivoting is selected, SLATMR 00227 * starts with the *last* row and interchanges the M-th and 00228 * IPIVOT(M)-th rows, then moves to the next-to-last row, 00229 * interchanging the (M-1)-th and the IPIVOT(M-1)-th rows, 00230 * and so on. In terms of "2-cycles", the permutation is 00231 * (1 IPIVOT(1)) (2 IPIVOT(2)) ... (M IPIVOT(M)) 00232 * where the rightmost cycle is applied first. This is the 00233 * *inverse* of the effect of pivoting in LINPACK. The idea 00234 * is that factoring (with pivoting) an identity matrix 00235 * which has been inverse-pivoted in this way should 00236 * result in a pivot vector identical to IPIVOT. 00237 * Not referenced if PIVTNG = 'N'. Not modified. 00238 * 00239 * SPARSE (input) REAL 00240 * On entry specifies the sparsity of the matrix if a sparse 00241 * matrix is to be generated. SPARSE should lie between 00242 * 0 and 1. To generate a sparse matrix, for each matrix entry 00243 * a uniform ( 0, 1 ) random number x is generated and 00244 * compared to SPARSE; if x is larger the matrix entry 00245 * is unchanged and if x is smaller the entry is set 00246 * to zero. Thus on the average a fraction SPARSE of the 00247 * entries will be set to zero. 00248 * Not modified. 00249 * 00250 * KL (input) INTEGER 00251 * On entry specifies the lower bandwidth of the matrix. For 00252 * example, KL=0 implies upper triangular, KL=1 implies upper 00253 * Hessenberg, and KL at least M-1 implies the matrix is not 00254 * banded. Must equal KU if matrix is symmetric. 00255 * Not modified. 00256 * 00257 * KU (input) INTEGER 00258 * On entry specifies the upper bandwidth of the matrix. For 00259 * example, KU=0 implies lower triangular, KU=1 implies lower 00260 * Hessenberg, and KU at least N-1 implies the matrix is not 00261 * banded. Must equal KL if matrix is symmetric. 00262 * Not modified. 00263 * 00264 * ANORM (input) REAL 00265 * On entry specifies maximum entry of output matrix 00266 * (output matrix will by multiplied by a constant so that 00267 * its largest absolute entry equal ANORM) 00268 * if ANORM is nonnegative. If ANORM is negative no scaling 00269 * is done. Not modified. 00270 * 00271 * PACK (input) CHARACTER*1 00272 * On entry specifies packing of matrix as follows: 00273 * 'N' => no packing 00274 * 'U' => zero out all subdiagonal entries (if symmetric) 00275 * 'L' => zero out all superdiagonal entries (if symmetric) 00276 * 'C' => store the upper triangle columnwise 00277 * (only if matrix symmetric or square upper triangular) 00278 * 'R' => store the lower triangle columnwise 00279 * (only if matrix symmetric or square lower triangular) 00280 * (same as upper half rowwise if symmetric) 00281 * 'B' => store the lower triangle in band storage scheme 00282 * (only if matrix symmetric) 00283 * 'Q' => store the upper triangle in band storage scheme 00284 * (only if matrix symmetric) 00285 * 'Z' => store the entire matrix in band storage scheme 00286 * (pivoting can be provided for by using this 00287 * option to store A in the trailing rows of 00288 * the allocated storage) 00289 * 00290 * Using these options, the various LAPACK packed and banded 00291 * storage schemes can be obtained: 00292 * GB - use 'Z' 00293 * PB, SB or TB - use 'B' or 'Q' 00294 * PP, SP or TP - use 'C' or 'R' 00295 * 00296 * If two calls to SLATMR differ only in the PACK parameter, 00297 * they will generate mathematically equivalent matrices. 00298 * Not modified. 00299 * 00300 * A (input/output) REAL array, dimension (LDA,N) 00301 * On exit A is the desired test matrix. Only those 00302 * entries of A which are significant on output 00303 * will be referenced (even if A is in packed or band 00304 * storage format). The 'unoccupied corners' of A in 00305 * band format will be zeroed out. 00306 * 00307 * LDA (input) INTEGER 00308 * on entry LDA specifies the first dimension of A as 00309 * declared in the calling program. 00310 * If PACK='N', 'U' or 'L', LDA must be at least max ( 1, M ). 00311 * If PACK='C' or 'R', LDA must be at least 1. 00312 * If PACK='B', or 'Q', LDA must be MIN ( KU+1, N ) 00313 * If PACK='Z', LDA must be at least KUU+KLL+1, where 00314 * KUU = MIN ( KU, N-1 ) and KLL = MIN ( KL, N-1 ) 00315 * Not modified. 00316 * 00317 * IWORK (workspace) INTEGER array, dimension ( N or M) 00318 * Workspace. Not referenced if PIVTNG = 'N'. Changed on exit. 00319 * 00320 * INFO (output) INTEGER 00321 * Error parameter on exit: 00322 * 0 => normal return 00323 * -1 => M negative or unequal to N and SYM='S' or 'H' 00324 * -2 => N negative 00325 * -3 => DIST illegal string 00326 * -5 => SYM illegal string 00327 * -7 => MODE not in range -6 to 6 00328 * -8 => COND less than 1.0, and MODE neither -6, 0 nor 6 00329 * -10 => MODE neither -6, 0 nor 6 and RSIGN illegal string 00330 * -11 => GRADE illegal string, or GRADE='E' and 00331 * M not equal to N, or GRADE='L', 'R', 'B' or 'E' and 00332 * SYM = 'S' or 'H' 00333 * -12 => GRADE = 'E' and DL contains zero 00334 * -13 => MODEL not in range -6 to 6 and GRADE= 'L', 'B', 'H', 00335 * 'S' or 'E' 00336 * -14 => CONDL less than 1.0, GRADE='L', 'B', 'H', 'S' or 'E', 00337 * and MODEL neither -6, 0 nor 6 00338 * -16 => MODER not in range -6 to 6 and GRADE= 'R' or 'B' 00339 * -17 => CONDR less than 1.0, GRADE='R' or 'B', and 00340 * MODER neither -6, 0 nor 6 00341 * -18 => PIVTNG illegal string, or PIVTNG='B' or 'F' and 00342 * M not equal to N, or PIVTNG='L' or 'R' and SYM='S' 00343 * or 'H' 00344 * -19 => IPIVOT contains out of range number and 00345 * PIVTNG not equal to 'N' 00346 * -20 => KL negative 00347 * -21 => KU negative, or SYM='S' or 'H' and KU not equal to KL 00348 * -22 => SPARSE not in range 0. to 1. 00349 * -24 => PACK illegal string, or PACK='U', 'L', 'B' or 'Q' 00350 * and SYM='N', or PACK='C' and SYM='N' and either KL 00351 * not equal to 0 or N not equal to M, or PACK='R' and 00352 * SYM='N', and either KU not equal to 0 or N not equal 00353 * to M 00354 * -26 => LDA too small 00355 * 1 => Error return from SLATM1 (computing D) 00356 * 2 => Cannot scale diagonal to DMAX (max. entry is 0) 00357 * 3 => Error return from SLATM1 (computing DL) 00358 * 4 => Error return from SLATM1 (computing DR) 00359 * 5 => ANORM is positive, but matrix constructed prior to 00360 * attempting to scale it to have norm ANORM, is zero 00361 * 00362 * ===================================================================== 00363 * 00364 * .. Parameters .. 00365 REAL ZERO 00366 PARAMETER ( ZERO = 0.0E0 ) 00367 REAL ONE 00368 PARAMETER ( ONE = 1.0E0 ) 00369 * .. 00370 * .. Local Scalars .. 00371 LOGICAL BADPVT, DZERO, FULBND 00372 INTEGER I, IDIST, IGRADE, IISUB, IPACK, IPVTNG, IRSIGN, 00373 $ ISUB, ISYM, J, JJSUB, JSUB, K, KLL, KUU, MNMIN, 00374 $ MNSUB, MXSUB, NPVTS 00375 REAL ALPHA, ONORM, TEMP 00376 * .. 00377 * .. Local Arrays .. 00378 REAL TEMPA( 1 ) 00379 * .. 00380 * .. External Functions .. 00381 LOGICAL LSAME 00382 REAL SLANGB, SLANGE, SLANSB, SLANSP, SLANSY, SLATM2, 00383 $ SLATM3 00384 EXTERNAL LSAME, SLANGB, SLANGE, SLANSB, SLANSP, SLANSY, 00385 $ SLATM2, SLATM3 00386 * .. 00387 * .. External Subroutines .. 00388 EXTERNAL SLATM1, SSCAL, XERBLA 00389 * .. 00390 * .. Intrinsic Functions .. 00391 INTRINSIC ABS, MAX, MIN, MOD 00392 * .. 00393 * .. Executable Statements .. 00394 * 00395 * 1) Decode and Test the input parameters. 00396 * Initialize flags & seed. 00397 * 00398 INFO = 0 00399 * 00400 * Quick return if possible 00401 * 00402 IF( M.EQ.0 .OR. N.EQ.0 ) 00403 $ RETURN 00404 * 00405 * Decode DIST 00406 * 00407 IF( LSAME( DIST, 'U' ) ) THEN 00408 IDIST = 1 00409 ELSE IF( LSAME( DIST, 'S' ) ) THEN 00410 IDIST = 2 00411 ELSE IF( LSAME( DIST, 'N' ) ) THEN 00412 IDIST = 3 00413 ELSE 00414 IDIST = -1 00415 END IF 00416 * 00417 * Decode SYM 00418 * 00419 IF( LSAME( SYM, 'S' ) ) THEN 00420 ISYM = 0 00421 ELSE IF( LSAME( SYM, 'N' ) ) THEN 00422 ISYM = 1 00423 ELSE IF( LSAME( SYM, 'H' ) ) THEN 00424 ISYM = 0 00425 ELSE 00426 ISYM = -1 00427 END IF 00428 * 00429 * Decode RSIGN 00430 * 00431 IF( LSAME( RSIGN, 'F' ) ) THEN 00432 IRSIGN = 0 00433 ELSE IF( LSAME( RSIGN, 'T' ) ) THEN 00434 IRSIGN = 1 00435 ELSE 00436 IRSIGN = -1 00437 END IF 00438 * 00439 * Decode PIVTNG 00440 * 00441 IF( LSAME( PIVTNG, 'N' ) ) THEN 00442 IPVTNG = 0 00443 ELSE IF( LSAME( PIVTNG, ' ' ) ) THEN 00444 IPVTNG = 0 00445 ELSE IF( LSAME( PIVTNG, 'L' ) ) THEN 00446 IPVTNG = 1 00447 NPVTS = M 00448 ELSE IF( LSAME( PIVTNG, 'R' ) ) THEN 00449 IPVTNG = 2 00450 NPVTS = N 00451 ELSE IF( LSAME( PIVTNG, 'B' ) ) THEN 00452 IPVTNG = 3 00453 NPVTS = MIN( N, M ) 00454 ELSE IF( LSAME( PIVTNG, 'F' ) ) THEN 00455 IPVTNG = 3 00456 NPVTS = MIN( N, M ) 00457 ELSE 00458 IPVTNG = -1 00459 END IF 00460 * 00461 * Decode GRADE 00462 * 00463 IF( LSAME( GRADE, 'N' ) ) THEN 00464 IGRADE = 0 00465 ELSE IF( LSAME( GRADE, 'L' ) ) THEN 00466 IGRADE = 1 00467 ELSE IF( LSAME( GRADE, 'R' ) ) THEN 00468 IGRADE = 2 00469 ELSE IF( LSAME( GRADE, 'B' ) ) THEN 00470 IGRADE = 3 00471 ELSE IF( LSAME( GRADE, 'E' ) ) THEN 00472 IGRADE = 4 00473 ELSE IF( LSAME( GRADE, 'H' ) .OR. LSAME( GRADE, 'S' ) ) THEN 00474 IGRADE = 5 00475 ELSE 00476 IGRADE = -1 00477 END IF 00478 * 00479 * Decode PACK 00480 * 00481 IF( LSAME( PACK, 'N' ) ) THEN 00482 IPACK = 0 00483 ELSE IF( LSAME( PACK, 'U' ) ) THEN 00484 IPACK = 1 00485 ELSE IF( LSAME( PACK, 'L' ) ) THEN 00486 IPACK = 2 00487 ELSE IF( LSAME( PACK, 'C' ) ) THEN 00488 IPACK = 3 00489 ELSE IF( LSAME( PACK, 'R' ) ) THEN 00490 IPACK = 4 00491 ELSE IF( LSAME( PACK, 'B' ) ) THEN 00492 IPACK = 5 00493 ELSE IF( LSAME( PACK, 'Q' ) ) THEN 00494 IPACK = 6 00495 ELSE IF( LSAME( PACK, 'Z' ) ) THEN 00496 IPACK = 7 00497 ELSE 00498 IPACK = -1 00499 END IF 00500 * 00501 * Set certain internal parameters 00502 * 00503 MNMIN = MIN( M, N ) 00504 KLL = MIN( KL, M-1 ) 00505 KUU = MIN( KU, N-1 ) 00506 * 00507 * If inv(DL) is used, check to see if DL has a zero entry. 00508 * 00509 DZERO = .FALSE. 00510 IF( IGRADE.EQ.4 .AND. MODEL.EQ.0 ) THEN 00511 DO 10 I = 1, M 00512 IF( DL( I ).EQ.ZERO ) 00513 $ DZERO = .TRUE. 00514 10 CONTINUE 00515 END IF 00516 * 00517 * Check values in IPIVOT 00518 * 00519 BADPVT = .FALSE. 00520 IF( IPVTNG.GT.0 ) THEN 00521 DO 20 J = 1, NPVTS 00522 IF( IPIVOT( J ).LE.0 .OR. IPIVOT( J ).GT.NPVTS ) 00523 $ BADPVT = .TRUE. 00524 20 CONTINUE 00525 END IF 00526 * 00527 * Set INFO if an error 00528 * 00529 IF( M.LT.0 ) THEN 00530 INFO = -1 00531 ELSE IF( M.NE.N .AND. ISYM.EQ.0 ) THEN 00532 INFO = -1 00533 ELSE IF( N.LT.0 ) THEN 00534 INFO = -2 00535 ELSE IF( IDIST.EQ.-1 ) THEN 00536 INFO = -3 00537 ELSE IF( ISYM.EQ.-1 ) THEN 00538 INFO = -5 00539 ELSE IF( MODE.LT.-6 .OR. MODE.GT.6 ) THEN 00540 INFO = -7 00541 ELSE IF( ( MODE.NE.-6 .AND. MODE.NE.0 .AND. MODE.NE.6 ) .AND. 00542 $ COND.LT.ONE ) THEN 00543 INFO = -8 00544 ELSE IF( ( MODE.NE.-6 .AND. MODE.NE.0 .AND. MODE.NE.6 ) .AND. 00545 $ IRSIGN.EQ.-1 ) THEN 00546 INFO = -10 00547 ELSE IF( IGRADE.EQ.-1 .OR. ( IGRADE.EQ.4 .AND. M.NE.N ) .OR. 00548 $ ( ( IGRADE.GE.1 .AND. IGRADE.LE.4 ) .AND. ISYM.EQ.0 ) ) 00549 $ THEN 00550 INFO = -11 00551 ELSE IF( IGRADE.EQ.4 .AND. DZERO ) THEN 00552 INFO = -12 00553 ELSE IF( ( IGRADE.EQ.1 .OR. IGRADE.EQ.3 .OR. IGRADE.EQ.4 .OR. 00554 $ IGRADE.EQ.5 ) .AND. ( MODEL.LT.-6 .OR. MODEL.GT.6 ) ) 00555 $ THEN 00556 INFO = -13 00557 ELSE IF( ( IGRADE.EQ.1 .OR. IGRADE.EQ.3 .OR. IGRADE.EQ.4 .OR. 00558 $ IGRADE.EQ.5 ) .AND. ( MODEL.NE.-6 .AND. MODEL.NE.0 .AND. 00559 $ MODEL.NE.6 ) .AND. CONDL.LT.ONE ) THEN 00560 INFO = -14 00561 ELSE IF( ( IGRADE.EQ.2 .OR. IGRADE.EQ.3 ) .AND. 00562 $ ( MODER.LT.-6 .OR. MODER.GT.6 ) ) THEN 00563 INFO = -16 00564 ELSE IF( ( IGRADE.EQ.2 .OR. IGRADE.EQ.3 ) .AND. 00565 $ ( MODER.NE.-6 .AND. MODER.NE.0 .AND. MODER.NE.6 ) .AND. 00566 $ CONDR.LT.ONE ) THEN 00567 INFO = -17 00568 ELSE IF( IPVTNG.EQ.-1 .OR. ( IPVTNG.EQ.3 .AND. M.NE.N ) .OR. 00569 $ ( ( IPVTNG.EQ.1 .OR. IPVTNG.EQ.2 ) .AND. ISYM.EQ.0 ) ) 00570 $ THEN 00571 INFO = -18 00572 ELSE IF( IPVTNG.NE.0 .AND. BADPVT ) THEN 00573 INFO = -19 00574 ELSE IF( KL.LT.0 ) THEN 00575 INFO = -20 00576 ELSE IF( KU.LT.0 .OR. ( ISYM.EQ.0 .AND. KL.NE.KU ) ) THEN 00577 INFO = -21 00578 ELSE IF( SPARSE.LT.ZERO .OR. SPARSE.GT.ONE ) THEN 00579 INFO = -22 00580 ELSE IF( IPACK.EQ.-1 .OR. ( ( IPACK.EQ.1 .OR. IPACK.EQ.2 .OR. 00581 $ IPACK.EQ.5 .OR. IPACK.EQ.6 ) .AND. ISYM.EQ.1 ) .OR. 00582 $ ( IPACK.EQ.3 .AND. ISYM.EQ.1 .AND. ( KL.NE.0 .OR. M.NE. 00583 $ N ) ) .OR. ( IPACK.EQ.4 .AND. ISYM.EQ.1 .AND. ( KU.NE. 00584 $ 0 .OR. M.NE.N ) ) ) THEN 00585 INFO = -24 00586 ELSE IF( ( ( IPACK.EQ.0 .OR. IPACK.EQ.1 .OR. IPACK.EQ.2 ) .AND. 00587 $ LDA.LT.MAX( 1, M ) ) .OR. ( ( IPACK.EQ.3 .OR. IPACK.EQ. 00588 $ 4 ) .AND. LDA.LT.1 ) .OR. ( ( IPACK.EQ.5 .OR. IPACK.EQ. 00589 $ 6 ) .AND. LDA.LT.KUU+1 ) .OR. 00590 $ ( IPACK.EQ.7 .AND. LDA.LT.KLL+KUU+1 ) ) THEN 00591 INFO = -26 00592 END IF 00593 * 00594 IF( INFO.NE.0 ) THEN 00595 CALL XERBLA( 'SLATMR', -INFO ) 00596 RETURN 00597 END IF 00598 * 00599 * Decide if we can pivot consistently 00600 * 00601 FULBND = .FALSE. 00602 IF( KUU.EQ.N-1 .AND. KLL.EQ.M-1 ) 00603 $ FULBND = .TRUE. 00604 * 00605 * Initialize random number generator 00606 * 00607 DO 30 I = 1, 4 00608 ISEED( I ) = MOD( ABS( ISEED( I ) ), 4096 ) 00609 30 CONTINUE 00610 * 00611 ISEED( 4 ) = 2*( ISEED( 4 ) / 2 ) + 1 00612 * 00613 * 2) Set up D, DL, and DR, if indicated. 00614 * 00615 * Compute D according to COND and MODE 00616 * 00617 CALL SLATM1( MODE, COND, IRSIGN, IDIST, ISEED, D, MNMIN, INFO ) 00618 IF( INFO.NE.0 ) THEN 00619 INFO = 1 00620 RETURN 00621 END IF 00622 IF( MODE.NE.0 .AND. MODE.NE.-6 .AND. MODE.NE.6 ) THEN 00623 * 00624 * Scale by DMAX 00625 * 00626 TEMP = ABS( D( 1 ) ) 00627 DO 40 I = 2, MNMIN 00628 TEMP = MAX( TEMP, ABS( D( I ) ) ) 00629 40 CONTINUE 00630 IF( TEMP.EQ.ZERO .AND. DMAX.NE.ZERO ) THEN 00631 INFO = 2 00632 RETURN 00633 END IF 00634 IF( TEMP.NE.ZERO ) THEN 00635 ALPHA = DMAX / TEMP 00636 ELSE 00637 ALPHA = ONE 00638 END IF 00639 DO 50 I = 1, MNMIN 00640 D( I ) = ALPHA*D( I ) 00641 50 CONTINUE 00642 * 00643 END IF 00644 * 00645 * Compute DL if grading set 00646 * 00647 IF( IGRADE.EQ.1 .OR. IGRADE.EQ.3 .OR. IGRADE.EQ.4 .OR. IGRADE.EQ. 00648 $ 5 ) THEN 00649 CALL SLATM1( MODEL, CONDL, 0, IDIST, ISEED, DL, M, INFO ) 00650 IF( INFO.NE.0 ) THEN 00651 INFO = 3 00652 RETURN 00653 END IF 00654 END IF 00655 * 00656 * Compute DR if grading set 00657 * 00658 IF( IGRADE.EQ.2 .OR. IGRADE.EQ.3 ) THEN 00659 CALL SLATM1( MODER, CONDR, 0, IDIST, ISEED, DR, N, INFO ) 00660 IF( INFO.NE.0 ) THEN 00661 INFO = 4 00662 RETURN 00663 END IF 00664 END IF 00665 * 00666 * 3) Generate IWORK if pivoting 00667 * 00668 IF( IPVTNG.GT.0 ) THEN 00669 DO 60 I = 1, NPVTS 00670 IWORK( I ) = I 00671 60 CONTINUE 00672 IF( FULBND ) THEN 00673 DO 70 I = 1, NPVTS 00674 K = IPIVOT( I ) 00675 J = IWORK( I ) 00676 IWORK( I ) = IWORK( K ) 00677 IWORK( K ) = J 00678 70 CONTINUE 00679 ELSE 00680 DO 80 I = NPVTS, 1, -1 00681 K = IPIVOT( I ) 00682 J = IWORK( I ) 00683 IWORK( I ) = IWORK( K ) 00684 IWORK( K ) = J 00685 80 CONTINUE 00686 END IF 00687 END IF 00688 * 00689 * 4) Generate matrices for each kind of PACKing 00690 * Always sweep matrix columnwise (if symmetric, upper 00691 * half only) so that matrix generated does not depend 00692 * on PACK 00693 * 00694 IF( FULBND ) THEN 00695 * 00696 * Use SLATM3 so matrices generated with differing PIVOTing only 00697 * differ only in the order of their rows and/or columns. 00698 * 00699 IF( IPACK.EQ.0 ) THEN 00700 IF( ISYM.EQ.0 ) THEN 00701 DO 100 J = 1, N 00702 DO 90 I = 1, J 00703 TEMP = SLATM3( M, N, I, J, ISUB, JSUB, KL, KU, 00704 $ IDIST, ISEED, D, IGRADE, DL, DR, IPVTNG, 00705 $ IWORK, SPARSE ) 00706 A( ISUB, JSUB ) = TEMP 00707 A( JSUB, ISUB ) = TEMP 00708 90 CONTINUE 00709 100 CONTINUE 00710 ELSE IF( ISYM.EQ.1 ) THEN 00711 DO 120 J = 1, N 00712 DO 110 I = 1, M 00713 TEMP = SLATM3( M, N, I, J, ISUB, JSUB, KL, KU, 00714 $ IDIST, ISEED, D, IGRADE, DL, DR, IPVTNG, 00715 $ IWORK, SPARSE ) 00716 A( ISUB, JSUB ) = TEMP 00717 110 CONTINUE 00718 120 CONTINUE 00719 END IF 00720 * 00721 ELSE IF( IPACK.EQ.1 ) THEN 00722 * 00723 DO 140 J = 1, N 00724 DO 130 I = 1, J 00725 TEMP = SLATM3( M, N, I, J, ISUB, JSUB, KL, KU, IDIST, 00726 $ ISEED, D, IGRADE, DL, DR, IPVTNG, IWORK, 00727 $ SPARSE ) 00728 MNSUB = MIN( ISUB, JSUB ) 00729 MXSUB = MAX( ISUB, JSUB ) 00730 A( MNSUB, MXSUB ) = TEMP 00731 IF( MNSUB.NE.MXSUB ) 00732 $ A( MXSUB, MNSUB ) = ZERO 00733 130 CONTINUE 00734 140 CONTINUE 00735 * 00736 ELSE IF( IPACK.EQ.2 ) THEN 00737 * 00738 DO 160 J = 1, N 00739 DO 150 I = 1, J 00740 TEMP = SLATM3( M, N, I, J, ISUB, JSUB, KL, KU, IDIST, 00741 $ ISEED, D, IGRADE, DL, DR, IPVTNG, IWORK, 00742 $ SPARSE ) 00743 MNSUB = MIN( ISUB, JSUB ) 00744 MXSUB = MAX( ISUB, JSUB ) 00745 A( MXSUB, MNSUB ) = TEMP 00746 IF( MNSUB.NE.MXSUB ) 00747 $ A( MNSUB, MXSUB ) = ZERO 00748 150 CONTINUE 00749 160 CONTINUE 00750 * 00751 ELSE IF( IPACK.EQ.3 ) THEN 00752 * 00753 DO 180 J = 1, N 00754 DO 170 I = 1, J 00755 TEMP = SLATM3( M, N, I, J, ISUB, JSUB, KL, KU, IDIST, 00756 $ ISEED, D, IGRADE, DL, DR, IPVTNG, IWORK, 00757 $ SPARSE ) 00758 * 00759 * Compute K = location of (ISUB,JSUB) entry in packed 00760 * array 00761 * 00762 MNSUB = MIN( ISUB, JSUB ) 00763 MXSUB = MAX( ISUB, JSUB ) 00764 K = MXSUB*( MXSUB-1 ) / 2 + MNSUB 00765 * 00766 * Convert K to (IISUB,JJSUB) location 00767 * 00768 JJSUB = ( K-1 ) / LDA + 1 00769 IISUB = K - LDA*( JJSUB-1 ) 00770 * 00771 A( IISUB, JJSUB ) = TEMP 00772 170 CONTINUE 00773 180 CONTINUE 00774 * 00775 ELSE IF( IPACK.EQ.4 ) THEN 00776 * 00777 DO 200 J = 1, N 00778 DO 190 I = 1, J 00779 TEMP = SLATM3( M, N, I, J, ISUB, JSUB, KL, KU, IDIST, 00780 $ ISEED, D, IGRADE, DL, DR, IPVTNG, IWORK, 00781 $ SPARSE ) 00782 * 00783 * Compute K = location of (I,J) entry in packed array 00784 * 00785 MNSUB = MIN( ISUB, JSUB ) 00786 MXSUB = MAX( ISUB, JSUB ) 00787 IF( MNSUB.EQ.1 ) THEN 00788 K = MXSUB 00789 ELSE 00790 K = N*( N+1 ) / 2 - ( N-MNSUB+1 )*( N-MNSUB+2 ) / 00791 $ 2 + MXSUB - MNSUB + 1 00792 END IF 00793 * 00794 * Convert K to (IISUB,JJSUB) location 00795 * 00796 JJSUB = ( K-1 ) / LDA + 1 00797 IISUB = K - LDA*( JJSUB-1 ) 00798 * 00799 A( IISUB, JJSUB ) = TEMP 00800 190 CONTINUE 00801 200 CONTINUE 00802 * 00803 ELSE IF( IPACK.EQ.5 ) THEN 00804 * 00805 DO 220 J = 1, N 00806 DO 210 I = J - KUU, J 00807 IF( I.LT.1 ) THEN 00808 A( J-I+1, I+N ) = ZERO 00809 ELSE 00810 TEMP = SLATM3( M, N, I, J, ISUB, JSUB, KL, KU, 00811 $ IDIST, ISEED, D, IGRADE, DL, DR, IPVTNG, 00812 $ IWORK, SPARSE ) 00813 MNSUB = MIN( ISUB, JSUB ) 00814 MXSUB = MAX( ISUB, JSUB ) 00815 A( MXSUB-MNSUB+1, MNSUB ) = TEMP 00816 END IF 00817 210 CONTINUE 00818 220 CONTINUE 00819 * 00820 ELSE IF( IPACK.EQ.6 ) THEN 00821 * 00822 DO 240 J = 1, N 00823 DO 230 I = J - KUU, J 00824 TEMP = SLATM3( M, N, I, J, ISUB, JSUB, KL, KU, IDIST, 00825 $ ISEED, D, IGRADE, DL, DR, IPVTNG, IWORK, 00826 $ SPARSE ) 00827 MNSUB = MIN( ISUB, JSUB ) 00828 MXSUB = MAX( ISUB, JSUB ) 00829 A( MNSUB-MXSUB+KUU+1, MXSUB ) = TEMP 00830 230 CONTINUE 00831 240 CONTINUE 00832 * 00833 ELSE IF( IPACK.EQ.7 ) THEN 00834 * 00835 IF( ISYM.EQ.0 ) THEN 00836 DO 260 J = 1, N 00837 DO 250 I = J - KUU, J 00838 TEMP = SLATM3( M, N, I, J, ISUB, JSUB, KL, KU, 00839 $ IDIST, ISEED, D, IGRADE, DL, DR, IPVTNG, 00840 $ IWORK, SPARSE ) 00841 MNSUB = MIN( ISUB, JSUB ) 00842 MXSUB = MAX( ISUB, JSUB ) 00843 A( MNSUB-MXSUB+KUU+1, MXSUB ) = TEMP 00844 IF( I.LT.1 ) 00845 $ A( J-I+1+KUU, I+N ) = ZERO 00846 IF( I.GE.1 .AND. MNSUB.NE.MXSUB ) 00847 $ A( MXSUB-MNSUB+1+KUU, MNSUB ) = TEMP 00848 250 CONTINUE 00849 260 CONTINUE 00850 ELSE IF( ISYM.EQ.1 ) THEN 00851 DO 280 J = 1, N 00852 DO 270 I = J - KUU, J + KLL 00853 TEMP = SLATM3( M, N, I, J, ISUB, JSUB, KL, KU, 00854 $ IDIST, ISEED, D, IGRADE, DL, DR, IPVTNG, 00855 $ IWORK, SPARSE ) 00856 A( ISUB-JSUB+KUU+1, JSUB ) = TEMP 00857 270 CONTINUE 00858 280 CONTINUE 00859 END IF 00860 * 00861 END IF 00862 * 00863 ELSE 00864 * 00865 * Use SLATM2 00866 * 00867 IF( IPACK.EQ.0 ) THEN 00868 IF( ISYM.EQ.0 ) THEN 00869 DO 300 J = 1, N 00870 DO 290 I = 1, J 00871 A( I, J ) = SLATM2( M, N, I, J, KL, KU, IDIST, 00872 $ ISEED, D, IGRADE, DL, DR, IPVTNG, 00873 $ IWORK, SPARSE ) 00874 A( J, I ) = A( I, J ) 00875 290 CONTINUE 00876 300 CONTINUE 00877 ELSE IF( ISYM.EQ.1 ) THEN 00878 DO 320 J = 1, N 00879 DO 310 I = 1, M 00880 A( I, J ) = SLATM2( M, N, I, J, KL, KU, IDIST, 00881 $ ISEED, D, IGRADE, DL, DR, IPVTNG, 00882 $ IWORK, SPARSE ) 00883 310 CONTINUE 00884 320 CONTINUE 00885 END IF 00886 * 00887 ELSE IF( IPACK.EQ.1 ) THEN 00888 * 00889 DO 340 J = 1, N 00890 DO 330 I = 1, J 00891 A( I, J ) = SLATM2( M, N, I, J, KL, KU, IDIST, ISEED, 00892 $ D, IGRADE, DL, DR, IPVTNG, IWORK, SPARSE ) 00893 IF( I.NE.J ) 00894 $ A( J, I ) = ZERO 00895 330 CONTINUE 00896 340 CONTINUE 00897 * 00898 ELSE IF( IPACK.EQ.2 ) THEN 00899 * 00900 DO 360 J = 1, N 00901 DO 350 I = 1, J 00902 A( J, I ) = SLATM2( M, N, I, J, KL, KU, IDIST, ISEED, 00903 $ D, IGRADE, DL, DR, IPVTNG, IWORK, SPARSE ) 00904 IF( I.NE.J ) 00905 $ A( I, J ) = ZERO 00906 350 CONTINUE 00907 360 CONTINUE 00908 * 00909 ELSE IF( IPACK.EQ.3 ) THEN 00910 * 00911 ISUB = 0 00912 JSUB = 1 00913 DO 380 J = 1, N 00914 DO 370 I = 1, J 00915 ISUB = ISUB + 1 00916 IF( ISUB.GT.LDA ) THEN 00917 ISUB = 1 00918 JSUB = JSUB + 1 00919 END IF 00920 A( ISUB, JSUB ) = SLATM2( M, N, I, J, KL, KU, IDIST, 00921 $ ISEED, D, IGRADE, DL, DR, IPVTNG, 00922 $ IWORK, SPARSE ) 00923 370 CONTINUE 00924 380 CONTINUE 00925 * 00926 ELSE IF( IPACK.EQ.4 ) THEN 00927 * 00928 IF( ISYM.EQ.0 ) THEN 00929 DO 400 J = 1, N 00930 DO 390 I = 1, J 00931 * 00932 * Compute K = location of (I,J) entry in packed array 00933 * 00934 IF( I.EQ.1 ) THEN 00935 K = J 00936 ELSE 00937 K = N*( N+1 ) / 2 - ( N-I+1 )*( N-I+2 ) / 2 + 00938 $ J - I + 1 00939 END IF 00940 * 00941 * Convert K to (ISUB,JSUB) location 00942 * 00943 JSUB = ( K-1 ) / LDA + 1 00944 ISUB = K - LDA*( JSUB-1 ) 00945 * 00946 A( ISUB, JSUB ) = SLATM2( M, N, I, J, KL, KU, 00947 $ IDIST, ISEED, D, IGRADE, DL, DR, 00948 $ IPVTNG, IWORK, SPARSE ) 00949 390 CONTINUE 00950 400 CONTINUE 00951 ELSE 00952 ISUB = 0 00953 JSUB = 1 00954 DO 420 J = 1, N 00955 DO 410 I = J, M 00956 ISUB = ISUB + 1 00957 IF( ISUB.GT.LDA ) THEN 00958 ISUB = 1 00959 JSUB = JSUB + 1 00960 END IF 00961 A( ISUB, JSUB ) = SLATM2( M, N, I, J, KL, KU, 00962 $ IDIST, ISEED, D, IGRADE, DL, DR, 00963 $ IPVTNG, IWORK, SPARSE ) 00964 410 CONTINUE 00965 420 CONTINUE 00966 END IF 00967 * 00968 ELSE IF( IPACK.EQ.5 ) THEN 00969 * 00970 DO 440 J = 1, N 00971 DO 430 I = J - KUU, J 00972 IF( I.LT.1 ) THEN 00973 A( J-I+1, I+N ) = ZERO 00974 ELSE 00975 A( J-I+1, I ) = SLATM2( M, N, I, J, KL, KU, IDIST, 00976 $ ISEED, D, IGRADE, DL, DR, IPVTNG, 00977 $ IWORK, SPARSE ) 00978 END IF 00979 430 CONTINUE 00980 440 CONTINUE 00981 * 00982 ELSE IF( IPACK.EQ.6 ) THEN 00983 * 00984 DO 460 J = 1, N 00985 DO 450 I = J - KUU, J 00986 A( I-J+KUU+1, J ) = SLATM2( M, N, I, J, KL, KU, IDIST, 00987 $ ISEED, D, IGRADE, DL, DR, IPVTNG, 00988 $ IWORK, SPARSE ) 00989 450 CONTINUE 00990 460 CONTINUE 00991 * 00992 ELSE IF( IPACK.EQ.7 ) THEN 00993 * 00994 IF( ISYM.EQ.0 ) THEN 00995 DO 480 J = 1, N 00996 DO 470 I = J - KUU, J 00997 A( I-J+KUU+1, J ) = SLATM2( M, N, I, J, KL, KU, 00998 $ IDIST, ISEED, D, IGRADE, DL, 00999 $ DR, IPVTNG, IWORK, SPARSE ) 01000 IF( I.LT.1 ) 01001 $ A( J-I+1+KUU, I+N ) = ZERO 01002 IF( I.GE.1 .AND. I.NE.J ) 01003 $ A( J-I+1+KUU, I ) = A( I-J+KUU+1, J ) 01004 470 CONTINUE 01005 480 CONTINUE 01006 ELSE IF( ISYM.EQ.1 ) THEN 01007 DO 500 J = 1, N 01008 DO 490 I = J - KUU, J + KLL 01009 A( I-J+KUU+1, J ) = SLATM2( M, N, I, J, KL, KU, 01010 $ IDIST, ISEED, D, IGRADE, DL, 01011 $ DR, IPVTNG, IWORK, SPARSE ) 01012 490 CONTINUE 01013 500 CONTINUE 01014 END IF 01015 * 01016 END IF 01017 * 01018 END IF 01019 * 01020 * 5) Scaling the norm 01021 * 01022 IF( IPACK.EQ.0 ) THEN 01023 ONORM = SLANGE( 'M', M, N, A, LDA, TEMPA ) 01024 ELSE IF( IPACK.EQ.1 ) THEN 01025 ONORM = SLANSY( 'M', 'U', N, A, LDA, TEMPA ) 01026 ELSE IF( IPACK.EQ.2 ) THEN 01027 ONORM = SLANSY( 'M', 'L', N, A, LDA, TEMPA ) 01028 ELSE IF( IPACK.EQ.3 ) THEN 01029 ONORM = SLANSP( 'M', 'U', N, A, TEMPA ) 01030 ELSE IF( IPACK.EQ.4 ) THEN 01031 ONORM = SLANSP( 'M', 'L', N, A, TEMPA ) 01032 ELSE IF( IPACK.EQ.5 ) THEN 01033 ONORM = SLANSB( 'M', 'L', N, KLL, A, LDA, TEMPA ) 01034 ELSE IF( IPACK.EQ.6 ) THEN 01035 ONORM = SLANSB( 'M', 'U', N, KUU, A, LDA, TEMPA ) 01036 ELSE IF( IPACK.EQ.7 ) THEN 01037 ONORM = SLANGB( 'M', N, KLL, KUU, A, LDA, TEMPA ) 01038 END IF 01039 * 01040 IF( ANORM.GE.ZERO ) THEN 01041 * 01042 IF( ANORM.GT.ZERO .AND. ONORM.EQ.ZERO ) THEN 01043 * 01044 * Desired scaling impossible 01045 * 01046 INFO = 5 01047 RETURN 01048 * 01049 ELSE IF( ( ANORM.GT.ONE .AND. ONORM.LT.ONE ) .OR. 01050 $ ( ANORM.LT.ONE .AND. ONORM.GT.ONE ) ) THEN 01051 * 01052 * Scale carefully to avoid over / underflow 01053 * 01054 IF( IPACK.LE.2 ) THEN 01055 DO 510 J = 1, N 01056 CALL SSCAL( M, ONE / ONORM, A( 1, J ), 1 ) 01057 CALL SSCAL( M, ANORM, A( 1, J ), 1 ) 01058 510 CONTINUE 01059 * 01060 ELSE IF( IPACK.EQ.3 .OR. IPACK.EQ.4 ) THEN 01061 * 01062 CALL SSCAL( N*( N+1 ) / 2, ONE / ONORM, A, 1 ) 01063 CALL SSCAL( N*( N+1 ) / 2, ANORM, A, 1 ) 01064 * 01065 ELSE IF( IPACK.GE.5 ) THEN 01066 * 01067 DO 520 J = 1, N 01068 CALL SSCAL( KLL+KUU+1, ONE / ONORM, A( 1, J ), 1 ) 01069 CALL SSCAL( KLL+KUU+1, ANORM, A( 1, J ), 1 ) 01070 520 CONTINUE 01071 * 01072 END IF 01073 * 01074 ELSE 01075 * 01076 * Scale straightforwardly 01077 * 01078 IF( IPACK.LE.2 ) THEN 01079 DO 530 J = 1, N 01080 CALL SSCAL( M, ANORM / ONORM, A( 1, J ), 1 ) 01081 530 CONTINUE 01082 * 01083 ELSE IF( IPACK.EQ.3 .OR. IPACK.EQ.4 ) THEN 01084 * 01085 CALL SSCAL( N*( N+1 ) / 2, ANORM / ONORM, A, 1 ) 01086 * 01087 ELSE IF( IPACK.GE.5 ) THEN 01088 * 01089 DO 540 J = 1, N 01090 CALL SSCAL( KLL+KUU+1, ANORM / ONORM, A( 1, J ), 1 ) 01091 540 CONTINUE 01092 END IF 01093 * 01094 END IF 01095 * 01096 END IF 01097 * 01098 * End of SLATMR 01099 * 01100 END