|
ScaLAPACK
2.0.2
ScaLAPACK: Scalable Linear Algebra PACKage
|
00001 SUBROUTINE PSMATGEN( ICTXT, AFORM, DIAG, M, N, MB, NB, A, LDA, 00002 $ IAROW, IACOL, ISEED, IROFF, IRNUM, ICOFF, 00003 $ ICNUM, MYROW, MYCOL, NPROW, NPCOL ) 00004 * 00005 * -- ScaLAPACK routine (version 1.7) -- 00006 * University of Tennessee, Knoxville, Oak Ridge National Laboratory, 00007 * and University of California, Berkeley. 00008 * May 1, 1997 00009 * 00010 * .. Scalar Arguments .. 00011 CHARACTER*1 AFORM, DIAG 00012 INTEGER IACOL, IAROW, ICNUM, ICOFF, ICTXT, IRNUM, 00013 $ IROFF, ISEED, LDA, M, MB, MYCOL, MYROW, N, 00014 $ NB, NPCOL, NPROW 00015 * .. 00016 * .. Array Arguments .. 00017 REAL A( LDA, * ) 00018 * .. 00019 * 00020 * Purpose 00021 * ======= 00022 * 00023 * PSMATGEN : Parallel Real Single precision MATrix GENerator. 00024 * Generate (or regenerate) a distributed matrix A (or sub-matrix of A). 00025 * 00026 * Arguments 00027 * ========= 00028 * 00029 * ICTXT (global input) INTEGER 00030 * The BLACS context handle, indicating the global context of 00031 * the operation. The context itself is global. 00032 * 00033 * AFORM (global input) CHARACTER*1 00034 * if AFORM = 'S' : A is returned is a symmetric matrix. 00035 * if AFORM = 'H' : A is returned is a Hermitian matrix. 00036 * if AFORM = 'T' : A is overwritten with the transpose of 00037 * what would normally be generated. 00038 * if AFORM = 'C' : A is overwritten with the conjugate trans- 00039 * pose of what would normally be generated. 00040 * otherwise a random matrix is generated. 00041 * 00042 * DIAG (global input) CHARACTER*1 00043 * if DIAG = 'D' : A is diagonally dominant. 00044 * 00045 * M (global input) INTEGER 00046 * The number of rows in the generated distributed matrix. 00047 * 00048 * N (global input) INTEGER 00049 * The number of columns in the generated distributed 00050 * matrix. 00051 * 00052 * MB (global input) INTEGER 00053 * The row blocking factor of the distributed matrix A. 00054 * 00055 * NB (global input) INTEGER 00056 * The column blocking factor of the distributed matrix A. 00057 * 00058 * A (local output) REAL, pointer into the local memory 00059 * to an array of dimension ( LDA, * ) containing the local 00060 * pieces of the distributed matrix. 00061 * 00062 * LDA (local input) INTEGER 00063 * The leading dimension of the array containing the local 00064 * pieces of the distributed matrix A. 00065 * 00066 * IAROW (global input) INTEGER 00067 * The row processor coordinate which holds the first block 00068 * of the distributed matrix A. 00069 * 00070 * IACOL (global input) INTEGER 00071 * The column processor coordinate which holds the first 00072 * block of the distributed matrix A. 00073 * 00074 * ISEED (global input) INTEGER 00075 * The seed number to generate the distributed matrix A. 00076 * 00077 * IROFF (local input) INTEGER 00078 * The number of local rows of A that have already been 00079 * generated. It should be a multiple of MB. 00080 * 00081 * IRNUM (local input) INTEGER 00082 * The number of local rows to be generated. 00083 * 00084 * ICOFF (local input) INTEGER 00085 * The number of local columns of A that have already been 00086 * generated. It should be a multiple of NB. 00087 * 00088 * ICNUM (local input) INTEGER 00089 * The number of local columns to be generated. 00090 * 00091 * MYROW (local input) INTEGER 00092 * The row process coordinate of the calling process. 00093 * 00094 * MYCOL (local input) INTEGER 00095 * The column process coordinate of the calling process. 00096 * 00097 * NPROW (global input) INTEGER 00098 * The number of process rows in the grid. 00099 * 00100 * NPCOL (global input) INTEGER 00101 * The number of process columns in the grid. 00102 * 00103 * Notes 00104 * ===== 00105 * 00106 * The code is originally developed by David Walker, ORNL, 00107 * and modified by Jaeyoung Choi, ORNL. 00108 * 00109 * Reference: G. Fox et al. 00110 * Section 12.3 of "Solving problems on concurrent processors Vol. I" 00111 * 00112 * ===================================================================== 00113 * 00114 * .. Parameters .. 00115 INTEGER MULT0, MULT1, IADD0, IADD1 00116 PARAMETER ( MULT0=20077, MULT1=16838, IADD0=12345, 00117 $ IADD1=0 ) 00118 REAL ONE, TWO 00119 PARAMETER ( ONE = 1.0E+0, TWO = 2.0E+0 ) 00120 * .. 00121 * .. Local Scalars .. 00122 LOGICAL SYMM, HERM, TRAN 00123 INTEGER I, IC, IK, INFO, IOFFC, IOFFR, IR, J, JK, 00124 $ JUMP1, JUMP2, JUMP3, JUMP4, JUMP5, JUMP6, 00125 $ JUMP7, MAXMN, MEND, MOFF, MP, MRCOL, MRROW, 00126 $ NEND, NOFF, NPMB, NQ, NQNB 00127 * .. 00128 * .. Local Arrays .. 00129 INTEGER IADD(2), IA1(2), IA2(2), IA3(2), IA4(2), 00130 $ IA5(2), IB1(2), IB2(2), IB3(2), IC1(2), IC2(2), 00131 $ IC3(2), IC4(2), IC5(2), IRAN1(2), IRAN2(2), 00132 $ IRAN3(2), IRAN4(2), ITMP1(2), ITMP2(2), 00133 $ ITMP3(2), JSEED(2), MULT(2) 00134 * .. 00135 * .. External Subroutines .. 00136 EXTERNAL JUMPIT, PXERBLA, SETRAN, XJUMPM 00137 * .. 00138 * .. Intrinsic Functions .. 00139 INTRINSIC ABS, MAX, MOD 00140 * .. 00141 * .. External Functions .. 00142 LOGICAL LSAME 00143 INTEGER ICEIL, NUMROC 00144 REAL PSRAND 00145 EXTERNAL ICEIL, NUMROC, LSAME, PSRAND 00146 * .. 00147 * .. Executable Statements .. 00148 * 00149 * Test the input arguments 00150 * 00151 MP = NUMROC( M, MB, MYROW, IAROW, NPROW ) 00152 NQ = NUMROC( N, NB, MYCOL, IACOL, NPCOL ) 00153 SYMM = LSAME( AFORM, 'S' ) 00154 HERM = LSAME( AFORM, 'H' ) 00155 TRAN = LSAME( AFORM, 'T' ) 00156 * 00157 INFO = 0 00158 IF( .NOT.LSAME( DIAG, 'D' ) .AND. 00159 $ .NOT.LSAME( DIAG, 'N' ) ) THEN 00160 INFO = 3 00161 ELSE IF( SYMM.OR.HERM ) THEN 00162 IF( M.NE.N ) THEN 00163 INFO = 5 00164 ELSE IF( MB.NE.NB ) THEN 00165 INFO = 7 00166 END IF 00167 ELSE IF( M.LT.0 ) THEN 00168 INFO = 4 00169 ELSE IF( N.LT.0 ) THEN 00170 INFO = 5 00171 ELSE IF( MB.LT.1 ) THEN 00172 INFO = 6 00173 ELSE IF( NB.LT.1 ) THEN 00174 INFO = 7 00175 ELSE IF( LDA.LT.0 ) THEN 00176 INFO = 9 00177 ELSE IF( ( IAROW.LT.0 ).OR.( IAROW.GE.NPROW ) ) THEN 00178 INFO = 10 00179 ELSE IF( ( IACOL.LT.0 ).OR.( IACOL.GE.NPCOL ) ) THEN 00180 INFO = 11 00181 ELSE IF( MOD(IROFF,MB).GT.0 ) THEN 00182 INFO = 13 00183 ELSE IF( IRNUM.GT.(MP-IROFF) ) THEN 00184 INFO = 14 00185 ELSE IF( MOD(ICOFF,NB).GT.0 ) THEN 00186 INFO = 15 00187 ELSE IF( ICNUM.GT.(NQ-ICOFF) ) THEN 00188 INFO = 16 00189 ELSE IF( ( MYROW.LT.0 ).OR.( MYROW.GE.NPROW ) ) THEN 00190 INFO = 17 00191 ELSE IF( ( MYCOL.LT.0 ).OR.( MYCOL.GE.NPCOL ) ) THEN 00192 INFO = 18 00193 END IF 00194 IF( INFO.NE.0 ) THEN 00195 CALL PXERBLA( ICTXT, 'PSMATGEN', INFO ) 00196 RETURN 00197 END IF 00198 * 00199 MRROW = MOD( NPROW+MYROW-IAROW, NPROW ) 00200 MRCOL = MOD( NPCOL+MYCOL-IACOL, NPCOL ) 00201 NPMB = NPROW * MB 00202 NQNB = NPCOL * NB 00203 MOFF = IROFF / MB 00204 NOFF = ICOFF / NB 00205 MEND = ICEIL(IRNUM, MB) + MOFF 00206 NEND = ICEIL(ICNUM, NB) + NOFF 00207 * 00208 MULT(1) = MULT0 00209 MULT(2) = MULT1 00210 IADD(1) = IADD0 00211 IADD(2) = IADD1 00212 JSEED(1) = ISEED 00213 JSEED(2) = 0 00214 * 00215 * Symmetric or Hermitian matrix will be generated. 00216 * 00217 IF( SYMM.OR.HERM ) THEN 00218 * 00219 * First, generate the lower triangular part (with diagonal block) 00220 * 00221 JUMP1 = 1 00222 JUMP2 = NPMB 00223 JUMP3 = M 00224 JUMP4 = NQNB 00225 JUMP5 = NB 00226 JUMP6 = MRCOL 00227 JUMP7 = MB*MRROW 00228 * 00229 CALL XJUMPM( JUMP1, MULT, IADD, JSEED, IRAN1, IA1, IC1 ) 00230 CALL XJUMPM( JUMP2, MULT, IADD, IRAN1, ITMP1, IA2, IC2 ) 00231 CALL XJUMPM( JUMP3, MULT, IADD, IRAN1, ITMP1, IA3, IC3 ) 00232 CALL XJUMPM( JUMP4, IA3, IC3, IRAN1, ITMP1, IA4, IC4 ) 00233 CALL XJUMPM( JUMP5, IA3, IC3, IRAN1, ITMP1, IA5, IC5 ) 00234 CALL XJUMPM( JUMP6, IA5, IC5, IRAN1, ITMP3, ITMP1, ITMP2 ) 00235 CALL XJUMPM( JUMP7, MULT, IADD, ITMP3, IRAN1, ITMP1, ITMP2 ) 00236 CALL XJUMPM( NOFF, IA4, IC4, IRAN1, ITMP1, ITMP2, ITMP3 ) 00237 CALL XJUMPM( MOFF, IA2, IC2, ITMP1, IRAN1, ITMP2, ITMP3 ) 00238 CALL SETRAN( IRAN1, IA1, IC1 ) 00239 * 00240 DO 10 I = 1, 2 00241 IB1(I) = IRAN1(I) 00242 IB2(I) = IRAN1(I) 00243 IB3(I) = IRAN1(I) 00244 10 CONTINUE 00245 * 00246 JK = 1 00247 DO 80 IC = NOFF+1, NEND 00248 IOFFC = ((IC-1)*NPCOL+MRCOL) * NB 00249 DO 70 I = 1, NB 00250 IF( JK .GT. ICNUM ) GO TO 90 00251 * 00252 IK = 1 00253 DO 50 IR = MOFF+1, MEND 00254 IOFFR = ((IR-1)*NPROW+MRROW) * MB 00255 * 00256 IF( IOFFR .GT. IOFFC ) THEN 00257 DO 20 J = 1, MB 00258 IF( IK .GT. IRNUM ) GO TO 60 00259 A(IK,JK) = ONE - TWO*PSRAND(0) 00260 IK = IK + 1 00261 20 CONTINUE 00262 * 00263 ELSE IF( IOFFC .EQ. IOFFR ) THEN 00264 IK = IK + I - 1 00265 IF( IK .GT. IRNUM ) GO TO 60 00266 DO 30 J = 1, I-1 00267 A(IK,JK) = ONE - TWO*PSRAND(0) 00268 30 CONTINUE 00269 A(IK,JK) = ONE - TWO*PSRAND(0) 00270 DO 40 J = 1, MB-I 00271 IF( IK+J .GT. IRNUM ) GO TO 60 00272 A(IK+J,JK) = ONE - TWO*PSRAND(0) 00273 A(IK,JK+J) = A(IK+J,JK) 00274 40 CONTINUE 00275 IK = IK + MB - I + 1 00276 ELSE 00277 IK = IK + MB 00278 END IF 00279 * 00280 CALL JUMPIT( IA2, IC2, IB1, IRAN2 ) 00281 IB1(1) = IRAN2(1) 00282 IB1(2) = IRAN2(2) 00283 50 CONTINUE 00284 * 00285 60 CONTINUE 00286 JK = JK + 1 00287 CALL JUMPIT( IA3, IC3, IB2, IRAN3 ) 00288 IB1(1) = IRAN3(1) 00289 IB1(2) = IRAN3(2) 00290 IB2(1) = IRAN3(1) 00291 IB2(2) = IRAN3(2) 00292 70 CONTINUE 00293 * 00294 CALL JUMPIT( IA4, IC4, IB3, IRAN4 ) 00295 IB1(1) = IRAN4(1) 00296 IB1(2) = IRAN4(2) 00297 IB2(1) = IRAN4(1) 00298 IB2(2) = IRAN4(2) 00299 IB3(1) = IRAN4(1) 00300 IB3(2) = IRAN4(2) 00301 80 CONTINUE 00302 * 00303 * Next, generate the upper triangular part. 00304 * 00305 90 CONTINUE 00306 MULT(1) = MULT0 00307 MULT(2) = MULT1 00308 IADD(1) = IADD0 00309 IADD(2) = IADD1 00310 JSEED(1) = ISEED 00311 JSEED(2) = 0 00312 * 00313 JUMP1 = 1 00314 JUMP2 = NQNB 00315 JUMP3 = N 00316 JUMP4 = NPMB 00317 JUMP5 = MB 00318 JUMP6 = MRROW 00319 JUMP7 = NB*MRCOL 00320 * 00321 CALL XJUMPM( JUMP1, MULT, IADD, JSEED, IRAN1, IA1, IC1 ) 00322 CALL XJUMPM( JUMP2, MULT, IADD, IRAN1, ITMP1, IA2, IC2 ) 00323 CALL XJUMPM( JUMP3, MULT, IADD, IRAN1, ITMP1, IA3, IC3 ) 00324 CALL XJUMPM( JUMP4, IA3, IC3, IRAN1, ITMP1, IA4, IC4 ) 00325 CALL XJUMPM( JUMP5, IA3, IC3, IRAN1, ITMP1, IA5, IC5 ) 00326 CALL XJUMPM( JUMP6, IA5, IC5, IRAN1, ITMP3, ITMP1, ITMP2 ) 00327 CALL XJUMPM( JUMP7, MULT, IADD, ITMP3, IRAN1, ITMP1, ITMP2 ) 00328 CALL XJUMPM( MOFF, IA4, IC4, IRAN1, ITMP1, ITMP2, ITMP3 ) 00329 CALL XJUMPM( NOFF, IA2, IC2, ITMP1, IRAN1, ITMP2, ITMP3 ) 00330 CALL SETRAN( IRAN1, IA1, IC1 ) 00331 * 00332 DO 100 I = 1, 2 00333 IB1(I) = IRAN1(I) 00334 IB2(I) = IRAN1(I) 00335 IB3(I) = IRAN1(I) 00336 100 CONTINUE 00337 * 00338 IK = 1 00339 DO 150 IR = MOFF+1, MEND 00340 IOFFR = ((IR-1)*NPROW+MRROW) * MB 00341 DO 140 J = 1, MB 00342 IF( IK .GT. IRNUM ) GO TO 160 00343 JK = 1 00344 DO 120 IC = NOFF+1, NEND 00345 IOFFC = ((IC-1)*NPCOL+MRCOL) * NB 00346 IF( IOFFC .GT. IOFFR ) THEN 00347 DO 110 I = 1, NB 00348 IF( JK .GT. ICNUM ) GO TO 130 00349 A(IK,JK) = ONE - TWO*PSRAND(0) 00350 JK = JK + 1 00351 110 CONTINUE 00352 ELSE 00353 JK = JK + NB 00354 END IF 00355 CALL JUMPIT( IA2, IC2, IB1, IRAN2 ) 00356 IB1(1) = IRAN2(1) 00357 IB1(2) = IRAN2(2) 00358 120 CONTINUE 00359 * 00360 130 CONTINUE 00361 IK = IK + 1 00362 CALL JUMPIT( IA3, IC3, IB2, IRAN3 ) 00363 IB1(1) = IRAN3(1) 00364 IB1(2) = IRAN3(2) 00365 IB2(1) = IRAN3(1) 00366 IB2(2) = IRAN3(2) 00367 140 CONTINUE 00368 * 00369 CALL JUMPIT( IA4, IC4, IB3, IRAN4 ) 00370 IB1(1) = IRAN4(1) 00371 IB1(2) = IRAN4(2) 00372 IB2(1) = IRAN4(1) 00373 IB2(2) = IRAN4(2) 00374 IB3(1) = IRAN4(1) 00375 IB3(2) = IRAN4(2) 00376 150 CONTINUE 00377 160 CONTINUE 00378 * 00379 * (Conjugate) Transposed matrix A will be generated. 00380 * 00381 ELSE IF( TRAN .OR. LSAME( AFORM, 'C' ) ) THEN 00382 * 00383 JUMP1 = 1 00384 JUMP2 = NQNB 00385 JUMP3 = N 00386 JUMP4 = NPMB 00387 JUMP5 = MB 00388 JUMP6 = MRROW 00389 JUMP7 = NB*MRCOL 00390 * 00391 CALL XJUMPM( JUMP1, MULT, IADD, JSEED, IRAN1, IA1, IC1 ) 00392 CALL XJUMPM( JUMP2, MULT, IADD, IRAN1, ITMP1, IA2, IC2 ) 00393 CALL XJUMPM( JUMP3, MULT, IADD, IRAN1, ITMP1, IA3, IC3 ) 00394 CALL XJUMPM( JUMP4, IA3, IC3, IRAN1, ITMP1, IA4, IC4 ) 00395 CALL XJUMPM( JUMP5, IA3, IC3, IRAN1, ITMP1, IA5, IC5 ) 00396 CALL XJUMPM( JUMP6, IA5, IC5, IRAN1, ITMP3, ITMP1, ITMP2 ) 00397 CALL XJUMPM( JUMP7, MULT, IADD, ITMP3, IRAN1, ITMP1, ITMP2 ) 00398 CALL XJUMPM( MOFF, IA4, IC4, IRAN1, ITMP1, ITMP2, ITMP3 ) 00399 CALL XJUMPM( NOFF, IA2, IC2, ITMP1, IRAN1, ITMP2, ITMP3 ) 00400 CALL SETRAN( IRAN1, IA1, IC1 ) 00401 * 00402 DO 170 I = 1, 2 00403 IB1(I) = IRAN1(I) 00404 IB2(I) = IRAN1(I) 00405 IB3(I) = IRAN1(I) 00406 170 CONTINUE 00407 * 00408 IK = 1 00409 DO 220 IR = MOFF+1, MEND 00410 IOFFR = ((IR-1)*NPROW+MRROW) * MB 00411 DO 210 J = 1, MB 00412 IF( IK .GT. IRNUM ) GO TO 230 00413 JK = 1 00414 DO 190 IC = NOFF+1, NEND 00415 IOFFC = ((IC-1)*NPCOL+MRCOL) * NB 00416 DO 180 I = 1, NB 00417 IF( JK .GT. ICNUM ) GO TO 200 00418 A(IK,JK) = ONE - TWO*PSRAND(0) 00419 JK = JK + 1 00420 180 CONTINUE 00421 CALL JUMPIT( IA2, IC2, IB1, IRAN2 ) 00422 IB1(1) = IRAN2(1) 00423 IB1(2) = IRAN2(2) 00424 190 CONTINUE 00425 * 00426 200 CONTINUE 00427 IK = IK + 1 00428 CALL JUMPIT( IA3, IC3, IB2, IRAN3 ) 00429 IB1(1) = IRAN3(1) 00430 IB1(2) = IRAN3(2) 00431 IB2(1) = IRAN3(1) 00432 IB2(2) = IRAN3(2) 00433 210 CONTINUE 00434 * 00435 CALL JUMPIT( IA4, IC4, IB3, IRAN4 ) 00436 IB1(1) = IRAN4(1) 00437 IB1(2) = IRAN4(2) 00438 IB2(1) = IRAN4(1) 00439 IB2(2) = IRAN4(2) 00440 IB3(1) = IRAN4(1) 00441 IB3(2) = IRAN4(2) 00442 220 CONTINUE 00443 230 CONTINUE 00444 * 00445 * A random matrix is generated. 00446 * 00447 ELSE 00448 * 00449 JUMP1 = 1 00450 JUMP2 = NPMB 00451 JUMP3 = M 00452 JUMP4 = NQNB 00453 JUMP5 = NB 00454 JUMP6 = MRCOL 00455 JUMP7 = MB*MRROW 00456 * 00457 CALL XJUMPM( JUMP1, MULT, IADD, JSEED, IRAN1, IA1, IC1 ) 00458 CALL XJUMPM( JUMP2, MULT, IADD, IRAN1, ITMP1, IA2, IC2 ) 00459 CALL XJUMPM( JUMP3, MULT, IADD, IRAN1, ITMP1, IA3, IC3 ) 00460 CALL XJUMPM( JUMP4, IA3, IC3, IRAN1, ITMP1, IA4, IC4 ) 00461 CALL XJUMPM( JUMP5, IA3, IC3, IRAN1, ITMP1, IA5, IC5 ) 00462 CALL XJUMPM( JUMP6, IA5, IC5, IRAN1, ITMP3, ITMP1, ITMP2 ) 00463 CALL XJUMPM( JUMP7, MULT, IADD, ITMP3, IRAN1, ITMP1, ITMP2 ) 00464 CALL XJUMPM( NOFF, IA4, IC4, IRAN1, ITMP1, ITMP2, ITMP3 ) 00465 CALL XJUMPM( MOFF, IA2, IC2, ITMP1, IRAN1, ITMP2, ITMP3 ) 00466 CALL SETRAN( IRAN1, IA1, IC1 ) 00467 * 00468 DO 240 I = 1, 2 00469 IB1(I) = IRAN1(I) 00470 IB2(I) = IRAN1(I) 00471 IB3(I) = IRAN1(I) 00472 240 CONTINUE 00473 * 00474 JK = 1 00475 DO 290 IC = NOFF+1, NEND 00476 IOFFC = ((IC-1)*NPCOL+MRCOL) * NB 00477 DO 280 I = 1, NB 00478 IF( JK .GT. ICNUM ) GO TO 300 00479 IK = 1 00480 DO 260 IR = MOFF+1, MEND 00481 IOFFR = ((IR-1)*NPROW+MRROW) * MB 00482 DO 250 J = 1, MB 00483 IF( IK .GT. IRNUM ) GO TO 270 00484 A(IK,JK) = ONE - TWO*PSRAND(0) 00485 IK = IK + 1 00486 250 CONTINUE 00487 CALL JUMPIT( IA2, IC2, IB1, IRAN2 ) 00488 IB1(1) = IRAN2(1) 00489 IB1(2) = IRAN2(2) 00490 260 CONTINUE 00491 * 00492 270 CONTINUE 00493 JK = JK + 1 00494 CALL JUMPIT( IA3, IC3, IB2, IRAN3 ) 00495 IB1(1) = IRAN3(1) 00496 IB1(2) = IRAN3(2) 00497 IB2(1) = IRAN3(1) 00498 IB2(2) = IRAN3(2) 00499 280 CONTINUE 00500 * 00501 CALL JUMPIT( IA4, IC4, IB3, IRAN4 ) 00502 IB1(1) = IRAN4(1) 00503 IB1(2) = IRAN4(2) 00504 IB2(1) = IRAN4(1) 00505 IB2(2) = IRAN4(2) 00506 IB3(1) = IRAN4(1) 00507 IB3(2) = IRAN4(2) 00508 290 CONTINUE 00509 300 CONTINUE 00510 END IF 00511 * 00512 * Diagonally dominant matrix will be generated. 00513 * 00514 IF( LSAME( DIAG, 'D' ) ) THEN 00515 IF( MB.NE.NB ) THEN 00516 WRITE(*,*) 'Diagonally dominant matrices with rowNB not'// 00517 $ ' equal colNB is not supported!' 00518 RETURN 00519 END IF 00520 * 00521 MAXMN = MAX(M, N) 00522 JK = 1 00523 DO 340 IC = NOFF+1, NEND 00524 IOFFC = ((IC-1)*NPCOL+MRCOL) * NB 00525 IK = 1 00526 DO 320 IR = MOFF+1, MEND 00527 IOFFR = ((IR-1)*NPROW+MRROW) * MB 00528 IF( IOFFC.EQ.IOFFR ) THEN 00529 DO 310 J = 0, MB-1 00530 IF( IK .GT. IRNUM ) GO TO 330 00531 A(IK,JK+J) = ABS(A(IK,JK+J)) + MAXMN 00532 IK = IK + 1 00533 310 CONTINUE 00534 ELSE 00535 IK = IK + MB 00536 END IF 00537 320 CONTINUE 00538 330 CONTINUE 00539 JK = JK + NB 00540 340 CONTINUE 00541 END IF 00542 * 00543 RETURN 00544 * 00545 * End of PSMATGEN 00546 * 00547 END