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