|
ScaLAPACK
2.0.2
ScaLAPACK: Scalable Linear Algebra PACKage
|
00001 SUBROUTINE PDDBINFO( 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 * PDDBINFO 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 IF( NBW.LT.1 .OR. NBW.GT.LDBWVAL ) THEN 00215 WRITE( NOUT, FMT = 9994 ) 'BW', LDBWVAL 00216 GO TO 20 00217 END IF 00218 READ( NIN, FMT = * ) ( BWLVAL( I ), I = 1, NBW ) 00219 READ( NIN, FMT = * ) ( BWUVAL( I ), I = 1, NBW ) 00220 * 00221 * Get values of NB 00222 * 00223 READ( NIN, FMT = * ) NNB 00224 IF( NNB.LT.1 .OR. NNB.GT.LDNBVAL ) THEN 00225 WRITE( NOUT, FMT = 9994 ) 'NB', LDNBVAL 00226 GO TO 20 00227 END IF 00228 READ( NIN, FMT = * ) ( NBVAL( I ), I = 1, NNB ) 00229 * 00230 * Get values of NRHS 00231 * 00232 READ( NIN, FMT = * ) NNR 00233 IF( NNR.LT.1 .OR. NNR.GT.LDNRVAL ) THEN 00234 WRITE( NOUT, FMT = 9994 ) 'NRHS', LDNRVAL 00235 GO TO 20 00236 END IF 00237 READ( NIN, FMT = * ) ( NRVAL( I ), I = 1, NNR ) 00238 * 00239 * Get values of NBRHS 00240 * 00241 READ( NIN, FMT = * ) NNBR 00242 IF( NNBR.LT.1 .OR. NNBR.GT.LDNBRVAL ) THEN 00243 WRITE( NOUT, FMT = 9994 ) 'NBRHS', LDNBRVAL 00244 GO TO 20 00245 END IF 00246 READ( NIN, FMT = * ) ( NBRVAL( I ), I = 1, NNBR ) 00247 * 00248 * Get number of grids 00249 * 00250 READ( NIN, FMT = * ) NGRIDS 00251 IF( NGRIDS.LT.1 .OR. NGRIDS.GT.LDPVAL ) THEN 00252 WRITE( NOUT, FMT = 9994 ) 'Grids', LDPVAL 00253 GO TO 20 00254 ELSE IF( NGRIDS.GT.LDQVAL ) THEN 00255 WRITE( NOUT, FMT = 9994 ) 'Grids', LDQVAL 00256 GO TO 20 00257 END IF 00258 * 00259 * Processor grid must be 1D so set PVAL to 1 00260 DO 8738 I = 1, NGRIDS 00261 PVAL( I ) = 1 00262 8738 CONTINUE 00263 * 00264 * Get values of Q 00265 * 00266 READ( NIN, FMT = * ) ( QVAL( I ), I = 1, NGRIDS ) 00267 * 00268 * Get level of checking 00269 * 00270 READ( NIN, FMT = * ) THRESH 00271 * 00272 * Close input file 00273 * 00274 CLOSE( NIN ) 00275 * 00276 * For pvm only: if virtual machine not set up, allocate it and 00277 * spawn the correct number of processes. 00278 * 00279 IF( NPROCS.LT.1 ) THEN 00280 NPROCS = 0 00281 DO 10 I = 1, NGRIDS 00282 NPROCS = MAX( NPROCS, PVAL( I )*QVAL( I ) ) 00283 10 CONTINUE 00284 CALL BLACS_SETUP( IAM, NPROCS ) 00285 END IF 00286 * 00287 * Temporarily define blacs grid to include all processes so 00288 * information can be broadcast to all processes. 00289 * 00290 CALL BLACS_GET( -1, 0, ICTXT ) 00291 CALL BLACS_GRIDINIT( ICTXT, 'Row-major', 1, NPROCS ) 00292 * 00293 * Compute machine epsilon 00294 * 00295 EPS = PDLAMCH( ICTXT, 'eps' ) 00296 * 00297 * Pack information arrays and broadcast 00298 * 00299 CALL SGEBS2D( ICTXT, 'All', ' ', 1, 1, THRESH, 1 ) 00300 I = 1 00301 WORK( I ) = NMAT 00302 I = I+1 00303 WORK( I ) = NBW 00304 I = I+1 00305 WORK( I ) = NNB 00306 I = I+1 00307 WORK( I ) = NNR 00308 I = I+1 00309 WORK( I ) = NNBR 00310 I = I+1 00311 WORK( I ) = NGRIDS 00312 I = I+1 00313 IF( LSAME( TRANS, 'N' ) ) THEN 00314 WORK( I ) = 1 00315 ELSE 00316 TRANS = 'T' 00317 WORK( I ) = 2 00318 END IF 00319 I = I+1 00320 * Send number of elements to be sent 00321 CALL IGEBS2D( ICTXT, 'All', ' ', 1, 1, I-1, 1 ) 00322 * Send elements 00323 CALL IGEBS2D( ICTXT, 'All', ' ', I-1, 1, WORK, I-1 ) 00324 * 00325 I = 1 00326 CALL ICOPY( NMAT, NVAL, 1, WORK( I ), 1 ) 00327 I = I + NMAT 00328 CALL ICOPY( NBW, BWLVAL, 1, WORK( I ), 1 ) 00329 I = I + NBW 00330 CALL ICOPY( NBW, BWUVAL, 1, WORK( I ), 1 ) 00331 I = I + NBW 00332 CALL ICOPY( NNB, NBVAL, 1, WORK( I ), 1 ) 00333 I = I + NNB 00334 CALL ICOPY( NNR, NRVAL, 1, WORK( I ), 1 ) 00335 I = I + NNR 00336 CALL ICOPY( NNBR, NBRVAL, 1, WORK( I ), 1 ) 00337 I = I + NNBR 00338 CALL ICOPY( NGRIDS, PVAL, 1, WORK( I ), 1 ) 00339 I = I + NGRIDS 00340 CALL ICOPY( NGRIDS, QVAL, 1, WORK( I ), 1 ) 00341 I = I + NGRIDS 00342 CALL IGEBS2D( ICTXT, 'All', ' ', I-1, 1, WORK, I-1 ) 00343 * 00344 * regurgitate input 00345 * 00346 WRITE( NOUT, FMT = 9999 ) 00347 $ 'SCALAPACK banded linear systems.' 00348 WRITE( NOUT, FMT = 9999 ) USRINFO 00349 WRITE( NOUT, FMT = * ) 00350 WRITE( NOUT, FMT = 9999 ) 00351 $ 'Tests of the parallel '// 00352 $ 'real double precision band matrix solve ' 00353 WRITE( NOUT, FMT = 9999 ) 00354 $ 'The following scaled residual '// 00355 $ 'checks will be computed:' 00356 WRITE( NOUT, FMT = 9999 ) 00357 $ ' Solve residual = ||Ax - b|| / '// 00358 $ '(||x|| * ||A|| * eps * N)' 00359 WRITE( NOUT, FMT = 9999 ) 00360 $ ' Factorization residual = ||A - LU|| /'// 00361 $ ' (||A|| * eps * N)' 00362 WRITE( NOUT, FMT = 9999 ) 00363 $ 'The matrix A is randomly '// 00364 $ 'generated for each test.' 00365 WRITE( NOUT, FMT = * ) 00366 WRITE( NOUT, FMT = 9999 ) 00367 $ 'An explanation of the input/output '// 00368 $ 'parameters follows:' 00369 WRITE( NOUT, FMT = 9999 ) 00370 $ 'TIME : Indicates whether WALL or '// 00371 $ 'CPU time was used.' 00372 * 00373 WRITE( NOUT, FMT = 9999 ) 00374 $ 'N : The number of rows and columns '// 00375 $ 'in the matrix A.' 00376 WRITE( NOUT, FMT = 9999 ) 00377 $ 'bwl, bwu : The number of diagonals '// 00378 $ 'in the matrix A.' 00379 WRITE( NOUT, FMT = 9999 ) 00380 $ 'NB : The size of the column panels the'// 00381 $ ' matrix A is split into. [-1 for default]' 00382 WRITE( NOUT, FMT = 9999 ) 00383 $ 'NRHS : The total number of RHS to solve'// 00384 $ ' for.' 00385 WRITE( NOUT, FMT = 9999 ) 00386 $ 'NBRHS : The number of RHS to be put on '// 00387 $ 'a column of processes before going' 00388 WRITE( NOUT, FMT = 9999 ) 00389 $ ' on to the next column of processes.' 00390 WRITE( NOUT, FMT = 9999 ) 00391 $ 'P : The number of process rows.' 00392 WRITE( NOUT, FMT = 9999 ) 00393 $ 'Q : The number of process columns.' 00394 WRITE( NOUT, FMT = 9999 ) 00395 $ 'THRESH : If a residual value is less than'// 00396 $ ' THRESH, CHECK is flagged as PASSED' 00397 WRITE( NOUT, FMT = 9999 ) 00398 $ 'Fact time: Time in seconds to factor the'// 00399 $ ' matrix' 00400 WRITE( NOUT, FMT = 9999 ) 00401 $ 'Sol Time: Time in seconds to solve the'// 00402 $ ' system.' 00403 WRITE( NOUT, FMT = 9999 ) 00404 $ 'MFLOPS : Rate of execution for factor '// 00405 $ 'and solve using sequential operation count.' 00406 WRITE( NOUT, FMT = 9999 ) 00407 $ 'MFLOP2 : Rough estimate of speed '// 00408 $ 'using actual op count (accurate big P,N).' 00409 WRITE( NOUT, FMT = * ) 00410 WRITE( NOUT, FMT = 9999 ) 00411 $ 'The following parameter values will be used:' 00412 WRITE( NOUT, FMT = 9996 ) 00413 $ 'N ', ( NVAL(I), I = 1, MIN(NMAT, 10) ) 00414 IF( NMAT.GT.10 ) 00415 $ WRITE( NOUT, FMT = 9997 ) ( NVAL(I), I = 11, NMAT ) 00416 WRITE( NOUT, FMT = 9996 ) 00417 $ 'bwl ', ( BWLVAL(I), I = 1, MIN(NBW, 10) ) 00418 IF( NBW.GT.10 ) 00419 $ WRITE( NOUT, FMT = 9997 ) ( BWLVAL(I), I = 11, NBW ) 00420 WRITE( NOUT, FMT = 9996 ) 00421 $ 'bwu ', ( BWUVAL(I), I = 1, MIN(NBW, 10) ) 00422 IF( NBW.GT.10 ) 00423 $ WRITE( NOUT, FMT = 9997 ) ( BWUVAL(I), I = 11, NBW ) 00424 WRITE( NOUT, FMT = 9996 ) 00425 $ 'NB ', ( NBVAL(I), I = 1, MIN(NNB, 10) ) 00426 IF( NNB.GT.10 ) 00427 $ WRITE( NOUT, FMT = 9997 ) ( NBVAL(I), I = 11, NNB ) 00428 WRITE( NOUT, FMT = 9996 ) 00429 $ 'NRHS ', ( NRVAL(I), I = 1, MIN(NNR, 10) ) 00430 IF( NNR.GT.10 ) 00431 $ WRITE( NOUT, FMT = 9997 ) ( NRVAL(I), I = 11, NNR ) 00432 WRITE( NOUT, FMT = 9996 ) 00433 $ 'NBRHS', ( NBRVAL(I), I = 1, MIN(NNBR, 10) ) 00434 IF( NNBR.GT.10 ) 00435 $ WRITE( NOUT, FMT = 9997 ) ( NBRVAL(I), I = 11, NNBR ) 00436 WRITE( NOUT, FMT = 9996 ) 00437 $ 'P ', ( PVAL(I), I = 1, MIN(NGRIDS, 10) ) 00438 IF( NGRIDS.GT.10 ) 00439 $ WRITE( NOUT, FMT = 9997) ( PVAL(I), I = 11, NGRIDS ) 00440 WRITE( NOUT, FMT = 9996 ) 00441 $ 'Q ', ( QVAL(I), I = 1, MIN(NGRIDS, 10) ) 00442 IF( NGRIDS.GT.10 ) 00443 $ WRITE( NOUT, FMT = 9997 ) ( QVAL(I), I = 11, NGRIDS ) 00444 WRITE( NOUT, FMT = * ) 00445 WRITE( NOUT, FMT = 9995 ) EPS 00446 WRITE( NOUT, FMT = 9998 ) THRESH 00447 * 00448 ELSE 00449 * 00450 * If in pvm, must participate setting up virtual machine 00451 * 00452 IF( NPROCS.LT.1 ) 00453 $ CALL BLACS_SETUP( IAM, NPROCS ) 00454 * 00455 * Temporarily define blacs grid to include all processes so 00456 * all processes have needed startup information 00457 * 00458 CALL BLACS_GET( -1, 0, ICTXT ) 00459 CALL BLACS_GRIDINIT( ICTXT, 'Row-major', 1, NPROCS ) 00460 * 00461 * Compute machine epsilon 00462 * 00463 EPS = PDLAMCH( ICTXT, 'eps' ) 00464 * 00465 CALL SGEBR2D( ICTXT, 'All', ' ', 1, 1, THRESH, 1, 0, 0 ) 00466 CALL IGEBR2D( ICTXT, 'All', ' ', 1, 1, I, 1, 0, 0 ) 00467 CALL IGEBR2D( ICTXT, 'All', ' ', I, 1, WORK, I, 0, 0 ) 00468 I = 1 00469 NMAT = WORK( I ) 00470 I = I+1 00471 NBW = WORK( I ) 00472 I = I+1 00473 NNB = WORK( I ) 00474 I = I+1 00475 NNR = WORK( I ) 00476 I = I+1 00477 NNBR = WORK( I ) 00478 I = I+1 00479 NGRIDS = WORK( I ) 00480 I = I+1 00481 IF( WORK( I ) .EQ. 1 ) THEN 00482 TRANS = 'N' 00483 ELSE 00484 TRANS = 'T' 00485 END IF 00486 I = I+1 00487 * 00488 I = NMAT + NBW + NNB + NNR + NNBR + 2*NGRIDS 00489 I = I + NBW 00490 * 00491 CALL IGEBR2D( ICTXT, 'All', ' ', 1, I, WORK, 1, 0, 0 ) 00492 I = 1 00493 CALL ICOPY( NMAT, WORK( I ), 1, NVAL, 1 ) 00494 I = I + NMAT 00495 CALL ICOPY( NBW, WORK( I ), 1, BWLVAL, 1 ) 00496 I = I + NBW 00497 CALL ICOPY( NBW, WORK( I ), 1, BWUVAL, 1 ) 00498 I = I + NBW 00499 CALL ICOPY( NNB, WORK( I ), 1, NBVAL, 1 ) 00500 I = I + NNB 00501 CALL ICOPY( NNR, WORK( I ), 1, NRVAL, 1 ) 00502 I = I + NNR 00503 CALL ICOPY( NNBR, WORK( I ), 1, NBRVAL, 1 ) 00504 I = I + NNBR 00505 CALL ICOPY( NGRIDS, WORK( I ), 1, PVAL, 1 ) 00506 I = I + NGRIDS 00507 CALL ICOPY( NGRIDS, WORK( I ), 1, QVAL, 1 ) 00508 * 00509 END IF 00510 * 00511 CALL BLACS_GRIDEXIT( ICTXT ) 00512 * 00513 RETURN 00514 * 00515 20 WRITE( NOUT, FMT = 9993 ) 00516 CLOSE( NIN ) 00517 IF( NOUT.NE.6 .AND. NOUT.NE.0 ) 00518 $ CLOSE( NOUT ) 00519 * 00520 CALL BLACS_ABORT( ICTXT, 1 ) 00521 STOP 00522 * 00523 9999 FORMAT( A ) 00524 9998 FORMAT( 'Routines pass computational tests if scaled residual ', 00525 $ 'is less than ', G12.5 ) 00526 9997 FORMAT( ' ', 10I6 ) 00527 9996 FORMAT( 2X, A5, ': ', 10I6 ) 00528 9995 FORMAT( 'Relative machine precision (eps) is taken to be ', 00529 $ E18.6 ) 00530 9994 FORMAT( ' Number of values of ',5A, ' is less than 1 or greater ', 00531 $ 'than ', I2 ) 00532 9993 FORMAT( ' Illegal input in file ',40A,'. Aborting run.' ) 00533 * 00534 * End of PDDBINFO 00535 * 00536 END