ScaLAPACK  2.0.2
ScaLAPACK: Scalable Linear Algebra PACKage
pzblas3tim.f
Go to the documentation of this file.
00001       BLOCK DATA
00002       INTEGER NSUBS
00003       PARAMETER (NSUBS = 11)
00004       CHARACTER*7        SNAMES( NSUBS )
00005       COMMON             /SNAMEC/SNAMES
00006       DATA               SNAMES/'PZGEMM ', 'PZSYMM ', 'PZHEMM ',
00007      $                   'PZSYRK ', 'PZHERK ', 'PZSYR2K',
00008      $                   'PZHER2K', 'PZTRMM ', 'PZTRSM ',
00009      $                   'PZGEADD', 'PZTRADD'/
00010       END BLOCK DATA
00011       
00012       PROGRAM PZBLA3TIM
00013 *
00014 *  -- PBLAS timing driver (version 2.0.2) --
00015 *     Univ. of Tennessee, Univ. of California Berkeley, Univ. of Colorado Denver
00016 *     May 1 2012
00017 *
00018 *  Purpose
00019 *  =======
00020 *
00021 *  PZBLA3TIM  is the main timing program for the Level 3 PBLAS routines.
00022 *
00023 *  The program must be driven by a short data file.  An  annotated exam-
00024 *  ple of a data file can be obtained by deleting the first 3 characters
00025 *  from the following 59 lines:
00026 *  'Level 3 PBLAS, Timing input file'
00027 *  'Intel iPSC/860 hypercube, gamma model.'
00028 *  'PZBLAS3TIM.SUMM'     output file name (if any)
00029 *  6     device out
00030 *  10              value of the logical computational blocksize NB
00031 *  1               number of process grids (ordered pairs of P & Q)
00032 *  2 2 1 4 2 3 8   values of P
00033 *  2 2 4 1 3 2 1   values of Q
00034 *  (1.0D0, 0.0D0)  value of ALPHA
00035 *  (1.0D0, 0.0D0)  value of BETA
00036 *  2               number of tests problems
00037 *  'N' 'U'         values of DIAG
00038 *  'L' 'R'         values of SIDE
00039 *  'N' 'T'         values of TRANSA
00040 *  'N' 'T'         values of TRANSB
00041 *  'U' 'L'         values of UPLO
00042 *  3  4            values of M
00043 *  3  4            values of N
00044 *  3  4            values of K
00045 *  6 10            values of M_A
00046 *  6 10            values of N_A
00047 *  2  5            values of IMB_A
00048 *  2  5            values of INB_A
00049 *  2  5            values of MB_A
00050 *  2  5            values of NB_A
00051 *  0  1            values of RSRC_A
00052 *  0  0            values of CSRC_A
00053 *  1  1            values of IA
00054 *  1  1            values of JA
00055 *  6 10            values of M_B
00056 *  6 10            values of N_B
00057 *  2  5            values of IMB_B
00058 *  2  5            values of INB_B
00059 *  2  5            values of MB_B
00060 *  2  5            values of NB_B
00061 *  0  1            values of RSRC_B
00062 *  0  0            values of CSRC_B
00063 *  1  1            values of IB
00064 *  1  1            values of JB
00065 *  6 10            values of M_C
00066 *  6 10            values of N_C
00067 *  2  5            values of IMB_C
00068 *  2  5            values of INB_C
00069 *  2  5            values of MB_C
00070 *  2  5            values of NB_C
00071 *  0  1            values of RSRC_C
00072 *  0  0            values of CSRC_C
00073 *  1  1            values of IC
00074 *  1  1            values of JC
00075 *  PZGEMM  T  put F for no test in the same column
00076 *  PZSYMM  T  put F for no test in the same column
00077 *  PZHEMM  T  put F for no test in the same column
00078 *  PZSYRK  T  put F for no test in the same column
00079 *  PZHERK  T  put F for no test in the same column
00080 *  PZSYR2K T  put F for no test in the same column
00081 *  PZHER2K T  put F for no test in the same column
00082 *  PZTRMM  T  put F for no test in the same column
00083 *  PZTRSM  T  put F for no test in the same column
00084 *  PZGEADD T  put F for no test in the same column
00085 *  PZTRADD T  put F for no test in the same column
00086 *
00087 *  Internal Parameters
00088 *  ===================
00089 *
00090 *  TOTMEM  INTEGER
00091 *          TOTMEM  is  a machine-specific parameter indicating the maxi-
00092 *          mum  amount  of  available  memory per  process in bytes. The
00093 *          user  should  customize TOTMEM to his  platform.  Remember to
00094 *          leave  room  in  memory  for the  operating system, the BLACS
00095 *          buffer, etc.  For  example,  on  a system with 8 MB of memory
00096 *          per process (e.g., one processor  on an Intel iPSC/860),  the
00097 *          parameters we use are TOTMEM=6200000  (leaving 1.8 MB for OS,
00098 *          code, BLACS buffer, etc).  However,  for PVM,  we usually set
00099 *          TOTMEM = 2000000.  Some experimenting  with the maximum value
00100 *          of TOTMEM may be required. By default, TOTMEM is 2000000.
00101 *
00102 *  DBLESZ  INTEGER
00103 *  ZPLXSZ  INTEGER
00104 *          DBLESZ  and  ZPLXSZ indicate the length in bytes on the given
00105 *          platform  for a double  precision real and a double precision
00106 *          complex. By default, DBLESZ is set to eight and ZPLXSZ is set
00107 *          to sixteen.
00108 *
00109 *  MEM     COMPLEX*16 array
00110 *          MEM is an array of dimension TOTMEM / ZPLXSZ.
00111 *          All arrays used by SCALAPACK routines are allocated from this
00112 *          array MEM and referenced by pointers. The  integer  IPA,  for
00113 *          example, is a pointer to the starting element of MEM for  the
00114 *          matrix A.
00115 *
00116 *  -- Written on April 1, 1998 by
00117 *     Antoine Petitet, University  of  Tennessee, Knoxville 37996, USA.
00118 *
00119 *  =====================================================================
00120 *
00121 *     .. Parameters ..
00122       INTEGER            MAXTESTS, MAXGRIDS, ZPLXSZ, TOTMEM, MEMSIZ,
00123      $                   NSUBS
00124       COMPLEX*16         ONE
00125       PARAMETER          ( MAXTESTS = 20, MAXGRIDS = 20, ZPLXSZ = 16,
00126      $                   ONE = ( 1.0D+0, 0.0D+0 ), TOTMEM = 2000000,
00127      $                   NSUBS = 11, MEMSIZ = TOTMEM / ZPLXSZ )
00128       INTEGER            BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
00129      $                   DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
00130      $                   RSRC_
00131       PARAMETER          ( BLOCK_CYCLIC_2D_INB = 2, DLEN_ = 11,
00132      $                   DTYPE_ = 1, CTXT_ = 2, M_ = 3, N_ = 4,
00133      $                   IMB_ = 5, INB_ = 6, MB_ = 7, NB_ = 8,
00134      $                   RSRC_ = 9, CSRC_ = 10, LLD_ = 11 )
00135 *     ..
00136 *     .. Local Scalars ..
00137       CHARACTER*1        ADIAGDO, AFORM, CFORM, DIAG, SIDE, TRANSA,
00138      $                   TRANSB, UPLO
00139       INTEGER            CSRCA, CSRCB, CSRCC, I, IA, IAM, IASEED, IB,
00140      $                   IBSEED, IC, ICSEED, ICTXT, IMBA, IMBB, IMBC,
00141      $                   IMIDA, IMIDB, IMIDC, INBA, INBB, INBC, IPA,
00142      $                   IPB, IPC, IPOSTA, IPOSTB, IPOSTC, IPREA, IPREB,
00143      $                   IPREC, J, JA, JB, JC, K, L, M, MA, MB, MBA,
00144      $                   MBB, MBC, MC, MEMREQD, MPA, MPB, MPC, MYCOL,
00145      $                   MYROW, N, NA, NB, NBA, NBB, NBC, NC, NCOLA,
00146      $                   NCOLB, NCOLC, NGRIDS, NOUT, NPCOL, NPROCS,
00147      $                   NPROW, NQA, NQB, NQC, NROWA, NROWB, NROWC,
00148      $                   NTESTS, OFFDA, OFFDC, RSRCA, RSRCB, RSRCC
00149       DOUBLE PRECISION   CFLOPS, NOPS, WFLOPS
00150       COMPLEX*16         ALPHA, BETA, SCALE
00151 *     ..
00152 *     .. Local Arrays ..
00153       LOGICAL            LTEST( NSUBS ), BCHECK( NSUBS ),
00154      $                   CCHECK( NSUBS )
00155       CHARACTER*1        DIAGVAL( MAXTESTS ), SIDEVAL( MAXTESTS ),
00156      $                   TRNAVAL( MAXTESTS ), TRNBVAL( MAXTESTS ),
00157      $                   UPLOVAL( MAXTESTS )
00158       CHARACTER*80       OUTFILE
00159       INTEGER            CSCAVAL( MAXTESTS ), CSCBVAL( MAXTESTS ),
00160      $                   CSCCVAL( MAXTESTS ), DESCA( DLEN_ ),
00161      $                   DESCB( DLEN_ ), DESCC( DLEN_ ),
00162      $                   IAVAL( MAXTESTS ), IBVAL( MAXTESTS ),
00163      $                   ICVAL( MAXTESTS ), IERR( 3 ),
00164      $                   IMBAVAL( MAXTESTS ), IMBBVAL( MAXTESTS ),
00165      $                   IMBCVAL( MAXTESTS ), INBAVAL( MAXTESTS ),
00166      $                   INBBVAL( MAXTESTS ), INBCVAL( MAXTESTS ),
00167      $                   JAVAL( MAXTESTS ), JBVAL( MAXTESTS ),
00168      $                   JCVAL( MAXTESTS ), KVAL( MAXTESTS ),
00169      $                   MAVAL( MAXTESTS ), MBAVAL( MAXTESTS ),
00170      $                   MBBVAL( MAXTESTS ), MBCVAL( MAXTESTS ),
00171      $                   MBVAL( MAXTESTS ), MCVAL( MAXTESTS ),
00172      $                   MVAL( MAXTESTS ), NAVAL( MAXTESTS ),
00173      $                   NBAVAL( MAXTESTS ), NBBVAL( MAXTESTS ),
00174      $                   NBCVAL( MAXTESTS ), NBVAL( MAXTESTS ),
00175      $                   NCVAL( MAXTESTS ), NVAL( MAXTESTS ),
00176      $                   PVAL( MAXTESTS ), QVAL( MAXTESTS ),
00177      $                   RSCAVAL( MAXTESTS ), RSCBVAL( MAXTESTS ),
00178      $                   RSCCVAL( MAXTESTS )
00179       DOUBLE PRECISION   CTIME( 1 ), WTIME( 1 )
00180       COMPLEX*16         MEM( MEMSIZ )
00181 *     ..
00182 *     .. External Subroutines ..
00183       EXTERNAL           BLACS_BARRIER, BLACS_EXIT, BLACS_GET,
00184      $                   BLACS_GRIDEXIT, BLACS_GRIDINFO, BLACS_GRIDINIT,
00185      $                   BLACS_PINFO, IGSUM2D, PB_BOOT, PB_COMBINE,
00186      $                   PB_TIMER, PMDESCCHK, PMDIMCHK, PZBLA3TIMINFO,
00187      $                   PZGEADD, PZGEMM, PZHEMM, PZHER2K, PZHERK,
00188      $                   PZLAGEN, PZLASCAL, PZSYMM, PZSYR2K, PZSYRK,
00189      $                   PZTRADD, PZTRMM, PZTRSM
00190 *     ..
00191 *     .. External Functions ..
00192       LOGICAL            LSAME
00193       DOUBLE PRECISION   PDOPBL3
00194       EXTERNAL           LSAME, PDOPBL3
00195 *     ..
00196 *     .. Intrinsic Functions ..
00197       INTRINSIC          DBLE, DCMPLX, MAX
00198 *     ..
00199 *     .. Common Blocks ..
00200       CHARACTER*7        SNAMES( NSUBS )
00201       LOGICAL            ABRTFLG
00202       INTEGER            INFO, NBLOG
00203       COMMON             /SNAMEC/SNAMES
00204       COMMON             /INFOC/INFO, NBLOG
00205       COMMON             /PBERRORC/NOUT, ABRTFLG
00206 *     ..
00207 *     .. Data Statements ..
00208       DATA               BCHECK/.TRUE., .TRUE., .TRUE., .FALSE.,
00209      $                   .FALSE., .TRUE., .TRUE., .TRUE., .TRUE.,
00210      $                   .FALSE., .FALSE./
00211       DATA               CCHECK/.TRUE., .TRUE., .TRUE., .TRUE., .TRUE.,
00212      $                   .TRUE., .TRUE., .FALSE., .FALSE., .TRUE.,
00213      $                   .TRUE./
00214 *     ..
00215 *     .. Executable Statements ..
00216 *
00217 *     Initialization
00218 *
00219 *     Set flag so that the PBLAS error handler won't abort on errors, so
00220 *     that the tester will detect unsupported operations.
00221 *
00222       ABRTFLG = .FALSE.
00223 *
00224 *     Seeds for random matrix generations.
00225 *
00226       IASEED = 100
00227       IBSEED = 200
00228       ICSEED = 300
00229 *
00230 *     Get starting information
00231 *
00232       CALL BLACS_PINFO( IAM, NPROCS )
00233       CALL PZBLA3TIMINFO( OUTFILE, NOUT, NTESTS, DIAGVAL, SIDEVAL,
00234      $                    TRNAVAL, TRNBVAL, UPLOVAL, MVAL, NVAL,
00235      $                    KVAL, MAVAL, NAVAL, IMBAVAL, MBAVAL,
00236      $                    INBAVAL, NBAVAL, RSCAVAL, CSCAVAL, IAVAL,
00237      $                    JAVAL, MBVAL, NBVAL, IMBBVAL, MBBVAL,
00238      $                    INBBVAL, NBBVAL, RSCBVAL, CSCBVAL, IBVAL,
00239      $                    JBVAL, MCVAL, NCVAL, IMBCVAL, MBCVAL,
00240      $                    INBCVAL, NBCVAL, RSCCVAL, CSCCVAL, ICVAL,
00241      $                    JCVAL, MAXTESTS, NGRIDS, PVAL, MAXGRIDS,
00242      $                    QVAL, MAXGRIDS, NBLOG, LTEST, IAM, NPROCS,
00243      $                    ALPHA, BETA, MEM )
00244 *
00245       IF( IAM.EQ.0 )
00246      $   WRITE( NOUT, FMT = 9984 )
00247 *
00248 *     Loop over different process grids
00249 *
00250       DO 60 I = 1, NGRIDS
00251 *
00252          NPROW = PVAL( I )
00253          NPCOL = QVAL( I )
00254 *
00255 *        Make sure grid information is correct
00256 *
00257          IERR( 1 ) = 0
00258          IF( NPROW.LT.1 ) THEN
00259             IF( IAM.EQ.0 )
00260      $         WRITE( NOUT, FMT = 9999 ) 'GRID SIZE', 'NPROW', NPROW
00261             IERR( 1 ) = 1
00262          ELSE IF( NPCOL.LT.1 ) THEN
00263             IF( IAM.EQ.0 )
00264      $         WRITE( NOUT, FMT = 9999 ) 'GRID SIZE', 'NPCOL', NPCOL
00265             IERR( 1 ) = 1
00266          ELSE IF( NPROW*NPCOL.GT.NPROCS ) THEN
00267             IF( IAM.EQ.0 )
00268      $         WRITE( NOUT, FMT = 9998 ) NPROW*NPCOL, NPROCS
00269             IERR( 1 ) = 1
00270          END IF
00271 *
00272          IF( IERR( 1 ).GT.0 ) THEN
00273             IF( IAM.EQ.0 )
00274      $         WRITE( NOUT, FMT = 9997 ) 'GRID'
00275             GO TO 60
00276          END IF
00277 *
00278 *        Define process grid
00279 *
00280          CALL BLACS_GET( -1, 0, ICTXT )
00281          CALL BLACS_GRIDINIT( ICTXT, 'Row-major', NPROW, NPCOL )
00282          CALL BLACS_GRIDINFO( ICTXT, NPROW, NPCOL, MYROW, MYCOL )
00283 *
00284 *        Go to bottom of process grid loop if this case doesn't use my
00285 *        process
00286 *
00287          IF( MYROW.GE.NPROW .OR. MYCOL.GE.NPCOL )
00288      $      GO TO 60
00289 *
00290 *        Loop over number of tests
00291 *
00292          DO 50 J = 1, NTESTS
00293 *
00294 *           Get the test parameters
00295 *
00296             DIAG   = DIAGVAL( J )
00297             SIDE   = SIDEVAL( J )
00298             TRANSA = TRNAVAL( J )
00299             TRANSB = TRNBVAL( J )
00300             UPLO   = UPLOVAL( J )
00301 *
00302             M      = MVAL( J )
00303             N      = NVAL( J )
00304             K      = KVAL( J )
00305 *
00306             MA    = MAVAL( J )
00307             NA    = NAVAL( J )
00308             IMBA  = IMBAVAL( J )
00309             MBA   = MBAVAL( J )
00310             INBA  = INBAVAL( J )
00311             NBA   = NBAVAL( J )
00312             RSRCA = RSCAVAL( J )
00313             CSRCA = CSCAVAL( J )
00314             IA    = IAVAL( J )
00315             JA    = JAVAL( J )
00316 *
00317             MB    = MBVAL( J )
00318             NB    = NBVAL( J )
00319             IMBB  = IMBBVAL( J )
00320             MBB   = MBBVAL( J )
00321             INBB  = INBBVAL( J )
00322             NBB   = NBBVAL( J )
00323             RSRCB = RSCBVAL( J )
00324             CSRCB = CSCBVAL( J )
00325             IB    = IBVAL( J )
00326             JB    = JBVAL( J )
00327 *
00328             MC    = MCVAL( J )
00329             NC    = NCVAL( J )
00330             IMBC  = IMBCVAL( J )
00331             MBC   = MBCVAL( J )
00332             INBC  = INBCVAL( J )
00333             NBC   = NBCVAL( J )
00334             RSRCC = RSCCVAL( J )
00335             CSRCC = CSCCVAL( J )
00336             IC    = ICVAL( J )
00337             JC    = JCVAL( J )
00338 *
00339             IF( IAM.EQ.0 ) THEN
00340 *
00341                WRITE( NOUT, FMT = * )
00342                WRITE( NOUT, FMT = 9996 ) J, NPROW, NPCOL
00343                WRITE( NOUT, FMT = * )
00344 *
00345                WRITE( NOUT, FMT = 9995 )
00346                WRITE( NOUT, FMT = 9994 )
00347                WRITE( NOUT, FMT = 9995 )
00348                WRITE( NOUT, FMT = 9993 ) M, N, K, SIDE, UPLO, TRANSA,
00349      $                                   TRANSB, DIAG
00350 *
00351                WRITE( NOUT, FMT = 9995 )
00352                WRITE( NOUT, FMT = 9992 )
00353                WRITE( NOUT, FMT = 9995 )
00354                WRITE( NOUT, FMT = 9991 ) IA, JA, MA, NA, IMBA, INBA,
00355      $                                   MBA, NBA, RSRCA, CSRCA
00356 *
00357                WRITE( NOUT, FMT = 9995 )
00358                WRITE( NOUT, FMT = 9990 )
00359                WRITE( NOUT, FMT = 9995 )
00360                WRITE( NOUT, FMT = 9991 ) IB, JB, MB, NB, IMBB, INBB,
00361      $                                   MBB, NBB, RSRCB, CSRCB
00362 *
00363                WRITE( NOUT, FMT = 9995 )
00364                WRITE( NOUT, FMT = 9989 )
00365                WRITE( NOUT, FMT = 9995 )
00366                WRITE( NOUT, FMT = 9991 ) IC, JC, MC, NC, IMBC, INBC,
00367      $                                   MBC, NBC, RSRCC, CSRCC
00368 *
00369                WRITE( NOUT, FMT = 9995 )
00370                WRITE( NOUT, FMT = 9980 )
00371 *
00372             END IF
00373 *
00374 *           Check the validity of the input test parameters
00375 *
00376             IF( .NOT.LSAME( SIDE, 'L' ).AND.
00377      $          .NOT.LSAME( SIDE, 'R' ) ) THEN
00378                IF( IAM.EQ.0 )
00379      $            WRITE( NOUT, FMT = 9997 ) 'SIDE'
00380                GO TO 40
00381             END IF
00382 *
00383             IF( .NOT.LSAME( UPLO, 'U' ).AND.
00384      $          .NOT.LSAME( UPLO, 'L' ) ) THEN
00385                IF( IAM.EQ.0 )
00386      $            WRITE( NOUT, FMT = 9997 ) 'UPLO'
00387                GO TO 40
00388             END IF
00389 *
00390             IF( .NOT.LSAME( TRANSA, 'N' ).AND.
00391      $          .NOT.LSAME( TRANSA, 'T' ).AND.
00392      $          .NOT.LSAME( TRANSA, 'C' ) ) THEN
00393                IF( IAM.EQ.0 )
00394      $            WRITE( NOUT, FMT = 9997 ) 'TRANSA'
00395                GO TO 40
00396             END IF
00397 *
00398             IF( .NOT.LSAME( TRANSB, 'N' ).AND.
00399      $          .NOT.LSAME( TRANSB, 'T' ).AND.
00400      $          .NOT.LSAME( TRANSB, 'C' ) ) THEN
00401                IF( IAM.EQ.0 )
00402      $            WRITE( NOUT, FMT = 9997 ) 'TRANSB'
00403                GO TO 40
00404             END IF
00405 *
00406             IF( .NOT.LSAME( DIAG , 'U' ).AND.
00407      $          .NOT.LSAME( DIAG , 'N' ) )THEN
00408                IF( IAM.EQ.0 )
00409      $            WRITE( NOUT, FMT = 9997 ) 'DIAG'
00410                GO TO 40
00411             END IF
00412 *
00413 *           Check and initialize the matrix descriptors
00414 *
00415             CALL PMDESCCHK( ICTXT, NOUT, 'A', DESCA,
00416      $                      BLOCK_CYCLIC_2D_INB, MA, NA, IMBA, INBA,
00417      $                      MBA, NBA, RSRCA, CSRCA, MPA, NQA, IPREA,
00418      $                      IMIDA, IPOSTA, 0, 0, IERR( 1 ) )
00419 *
00420             CALL PMDESCCHK( ICTXT, NOUT, 'B', DESCB,
00421      $                      BLOCK_CYCLIC_2D_INB, MB, NB, IMBB, INBB,
00422      $                      MBB, NBB, RSRCB, CSRCB, MPB, NQB, IPREB,
00423      $                      IMIDB, IPOSTB, 0, 0, IERR( 2 ) )
00424 *
00425             CALL PMDESCCHK( ICTXT, NOUT, 'C', DESCC,
00426      $                      BLOCK_CYCLIC_2D_INB, MC, NC, IMBC, INBC,
00427      $                      MBC, NBC, RSRCC, CSRCC, MPC, NQC, IPREC,
00428      $                      IMIDC, IPOSTC, 0, 0, IERR( 3 ) )
00429 *
00430             IF( IERR( 1 ).GT.0 .OR. IERR( 2 ).GT.0 .OR.
00431      $          IERR( 3 ).GT.0 ) THEN
00432                GO TO 40
00433             END IF
00434 *
00435 *           Assign pointers into MEM for matrices corresponding to
00436 *           the distributed matrices A, X and Y.
00437 *
00438             IPA = IPREA + 1
00439             IPB = IPA + DESCA( LLD_ )*NQA
00440             IPC = IPB + DESCB( LLD_ )*NQB
00441 *
00442 *           Check if sufficient memory.
00443 *
00444             MEMREQD = IPC + DESCC( LLD_ )*NQC - 1
00445             IERR( 1 ) = 0
00446             IF( MEMREQD.GT.MEMSIZ ) THEN
00447                IF( IAM.EQ.0 )
00448      $            WRITE( NOUT, FMT = 9987 ) MEMREQD*ZPLXSZ
00449                IERR( 1 ) = 1
00450             END IF
00451 *
00452 *           Check all processes for an error
00453 *
00454             CALL IGSUM2D( ICTXT, 'All', ' ', 1, 1, IERR, 1, -1, 0 )
00455 *
00456             IF( IERR( 1 ).GT.0 ) THEN
00457                IF( IAM.EQ.0 )
00458      $            WRITE( NOUT, FMT = 9988 )
00459                GO TO 40
00460             END IF
00461 *
00462 *           Loop over all PBLAS 3 routines
00463 *
00464             DO 30 L = 1, NSUBS
00465 *
00466 *              Continue only if this subroutine has to be tested.
00467 *
00468                IF( .NOT.LTEST( L ) )
00469      $            GO TO 30
00470 *
00471 *              Define the size of the operands
00472 *
00473                IF( L.EQ.1 ) THEN
00474 *
00475 *                 PZGEMM
00476 *
00477                   NROWC = M
00478                   NCOLC = N
00479                   IF( LSAME( TRANSA, 'N' ) ) THEN
00480                      NROWA = M
00481                      NCOLA = K
00482                   ELSE
00483                      NROWA = K
00484                      NCOLA = M
00485                   END IF
00486                   IF( LSAME( TRANSB, 'N' ) ) THEN
00487                      NROWB = K
00488                      NCOLB = N
00489                   ELSE
00490                      NROWB = N
00491                      NCOLB = K
00492                   END IF
00493                ELSE IF( L.EQ.2 .OR. L.EQ.3 ) THEN
00494 *
00495 *                 PZSYMM, PZHEMM
00496 *
00497                   NROWC = M
00498                   NCOLC = N
00499                   NROWB = M
00500                   NCOLB = N
00501                   IF( LSAME( SIDE, 'L' ) ) THEN
00502                      NROWA = M
00503                      NCOLA = M
00504                   ELSE
00505                      NROWA = N
00506                      NCOLA = N
00507                   END IF
00508                ELSE IF( L.EQ.4 .OR. L.EQ.5 ) THEN
00509 *
00510 *                 PZSYRK, PZHERK
00511 *
00512                   NROWC = N
00513                   NCOLC = N
00514                   IF( LSAME( TRANSA, 'N' ) ) THEN
00515                      NROWA = N
00516                      NCOLA = K
00517                   ELSE
00518                      NROWA = K
00519                      NCOLA = N
00520                   END IF
00521                   NROWB = 0
00522                   NCOLB = 0
00523                ELSE IF( L.EQ.6 .OR. L.EQ.7 ) THEN
00524 *
00525 *                 PZSYR2K, PZHER2K
00526 *
00527                   NROWC = N
00528                   NCOLC = N
00529                   IF( LSAME( TRANSA, 'N' ) ) THEN
00530                      NROWA = N
00531                      NCOLA = K
00532                      NROWB = N
00533                      NCOLB = K
00534                   ELSE
00535                      NROWA = K
00536                      NCOLA = N
00537                      NROWB = K
00538                      NCOLB = N
00539                   END IF
00540                ELSE IF( L.EQ.8 .OR. L.EQ.9 ) THEN
00541 *
00542 *                 PZTRMM, PZTRSM
00543 *
00544                   NROWB = M
00545                   NCOLB = N
00546                   IF( LSAME( SIDE, 'L' ) ) THEN
00547                      NROWA = M
00548                      NCOLA = M
00549                   ELSE
00550                      NROWA = N
00551                      NCOLA = N
00552                   END IF
00553                   NROWC = 0
00554                   NCOLC = 0
00555                ELSE IF( L.EQ.10 .OR. L.EQ.11 ) THEN
00556 *
00557 *                 PZGEADD, PZTRADD
00558 *
00559                   IF( LSAME( TRANSA, 'N' ) ) THEN
00560                      NROWA = M
00561                      NCOLA = N
00562                   ELSE
00563                      NROWA = N
00564                      NCOLA = M
00565                   END IF
00566                   NROWC = M
00567                   NCOLC = N
00568                   NROWB = 0
00569                   NCOLB = 0
00570 *
00571                END IF
00572 *
00573 *              Check the validity of the operand sizes
00574 *
00575                CALL PMDIMCHK( ICTXT, NOUT, NROWA, NCOLA, 'A', IA, JA,
00576      $                        DESCA, IERR( 1 ) )
00577                CALL PMDIMCHK( ICTXT, NOUT, NROWB, NCOLB, 'B', IB, JB,
00578      $                        DESCB, IERR( 2 ) )
00579                CALL PMDIMCHK( ICTXT, NOUT, NROWC, NCOLC, 'C', IC, JC,
00580      $                        DESCC, IERR( 3 ) )
00581 *
00582                IF( IERR( 1 ).NE.0 .OR. IERR( 2 ).NE.0 .OR.
00583      $             IERR( 3 ).NE.0 ) THEN
00584                   GO TO 30
00585                END IF
00586 *
00587 *              Check special values of TRANSA for symmetric and
00588 *              hermitian rank-k and rank-2k updates.
00589 *
00590                IF( L.EQ.4 .OR. L.EQ.6 ) THEN
00591                   IF( .NOT.LSAME( TRANSA, 'N' ).AND.
00592      $                .NOT.LSAME( TRANSA, 'T' ) ) THEN
00593                      IF( IAM.EQ.0 )
00594      $                  WRITE( NOUT, FMT = 9983 ) SNAMES( L ), 'TRANSA'
00595                      GO TO 30
00596                   END IF
00597                ELSE IF( L.EQ.5 .OR. L.EQ.7 ) THEN
00598                   IF( .NOT.LSAME( TRANSA, 'N' ).AND.
00599      $                .NOT.LSAME( TRANSA, 'C' ) ) THEN
00600                      IF( IAM.EQ.0 )
00601      $                  WRITE( NOUT, FMT = 9983 ) SNAMES( L ), 'TRANSA'
00602                      GO TO 30
00603                   END IF
00604                END IF
00605 *
00606 *              Generate distributed matrices A, B and C
00607 *
00608                IF( L.EQ.2 ) THEN
00609 *
00610 *                 PZSYMM
00611 *
00612                   AFORM   = 'S'
00613                   ADIAGDO = 'N'
00614                   OFFDA   = IA - JA
00615                   CFORM   = 'N'
00616                   OFFDC   = 0
00617 *
00618                ELSE IF( L.EQ.3 ) THEN
00619 *
00620 *                 PZHEMM
00621 *
00622                   AFORM   = 'H'
00623                   ADIAGDO = 'N'
00624                   OFFDA   = IA - JA
00625                   CFORM   = 'N'
00626                   OFFDC   = 0
00627 *
00628                ELSE IF( L.EQ.4 .OR. L.EQ.6 ) THEN
00629 *
00630 *                 PZSYRK, PZSYR2K
00631 *
00632                   AFORM   = 'N'
00633                   ADIAGDO = 'N'
00634                   OFFDA   = 0
00635                   CFORM   = 'S'
00636                   OFFDC   = IC - JC
00637 *
00638                ELSE IF( L.EQ.5 .OR. L.EQ.7 ) THEN
00639 *
00640 *                 PZHERK, PZHER2K
00641 *
00642                   AFORM = 'N'
00643                   ADIAGDO = 'N'
00644                   OFFDA = 0
00645                   CFORM = 'H'
00646                   OFFDC = IC - JC
00647 *
00648                ELSE IF( ( L.EQ.9 ).AND.( LSAME( DIAG, 'N' ) ) ) THEN
00649 *
00650 *                 PZTRSM
00651 *
00652                   AFORM   = 'N'
00653                   ADIAGDO = 'D'
00654                   OFFDA   = IA - JA
00655                   CFORM   = 'N'
00656                   OFFDC   = 0
00657 *
00658                ELSE
00659 *
00660 *                 Default values
00661 *
00662                   AFORM   = 'N'
00663                   ADIAGDO = 'N'
00664                   OFFDA   = 0
00665                   CFORM   = 'N'
00666                   OFFDC   = 0
00667 *
00668                END IF
00669 *
00670                CALL PZLAGEN( .FALSE., AFORM, ADIAGDO, OFFDA, MA, NA,
00671      $                       1, 1, DESCA, IASEED, MEM( IPA ),
00672      $                       DESCA( LLD_ ) )
00673                IF( ( L.EQ.9 ).AND.( .NOT.( LSAME( DIAG, 'N' ) ) ).AND.
00674      $             ( MAX( NROWA, NCOLA ).GT.1 ) ) THEN
00675                   SCALE = ONE / DCMPLX( DBLE( MAX( NROWA, NCOLA ) ) )
00676                   IF( LSAME( UPLO, 'L' ) ) THEN
00677                      CALL PZLASCAL( 'Lower', NROWA-1, NCOLA-1, SCALE,
00678      $                              MEM( IPA ), IA+1, JA, DESCA )
00679                   ELSE
00680                      CALL PZLASCAL( 'Upper', NROWA-1, NCOLA-1, SCALE,
00681      $                              MEM( IPA ), IA, JA+1, DESCA )
00682                   END IF
00683 *
00684                END IF
00685 *
00686                IF( BCHECK( L ) )
00687      $            CALL PZLAGEN( .FALSE., 'None', 'No diag', 0, MB, NB,
00688      $                          1, 1, DESCB, IBSEED, MEM( IPB ),
00689      $                          DESCB( LLD_ ) )
00690 *
00691                IF( CCHECK( L ) )
00692      $            CALL PZLAGEN( .FALSE., CFORM, 'No diag', OFFDC, MC,
00693      $                          NC, 1, 1, DESCC, ICSEED, MEM( IPC ),
00694      $                          DESCC( LLD_ ) )
00695 *
00696                INFO = 0
00697                CALL PB_BOOT()
00698                CALL BLACS_BARRIER( ICTXT, 'All' )
00699 *
00700 *              Call the Level 3 PBLAS routine
00701 *
00702                IF( L.EQ.1 ) THEN
00703 *
00704 *                 Test PZGEMM
00705 *
00706                   NOPS = PDOPBL3( SNAMES( L ), M, N, K )
00707 *
00708                   CALL PB_TIMER( 1 )
00709                   CALL PZGEMM( TRANSA, TRANSB, M, N, K, ALPHA,
00710      $                         MEM( IPA ), IA, JA, DESCA, MEM( IPB ),
00711      $                         IB, JB, DESCB, BETA, MEM( IPC ), IC, JC,
00712      $                         DESCC )
00713                   CALL PB_TIMER( 1 )
00714 *
00715                ELSE IF( L.EQ.2 ) THEN
00716 *
00717 *                 Test PZSYMM
00718 *
00719                   IF( LSAME( SIDE, 'L' ) ) THEN
00720                      NOPS = PDOPBL3( SNAMES( L ), M, N, 0 )
00721                   ELSE
00722                      NOPS = PDOPBL3( SNAMES( L ), M, N, 1 )
00723                   END IF
00724 *
00725                   CALL PB_TIMER( 1 )
00726                   CALL PZSYMM( SIDE, UPLO, M, N, ALPHA, MEM( IPA ), IA,
00727      $                         JA, DESCA, MEM( IPB ), IB, JB, DESCB,
00728      $                         BETA, MEM( IPC ), IC, JC, DESCC )
00729                   CALL PB_TIMER( 1 )
00730 *
00731                ELSE IF( L.EQ.3 ) THEN
00732 *
00733 *                 Test PZHEMM
00734 *
00735                   IF( LSAME( SIDE, 'L' ) ) THEN
00736                      NOPS = PDOPBL3( SNAMES( L ), M, N, 0 )
00737                   ELSE
00738                      NOPS = PDOPBL3( SNAMES( L ), M, N, 1 )
00739                   END IF
00740 *
00741                   CALL PB_TIMER( 1 )
00742                   CALL PZHEMM( SIDE, UPLO, M, N, ALPHA, MEM( IPA ), IA,
00743      $                         JA, DESCA, MEM( IPB ), IB, JB, DESCB,
00744      $                         BETA, MEM( IPC ), IC, JC, DESCC )
00745                   CALL PB_TIMER( 1 )
00746 *
00747                ELSE IF( L.EQ.4 ) THEN
00748 *
00749 *                 Test PZSYRK
00750 *
00751                   NOPS = PDOPBL3( SNAMES( L ), N, N, K )
00752 *
00753                   CALL PB_TIMER( 1 )
00754                   CALL PZSYRK( UPLO, TRANSA, N, K, ALPHA, MEM( IPA ),
00755      $                         IA, JA, DESCA, BETA, MEM( IPC ), IC, JC,
00756      $                         DESCC )
00757                   CALL PB_TIMER( 1 )
00758 *
00759                ELSE IF( L.EQ.5 ) THEN
00760 *
00761 *                 Test PZHERK
00762 *
00763                   NOPS = PDOPBL3( SNAMES( L ), N, N, K )
00764 *
00765                   CALL PB_TIMER( 1 )
00766                   CALL PZHERK( UPLO, TRANSA, N, K, DBLE( ALPHA ),
00767      $                         MEM( IPA ), IA, JA, DESCA, DBLE( BETA ),
00768      $                         MEM( IPC ), IC, JC, DESCC )
00769                   CALL PB_TIMER( 1 )
00770 *
00771                ELSE IF( L.EQ.6 ) THEN
00772 *
00773 *                 Test PZSYR2K
00774 *
00775                   NOPS = PDOPBL3( SNAMES( L ), N, N, K )
00776 *
00777                   CALL PB_TIMER( 1 )
00778                   CALL PZSYR2K( UPLO, TRANSA, N, K, ALPHA, MEM( IPA ),
00779      $                          IA, JA, DESCA, MEM( IPB ), IB, JB,
00780      $                          DESCB, BETA, MEM( IPC ), IC, JC,
00781      $                          DESCC )
00782                   CALL PB_TIMER( 1 )
00783 *
00784                ELSE IF( L.EQ.7 ) THEN
00785 *
00786 *                 Test PZHER2K
00787 *
00788                   NOPS = PDOPBL3( SNAMES( L ), N, N, K )
00789 *
00790                   CALL PB_TIMER( 1 )
00791                   CALL PZHER2K( UPLO, TRANSA, N, K, ALPHA, MEM( IPA ),
00792      $                          IA, JA, DESCA, MEM( IPB ), IB, JB,
00793      $                          DESCB, DBLE( BETA ), MEM( IPC ), IC, JC,
00794      $                          DESCC )
00795                   CALL PB_TIMER( 1 )
00796 *
00797                ELSE IF( L.EQ.8 ) THEN
00798 *
00799 *                 Test PZTRMM
00800 *
00801                   IF( LSAME( SIDE, 'L' ) ) THEN
00802                      NOPS = PDOPBL3( SNAMES( L ), M, N, 0 )
00803                   ELSE
00804                      NOPS = PDOPBL3( SNAMES( L ), M, N, 1 )
00805                   END IF
00806 *
00807                   CALL PB_TIMER( 1 )
00808                   CALL PZTRMM( SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA,
00809      $                         MEM( IPA ), IA, JA, DESCA, MEM( IPB ),
00810      $                         IB, JB, DESCB )
00811                   CALL PB_TIMER( 1 )
00812 *
00813                ELSE IF( L.EQ.9 ) THEN
00814 *
00815 *                 Test PZTRSM
00816 *
00817                   IF( LSAME( SIDE, 'L' ) ) THEN
00818                      NOPS = PDOPBL3( SNAMES( L ), M, N, 0 )
00819                   ELSE
00820                      NOPS = PDOPBL3( SNAMES( L ), M, N, 1 )
00821                   END IF
00822 *
00823                   CALL PB_TIMER( 1 )
00824                   CALL PZTRSM( SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA,
00825      $                         MEM( IPA ), IA, JA, DESCA, MEM( IPB ),
00826      $                         IB, JB, DESCB )
00827                   CALL PB_TIMER( 1 )
00828 *
00829                ELSE IF( L.EQ.10 ) THEN
00830 *
00831 *                 Test PZGEADD
00832 *
00833                   NOPS = PDOPBL3( SNAMES( L ), M, N, M )
00834 *
00835                   CALL PB_TIMER( 1 )
00836                   CALL PZGEADD( TRANSA, M, N, ALPHA, MEM( IPA ), IA, JA,
00837      $                          DESCA, BETA, MEM( IPC ), IC, JC, DESCC )
00838                   CALL PB_TIMER( 1 )
00839 *
00840                ELSE IF( L.EQ.11 ) THEN
00841 *
00842 *                 Test PZTRADD
00843 *
00844                   IF( LSAME( UPLO, 'U' ) ) THEN
00845                      NOPS = PDOPBL3( SNAMES( L ), M, N, 0 )
00846                   ELSE
00847                      NOPS = PDOPBL3( SNAMES( L ), M, N, 1 )
00848                   END IF
00849 *
00850                   CALL PB_TIMER( 1 )
00851                   CALL PZTRADD( UPLO, TRANSA, M, N, ALPHA, MEM( IPA ),
00852      $                          IA, JA, DESCA, BETA, MEM( IPC ), IC, JC,
00853      $                          DESCC )
00854                   CALL PB_TIMER( 1 )
00855 *
00856                END IF
00857 *
00858 *              Check if the operation has been performed.
00859 *
00860                IF( INFO.NE.0 ) THEN
00861                   IF( IAM.EQ.0 )
00862      $               WRITE( NOUT, FMT = 9982 ) INFO
00863                   GO TO 30
00864                END IF
00865 *
00866                CALL PB_COMBINE( ICTXT, 'All', '>', 'W', 1, 1, WTIME )
00867                CALL PB_COMBINE( ICTXT, 'All', '>', 'C', 1, 1, CTIME )
00868 *
00869 *              Only node 0 prints timing test result
00870 *
00871                IF( IAM.EQ.0 ) THEN
00872 *
00873 *                 Print WALL time if machine supports it
00874 *
00875                   IF( WTIME( 1 ).GT.0.0D+0 ) THEN
00876                      WFLOPS = NOPS / ( WTIME( 1 ) * 1.0D+6 )
00877                   ELSE
00878                      WFLOPS = 0.0D+0
00879                   END IF
00880 *
00881 *                 Print CPU time if machine supports it
00882 *
00883                   IF( CTIME( 1 ).GT.0.0D+0 ) THEN
00884                      CFLOPS = NOPS / ( CTIME( 1 ) * 1.0D+6 )
00885                   ELSE
00886                      CFLOPS = 0.0D+0
00887                   END IF
00888 *
00889                   WRITE( NOUT, FMT = 9981 ) SNAMES( L ), WTIME( 1 ),
00890      $                                      WFLOPS, CTIME( 1 ), CFLOPS
00891 *
00892                END IF
00893 *
00894    30       CONTINUE
00895 *
00896    40       IF( IAM.EQ.0 ) THEN
00897                WRITE( NOUT, FMT = 9995 )
00898                WRITE( NOUT, FMT = * )
00899                WRITE( NOUT, FMT = 9986 ) J
00900             END IF
00901 *
00902    50   CONTINUE
00903 *
00904         CALL BLACS_GRIDEXIT( ICTXT )
00905 *
00906    60 CONTINUE
00907 *
00908       IF( IAM.EQ.0 ) THEN
00909          WRITE( NOUT, FMT = * )
00910          WRITE( NOUT, FMT = 9985 )
00911          WRITE( NOUT, FMT = * )
00912       END IF
00913 *
00914       CALL BLACS_EXIT( 0 )
00915 *
00916  9999 FORMAT( 'ILLEGAL ', A, ': ', A, ' = ', I10,
00917      $        ' should be at least 1' )
00918  9998 FORMAT( 'ILLEGAL GRID: NPROW*NPCOL = ', I4,
00919      $        '. It can be at most', I4 )
00920  9997 FORMAT( 'Bad ', A, ' parameters: going on to next test case.' )
00921  9996 FORMAT( 2X, 'Test number ', I2 , ' started on a ', I4, ' x ',
00922      $        I4, ' process grid.' )
00923  9995 FORMAT( 2X, '   ------------------------------------------------',
00924      $        '-------------------' )
00925  9994 FORMAT( 2X, '        M      N      K    SIDE  UPLO  TRANSA  ',
00926      $        'TRANSB  DIAG' )
00927  9993 FORMAT( 5X,I6,1X,I6,1X,I6,6X,A1,5X,A1,7X,A1,7X,A1,5X,A1 )
00928  9992 FORMAT( 2X, '       IA     JA     MA     NA   IMBA   INBA',
00929      $        '    MBA    NBA RSRCA CSRCA' )
00930  9991 FORMAT( 5X,I6,1X,I6,1X,I6,1X,I6,1X,I6,1X,I6,1X,I6,1X,I6,
00931      $        1X,I5,1X,I5 )
00932  9990 FORMAT( 2X, '       IB     JB     MB     NB   IMBB   INBB',
00933      $        '    MBB    NBB RSRCB CSRCB' )
00934  9989 FORMAT( 2X, '       IC     JC     MC     NC   IMBC   INBC',
00935      $        '    MBC    NBC RSRCC CSRCC' )
00936  9988 FORMAT( 'Not enough memory for this test: going on to',
00937      $        ' next test case.' )
00938  9987 FORMAT( 'Not enough memory. Need: ', I12 )
00939  9986 FORMAT( 2X, 'Test number ', I2, ' completed.' )
00940  9985 FORMAT( 2X, 'End of Tests.' )
00941  9984 FORMAT( 2X, 'Tests started.' )
00942  9983 FORMAT( 5X, A, '     ***** ', A, ' has an incorrect value:     ',
00943      $            ' BYPASS  *****' )
00944  9982 FORMAT( 2X, '   ***** Operation not supported, error code: ',
00945      $        I5, ' *****' )
00946  9981 FORMAT( 2X, '|  ', A, 2X, F13.3, 2X, F13.3, 2X, F13.3, 2X, F13.3 )
00947  9980 FORMAT( 2X, '            WALL time (s)    WALL Mflops ',
00948      $        '  CPU time (s)     CPU Mflops' )
00949 *
00950       STOP
00951 *
00952 *     End of PZBLA3TIM
00953 *
00954       END
00955       SUBROUTINE PZBLA3TIMINFO( SUMMRY, NOUT, NMAT, DIAGVAL, SIDEVAL,
00956      $                          TRNAVAL, TRNBVAL, UPLOVAL, MVAL,
00957      $                          NVAL, KVAL, MAVAL, NAVAL, IMBAVAL,
00958      $                          MBAVAL, INBAVAL, NBAVAL, RSCAVAL,
00959      $                          CSCAVAL, IAVAL, JAVAL, MBVAL, NBVAL,
00960      $                          IMBBVAL, MBBVAL, INBBVAL, NBBVAL,
00961      $                          RSCBVAL, CSCBVAL, IBVAL, JBVAL,
00962      $                          MCVAL, NCVAL, IMBCVAL, MBCVAL,
00963      $                          INBCVAL, NBCVAL, RSCCVAL, CSCCVAL,
00964      $                          ICVAL, JCVAL, LDVAL, NGRIDS, PVAL,
00965      $                          LDPVAL, QVAL, LDQVAL, NBLOG, LTEST,
00966      $                          IAM, NPROCS, ALPHA, BETA, WORK )
00967 *
00968 *  -- PBLAS test routine (version 2.0) --
00969 *     University of Tennessee, Knoxville, Oak Ridge National Laboratory,
00970 *     and University of California, Berkeley.
00971 *     April 1, 1998
00972 *
00973 *     .. Scalar Arguments ..
00974       INTEGER            IAM, LDPVAL, LDQVAL, LDVAL, NBLOG, NGRIDS,
00975      $                   NMAT, NOUT, NPROCS
00976       COMPLEX*16         ALPHA, BETA
00977 *     ..
00978 *     .. Array Arguments ..
00979       CHARACTER*( * )    SUMMRY
00980       CHARACTER*1        DIAGVAL( LDVAL ), SIDEVAL( LDVAL ),
00981      $                   TRNAVAL( LDVAL ), TRNBVAL( LDVAL ),
00982      $                   UPLOVAL( LDVAL )
00983       LOGICAL            LTEST( * )
00984       INTEGER            CSCAVAL( LDVAL ), CSCBVAL( LDVAL ),
00985      $                   CSCCVAL( LDVAL ), IAVAL( LDVAL ),
00986      $                   IBVAL( LDVAL ), ICVAL( LDVAL ),
00987      $                   IMBAVAL( LDVAL ), IMBBVAL( LDVAL ),
00988      $                   IMBCVAL( LDVAL ), INBAVAL( LDVAL ),
00989      $                   INBBVAL( LDVAL ), INBCVAL( LDVAL ),
00990      $                   JAVAL( LDVAL ), JBVAL( LDVAL ), JCVAL( LDVAL ),
00991      $                   KVAL( LDVAL ), MAVAL( LDVAL ), MBAVAL( LDVAL ),
00992      $                   MBBVAL( LDVAL ), MBCVAL( LDVAL ),
00993      $                   MBVAL( LDVAL ), MCVAL( LDVAL ), MVAL( LDVAL ),
00994      $                   NAVAL( LDVAL ), NBAVAL( LDVAL ),
00995      $                   NBBVAL( LDVAL ), NBCVAL( LDVAL ),
00996      $                   NBVAL( LDVAL ), NCVAL( LDVAL ), NVAL( LDVAL ),
00997      $                   PVAL( LDPVAL ), QVAL( LDQVAL ),
00998      $                   RSCAVAL( LDVAL ), RSCBVAL( LDVAL ),
00999      $                   RSCCVAL( LDVAL ), WORK( * )
01000 *     ..
01001 *
01002 *  Purpose
01003 *  =======
01004 *
01005 *  PZBLA3TIMINFO  get  the needed startup information for timing various
01006 *  Level 3 PBLAS routines, and transmits it to all processes.
01007 *
01008 *  Notes
01009 *  =====
01010 *
01011 *  For packing the information we assumed that the length in bytes of an
01012 *  integer is equal to the length in bytes of a real single precision.
01013 *
01014 *  Arguments
01015 *  =========
01016 *
01017 *  SUMMRY  (global output) CHARACTER*(*)
01018 *          On  exit,  SUMMRY  is  the  name of output (summary) file (if
01019 *          any). SUMMRY is only defined for process 0.
01020 *
01021 *  NOUT    (global output) INTEGER
01022 *          On exit, NOUT  specifies the unit number for the output file.
01023 *          When NOUT is 6, output to screen,  when  NOUT is 0, output to
01024 *          stderr. NOUT is only defined for process 0.
01025 *
01026 *  NMAT    (global output) INTEGER
01027 *          On exit,  NMAT  specifies the number of different test cases.
01028 *
01029 *  DIAGVAL (global output) CHARACTER array
01030 *          On entry,  DIAGVAL  is  an array of dimension LDVAL. On exit,
01031 *          this array contains the values of DIAG to run the code with.
01032 *
01033 *  SIDEVAL (global output) CHARACTER array
01034 *          On entry,  SIDEVAL  is  an array of dimension LDVAL. On exit,
01035 *          this array contains the values of SIDE to run the code with.
01036 *
01037 *  TRNAVAL (global output) CHARACTER array
01038 *          On entry, TRNAVAL  is an array of dimension LDVAL.  On  exit,
01039 *          this array contains  the  values  of  TRANSA  to run the code
01040 *          with.
01041 *
01042 *  TRNBVAL (global output) CHARACTER array
01043 *          On entry, TRNBVAL  is an array of dimension LDVAL.  On  exit,
01044 *          this array contains  the  values  of  TRANSB  to run the code
01045 *          with.
01046 *
01047 *  UPLOVAL (global output) CHARACTER array
01048 *          On entry, UPLOVAL  is an array of dimension LDVAL.  On  exit,
01049 *          this array contains the values of UPLO to run the code with.
01050 *
01051 *  MVAL    (global output) INTEGER array
01052 *          On entry, MVAL is an array of dimension LDVAL.  On exit, this
01053 *          array contains the values of M to run the code with.
01054 *
01055 *  NVAL    (global output) INTEGER array
01056 *          On entry, NVAL is an array of dimension LDVAL.  On exit, this
01057 *          array contains the values of N to run the code with.
01058 *
01059 *  KVAL    (global output) INTEGER array
01060 *          On entry, KVAL is an array of dimension LDVAL.  On exit, this
01061 *          array contains the values of K to run the code with.
01062 *
01063 *  MAVAL   (global output) INTEGER array
01064 *          On entry, MAVAL is an array of dimension LDVAL. On exit, this
01065 *          array  contains  the values  of  DESCA( M_ )  to run the code
01066 *          with.
01067 *
01068 *  NAVAL   (global output) INTEGER array
01069 *          On entry, NAVAL is an array of dimension LDVAL. On exit, this
01070 *          array  contains  the values  of  DESCA( N_ )  to run the code
01071 *          with.
01072 *
01073 *  IMBAVAL (global output) INTEGER array
01074 *          On entry,  IMBAVAL  is an array of  dimension LDVAL. On exit,
01075 *          this  array  contains  the values of DESCA( IMB_ ) to run the
01076 *          code with.
01077 *
01078 *  MBAVAL  (global output) INTEGER array
01079 *          On entry,  MBAVAL  is an array of  dimension  LDVAL. On exit,
01080 *          this  array  contains  the values of DESCA( MB_ ) to  run the
01081 *          code with.
01082 *
01083 *  INBAVAL (global output) INTEGER array
01084 *          On entry,  INBAVAL  is an array of  dimension LDVAL. On exit,
01085 *          this  array  contains  the values of DESCA( INB_ ) to run the
01086 *          code with.
01087 *
01088 *  NBAVAL  (global output) INTEGER array
01089 *          On entry,  NBAVAL  is an array of  dimension  LDVAL. On exit,
01090 *          this  array  contains  the values of DESCA( NB_ ) to  run the
01091 *          code with.
01092 *
01093 *  RSCAVAL (global output) INTEGER array
01094 *          On entry, RSCAVAL  is an array of  dimension  LDVAL. On exit,
01095 *          this  array  contains the values of DESCA( RSRC_ ) to run the
01096 *          code with.
01097 *
01098 *  CSCAVAL (global output) INTEGER array
01099 *          On entry, CSCAVAL  is an array of  dimension  LDVAL. On exit,
01100 *          this  array  contains the values of DESCA( CSRC_ ) to run the
01101 *          code with.
01102 *
01103 *  IAVAL   (global output) INTEGER array
01104 *          On entry, IAVAL is an array of dimension LDVAL. On exit, this
01105 *          array  contains the values of IA to run the code with.
01106 *
01107 *  JAVAL   (global output) INTEGER array
01108 *          On entry, JAVAL is an array of dimension LDVAL. On exit, this
01109 *          array  contains the values of JA to run the code with.
01110 *
01111 *  MBVAL   (global output) INTEGER array
01112 *          On entry, MBVAL is an array of dimension LDVAL. On exit, this
01113 *          array  contains  the values  of  DESCB( M_ )  to run the code
01114 *          with.
01115 *
01116 *  NBVAL   (global output) INTEGER array
01117 *          On entry, NBVAL is an array of dimension LDVAL. On exit, this
01118 *          array  contains  the values  of  DESCB( N_ )  to run the code
01119 *          with.
01120 *
01121 *  IMBBVAL (global output) INTEGER array
01122 *          On entry,  IMBBVAL  is an array of  dimension LDVAL. On exit,
01123 *          this  array  contains  the values of DESCB( IMB_ ) to run the
01124 *          code with.
01125 *
01126 *  MBBVAL  (global output) INTEGER array
01127 *          On entry,  MBBVAL  is an array of  dimension  LDVAL. On exit,
01128 *          this  array  contains  the values of DESCB( MB_ ) to  run the
01129 *          code with.
01130 *
01131 *  INBBVAL (global output) INTEGER array
01132 *          On entry,  INBBVAL  is an array of  dimension LDVAL. On exit,
01133 *          this  array  contains  the values of DESCB( INB_ ) to run the
01134 *          code with.
01135 *
01136 *  NBBVAL  (global output) INTEGER array
01137 *          On entry,  NBBVAL  is an array of  dimension  LDVAL. On exit,
01138 *          this  array  contains  the values of DESCB( NB_ ) to  run the
01139 *          code with.
01140 *
01141 *  RSCBVAL (global output) INTEGER array
01142 *          On entry, RSCBVAL  is an array of  dimension  LDVAL. On exit,
01143 *          this  array  contains the values of DESCB( RSRC_ ) to run the
01144 *          code with.
01145 *
01146 *  CSCBVAL (global output) INTEGER array
01147 *          On entry, CSCBVAL  is an array of  dimension  LDVAL. On exit,
01148 *          this  array  contains the values of DESCB( CSRC_ ) to run the
01149 *          code with.
01150 *
01151 *  IBVAL   (global output) INTEGER array
01152 *          On entry, IBVAL is an array of dimension LDVAL. On exit, this
01153 *          array  contains the values of IB to run the code with.
01154 *
01155 *  JBVAL   (global output) INTEGER array
01156 *          On entry, JBVAL is an array of dimension LDVAL. On exit, this
01157 *          array  contains the values of JB to run the code with.
01158 *
01159 *  MCVAL   (global output) INTEGER array
01160 *          On entry, MCVAL is an array of dimension LDVAL. On exit, this
01161 *          array  contains  the values  of  DESCC( M_ )  to run the code
01162 *          with.
01163 *
01164 *  NCVAL   (global output) INTEGER array
01165 *          On entry, NCVAL is an array of dimension LDVAL. On exit, this
01166 *          array  contains  the values  of  DESCC( N_ )  to run the code
01167 *          with.
01168 *
01169 *  IMBCVAL (global output) INTEGER array
01170 *          On entry,  IMBCVAL  is an array of  dimension LDVAL. On exit,
01171 *          this  array  contains  the values of DESCC( IMB_ ) to run the
01172 *          code with.
01173 *
01174 *  MBCVAL  (global output) INTEGER array
01175 *          On entry,  MBCVAL  is an array of  dimension  LDVAL. On exit,
01176 *          this  array  contains  the values of DESCC( MB_ ) to  run the
01177 *          code with.
01178 *
01179 *  INBCVAL (global output) INTEGER array
01180 *          On entry,  INBCVAL  is an array of  dimension LDVAL. On exit,
01181 *          this  array  contains  the values of DESCC( INB_ ) to run the
01182 *          code with.
01183 *
01184 *  NBCVAL  (global output) INTEGER array
01185 *          On entry,  NBCVAL  is an array of  dimension  LDVAL. On exit,
01186 *          this  array  contains  the values of DESCC( NB_ ) to  run the
01187 *          code with.
01188 *
01189 *  RSCCVAL (global output) INTEGER array
01190 *          On entry, RSCCVAL  is an array of  dimension  LDVAL. On exit,
01191 *          this  array  contains the values of DESCC( RSRC_ ) to run the
01192 *          code with.
01193 *
01194 *  CSCCVAL (global output) INTEGER array
01195 *          On entry, CSCCVAL  is an array of  dimension  LDVAL. On exit,
01196 *          this  array  contains the values of DESCC( CSRC_ ) to run the
01197 *          code with.
01198 *
01199 *  ICVAL   (global output) INTEGER array
01200 *          On entry, ICVAL is an array of dimension LDVAL. On exit, this
01201 *          array  contains the values of IC to run the code with.
01202 *
01203 *  JCVAL   (global output) INTEGER array
01204 *          On entry, JCVAL is an array of dimension LDVAL. On exit, this
01205 *          array  contains the values of JC to run the code with.
01206 *
01207 *  LDVAL   (global input) INTEGER
01208 *          On entry, LDVAL specifies the maximum number of different va-
01209 *          lues  that  can be used for DIAG, SIDE, TRANSA, TRANSB, UPLO,
01210 *          M,  N,  K,  DESCA(:), IA, JA, DESCB(:), IB, JB, DESCC(:), IC,
01211 *          JC. This is also the maximum number of test cases.
01212 *
01213 *  NGRIDS  (global output) INTEGER
01214 *          On exit, NGRIDS specifies the number of different values that
01215 *          can be used for P and Q.
01216 *
01217 *  PVAL    (global output) INTEGER array
01218 *          On entry, PVAL is an array of dimension LDPVAL. On exit, this
01219 *          array contains the values of P to run the code with.
01220 *
01221 *  LDPVAL  (global input) INTEGER
01222 *          On entry,  LDPVAL  specifies  the maximum number of different
01223 *          values that can be used for P.
01224 *
01225 *  QVAL    (global output) INTEGER array
01226 *          On entry, QVAL is an array of dimension LDQVAL. On exit, this
01227 *          array contains the values of Q to run the code with.
01228 *
01229 *  LDQVAL  (global input) INTEGER
01230 *          On entry,  LDQVAL  specifies  the maximum number of different
01231 *          values that can be used for Q.
01232 *
01233 *  NBLOG   (global output) INTEGER
01234 *          On exit, NBLOG specifies the logical computational block size
01235 *          to run the tests with. NBLOG must be at least one.
01236 *
01237 *  LTEST   (global output) LOGICAL array
01238 *          On entry, LTEST  is an array of dimension at least eleven. On
01239 *          exit, if LTEST( i ) is .TRUE., the i-th Level 3 PBLAS routine
01240 *          will be tested.  See  the  input file for the ordering of the
01241 *          routines.
01242 *
01243 *  IAM     (local input) INTEGER
01244 *          On entry,  IAM  specifies the number of the process executing
01245 *          this routine.
01246 *
01247 *  NPROCS  (global input) INTEGER
01248 *          On entry, NPROCS specifies the total number of processes.
01249 *
01250 *  ALPHA   (global output) COMPLEX*16
01251 *          On exit, ALPHA specifies the value of alpha to be used in all
01252 *          the test cases.
01253 *
01254 *  BETA    (global output) COMPLEX*16
01255 *          On exit, BETA  specifies the value of beta  to be used in all
01256 *          the test cases.
01257 *
01258 *  WORK    (local workspace) INTEGER array
01259 *          On   entry,   WORK   is   an  array  of  dimension  at  least
01260 *          MAX( 3, 2*NGRIDS+38*NMAT+NSUBS ) with NSUBS = 11. This  array
01261 *          is  used  to  pack all output arrays in order to send info in
01262 *          one message.
01263 *
01264 *  -- Written on April 1, 1998 by
01265 *     Antoine Petitet, University  of  Tennessee, Knoxville 37996, USA.
01266 *
01267 *  =====================================================================
01268 *
01269 *     .. Parameters ..
01270       INTEGER            NIN, NSUBS
01271       PARAMETER          ( NIN = 11, NSUBS = 11 )
01272 *     ..
01273 *     .. Local Scalars ..
01274       LOGICAL            LTESTT
01275       INTEGER            I, ICTXT, J
01276 *     ..
01277 *     .. Local Arrays ..
01278       CHARACTER*7        SNAMET
01279       CHARACTER*79       USRINFO
01280 *     ..
01281 *     .. External Subroutines ..
01282       EXTERNAL           BLACS_ABORT, BLACS_GET, BLACS_GRIDEXIT,
01283      $                   BLACS_GRIDINIT, BLACS_SETUP, ICOPY, IGEBR2D,
01284      $                   IGEBS2D, SGEBR2D, SGEBS2D, ZGEBR2D, ZGEBS2D
01285 *     ..
01286 *     .. Intrinsic Functions ..
01287       INTRINSIC          CHAR, ICHAR, MAX, MIN
01288 *     ..
01289 *     .. Common Blocks ..
01290       CHARACTER*7        SNAMES( NSUBS )
01291       COMMON             /SNAMEC/SNAMES
01292 *     ..
01293 *     .. Executable Statements ..
01294 *
01295 *     Process 0 reads the input data, broadcasts to other processes and
01296 *     writes needed information to NOUT
01297 *
01298       IF( IAM.EQ.0 ) THEN
01299 *
01300 *        Open file and skip data file header
01301 *
01302          OPEN( NIN, FILE='PZBLAS3TIM.dat', STATUS='OLD' )
01303          READ( NIN, FMT = * ) SUMMRY
01304          SUMMRY = ' '
01305 *
01306 *        Read in user-supplied info about machine type, compiler, etc.
01307 *
01308          READ( NIN, FMT = 9999 ) USRINFO
01309 *
01310 *        Read name and unit number for summary output file
01311 *
01312          READ( NIN, FMT = * ) SUMMRY
01313          READ( NIN, FMT = * ) NOUT
01314          IF( NOUT.NE.0 .AND. NOUT.NE.6 )
01315      $      OPEN( NOUT, FILE = SUMMRY, STATUS = 'UNKNOWN' )
01316 *
01317 *        Read and check the parameter values for the tests.
01318 *
01319 *        Get logical computational block size
01320 *
01321          READ( NIN, FMT = * ) NBLOG
01322          IF( NBLOG.LT.1 )
01323      $      NBLOG = 32
01324 *
01325 *        Get number of grids
01326 *
01327          READ( NIN, FMT = * ) NGRIDS
01328          IF( NGRIDS.LT.1 .OR. NGRIDS.GT.LDPVAL ) THEN
01329             WRITE( NOUT, FMT = 9998 ) 'Grids', LDPVAL
01330             GO TO 120
01331          ELSE IF( NGRIDS.GT.LDQVAL ) THEN
01332             WRITE( NOUT, FMT = 9998 ) 'Grids', LDQVAL
01333             GO TO 120
01334          END IF
01335 *
01336 *        Get values of P and Q
01337 *
01338          READ( NIN, FMT = * ) ( PVAL( I ), I = 1, NGRIDS )
01339          READ( NIN, FMT = * ) ( QVAL( I ), I = 1, NGRIDS )
01340 *
01341 *        Read ALPHA, BETA
01342 *
01343          READ( NIN, FMT = * ) ALPHA
01344          READ( NIN, FMT = * ) BETA
01345 *
01346 *        Read number of tests.
01347 *
01348          READ( NIN, FMT = * ) NMAT
01349          IF( NMAT.LT.1 .OR. NMAT.GT.LDVAL ) THEN
01350             WRITE( NOUT, FMT = 9998 ) 'Tests', LDVAL
01351             GO TO 120
01352          ENDIF
01353 *
01354 *        Read in input data into arrays.
01355 *
01356          READ( NIN, FMT = * ) ( DIAGVAL( I ), I = 1, NMAT )
01357          READ( NIN, FMT = * ) ( SIDEVAL( I ), I = 1, NMAT )
01358          READ( NIN, FMT = * ) ( TRNAVAL( I ), I = 1, NMAT )
01359          READ( NIN, FMT = * ) ( TRNBVAL( I ), I = 1, NMAT )
01360          READ( NIN, FMT = * ) ( UPLOVAL( I ), I = 1, NMAT )
01361          READ( NIN, FMT = * ) ( MVAL   ( I ), I = 1, NMAT )
01362          READ( NIN, FMT = * ) ( NVAL   ( I ), I = 1, NMAT )
01363          READ( NIN, FMT = * ) ( KVAL   ( I ), I = 1, NMAT )
01364          READ( NIN, FMT = * ) ( MAVAL  ( I ), I = 1, NMAT )
01365          READ( NIN, FMT = * ) ( NAVAL  ( I ), I = 1, NMAT )
01366          READ( NIN, FMT = * ) ( IMBAVAL( I ), I = 1, NMAT )
01367          READ( NIN, FMT = * ) ( INBAVAL( I ), I = 1, NMAT )
01368          READ( NIN, FMT = * ) ( MBAVAL ( I ), I = 1, NMAT )
01369          READ( NIN, FMT = * ) ( NBAVAL ( I ), I = 1, NMAT )
01370          READ( NIN, FMT = * ) ( RSCAVAL( I ), I = 1, NMAT )
01371          READ( NIN, FMT = * ) ( CSCAVAL( I ), I = 1, NMAT )
01372          READ( NIN, FMT = * ) ( IAVAL  ( I ), I = 1, NMAT )
01373          READ( NIN, FMT = * ) ( JAVAL  ( I ), I = 1, NMAT )
01374          READ( NIN, FMT = * ) ( MBVAL  ( I ), I = 1, NMAT )
01375          READ( NIN, FMT = * ) ( NBVAL  ( I ), I = 1, NMAT )
01376          READ( NIN, FMT = * ) ( IMBBVAL( I ), I = 1, NMAT )
01377          READ( NIN, FMT = * ) ( INBBVAL( I ), I = 1, NMAT )
01378          READ( NIN, FMT = * ) ( MBBVAL ( I ), I = 1, NMAT )
01379          READ( NIN, FMT = * ) ( NBBVAL ( I ), I = 1, NMAT )
01380          READ( NIN, FMT = * ) ( RSCBVAL( I ), I = 1, NMAT )
01381          READ( NIN, FMT = * ) ( CSCBVAL( I ), I = 1, NMAT )
01382          READ( NIN, FMT = * ) ( IBVAL  ( I ), I = 1, NMAT )
01383          READ( NIN, FMT = * ) ( JBVAL  ( I ), I = 1, NMAT )
01384          READ( NIN, FMT = * ) ( MCVAL  ( I ), I = 1, NMAT )
01385          READ( NIN, FMT = * ) ( NCVAL  ( I ), I = 1, NMAT )
01386          READ( NIN, FMT = * ) ( IMBCVAL( I ), I = 1, NMAT )
01387          READ( NIN, FMT = * ) ( INBCVAL( I ), I = 1, NMAT )
01388          READ( NIN, FMT = * ) ( MBCVAL ( I ), I = 1, NMAT )
01389          READ( NIN, FMT = * ) ( NBCVAL ( I ), I = 1, NMAT )
01390          READ( NIN, FMT = * ) ( RSCCVAL( I ), I = 1, NMAT )
01391          READ( NIN, FMT = * ) ( CSCCVAL( I ), I = 1, NMAT )
01392          READ( NIN, FMT = * ) ( ICVAL  ( I ), I = 1, NMAT )
01393          READ( NIN, FMT = * ) ( JCVAL  ( I ), I = 1, NMAT )
01394 *
01395 *        Read names of subroutines and flags which indicate
01396 *        whether they are to be tested.
01397 *
01398          DO 10 I = 1, NSUBS
01399             LTEST( I ) = .FALSE.
01400    10    CONTINUE
01401    20    CONTINUE
01402          READ( NIN, FMT = 9996, END = 50 ) SNAMET, LTESTT
01403          DO 30 I = 1, NSUBS
01404             IF( SNAMET.EQ.SNAMES( I ) )
01405      $         GO TO 40
01406    30    CONTINUE
01407 *
01408          WRITE( NOUT, FMT = 9995 )SNAMET
01409          GO TO 120
01410 *
01411    40    CONTINUE
01412          LTEST( I ) = LTESTT
01413          GO TO 20
01414 *
01415    50    CONTINUE
01416 *
01417 *        Close input file
01418 *
01419          CLOSE ( NIN )
01420 *
01421 *        For pvm only: if virtual machine not set up, allocate it and
01422 *        spawn the correct number of processes.
01423 *
01424          IF( NPROCS.LT.1 ) THEN
01425             NPROCS = 0
01426             DO 60 I = 1, NGRIDS
01427                NPROCS = MAX( NPROCS, PVAL( I )*QVAL( I ) )
01428    60       CONTINUE
01429             CALL BLACS_SETUP( IAM, NPROCS )
01430          END IF
01431 *
01432 *        Temporarily define blacs grid to include all processes so
01433 *        information can be broadcast to all processes
01434 *
01435          CALL BLACS_GET( -1, 0, ICTXT )
01436          CALL BLACS_GRIDINIT( ICTXT, 'Row-major', 1, NPROCS )
01437 *
01438 *        Pack information arrays and broadcast
01439 *
01440          CALL ZGEBS2D( ICTXT, 'All', ' ', 1, 1, ALPHA, 1 )
01441          CALL ZGEBS2D( ICTXT, 'All', ' ', 1, 1, BETA,  1 )
01442 *
01443          WORK( 1 ) = NGRIDS
01444          WORK( 2 ) = NMAT
01445          WORK( 3 ) = NBLOG
01446          CALL IGEBS2D( ICTXT, 'All', ' ', 3, 1, WORK, 3 )
01447 *
01448          I = 1
01449          DO 70 J = 1, NMAT
01450             WORK( I   ) = ICHAR( DIAGVAL( J ) )
01451             WORK( I+1 ) = ICHAR( SIDEVAL( J ) )
01452             WORK( I+2 ) = ICHAR( TRNAVAL( J ) )
01453             WORK( I+3 ) = ICHAR( TRNBVAL( J ) )
01454             WORK( I+4 ) = ICHAR( UPLOVAL( J ) )
01455             I = I + 5
01456    70    CONTINUE
01457          CALL ICOPY( NGRIDS, PVAL,     1, WORK( I ), 1 )
01458          I = I + NGRIDS
01459          CALL ICOPY( NGRIDS, QVAL,     1, WORK( I ), 1 )
01460          I = I + NGRIDS
01461          CALL ICOPY( NMAT,   MVAL,     1, WORK( I ), 1 )
01462          I = I + NMAT
01463          CALL ICOPY( NMAT,   NVAL,     1, WORK( I ), 1 )
01464          I = I + NMAT
01465          CALL ICOPY( NMAT,   KVAL,     1, WORK( I ), 1 )
01466          I = I + NMAT
01467          CALL ICOPY( NMAT,   MAVAL,    1, WORK( I ), 1 )
01468          I = I + NMAT
01469          CALL ICOPY( NMAT,   NAVAL,    1, WORK( I ), 1 )
01470          I = I + NMAT
01471          CALL ICOPY( NMAT,   IMBAVAL,  1, WORK( I ), 1 )
01472          I = I + NMAT
01473          CALL ICOPY( NMAT,   INBAVAL,  1, WORK( I ), 1 )
01474          I = I + NMAT
01475          CALL ICOPY( NMAT,   MBAVAL,   1, WORK( I ), 1 )
01476          I = I + NMAT
01477          CALL ICOPY( NMAT,   NBAVAL,   1, WORK( I ), 1 )
01478          I = I + NMAT
01479          CALL ICOPY( NMAT,   RSCAVAL,  1, WORK( I ), 1 )
01480          I = I + NMAT
01481          CALL ICOPY( NMAT,   CSCAVAL,  1, WORK( I ), 1 )
01482          I = I + NMAT
01483          CALL ICOPY( NMAT,   IAVAL,    1, WORK( I ), 1 )
01484          I = I + NMAT
01485          CALL ICOPY( NMAT,   JAVAL,    1, WORK( I ), 1 )
01486          I = I + NMAT
01487          CALL ICOPY( NMAT,   MBVAL,    1, WORK( I ), 1 )
01488          I = I + NMAT
01489          CALL ICOPY( NMAT,   NBVAL,    1, WORK( I ), 1 )
01490          I = I + NMAT
01491          CALL ICOPY( NMAT,   IMBBVAL,  1, WORK( I ), 1 )
01492          I = I + NMAT
01493          CALL ICOPY( NMAT,   INBBVAL,  1, WORK( I ), 1 )
01494          I = I + NMAT
01495          CALL ICOPY( NMAT,   MBBVAL,   1, WORK( I ), 1 )
01496          I = I + NMAT
01497          CALL ICOPY( NMAT,   NBBVAL,   1, WORK( I ), 1 )
01498          I = I + NMAT
01499          CALL ICOPY( NMAT,   RSCBVAL,  1, WORK( I ), 1 )
01500          I = I + NMAT
01501          CALL ICOPY( NMAT,   CSCBVAL,  1, WORK( I ), 1 )
01502          I = I + NMAT
01503          CALL ICOPY( NMAT,   IBVAL,    1, WORK( I ), 1 )
01504          I = I + NMAT
01505          CALL ICOPY( NMAT,   JBVAL,    1, WORK( I ), 1 )
01506          I = I + NMAT
01507          CALL ICOPY( NMAT,   MCVAL,    1, WORK( I ), 1 )
01508          I = I + NMAT
01509          CALL ICOPY( NMAT,   NCVAL,    1, WORK( I ), 1 )
01510          I = I + NMAT
01511          CALL ICOPY( NMAT,   IMBCVAL,  1, WORK( I ), 1 )
01512          I = I + NMAT
01513          CALL ICOPY( NMAT,   INBCVAL,  1, WORK( I ), 1 )
01514          I = I + NMAT
01515          CALL ICOPY( NMAT,   MBCVAL,   1, WORK( I ), 1 )
01516          I = I + NMAT
01517          CALL ICOPY( NMAT,   NBCVAL,   1, WORK( I ), 1 )
01518          I = I + NMAT
01519          CALL ICOPY( NMAT,   RSCCVAL,  1, WORK( I ), 1 )
01520          I = I + NMAT
01521          CALL ICOPY( NMAT,   CSCCVAL,  1, WORK( I ), 1 )
01522          I = I + NMAT
01523          CALL ICOPY( NMAT,   ICVAL,    1, WORK( I ), 1 )
01524          I = I + NMAT
01525          CALL ICOPY( NMAT,   JCVAL,    1, WORK( I ), 1 )
01526          I = I + NMAT
01527 *
01528          DO 80 J = 1, NSUBS
01529             IF( LTEST( J ) ) THEN
01530                WORK( I ) = 1
01531             ELSE
01532                WORK( I ) = 0
01533             END IF
01534             I = I + 1
01535    80    CONTINUE
01536          I = I - 1
01537          CALL IGEBS2D( ICTXT, 'All', ' ', I, 1, WORK, I )
01538 *
01539 *        regurgitate input
01540 *
01541          WRITE( NOUT, FMT = 9999 )
01542      $               'Level 3 PBLAS timing program.'
01543          WRITE( NOUT, FMT = 9999 ) USRINFO
01544          WRITE( NOUT, FMT = * )
01545          WRITE( NOUT, FMT = 9999 )
01546      $               'Tests of the complex double precision '//
01547      $               'Level 3 PBLAS'
01548          WRITE( NOUT, FMT = * )
01549          WRITE( NOUT, FMT = 9992 ) NMAT
01550          WRITE( NOUT, FMT = 9986 ) NBLOG
01551          WRITE( NOUT, FMT = 9991 ) NGRIDS
01552          WRITE( NOUT, FMT = 9989 )
01553      $               'P', ( PVAL(I), I = 1, MIN(NGRIDS, 5) )
01554          IF( NGRIDS.GT.5 )
01555      $      WRITE( NOUT, FMT = 9990 ) ( PVAL(I), I = 6,
01556      $                                  MIN( 10, NGRIDS ) )
01557          IF( NGRIDS.GT.10 )
01558      $      WRITE( NOUT, FMT = 9990 ) ( PVAL(I), I = 11,
01559      $                                  MIN( 15, NGRIDS ) )
01560          IF( NGRIDS.GT.15 )
01561      $      WRITE( NOUT, FMT = 9990 ) ( PVAL(I), I = 16, NGRIDS )
01562          WRITE( NOUT, FMT = 9989 )
01563      $               'Q', ( QVAL(I), I = 1, MIN(NGRIDS, 5) )
01564          IF( NGRIDS.GT.5 )
01565      $      WRITE( NOUT, FMT = 9990 ) ( QVAL(I), I = 6,
01566      $                                  MIN( 10, NGRIDS ) )
01567          IF( NGRIDS.GT.10 )
01568      $      WRITE( NOUT, FMT = 9990 ) ( QVAL(I), I = 11,
01569      $                                  MIN( 15, NGRIDS ) )
01570          IF( NGRIDS.GT.15 )
01571      $      WRITE( NOUT, FMT = 9990 ) ( QVAL(I), I = 16, NGRIDS )
01572          WRITE( NOUT, FMT = 9994 ) ALPHA
01573          WRITE( NOUT, FMT = 9993 ) BETA
01574          IF( LTEST( 1 ) ) THEN
01575             WRITE( NOUT, FMT = 9988 ) SNAMES( 1 ), ' ... Yes'
01576          ELSE
01577             WRITE( NOUT, FMT = 9988 ) SNAMES( 1 ), ' ... No '
01578          END IF
01579          DO 90 I = 2, NSUBS
01580             IF( LTEST( I ) ) THEN
01581                WRITE( NOUT, FMT = 9987 ) SNAMES( I ), ' ... Yes'
01582             ELSE
01583                WRITE( NOUT, FMT = 9987 ) SNAMES( I ), ' ... No '
01584             END IF
01585    90    CONTINUE
01586          WRITE( NOUT, FMT = * )
01587 *
01588       ELSE
01589 *
01590 *        If in pvm, must participate setting up virtual machine
01591 *
01592          IF( NPROCS.LT.1 )
01593      $      CALL BLACS_SETUP( IAM, NPROCS )
01594 *
01595 *        Temporarily define blacs grid to include all processes so
01596 *        information can be broadcast to all processes
01597 *
01598          CALL BLACS_GET( -1, 0, ICTXT )
01599          CALL BLACS_GRIDINIT( ICTXT, 'Row-major', 1, NPROCS )
01600 *
01601          CALL ZGEBR2D( ICTXT, 'All', ' ', 1, 1, ALPHA, 1, 0, 0 )
01602          CALL ZGEBR2D( ICTXT, 'All', ' ', 1, 1, BETA,  1, 0, 0 )
01603 *
01604          CALL IGEBR2D( ICTXT, 'All', ' ', 3, 1, WORK, 3, 0, 0 )
01605          NGRIDS = WORK( 1 )
01606          NMAT   = WORK( 2 )
01607          NBLOG  = WORK( 3 )
01608 *
01609          I = 2*NGRIDS + 38*NMAT + NSUBS
01610          CALL IGEBR2D( ICTXT, 'All', ' ', I, 1, WORK, I, 0, 0 )
01611 *
01612          I = 1
01613          DO 100 J = 1, NMAT
01614             DIAGVAL( J ) = CHAR( WORK( I   ) )
01615             SIDEVAL( J ) = CHAR( WORK( I+1 ) )
01616             TRNAVAL( J ) = CHAR( WORK( I+2 ) )
01617             TRNBVAL( J ) = CHAR( WORK( I+3 ) )
01618             UPLOVAL( J ) = CHAR( WORK( I+4 ) )
01619             I = I + 5
01620   100    CONTINUE
01621          CALL ICOPY( NGRIDS, WORK( I ), 1, PVAL,     1 )
01622          I = I + NGRIDS
01623          CALL ICOPY( NGRIDS, WORK( I ), 1, QVAL,     1 )
01624          I = I + NGRIDS
01625          CALL ICOPY( NMAT,   WORK( I ), 1, MVAL,     1 )
01626          I = I + NMAT
01627          CALL ICOPY( NMAT,   WORK( I ), 1, NVAL,     1 )
01628          I = I + NMAT
01629          CALL ICOPY( NMAT,   WORK( I ), 1, KVAL,     1 )
01630          I = I + NMAT
01631          CALL ICOPY( NMAT,   WORK( I ), 1, MAVAL,    1 )
01632          I = I + NMAT
01633          CALL ICOPY( NMAT,   WORK( I ), 1, NAVAL,    1 )
01634          I = I + NMAT
01635          CALL ICOPY( NMAT,   WORK( I ), 1, IMBAVAL,  1 )
01636          I = I + NMAT
01637          CALL ICOPY( NMAT,   WORK( I ), 1, INBAVAL,  1 )
01638          I = I + NMAT
01639          CALL ICOPY( NMAT,   WORK( I ), 1, MBAVAL,   1 )
01640          I = I + NMAT
01641          CALL ICOPY( NMAT,   WORK( I ), 1, NBAVAL,   1 )
01642          I = I + NMAT
01643          CALL ICOPY( NMAT,   WORK( I ), 1, RSCAVAL,  1 )
01644          I = I + NMAT
01645          CALL ICOPY( NMAT,   WORK( I ), 1, CSCAVAL,  1 )
01646          I = I + NMAT
01647          CALL ICOPY( NMAT,   WORK( I ), 1, IAVAL,    1 )
01648          I = I + NMAT
01649          CALL ICOPY( NMAT,   WORK( I ), 1, JAVAL,    1 )
01650          I = I + NMAT
01651          CALL ICOPY( NMAT,   WORK( I ), 1, MBVAL,    1 )
01652          I = I + NMAT
01653          CALL ICOPY( NMAT,   WORK( I ), 1, NBVAL,    1 )
01654          I = I + NMAT
01655          CALL ICOPY( NMAT,   WORK( I ), 1, IMBBVAL,  1 )
01656          I = I + NMAT
01657          CALL ICOPY( NMAT,   WORK( I ), 1, INBBVAL,  1 )
01658          I = I + NMAT
01659          CALL ICOPY( NMAT,   WORK( I ), 1, MBBVAL,   1 )
01660          I = I + NMAT
01661          CALL ICOPY( NMAT,   WORK( I ), 1, NBBVAL,   1 )
01662          I = I + NMAT
01663          CALL ICOPY( NMAT,   WORK( I ), 1, RSCBVAL,  1 )
01664          I = I + NMAT
01665          CALL ICOPY( NMAT,   WORK( I ), 1, CSCBVAL,  1 )
01666          I = I + NMAT
01667          CALL ICOPY( NMAT,   WORK( I ), 1, IBVAL,    1 )
01668          I = I + NMAT
01669          CALL ICOPY( NMAT,   WORK( I ), 1, JBVAL,    1 )
01670          I = I + NMAT
01671          CALL ICOPY( NMAT,   WORK( I ), 1, MCVAL,    1 )
01672          I = I + NMAT
01673          CALL ICOPY( NMAT,   WORK( I ), 1, NCVAL,    1 )
01674          I = I + NMAT
01675          CALL ICOPY( NMAT,   WORK( I ), 1, IMBCVAL,  1 )
01676          I = I + NMAT
01677          CALL ICOPY( NMAT,   WORK( I ), 1, INBCVAL,  1 )
01678          I = I + NMAT
01679          CALL ICOPY( NMAT,   WORK( I ), 1, MBCVAL,   1 )
01680          I = I + NMAT
01681          CALL ICOPY( NMAT,   WORK( I ), 1, NBCVAL,   1 )
01682          I = I + NMAT
01683          CALL ICOPY( NMAT,   WORK( I ), 1, RSCCVAL,  1 )
01684          I = I + NMAT
01685          CALL ICOPY( NMAT,   WORK( I ), 1, CSCCVAL,  1 )
01686          I = I + NMAT
01687          CALL ICOPY( NMAT,   WORK( I ), 1, ICVAL,    1 )
01688          I = I + NMAT
01689          CALL ICOPY( NMAT,   WORK( I ), 1, JCVAL,    1 )
01690          I = I + NMAT
01691 *
01692          DO 110 J = 1, NSUBS
01693             IF( WORK( I ).EQ.1 ) THEN
01694                LTEST( J ) = .TRUE.
01695             ELSE
01696                LTEST( J ) = .FALSE.
01697             END IF
01698             I = I + 1
01699   110    CONTINUE
01700 *
01701       END IF
01702 *
01703       CALL BLACS_GRIDEXIT( ICTXT )
01704 *
01705       RETURN
01706 *
01707   120 WRITE( NOUT, FMT = 9997 )
01708       CLOSE( NIN )
01709       IF( NOUT.NE.6 .AND. NOUT.NE.0 )
01710      $   CLOSE( NOUT )
01711       CALL BLACS_ABORT( ICTXT, 1 )
01712 *
01713       STOP
01714 *
01715  9999 FORMAT( A )
01716  9998 FORMAT( ' Number of values of ',5A, ' is less than 1 or greater ',
01717      $        'than ', I2 )
01718  9997 FORMAT( ' Illegal input in file ',40A,'.  Aborting run.' )
01719  9996 FORMAT( A7, L2 )
01720  9995 FORMAT( '  Subprogram name ', A7, ' not recognized',
01721      $        /' ******* TESTS ABANDONED *******' )
01722  9994 FORMAT( 2X, 'Alpha                     :      (', G16.6,
01723      $        ',', G16.6, ')' )
01724  9993 FORMAT( 2X, 'Beta                      :      (', G16.6,
01725      $        ',', G16.6, ')' )
01726  9992 FORMAT( 2X, 'Number of Tests           : ', I6 )
01727  9991 FORMAT( 2X, 'Number of process grids   : ', I6 )
01728  9990 FORMAT( 2X, '                          : ', 5I6 )
01729  9989 FORMAT( 2X, A1, '                         : ', 5I6 )
01730  9988 FORMAT( 2X, 'Routines to be tested     :      ', A, A8 )
01731  9987 FORMAT( 2X, '                                 ', A, A8 )
01732  9986 FORMAT( 2X, 'Logical block size        : ', I6 )
01733 *
01734 *     End of PZBLA3TIMINFO
01735 *
01736       END