ScaLAPACK  2.0.2
ScaLAPACK: Scalable Linear Algebra PACKage
pddbinfo.f
Go to the documentation of this file.
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