|
ScaLAPACK
2.0.2
ScaLAPACK: Scalable Linear Algebra PACKage
|
00001 SUBROUTINE PDDTINFO( SUMMRY, NOUT, TRANS, NMAT, NVAL, LDNVAL, NBW, 00002 $ BWLVAL, BWUVAL, LDBWVAL, NNB, NBVAL, LDNBVAL, 00003 $ NNR, NRVAL, LDNRVAL, NNBR, NBRVAL, LDNBRVAL, 00004 $ NGRIDS, PVAL, LDPVAL, QVAL, LDQVAL, THRESH, 00005 $ WORK, IAM, NPROCS ) 00006 * 00007 * 00008 * 00009 * -- ScaLAPACK routine (version 1.7) -- 00010 * University of Tennessee, Knoxville, Oak Ridge National Laboratory, 00011 * and University of California, Berkeley. 00012 * November 15, 1997 00013 * 00014 * .. Scalar Arguments .. 00015 CHARACTER TRANS 00016 CHARACTER*(*) SUMMRY 00017 INTEGER IAM, 00018 $ LDBWVAL, LDNBRVAL, LDNBVAL, LDNRVAL, LDNVAL, 00019 $ LDPVAL, LDQVAL, NGRIDS, NMAT, NNB, NNBR, NBW, 00020 $ NPROCS, NNR, NOUT 00021 REAL THRESH 00022 * .. 00023 * .. Array Arguments .. 00024 INTEGER NBRVAL( LDNBRVAL ), NBVAL( LDNBVAL ), 00025 $ NRVAL( LDNRVAL ), NVAL( LDNVAL ), 00026 $ BWLVAL( LDBWVAL),BWUVAL( LDBWVAL), 00027 $ PVAL( LDPVAL ), QVAL(LDQVAL), WORK( * ) 00028 * .. 00029 * 00030 * Purpose 00031 * ======= 00032 * 00033 * PDDTINFO get needed startup information for band factorization 00034 * and transmits it to all processes. 00035 * 00036 * Arguments 00037 * ========= 00038 * 00039 * SUMMRY (global output) CHARACTER*(*) 00040 * Name of output (summary) file (if any). Only defined for 00041 * process 0. 00042 * 00043 * NOUT (global output) INTEGER 00044 * The unit number for output file. NOUT = 6, ouput to screen, 00045 * NOUT = 0, output to stderr. Only defined for process 0. 00046 * 00047 * 00048 * NMAT (global output) INTEGER 00049 * The number of different values that can be used for N. 00050 * 00051 * NVAL (global output) INTEGER array, dimension (LDNVAL) 00052 * The values of N (number of columns in matrix) to run the 00053 * code with. 00054 * 00055 * NBW (global output) INTEGER 00056 * The number of different values that can be used for @bw@. 00057 * BWLVAL (global output) INTEGER array, dimension (LDNVAL) 00058 * The values of BWL (number of subdiagonals in matrix) to run 00059 * the code with. 00060 * BWUVAL (global output) INTEGER array, dimension (LDNVAL) 00061 * The values of BW (number of supdiagonals in matrix) to run 00062 * the code with. 00063 * 00064 * LDNVAL (global input) INTEGER 00065 * The maximum number of different values that can be used for 00066 * N, LDNVAL > = NMAT. 00067 * 00068 * NNB (global output) INTEGER 00069 * The number of different values that can be used for NB. 00070 * 00071 * NBVAL (global output) INTEGER array, dimension (LDNBVAL) 00072 * The values of NB (blocksize) to run the code with. 00073 * 00074 * LDNBVAL (global input) INTEGER 00075 * The maximum number of different values that can be used for 00076 * NB, LDNBVAL >= NNB. 00077 * 00078 * NNR (global output) INTEGER 00079 * The number of different values that can be used for NRHS. 00080 * 00081 * NRVAL (global output) INTEGER array, dimension(LDNRVAL) 00082 * The values of NRHS (# of Right Hand Sides) to run the code 00083 * with. 00084 * 00085 * LDNRVAL (global input) INTEGER 00086 * The maximum number of different values that can be used for 00087 * NRHS, LDNRVAL >= NNR. 00088 * 00089 * NNBR (global output) INTEGER 00090 * The number of different values that can be used for NBRHS. 00091 * 00092 * NBRVAL (global output) INTEGER array, dimension (LDNBRVAL) 00093 * The values of NBRHS (RHS blocksize) to run the code with. 00094 * 00095 * LDNBRVAL (global input) INTEGER 00096 * The maximum number of different values that can be used for 00097 * NBRHS, LDNBRVAL >= NBRVAL. 00098 * 00099 * NGRIDS (global output) INTEGER 00100 * The number of different values that can be used for P & Q. 00101 * 00102 * PVAL (global output) INTEGER array, dimension (LDPVAL) 00103 * Not used (will be returned as all 1s) since proc grid is 1D 00104 * 00105 * LDPVAL (global input) INTEGER 00106 * The maximum number of different values that can be used for 00107 * P, LDPVAL >= NGRIDS. 00108 * 00109 * QVAL (global output) INTEGER array, dimension (LDQVAL) 00110 * The values of Q (number of process columns) to run the code 00111 * with. 00112 * 00113 * LDQVAL (global input) INTEGER 00114 * The maximum number of different values that can be used for 00115 * Q, LDQVAL >= NGRIDS. 00116 * 00117 * THRESH (global output) REAL 00118 * Indicates what error checks shall be run and printed out: 00119 * = 0 : Perform no error checking 00120 * > 0 : report all residuals greater than THRESH, perform 00121 * factor check only if solve check fails 00122 * 00123 * WORK (local workspace) INTEGER array of dimension >= 00124 * MAX( 8, LDNVAL+2*LDNBVAL+LDNRVAL+LDNBRVAL+LDPVAL+LDQVAL 00125 * $ +3*LDNVAL) 00126 * Used to pack input arrays in order to send info in one 00127 * message. 00128 * 00129 * IAM (local input) INTEGER 00130 * My process number. 00131 * 00132 * NPROCS (global input) INTEGER 00133 * The total number of processes. 00134 * 00135 * ====================================================================== 00136 * 00137 * Note: For packing the information we assumed that the length in bytes 00138 * ===== of an integer is equal to the length in bytes of a real single 00139 * precision. 00140 * 00141 * ===================================================================== 00142 * 00143 * Code Developer: Andrew J. Cleary, University of Tennessee. 00144 * Current address: Lawrence Livermore National Labs. 00145 * This version released: August, 2001. 00146 * 00147 * ====================================================================== 00148 * 00149 * .. Parameters .. 00150 INTEGER NIN 00151 PARAMETER ( NIN = 11 ) 00152 * .. 00153 * .. Local Scalars .. 00154 INTEGER I, ICTXT 00155 CHARACTER*79 USRINFO 00156 DOUBLE PRECISION EPS 00157 * .. 00158 * .. External Subroutines .. 00159 EXTERNAL BLACS_ABORT, BLACS_GET, BLACS_GRIDEXIT, 00160 $ BLACS_GRIDINIT, BLACS_SETUP, ICOPY, IGEBR2D, 00161 $ IGEBS2D, SGEBR2D, SGEBS2D 00162 * .. 00163 * .. External Functions .. 00164 LOGICAL LSAME 00165 DOUBLE PRECISION PDLAMCH 00166 EXTERNAL LSAME, PDLAMCH 00167 * .. 00168 * .. Intrinsic Functions .. 00169 INTRINSIC MAX, MIN 00170 * .. 00171 * .. Executable Statements .. 00172 * 00173 * Process 0 reads the input data, broadcasts to other processes and 00174 * writes needed information to NOUT 00175 * 00176 IF( IAM.EQ.0 ) THEN 00177 * 00178 * Open file and skip data file header 00179 * 00180 OPEN( NIN, FILE = 'BLU.dat', STATUS = 'OLD' ) 00181 READ( NIN, FMT = * ) SUMMRY 00182 SUMMRY = ' ' 00183 * 00184 * Read in user-supplied info about machine type, compiler, etc. 00185 * 00186 READ( NIN, FMT = 9999 ) USRINFO 00187 * 00188 * Read name and unit number for summary output file 00189 * 00190 READ( NIN, FMT = * ) SUMMRY 00191 READ( NIN, FMT = * ) NOUT 00192 IF( NOUT.NE.0 .AND. NOUT.NE.6 ) 00193 $ OPEN( NOUT, FILE = SUMMRY, STATUS = 'UNKNOWN' ) 00194 * 00195 * Read and check the parameter values for the tests. 00196 * 00197 * Get TRANS 00198 * 00199 READ( NIN, FMT = * ) TRANS 00200 * 00201 * 00202 * Get number of matrices and their dimensions 00203 * 00204 READ( NIN, FMT = * ) NMAT 00205 IF( NMAT.LT.1 .OR. NMAT.GT.LDNVAL ) THEN 00206 WRITE( NOUT, FMT = 9994 ) 'N', LDNVAL 00207 GO TO 20 00208 END IF 00209 READ( NIN, FMT = * ) ( NVAL( I ), I = 1, NMAT ) 00210 * 00211 * Get bandwidths 00212 * 00213 READ( NIN, FMT = * ) NBW 00214 NBW = 1 00215 IF( NBW.LT.1 .OR. NBW.GT.LDBWVAL ) THEN 00216 WRITE( NOUT, FMT = 9994 ) 'BW', LDBWVAL 00217 GO TO 20 00218 END IF 00219 READ( NIN, FMT = * ) ( BWLVAL( I ), I = 1, NBW ) 00220 READ( NIN, FMT = * ) ( BWUVAL( I ), I = 1, NBW ) 00221 * 00222 * Get values of NB 00223 * 00224 READ( NIN, FMT = * ) NNB 00225 IF( NNB.LT.1 .OR. NNB.GT.LDNBVAL ) THEN 00226 WRITE( NOUT, FMT = 9994 ) 'NB', LDNBVAL 00227 GO TO 20 00228 END IF 00229 READ( NIN, FMT = * ) ( NBVAL( I ), I = 1, NNB ) 00230 * 00231 * Get values of NRHS 00232 * 00233 READ( NIN, FMT = * ) NNR 00234 IF( NNR.LT.1 .OR. NNR.GT.LDNRVAL ) THEN 00235 WRITE( NOUT, FMT = 9994 ) 'NRHS', LDNRVAL 00236 GO TO 20 00237 END IF 00238 READ( NIN, FMT = * ) ( NRVAL( I ), I = 1, NNR ) 00239 * 00240 * Get values of NBRHS 00241 * 00242 READ( NIN, FMT = * ) NNBR 00243 IF( NNBR.LT.1 .OR. NNBR.GT.LDNBRVAL ) THEN 00244 WRITE( NOUT, FMT = 9994 ) 'NBRHS', LDNBRVAL 00245 GO TO 20 00246 END IF 00247 READ( NIN, FMT = * ) ( NBRVAL( I ), I = 1, NNBR ) 00248 * 00249 * Get number of grids 00250 * 00251 READ( NIN, FMT = * ) NGRIDS 00252 IF( NGRIDS.LT.1 .OR. NGRIDS.GT.LDPVAL ) THEN 00253 WRITE( NOUT, FMT = 9994 ) 'Grids', LDPVAL 00254 GO TO 20 00255 ELSE IF( NGRIDS.GT.LDQVAL ) THEN 00256 WRITE( NOUT, FMT = 9994 ) 'Grids', LDQVAL 00257 GO TO 20 00258 END IF 00259 * 00260 * Processor grid must be 1D so set PVAL to 1 00261 DO 8738 I = 1, NGRIDS 00262 PVAL( I ) = 1 00263 8738 CONTINUE 00264 * 00265 * Get values of Q 00266 * 00267 READ( NIN, FMT = * ) ( QVAL( I ), I = 1, NGRIDS ) 00268 * 00269 * Get level of checking 00270 * 00271 READ( NIN, FMT = * ) THRESH 00272 * 00273 * Close input file 00274 * 00275 CLOSE( NIN ) 00276 * 00277 * For pvm only: if virtual machine not set up, allocate it and 00278 * spawn the correct number of processes. 00279 * 00280 IF( NPROCS.LT.1 ) THEN 00281 NPROCS = 0 00282 DO 10 I = 1, NGRIDS 00283 NPROCS = MAX( NPROCS, PVAL( I )*QVAL( I ) ) 00284 10 CONTINUE 00285 CALL BLACS_SETUP( IAM, NPROCS ) 00286 END IF 00287 * 00288 * Temporarily define blacs grid to include all processes so 00289 * information can be broadcast to all processes. 00290 * 00291 CALL BLACS_GET( -1, 0, ICTXT ) 00292 CALL BLACS_GRIDINIT( ICTXT, 'Row-major', 1, NPROCS ) 00293 * 00294 * Compute machine epsilon 00295 * 00296 EPS = PDLAMCH( ICTXT, 'eps' ) 00297 * 00298 * Pack information arrays and broadcast 00299 * 00300 CALL SGEBS2D( ICTXT, 'All', ' ', 1, 1, THRESH, 1 ) 00301 I = 1 00302 WORK( I ) = NMAT 00303 I = I+1 00304 WORK( I ) = NBW 00305 I = I+1 00306 WORK( I ) = NNB 00307 I = I+1 00308 WORK( I ) = NNR 00309 I = I+1 00310 WORK( I ) = NNBR 00311 I = I+1 00312 WORK( I ) = NGRIDS 00313 I = I+1 00314 IF( LSAME( TRANS, 'N' ) ) THEN 00315 WORK( I ) = 1 00316 ELSE 00317 TRANS = 'T' 00318 WORK( I ) = 2 00319 END IF 00320 I = I+1 00321 * Send number of elements to be sent 00322 CALL IGEBS2D( ICTXT, 'All', ' ', 1, 1, I-1, 1 ) 00323 * Send elements 00324 CALL IGEBS2D( ICTXT, 'All', ' ', I-1, 1, WORK, I-1 ) 00325 * 00326 I = 1 00327 CALL ICOPY( NMAT, NVAL, 1, WORK( I ), 1 ) 00328 I = I + NMAT 00329 CALL ICOPY( NBW, BWLVAL, 1, WORK( I ), 1 ) 00330 I = I + NBW 00331 CALL ICOPY( NBW, BWUVAL, 1, WORK( I ), 1 ) 00332 I = I + NBW 00333 CALL ICOPY( NNB, NBVAL, 1, WORK( I ), 1 ) 00334 I = I + NNB 00335 CALL ICOPY( NNR, NRVAL, 1, WORK( I ), 1 ) 00336 I = I + NNR 00337 CALL ICOPY( NNBR, NBRVAL, 1, WORK( I ), 1 ) 00338 I = I + NNBR 00339 CALL ICOPY( NGRIDS, PVAL, 1, WORK( I ), 1 ) 00340 I = I + NGRIDS 00341 CALL ICOPY( NGRIDS, QVAL, 1, WORK( I ), 1 ) 00342 I = I + NGRIDS 00343 CALL IGEBS2D( ICTXT, 'All', ' ', I-1, 1, WORK, I-1 ) 00344 * 00345 * regurgitate input 00346 * 00347 WRITE( NOUT, FMT = 9999 ) 00348 $ 'SCALAPACK banded linear systems.' 00349 WRITE( NOUT, FMT = 9999 ) USRINFO 00350 WRITE( NOUT, FMT = * ) 00351 WRITE( NOUT, FMT = 9999 ) 00352 $ 'Tests of the parallel '// 00353 $ 'real double precision band matrix solve ' 00354 WRITE( NOUT, FMT = 9999 ) 00355 $ 'The following scaled residual '// 00356 $ 'checks will be computed:' 00357 WRITE( NOUT, FMT = 9999 ) 00358 $ ' Solve residual = ||Ax - b|| / '// 00359 $ '(||x|| * ||A|| * eps * N)' 00360 WRITE( NOUT, FMT = 9999 ) 00361 $ ' Factorization residual = ||A - LU|| /'// 00362 $ ' (||A|| * eps * N)' 00363 WRITE( NOUT, FMT = 9999 ) 00364 $ 'The matrix A is randomly '// 00365 $ 'generated for each test.' 00366 WRITE( NOUT, FMT = * ) 00367 WRITE( NOUT, FMT = 9999 ) 00368 $ 'An explanation of the input/output '// 00369 $ 'parameters follows:' 00370 WRITE( NOUT, FMT = 9999 ) 00371 $ 'TIME : Indicates whether WALL or '// 00372 $ 'CPU time was used.' 00373 * 00374 WRITE( NOUT, FMT = 9999 ) 00375 $ 'N : The number of rows and columns '// 00376 $ 'in the matrix A.' 00377 WRITE( NOUT, FMT = 9999 ) 00378 $ 'bwl, bwu : The number of diagonals '// 00379 $ 'in the matrix A.' 00380 WRITE( NOUT, FMT = 9999 ) 00381 $ 'NB : The size of the column panels the'// 00382 $ ' matrix A is split into. [-1 for default]' 00383 WRITE( NOUT, FMT = 9999 ) 00384 $ 'NRHS : The total number of RHS to solve'// 00385 $ ' for.' 00386 WRITE( NOUT, FMT = 9999 ) 00387 $ 'NBRHS : The number of RHS to be put on '// 00388 $ 'a column of processes before going' 00389 WRITE( NOUT, FMT = 9999 ) 00390 $ ' on to the next column of processes.' 00391 WRITE( NOUT, FMT = 9999 ) 00392 $ 'P : The number of process rows.' 00393 WRITE( NOUT, FMT = 9999 ) 00394 $ 'Q : The number of process columns.' 00395 WRITE( NOUT, FMT = 9999 ) 00396 $ 'THRESH : If a residual value is less than'// 00397 $ ' THRESH, CHECK is flagged as PASSED' 00398 WRITE( NOUT, FMT = 9999 ) 00399 $ 'Fact time: Time in seconds to factor the'// 00400 $ ' matrix' 00401 WRITE( NOUT, FMT = 9999 ) 00402 $ 'Sol Time: Time in seconds to solve the'// 00403 $ ' system.' 00404 WRITE( NOUT, FMT = 9999 ) 00405 $ 'MFLOPS : Rate of execution for factor '// 00406 $ 'and solve using sequential operation count.' 00407 WRITE( NOUT, FMT = 9999 ) 00408 $ 'MFLOP2 : Rough estimate of speed '// 00409 $ 'using actual op count (accurate big P,N).' 00410 WRITE( NOUT, FMT = * ) 00411 WRITE( NOUT, FMT = 9999 ) 00412 $ 'The following parameter values will be used:' 00413 WRITE( NOUT, FMT = 9996 ) 00414 $ 'N ', ( NVAL(I), I = 1, MIN(NMAT, 10) ) 00415 IF( NMAT.GT.10 ) 00416 $ WRITE( NOUT, FMT = 9997 ) ( NVAL(I), I = 11, NMAT ) 00417 WRITE( NOUT, FMT = 9996 ) 00418 $ 'bwl ', ( BWLVAL(I), I = 1, MIN(NBW, 10) ) 00419 IF( NBW.GT.10 ) 00420 $ WRITE( NOUT, FMT = 9997 ) ( BWLVAL(I), I = 11, NBW ) 00421 WRITE( NOUT, FMT = 9996 ) 00422 $ 'bwu ', ( BWUVAL(I), I = 1, MIN(NBW, 10) ) 00423 IF( NBW.GT.10 ) 00424 $ WRITE( NOUT, FMT = 9997 ) ( BWUVAL(I), I = 11, NBW ) 00425 WRITE( NOUT, FMT = 9996 ) 00426 $ 'NB ', ( NBVAL(I), I = 1, MIN(NNB, 10) ) 00427 IF( NNB.GT.10 ) 00428 $ WRITE( NOUT, FMT = 9997 ) ( NBVAL(I), I = 11, NNB ) 00429 WRITE( NOUT, FMT = 9996 ) 00430 $ 'NRHS ', ( NRVAL(I), I = 1, MIN(NNR, 10) ) 00431 IF( NNR.GT.10 ) 00432 $ WRITE( NOUT, FMT = 9997 ) ( NRVAL(I), I = 11, NNR ) 00433 WRITE( NOUT, FMT = 9996 ) 00434 $ 'NBRHS', ( NBRVAL(I), I = 1, MIN(NNBR, 10) ) 00435 IF( NNBR.GT.10 ) 00436 $ WRITE( NOUT, FMT = 9997 ) ( NBRVAL(I), I = 11, NNBR ) 00437 WRITE( NOUT, FMT = 9996 ) 00438 $ 'P ', ( PVAL(I), I = 1, MIN(NGRIDS, 10) ) 00439 IF( NGRIDS.GT.10 ) 00440 $ WRITE( NOUT, FMT = 9997) ( PVAL(I), I = 11, NGRIDS ) 00441 WRITE( NOUT, FMT = 9996 ) 00442 $ 'Q ', ( QVAL(I), I = 1, MIN(NGRIDS, 10) ) 00443 IF( NGRIDS.GT.10 ) 00444 $ WRITE( NOUT, FMT = 9997 ) ( QVAL(I), I = 11, NGRIDS ) 00445 WRITE( NOUT, FMT = * ) 00446 WRITE( NOUT, FMT = 9995 ) EPS 00447 WRITE( NOUT, FMT = 9998 ) THRESH 00448 * 00449 ELSE 00450 * 00451 * If in pvm, must participate setting up virtual machine 00452 * 00453 IF( NPROCS.LT.1 ) 00454 $ CALL BLACS_SETUP( IAM, NPROCS ) 00455 * 00456 * Temporarily define blacs grid to include all processes so 00457 * all processes have needed startup information 00458 * 00459 CALL BLACS_GET( -1, 0, ICTXT ) 00460 CALL BLACS_GRIDINIT( ICTXT, 'Row-major', 1, NPROCS ) 00461 * 00462 * Compute machine epsilon 00463 * 00464 EPS = PDLAMCH( ICTXT, 'eps' ) 00465 * 00466 CALL SGEBR2D( ICTXT, 'All', ' ', 1, 1, THRESH, 1, 0, 0 ) 00467 CALL IGEBR2D( ICTXT, 'All', ' ', 1, 1, I, 1, 0, 0 ) 00468 CALL IGEBR2D( ICTXT, 'All', ' ', I, 1, WORK, I, 0, 0 ) 00469 I = 1 00470 NMAT = WORK( I ) 00471 I = I+1 00472 NBW = WORK( I ) 00473 I = I+1 00474 NNB = WORK( I ) 00475 I = I+1 00476 NNR = WORK( I ) 00477 I = I+1 00478 NNBR = WORK( I ) 00479 I = I+1 00480 NGRIDS = WORK( I ) 00481 I = I+1 00482 IF( WORK( I ) .EQ. 1 ) THEN 00483 TRANS = 'N' 00484 ELSE 00485 TRANS = 'T' 00486 END IF 00487 I = I+1 00488 * 00489 I = NMAT + NBW + NNB + NNR + NNBR + 2*NGRIDS 00490 I = I + NBW 00491 * 00492 CALL IGEBR2D( ICTXT, 'All', ' ', 1, I, WORK, 1, 0, 0 ) 00493 I = 1 00494 CALL ICOPY( NMAT, WORK( I ), 1, NVAL, 1 ) 00495 I = I + NMAT 00496 CALL ICOPY( NBW, WORK( I ), 1, BWLVAL, 1 ) 00497 I = I + NBW 00498 CALL ICOPY( NBW, WORK( I ), 1, BWUVAL, 1 ) 00499 I = I + NBW 00500 CALL ICOPY( NNB, WORK( I ), 1, NBVAL, 1 ) 00501 I = I + NNB 00502 CALL ICOPY( NNR, WORK( I ), 1, NRVAL, 1 ) 00503 I = I + NNR 00504 CALL ICOPY( NNBR, WORK( I ), 1, NBRVAL, 1 ) 00505 I = I + NNBR 00506 CALL ICOPY( NGRIDS, WORK( I ), 1, PVAL, 1 ) 00507 I = I + NGRIDS 00508 CALL ICOPY( NGRIDS, WORK( I ), 1, QVAL, 1 ) 00509 * 00510 END IF 00511 * 00512 CALL BLACS_GRIDEXIT( ICTXT ) 00513 * 00514 RETURN 00515 * 00516 20 WRITE( NOUT, FMT = 9993 ) 00517 CLOSE( NIN ) 00518 IF( NOUT.NE.6 .AND. NOUT.NE.0 ) 00519 $ CLOSE( NOUT ) 00520 * 00521 CALL BLACS_ABORT( ICTXT, 1 ) 00522 STOP 00523 * 00524 9999 FORMAT( A ) 00525 9998 FORMAT( 'Routines pass computational tests if scaled residual ', 00526 $ 'is less than ', G12.5 ) 00527 9997 FORMAT( ' ', 10I6 ) 00528 9996 FORMAT( 2X, A5, ': ', 10I6 ) 00529 9995 FORMAT( 'Relative machine precision (eps) is taken to be ', 00530 $ E18.6 ) 00531 9994 FORMAT( ' Number of values of ',5A, ' is less than 1 or greater ', 00532 $ 'than ', I2 ) 00533 9993 FORMAT( ' Illegal input in file ',40A,'. Aborting run.' ) 00534 * 00535 * End of PDDTINFO 00536 * 00537 END