ScaLAPACK  2.0.2
ScaLAPACK: Scalable Linear Algebra PACKage
psblas2tst.f
Go to the documentation of this file.
00001       BLOCK DATA
00002       INTEGER NSUBS
00003       PARAMETER (NSUBS = 7)
00004       CHARACTER*7        SNAMES( NSUBS )
00005       COMMON             /SNAMEC/SNAMES
00006       DATA               SNAMES/'PSGEMV ', 'PSSYMV ', 'PSTRMV ',
00007      $                   'PSTRSV ', 'PSGER  ', 'PSSYR  ',
00008      $                   'PSSYR2 '/
00009       END BLOCK DATA
00010 
00011       PROGRAM PSBLA2TST
00012 *
00013 *  -- PBLAS testing driver (version 2.0.2) --
00014 *     Univ. of Tennessee, Univ. of California Berkeley, Univ. of Colorado Denver
00015 *     May 1 2012
00016 *
00017 *  Purpose
00018 *  =======
00019 *
00020 *  PSBLA2TST is the main testing program for the PBLAS Level 2 routines.
00021 *
00022 *  The program must be driven by a short data file.  An  annotated exam-
00023 *  ple of a data file can be obtained by deleting the first 3 characters
00024 *  from the following 60 lines:
00025 *  'Level 2 PBLAS, Testing input file'
00026 *  'Intel iPSC/860 hypercube, gamma model.'
00027 *  'PSBLAS2TST.SUMM'     output file name (if any)
00028 *  6       device out
00029 *  F       logical flag, T to stop on failures
00030 *  F       logical flag, T to test error exits
00031 *  0       verbosity, 0 for pass/fail, 1-3 for matrix dump on errors
00032 *  10      the leading dimension gap
00033 *  16.0    threshold value of test ratio
00034 *  10              value of the logical computational blocksize NB
00035 *  1               number of process grids (ordered pairs of P & Q)
00036 *  2 2 1 4 2 3 8   values of P
00037 *  2 2 4 1 3 2 1   values of Q
00038 *  1.0E0           value of ALPHA
00039 *  1.0E0           value of BETA
00040 *  2               number of tests problems
00041 *  'U' 'L'         values of UPLO
00042 *  'N' 'T'         values of TRANS
00043 *  'N' 'U'         values of DIAG
00044 *  3  4            values of M
00045 *  3  4            values of N
00046 *  6 10            values of M_A
00047 *  6 10            values of N_A
00048 *  2  5            values of IMB_A
00049 *  2  5            values of INB_A
00050 *  2  5            values of MB_A
00051 *  2  5            values of NB_A
00052 *  0  1            values of RSRC_A
00053 *  0  0            values of CSRC_A
00054 *  1  1            values of IA
00055 *  1  1            values of JA
00056 *  6 10            values of M_X
00057 *  6 10            values of N_X
00058 *  2  5            values of IMB_X
00059 *  2  5            values of INB_X
00060 *  2  5            values of MB_X
00061 *  2  5            values of NB_X
00062 *  0  1            values of RSRC_X
00063 *  0  0            values of CSRC_X
00064 *  1  1            values of IX
00065 *  1  1            values of JX
00066 *  1  1            values of INCX
00067 *  6 10            values of M_Y
00068 *  6 10            values of N_Y
00069 *  2  5            values of IMB_Y
00070 *  2  5            values of INB_Y
00071 *  2  5            values of MB_Y
00072 *  2  5            values of NB_Y
00073 *  0  1            values of RSRC_Y
00074 *  0  0            values of CSRC_Y
00075 *  1  1            values of IY
00076 *  1  1            values of JY
00077 *  6  1            values of INCY
00078 *  PSGEMV  T  put F for no test in the same column
00079 *  PSSYMV  T  put F for no test in the same column
00080 *  PSTRMV  T  put F for no test in the same column
00081 *  PSTRSV  T  put F for no test in the same column
00082 *  PSGER   T  put F for no test in the same column
00083 *  PSSYR   T  put F for no test in the same column
00084 *  PSSYR2  T  put F for no test in the same column
00085 *
00086 *  Internal Parameters
00087 *  ===================
00088 *
00089 *  TOTMEM  INTEGER
00090 *          TOTMEM  is  a machine-specific parameter indicating the maxi-
00091 *          mum  amount  of  available  memory per  process in bytes. The
00092 *          user  should  customize TOTMEM to his  platform.  Remember to
00093 *          leave  room  in  memory  for the  operating system, the BLACS
00094 *          buffer, etc.  For  example,  on  a system with 8 MB of memory
00095 *          per process (e.g., one processor  on an Intel iPSC/860),  the
00096 *          parameters we use are TOTMEM=6200000  (leaving 1.8 MB for OS,
00097 *          code, BLACS buffer, etc).  However,  for PVM,  we usually set
00098 *          TOTMEM = 2000000.  Some experimenting  with the maximum value
00099 *          of TOTMEM may be required. By default, TOTMEM is 2000000.
00100 *
00101 *  REALSZ  INTEGER
00102 *          REALSZ  indicates  the  length in bytes on the given platform
00103 *          for  a  single  precision  real. By default, REALSZ is set to
00104 *          four.
00105 *
00106 *  MEM     REAL array
00107 *          MEM is an array of dimension TOTMEM / REALSZ.
00108 *          All arrays used by SCALAPACK routines are allocated from this
00109 *          array MEM and referenced by pointers. The  integer  IPA,  for
00110 *          example, is a pointer to the starting element of MEM for  the
00111 *          matrix A.
00112 *
00113 *  -- Written on April 1, 1998 by
00114 *     Antoine Petitet, University  of  Tennessee, Knoxville 37996, USA.
00115 *
00116 *  =====================================================================
00117 *
00118 *     .. Parameters ..
00119       INTEGER            MAXTESTS, MAXGRIDS, GAPMUL, REALSZ, TOTMEM,
00120      $                   MEMSIZ, NSUBS
00121       REAL               ONE, PADVAL, ZERO, ROGUE
00122       PARAMETER          ( MAXTESTS = 20, MAXGRIDS = 20, GAPMUL = 10,
00123      $                   REALSZ = 4, TOTMEM = 2000000,
00124      $                   MEMSIZ = TOTMEM / REALSZ, ZERO = 0.0E+0,
00125      $                   ONE = 1.0E+0, PADVAL = -9923.0E+0,
00126      $                   NSUBS = 7, ROGUE = -1.0E+10 )
00127       INTEGER            BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
00128      $                   DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
00129      $                   RSRC_
00130       PARAMETER          ( BLOCK_CYCLIC_2D_INB = 2, DLEN_ = 11,
00131      $                   DTYPE_ = 1, CTXT_ = 2, M_ = 3, N_ = 4,
00132      $                   IMB_ = 5, INB_ = 6, MB_ = 7, NB_ = 8,
00133      $                   RSRC_ = 9, CSRC_ = 10, LLD_ = 11 )
00134 *     ..
00135 *     .. Local Scalars ..
00136       LOGICAL            ERRFLG, SOF, TEE
00137       CHARACTER*1        AFORM, DIAG, DIAGDO, TRANS, UPLO
00138       INTEGER            CSRCA, CSRCX, CSRCY, I, IA, IAM, IASEED, ICTXT,
00139      $                   IGAP, IMBA, IMBX, IMBY, IMIDA, IMIDX, IMIDY,
00140      $                   INBA, INBX, INBY, INCX, INCY, IPA, IPG, IPMATA,
00141      $                   IPMATX, IPMATY, IPOSTA, IPOSTX, IPOSTY, IPREA,
00142      $                   IPREX, IPREY, IPX, IPY, IVERB, IX, IXSEED, IY,
00143      $                   IYSEED, J, JA, JX, JY, K, LDA, LDX, LDY, M, MA,
00144      $                   MBA, MBX, MBY, MEMREQD, MPA, MPX, MPY, MX, MY,
00145      $                   MYCOL, MYROW, N, NA, NBA, NBX, NBY, NCOLA,
00146      $                   NGRIDS, NLX, NLY, NOUT, NPCOL, NPROCS, NPROW,
00147      $                   NQA, NQX, NQY, NROWA, NTESTS, NX, NY, OFFD,
00148      $                   RSRCA, RSRCX, RSRCY, TSKIP, TSTCNT
00149       REAL               ALPHA, BETA, SCALE, THRESH
00150 *     ..
00151 *     .. Local Arrays ..
00152       LOGICAL            LTEST( NSUBS ), YCHECK( NSUBS )
00153       CHARACTER*1        DIAGVAL( MAXTESTS ), TRANVAL( MAXTESTS ),
00154      $                   UPLOVAL( MAXTESTS )
00155       CHARACTER*80       OUTFILE
00156       INTEGER            CSCAVAL( MAXTESTS ), CSCXVAL( MAXTESTS ),
00157      $                   CSCYVAL( MAXTESTS ), DESCA( DLEN_ ),
00158      $                   DESCAR( DLEN_ ), DESCX( DLEN_ ),
00159      $                   DESCXR( DLEN_ ), DESCY( DLEN_ ),
00160      $                   DESCYR( DLEN_ ), IAVAL( MAXTESTS ), IERR( 6 ),
00161      $                   IMBAVAL( MAXTESTS ), IMBXVAL( MAXTESTS ),
00162      $                   IMBYVAL( MAXTESTS ), INBAVAL( MAXTESTS ),
00163      $                   INBXVAL( MAXTESTS ), INBYVAL( MAXTESTS ),
00164      $                   INCXVAL( MAXTESTS ), INCYVAL( MAXTESTS ),
00165      $                   IXVAL( MAXTESTS ), IYVAL( MAXTESTS ),
00166      $                   JAVAL( MAXTESTS ), JXVAL( MAXTESTS ),
00167      $                   JYVAL( MAXTESTS )
00168       INTEGER            KFAIL( NSUBS ), KPASS( NSUBS ), KSKIP( NSUBS ),
00169      $                   KTESTS( NSUBS ), MAVAL( MAXTESTS ),
00170      $                   MBAVAL( MAXTESTS ), MBXVAL( MAXTESTS ),
00171      $                   MBYVAL( MAXTESTS ), MVAL( MAXTESTS ),
00172      $                   MXVAL( MAXTESTS ), MYVAL( MAXTESTS ),
00173      $                   NAVAL( MAXTESTS ), NBAVAL( MAXTESTS ),
00174      $                   NBXVAL( MAXTESTS ), NBYVAL( MAXTESTS ),
00175      $                   NVAL( MAXTESTS ), NXVAL( MAXTESTS ),
00176      $                   NYVAL( MAXTESTS ), PVAL( MAXTESTS ),
00177      $                   QVAL( MAXTESTS ), RSCAVAL( MAXTESTS ),
00178      $                   RSCXVAL( MAXTESTS ), RSCYVAL( MAXTESTS )
00179       REAL               MEM( MEMSIZ )
00180 *     ..
00181 *     .. External Subroutines ..
00182       EXTERNAL           BLACS_EXIT, BLACS_GET, BLACS_GRIDEXIT,
00183      $                   BLACS_GRIDINFO, BLACS_GRIDINIT, BLACS_PINFO,
00184      $                   IGSUM2D, PB_DESCSET2, PB_PSLAPRNT, PB_SCHEKPAD,
00185      $                   PB_SFILLPAD, PB_SLASCAL, PB_SLASET, PMDESCCHK,
00186      $                   PMDIMCHK, PSBLA2TSTINFO, PSBLAS2TSTCHK,
00187      $                   PSBLAS2TSTCHKE, PSCHKARG2, PSCHKVOUT, PSGEMV,
00188      $                   PSGER, PSLAGEN, PSLASCAL, PSLASET, PSMPRNT,
00189      $                   PSSYMV, PSSYR, PSSYR2, PSTRMV, PSTRSV, PSVPRNT,
00190      $                   PVDESCCHK, PVDIMCHK
00191 *     ..
00192 *     .. External Functions ..
00193       LOGICAL            LSAME
00194       EXTERNAL           LSAME
00195 *     ..
00196 *     .. Intrinsic Functions ..
00197       INTRINSIC          ABS, MAX, MOD, REAL
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               YCHECK/.TRUE., .TRUE., .FALSE., .FALSE.,
00209      $                   .TRUE., .FALSE., .TRUE./
00210 *     ..
00211 *     .. Executable Statements ..
00212 *
00213 *     Initialization
00214 *
00215 *     Set flag so that the PBLAS error handler won't abort on errors, so
00216 *     that the tester will detect unsupported operations.
00217 *
00218       ABRTFLG = .FALSE.
00219 *
00220 *     So far no error, will become true as soon as one error is found.
00221 *
00222       ERRFLG = .FALSE.
00223 *
00224 *     Test counters
00225 *
00226       TSKIP  = 0
00227       TSTCNT = 0
00228 *
00229 *     Seeds for random matrix generations.
00230 *
00231       IASEED = 100
00232       IXSEED = 200
00233       IYSEED = 300
00234 *
00235 *     So far no tests have been performed.
00236 *
00237       DO 10 I = 1, NSUBS
00238          KPASS( I )  = 0
00239          KSKIP( I )  = 0
00240          KFAIL( I )  = 0
00241          KTESTS( I ) = 0
00242    10 CONTINUE
00243 *
00244 *     Get starting information
00245 *
00246       CALL BLACS_PINFO( IAM, NPROCS )
00247       CALL PSBLA2TSTINFO( OUTFILE, NOUT, NTESTS, DIAGVAL, TRANVAL,
00248      $                    UPLOVAL, MVAL, NVAL, MAVAL, NAVAL, IMBAVAL,
00249      $                    MBAVAL, INBAVAL, NBAVAL, RSCAVAL, CSCAVAL,
00250      $                    IAVAL, JAVAL, MXVAL, NXVAL, IMBXVAL, MBXVAL,
00251      $                    INBXVAL, NBXVAL, RSCXVAL, CSCXVAL, IXVAL,
00252      $                    JXVAL, INCXVAL, MYVAL, NYVAL, IMBYVAL,
00253      $                    MBYVAL, INBYVAL, NBYVAL, RSCYVAL, CSCYVAL,
00254      $                    IYVAL, JYVAL, INCYVAL, MAXTESTS, NGRIDS,
00255      $                    PVAL, MAXGRIDS, QVAL, MAXGRIDS, NBLOG, LTEST,
00256      $                    SOF, TEE, IAM, IGAP, IVERB, NPROCS, THRESH,
00257      $                    ALPHA, BETA, MEM )
00258 *
00259       IF( IAM.EQ.0 ) THEN
00260          WRITE( NOUT, FMT = 9975 )
00261          WRITE( NOUT, FMT = * )
00262       END IF
00263 *
00264 *     If TEE is set then Test Error Exits of routines.
00265 *
00266       IF( TEE )
00267      $   CALL PSBLAS2TSTCHKE( LTEST, NOUT, NPROCS )
00268 *
00269 *     Loop over different process grids
00270 *
00271       DO 60 I = 1, NGRIDS
00272 *
00273          NPROW = PVAL( I )
00274          NPCOL = QVAL( I )
00275 *
00276 *        Make sure grid information is correct
00277 *
00278          IERR( 1 ) = 0
00279          IF( NPROW.LT.1 ) THEN
00280             IF( IAM.EQ.0 )
00281      $         WRITE( NOUT, FMT = 9999 ) 'GRID SIZE', 'NPROW', NPROW
00282             IERR( 1 ) = 1
00283          ELSE IF( NPCOL.LT.1 ) THEN
00284             IF( IAM.EQ.0 )
00285      $         WRITE( NOUT, FMT = 9999 ) 'GRID SIZE', 'NPCOL', NPCOL
00286             IERR( 1 ) = 1
00287          ELSE IF( NPROW*NPCOL.GT.NPROCS ) THEN
00288             IF( IAM.EQ.0 )
00289      $         WRITE( NOUT, FMT = 9998 ) NPROW*NPCOL, NPROCS
00290             IERR( 1 ) = 1
00291          END IF
00292 *
00293          IF( IERR( 1 ).GT.0 ) THEN
00294             IF( IAM.EQ.0 )
00295      $         WRITE( NOUT, FMT = 9997 ) 'GRID'
00296             TSKIP = TSKIP + 1
00297             GO TO 60
00298          END IF
00299 *
00300 *        Define process grid
00301 *
00302          CALL BLACS_GET( -1, 0, ICTXT )
00303          CALL BLACS_GRIDINIT( ICTXT, 'Row-major', NPROW, NPCOL )
00304          CALL BLACS_GRIDINFO( ICTXT, NPROW, NPCOL, MYROW, MYCOL )
00305 *
00306 *        Go to bottom of process grid loop if this case doesn't use my
00307 *        process
00308 *
00309          IF( MYROW.GE.NPROW .OR. MYCOL.GE.NPCOL )
00310      $      GO TO 60
00311 *
00312 *        Loop over number of tests
00313 *
00314          DO 50 J = 1, NTESTS
00315 *
00316 *           Get the test parameters
00317 *
00318             DIAG  = DIAGVAL( J )
00319             TRANS = TRANVAL( J )
00320             UPLO  = UPLOVAL( J )
00321 *
00322             M     = MVAL( J )
00323             N     = NVAL( J )
00324 *
00325             MA    = MAVAL( J )
00326             NA    = NAVAL( J )
00327             IMBA  = IMBAVAL( J )
00328             INBA  = INBAVAL( J )
00329             MBA   = MBAVAL( J )
00330             NBA   = NBAVAL( J )
00331             RSRCA = RSCAVAL( J )
00332             CSRCA = CSCAVAL( J )
00333             IA    = IAVAL( J )
00334             JA    = JAVAL( J )
00335 *
00336             MX    = MXVAL( J )
00337             NX    = NXVAL( J )
00338             IMBX  = IMBXVAL( J )
00339             INBX  = INBXVAL( J )
00340             MBX   = MBXVAL( J )
00341             NBX   = NBXVAL( J )
00342             RSRCX = RSCXVAL( J )
00343             CSRCX = CSCXVAL( J )
00344             IX    = IXVAL( J )
00345             JX    = JXVAL( J )
00346             INCX  = INCXVAL( J )
00347 *
00348             MY    = MYVAL( J )
00349             NY    = NYVAL( J )
00350             IMBY  = IMBYVAL( J )
00351             INBY  = INBYVAL( J )
00352             MBY   = MBYVAL( J )
00353             NBY   = NBYVAL( J )
00354             RSRCY = RSCYVAL( J )
00355             CSRCY = CSCYVAL( J )
00356             IY    = IYVAL( J )
00357             JY    = JYVAL( J )
00358             INCY  = INCYVAL( J )
00359 *
00360             IF( IAM.EQ.0 ) THEN
00361                TSTCNT = TSTCNT + 1
00362                WRITE( NOUT, FMT = * )
00363                WRITE( NOUT, FMT = 9996 ) TSTCNT, NPROW, NPCOL
00364                WRITE( NOUT, FMT = * )
00365 *
00366                WRITE( NOUT, FMT = 9995 )
00367                WRITE( NOUT, FMT = 9994 )
00368                WRITE( NOUT, FMT = 9995 )
00369                WRITE( NOUT, FMT = 9993 ) M, N, UPLO, TRANS, DIAG
00370 *
00371                WRITE( NOUT, FMT = 9995 )
00372                WRITE( NOUT, FMT = 9992 )
00373                WRITE( NOUT, FMT = 9995 )
00374                WRITE( NOUT, FMT = 9991 ) IA, JA, MA, NA, IMBA, INBA,
00375      $                                   MBA, NBA, RSRCA, CSRCA
00376 *
00377                WRITE( NOUT, FMT = 9995 )
00378                WRITE( NOUT, FMT = 9990 )
00379                WRITE( NOUT, FMT = 9995 )
00380                WRITE( NOUT, FMT = 9989 ) IX, JX, MX, NX, IMBX, INBX,
00381      $                                   MBX, NBX, RSRCX, CSRCX, INCX
00382 *
00383                WRITE( NOUT, FMT = 9995 )
00384                WRITE( NOUT, FMT = 9988 )
00385                WRITE( NOUT, FMT = 9995 )
00386                WRITE( NOUT, FMT = 9989 ) IY, JY, MY, NY, IMBY, INBY,
00387      $                                   MBY, NBY, RSRCY, CSRCY, INCY
00388 *
00389                WRITE( NOUT, FMT = 9995 )
00390 *
00391             END IF
00392 *
00393 *           Check the validity of the input test parameters
00394 *
00395             IF( .NOT.LSAME( UPLO, 'U' ).AND.
00396      $          .NOT.LSAME( UPLO, 'L' ) ) THEN
00397                IF( IAM.EQ.0 )
00398      $            WRITE( NOUT, FMT = 9997 ) 'UPLO'
00399                TSKIP = TSKIP + 1
00400                GO TO 40
00401             END IF
00402 *
00403             IF( .NOT.LSAME( TRANS, 'N' ).AND.
00404      $          .NOT.LSAME( TRANS, 'T' ).AND.
00405      $          .NOT.LSAME( TRANS, 'C' ) ) THEN
00406                IF( IAM.EQ.0 )
00407      $            WRITE( NOUT, FMT = 9997 ) 'TRANS'
00408                TSKIP = TSKIP + 1
00409                GO TO 40
00410             END IF
00411 *
00412             IF( .NOT.LSAME( DIAG , 'U' ).AND.
00413      $         .NOT.LSAME( DIAG , 'N' ) )THEN
00414                IF( IAM.EQ.0 )
00415      $            WRITE( NOUT, FMT = 9997 ) TRANS
00416                WRITE( NOUT, FMT = 9997 ) 'DIAG'
00417                TSKIP = TSKIP + 1
00418                GO TO 40
00419             END IF
00420 *
00421 *           Check and initialize the matrix descriptors
00422 *
00423             CALL PMDESCCHK( ICTXT, NOUT, 'A', DESCA,
00424      $                      BLOCK_CYCLIC_2D_INB, MA, NA, IMBA, INBA,
00425      $                      MBA, NBA, RSRCA, CSRCA, MPA, NQA, IPREA,
00426      $                      IMIDA, IPOSTA, IGAP, GAPMUL, IERR( 1 ) )
00427             CALL PVDESCCHK( ICTXT, NOUT, 'X', DESCX,
00428      $                      BLOCK_CYCLIC_2D_INB, MX, NX, IMBX, INBX,
00429      $                      MBX, NBX, RSRCX, CSRCX, INCX, MPX, NQX,
00430      $                      IPREX, IMIDX, IPOSTX, IGAP, GAPMUL,
00431      $                      IERR( 2 ) )
00432             CALL PVDESCCHK( ICTXT, NOUT, 'Y', DESCY,
00433      $                      BLOCK_CYCLIC_2D_INB, MY, NY, IMBY, INBY,
00434      $                      MBY, NBY, RSRCY, CSRCY, INCY, MPY, NQY,
00435      $                      IPREY, IMIDY, IPOSTY, IGAP, GAPMUL,
00436      $                      IERR( 3 ) )
00437 *
00438             IF( IERR( 1 ).GT.0 .OR. IERR( 2 ).GT.0 .OR.
00439      $          IERR( 3 ).GT.0 ) THEN
00440                TSKIP = TSKIP + 1
00441                GO TO 40
00442             END IF
00443 *
00444             LDA = MAX( 1, MA )
00445             LDX = MAX( 1, MX )
00446             LDY = MAX( 1, MY )
00447 *
00448 *           Assign pointers into MEM for matrices corresponding to
00449 *           the distributed matrices A, X and Y.
00450 *
00451             IPA = IPREA + 1
00452             IPX = IPA + DESCA( LLD_ )*NQA + IPOSTA + IPREX
00453             IPY = IPX + DESCX( LLD_ )*NQX + IPOSTX + IPREY
00454             IPMATA = IPY + DESCY( LLD_ )*NQY + IPOSTY
00455             IPMATX = IPMATA + MA*NA
00456             IPMATY = IPMATX + MX*NX
00457             IPG = IPMATY + MAX( MX*NX, MY*NY )
00458 *
00459 *           Check if sufficient memory.
00460 *           Requirement = mem for local part of parallel matrices +
00461 *                         mem for whole matrices for comp. check +
00462 *                         mem for recving comp. check error vals.
00463 *
00464             MEMREQD = IPG + MAX( M, N ) - 1 +
00465      $                MAX( MAX( IMBA, MBA ),
00466      $                     MAX( MAX( IMBX, MBX ),
00467      $                          MAX( IMBY, MBY ) ) )
00468             IERR( 1 ) = 0
00469             IF( MEMREQD.GT.MEMSIZ ) THEN
00470                IF( IAM.EQ.0 )
00471      $            WRITE( NOUT, FMT = 9986 ) MEMREQD*REALSZ
00472                IERR( 1 ) = 1
00473             END IF
00474 *
00475 *           Check all processes for an error
00476 *
00477             CALL IGSUM2D( ICTXT, 'All', ' ', 1, 1, IERR, 1, -1, 0 )
00478 *
00479             IF( IERR( 1 ).GT.0 ) THEN
00480                IF( IAM.EQ.0 )
00481      $            WRITE( NOUT, FMT = 9987 )
00482                TSKIP = TSKIP + 1
00483                GO TO 40
00484             END IF
00485 *
00486 *           Loop over all PBLAS 2 routines
00487 *
00488             DO 30 K = 1, NSUBS
00489 *
00490 *              Continue only if this subroutine has to be tested.
00491 *
00492                IF( .NOT.LTEST( K ) )
00493      $            GO TO 30
00494 *
00495                IF( IAM.EQ.0 ) THEN
00496                   WRITE( NOUT, FMT = * )
00497                   WRITE( NOUT, FMT = 9985 ) SNAMES( K )
00498                END IF
00499 *
00500 *              Define the size of the operands
00501 *
00502                IF( K.EQ.1 ) THEN
00503                   NROWA = M
00504                   NCOLA = N
00505                   IF( LSAME( TRANS, 'N' ) ) THEN
00506                      NLX = N
00507                      NLY = M
00508                   ELSE
00509                      NLX = M
00510                      NLY = N
00511                   END IF
00512                ELSE IF( K.EQ.5 ) THEN
00513                   NROWA = M
00514                   NCOLA = N
00515                   NLX = M
00516                   NLY = N
00517                ELSE
00518                   NROWA = N
00519                   NCOLA = N
00520                   NLX = N
00521                   NLY = N
00522                END IF
00523 *
00524 *              Check the validity of the operand sizes
00525 *
00526                CALL PMDIMCHK( ICTXT, NOUT, NROWA, NCOLA, 'A', IA, JA,
00527      $                        DESCA, IERR( 1 ) )
00528                CALL PVDIMCHK( ICTXT, NOUT, NLX, 'X', IX, JX, DESCX,
00529      $                        INCX, IERR( 2 ) )
00530                CALL PVDIMCHK( ICTXT, NOUT, NLY, 'Y', IY, JY, DESCY,
00531      $                        INCY, IERR( 3 ) )
00532 *
00533                IF( IERR( 1 ).NE.0 .OR. IERR( 2 ).NE.0 .OR.
00534      $             IERR( 3 ).NE.0 ) THEN
00535                   KSKIP( K ) = KSKIP( K ) + 1
00536                   GO TO 30
00537                END IF
00538 *
00539 *              Generate distributed matrices A, X and Y
00540 *
00541                IF( K.EQ.2 .OR. K.EQ.6 .OR. K.EQ.7 ) THEN
00542                   AFORM  = 'S'
00543                   DIAGDO = 'N'
00544                   OFFD   = IA - JA
00545                ELSE IF( ( K.EQ.4 ).AND.( LSAME( DIAG, 'N' ) ) ) THEN
00546                   AFORM  = 'N'
00547                   DIAGDO = 'D'
00548                   OFFD   = IA - JA
00549                ELSE
00550                   AFORM  = 'N'
00551                   DIAGDO = 'N'
00552                   OFFD   = 0
00553                END IF
00554 *
00555                CALL PSLAGEN( .FALSE., AFORM, DIAGDO, OFFD, MA, NA,
00556      $                       1, 1, DESCA, IASEED, MEM( IPA ),
00557      $                       DESCA( LLD_ ) )
00558                CALL PSLAGEN( .FALSE., 'None', 'No diag', 0, MX, NX, 1,
00559      $                       1, DESCX, IXSEED, MEM( IPX ),
00560      $                       DESCX( LLD_ ) )
00561                IF( YCHECK( K ) )
00562      $            CALL PSLAGEN( .FALSE., 'None', 'No diag', 0, MY, NY,
00563      $                          1, 1, DESCY, IYSEED, MEM( IPY ),
00564      $                          DESCY( LLD_ ) )
00565 *
00566 *              Generate entire matrices on each process.
00567 *
00568                CALL PB_DESCSET2( DESCAR, MA, NA, IMBA, INBA, MBA, NBA,
00569      $                           -1, -1, ICTXT, MAX( 1, MA ) )
00570                CALL PSLAGEN( .FALSE., AFORM, DIAGDO, OFFD, MA, NA,
00571      $                       1, 1, DESCAR, IASEED, MEM( IPMATA ),
00572      $                       DESCAR( LLD_ ) )
00573                CALL PB_DESCSET2( DESCXR, MX, NX, IMBX, INBX, MBX, NBX,
00574      $                           -1, -1, ICTXT, MAX( 1, MX ) )
00575                CALL PSLAGEN( .FALSE., 'None', 'No diag', 0, MX, NX, 1,
00576      $                       1, DESCXR, IXSEED, MEM( IPMATX ),
00577      $                       DESCXR( LLD_ ) )
00578                IF( YCHECK( K ) ) THEN
00579 *
00580                   CALL PB_DESCSET2( DESCYR, MY, NY, IMBY, INBY, MBY,
00581      $                              NBY, -1, -1, ICTXT, MAX( 1, MY ) )
00582                   CALL PSLAGEN( .FALSE., 'None', 'No diag', 0, MY, NY,
00583      $                          1, 1, DESCYR, IYSEED, MEM( IPMATY ),
00584      $                          DESCYR( LLD_ ) )
00585 *
00586                ELSE
00587 *
00588 *                 If Y is not needed, generate a copy of X instead
00589 *
00590                   CALL PB_DESCSET2( DESCYR, MX, NX, IMBX, INBX, MBX,
00591      $                              NBX, -1, -1, ICTXT, MAX( 1, MX ) )
00592                   CALL PSLAGEN( .FALSE., 'None', 'No diag', 0, MX, NX,
00593      $                          1, 1, DESCYR, IXSEED, MEM( IPMATY ),
00594      $                          DESCYR( LLD_ ) )
00595 *
00596                END IF
00597 *
00598 *              Zero non referenced part of the matrices A
00599 *
00600                IF( ( K.EQ.2 .OR. K.EQ.6 .OR. K.EQ.7 ).AND.
00601      $             ( MAX( NROWA, NCOLA ).GT.1 ) ) THEN
00602 *
00603 *                 The distributed matrix A is symmetric
00604 *
00605                   IF( LSAME( UPLO, 'L' ) ) THEN
00606 *
00607 *                    Zeros the strict upper triangular part of A.
00608 *
00609                      CALL PSLASET( 'Upper', NROWA-1, NCOLA-1, ROGUE,
00610      $                             ROGUE, MEM( IPA ), IA, JA+1, DESCA )
00611                      IF( K.NE.2 ) THEN
00612                         CALL PB_SLASET( 'Upper', NROWA-1, NCOLA-1, 0,
00613      $                                  ROGUE, ROGUE,
00614      $                                  MEM( IPMATA+IA-1+JA*LDA ), LDA )
00615                      END IF
00616 *
00617                   ELSE IF( LSAME( UPLO, 'U' ) ) THEN
00618 *
00619 *                    Zeros the strict lower triangular part of A.
00620 *
00621                      CALL PSLASET( 'Lower', NROWA-1, NCOLA-1, ROGUE,
00622      $                             ROGUE, MEM( IPA ), IA+1, JA, DESCA )
00623                      IF( K.NE.2 ) THEN
00624                         CALL PB_SLASET( 'Lower', NROWA-1, NCOLA-1, 0,
00625      $                                  ROGUE, ROGUE,
00626      $                                  MEM( IPMATA+IA+(JA-1)*LDA ),
00627      $                                  LDA )
00628                      END IF
00629 *
00630                   END IF
00631 *
00632                ELSE IF( K.EQ.3 .OR. K.EQ.4 ) THEN
00633 *
00634                   IF( LSAME( UPLO, 'L' ) ) THEN
00635 *
00636 *                    The distributed matrix A is lower triangular
00637 *
00638                      IF( LSAME( DIAG, 'N' ) ) THEN
00639 *
00640                         IF( MAX( NROWA, NCOLA ).GT.1 ) THEN
00641                            CALL PSLASET( 'Upper', NROWA-1, NCOLA-1,
00642      $                                   ROGUE, ROGUE, MEM( IPA ), IA,
00643      $                                   JA+1, DESCA )
00644                            CALL PB_SLASET( 'Upper', NROWA-1, NCOLA-1, 0,
00645      $                                     ZERO, ZERO,
00646      $                                     MEM( IPMATA+IA-1+JA*LDA ),
00647      $                                     LDA )
00648                         END IF
00649 *
00650                      ELSE
00651 *
00652                         CALL PSLASET( 'Upper', NROWA, NCOLA, ROGUE, ONE,
00653      $                                MEM( IPA ), IA, JA, DESCA )
00654                         CALL PB_SLASET( 'Upper', NROWA, NCOLA, 0, ZERO,
00655      $                                  ONE,
00656      $                                  MEM( IPMATA+IA-1+(JA-1)*LDA ),
00657      $                                  LDA )
00658                         IF( ( K.EQ.4 ).AND.
00659      $                      ( MAX( NROWA, NCOLA ).GT.1 ) ) THEN
00660                            SCALE = ONE / REAL( MAX( NROWA, NCOLA ) )
00661                            CALL PSLASCAL( 'Lower', NROWA-1, NCOLA-1,
00662      $                                    SCALE, MEM( IPA ), IA+1, JA,
00663      $                                    DESCA )
00664                            CALL PB_SLASCAL( 'Lower', NROWA-1, NCOLA-1,
00665      $                                  0, SCALE,
00666      $                                  MEM( IPMATA+IA+(JA-1)*LDA ),
00667      $                                  LDA )
00668                         END IF
00669 *
00670                      END IF
00671 *
00672                   ELSE IF( LSAME( UPLO, 'U' ) ) THEN
00673 *
00674 *                    The distributed matrix A is upper triangular
00675 *
00676                      IF( LSAME( DIAG, 'N' ) ) THEN
00677 *
00678                         IF( MAX( NROWA, NCOLA ).GT.1 ) THEN
00679                            CALL PSLASET( 'Lower', NROWA-1, NCOLA-1,
00680      $                                   ROGUE, ROGUE, MEM( IPA ), IA+1,
00681      $                                   JA, DESCA )
00682                            CALL PB_SLASET( 'Lower', NROWA-1, NCOLA-1, 0,
00683      $                                     ZERO, ZERO,
00684      $                                     MEM( IPMATA+IA+(JA-1)*LDA ),
00685      $                                     LDA )
00686                         END IF
00687 *
00688                      ELSE
00689 *
00690                         CALL PSLASET( 'Lower', NROWA, NCOLA, ROGUE, ONE,
00691      $                                MEM( IPA ), IA, JA, DESCA )
00692                         CALL PB_SLASET( 'Lower', NROWA, NCOLA, 0, ZERO,
00693      $                                  ONE,
00694      $                                  MEM( IPMATA+IA-1+(JA-1)*LDA ),
00695      $                                  LDA )
00696                         IF( ( K.EQ.4 ).AND.
00697      $                      ( MAX( NROWA, NCOLA ).GT.1 ) ) THEN
00698                            SCALE = ONE / REAL( MAX( NROWA, NCOLA ) )
00699                            CALL PSLASCAL( 'Upper', NROWA-1, NCOLA-1,
00700      $                                    SCALE, MEM( IPA ), IA, JA+1,
00701      $                                    DESCA )
00702                            CALL PB_SLASCAL( 'Upper', NROWA-1, NCOLA-1,
00703      $                                  0, SCALE,
00704      $                                  MEM( IPMATA+IA-1+JA*LDA ), LDA )
00705                         END IF
00706 *
00707                      END IF
00708 *
00709                   END IF
00710 *
00711                END IF
00712 *
00713 *              Pad the guard zones of A, X and Y
00714 *
00715                CALL PB_SFILLPAD( ICTXT, MPA, NQA, MEM( IPA-IPREA ),
00716      $                           DESCA( LLD_ ), IPREA, IPOSTA, PADVAL )
00717 *
00718                CALL PB_SFILLPAD( ICTXT, MPX, NQX, MEM( IPX-IPREX ),
00719      $                           DESCX( LLD_ ), IPREX, IPOSTX, PADVAL )
00720 *
00721                IF( YCHECK( K ) ) THEN
00722                   CALL PB_SFILLPAD( ICTXT, MPY, NQY, MEM( IPY-IPREY ),
00723      $                              DESCY( LLD_ ), IPREY, IPOSTY,
00724      $                              PADVAL )
00725                END IF
00726 *
00727 *              Initialize the check for INPUT-only arguments.
00728 *
00729                INFO = 0
00730                CALL PSCHKARG2( ICTXT, NOUT, SNAMES( K ), UPLO, TRANS,
00731      $                         DIAG, M, N, ALPHA, IA, JA, DESCA, IX,
00732      $                         JX, DESCX, INCX, BETA, IY, JY, DESCY,
00733      $                         INCY, INFO )
00734 *
00735 *              Print initial parallel data if IVERB >= 2.
00736 *
00737                IF( IVERB.EQ.2 ) THEN
00738                   CALL PB_PSLAPRNT( NROWA, NCOLA, MEM( IPA ), IA, JA,
00739      $                              DESCA, 0, 0, 'PARALLEL_INITIAL_A',
00740      $                              NOUT, MEM( IPG ) )
00741                ELSE IF( IVERB.GE.3 ) THEN
00742                   CALL PB_PSLAPRNT( MA, NA, MEM( IPA ), 1, 1, DESCA, 0,
00743      $                              0, 'PARALLEL_INITIAL_A', NOUT,
00744      $                              MEM( IPG ) )
00745                END IF
00746 *
00747                IF( IVERB.EQ.2 ) THEN
00748                   IF( INCX.EQ.DESCX( M_ ) ) THEN
00749                      CALL PB_PSLAPRNT( 1, NLX, MEM( IPX ), IX, JX,
00750      $                                 DESCX, 0, 0,
00751      $                                 'PARALLEL_INITIAL_X', NOUT,
00752      $                                 MEM( IPG ) )
00753                   ELSE
00754                      CALL PB_PSLAPRNT( NLX, 1, MEM( IPX ), IX, JX,
00755      $                                 DESCX, 0, 0,
00756      $                                 'PARALLEL_INITIAL_X', NOUT,
00757      $                                 MEM( IPG ) )
00758                   END IF
00759                ELSE IF( IVERB.GE.3 ) THEN
00760                   CALL PB_PSLAPRNT( MX, NX, MEM( IPX ), 1, 1, DESCX, 0,
00761      $                              0, 'PARALLEL_INITIAL_X', NOUT,
00762      $                              MEM( IPG ) )
00763                END IF
00764 *
00765                IF( YCHECK( K ) ) THEN
00766                   IF( IVERB.EQ.2 ) THEN
00767                      IF( INCY.EQ.DESCY( M_ ) ) THEN
00768                         CALL PB_PSLAPRNT( 1, NLY, MEM( IPY ), IY, JY,
00769      $                                    DESCY, 0, 0,
00770      $                                    'PARALLEL_INITIAL_Y', NOUT,
00771      $                                    MEM( IPG ) )
00772                      ELSE
00773                         CALL PB_PSLAPRNT( NLY, 1, MEM( IPY ), IY, JY,
00774      $                                    DESCY, 0, 0,
00775      $                                    'PARALLEL_INITIAL_Y', NOUT,
00776      $                                    MEM( IPG ) )
00777                      END IF
00778                   ELSE IF( IVERB.GE.3 ) THEN
00779                      CALL PB_PSLAPRNT( MY, NY, MEM( IPY ), 1, 1, DESCY,
00780      $                                 0, 0, 'PARALLEL_INITIAL_Y', NOUT,
00781      $                                 MEM( IPG ) )
00782                   END IF
00783                END IF
00784 *
00785 *              Call the Level 2 PBLAS routine
00786 *
00787                INFO = 0
00788                IF( K.EQ.1 ) THEN
00789 *
00790 *                 Test PSGEMV
00791 *
00792                   CALL PSGEMV( TRANS, M, N, ALPHA, MEM( IPA ), IA, JA,
00793      $                         DESCA, MEM( IPX ), IX, JX, DESCX, INCX,
00794      $                         BETA, MEM( IPY ), IY, JY, DESCY, INCY )
00795 *
00796                ELSE IF( K.EQ.2 ) THEN
00797 *
00798 *                 Test PSSYMV
00799 *
00800                   CALL PSSYMV( UPLO, N, ALPHA, MEM( IPA ), IA, JA,
00801      $                         DESCA, MEM( IPX ), IX, JX, DESCX, INCX,
00802      $                         BETA, MEM( IPY ), IY, JY, DESCY, INCY )
00803 *
00804                ELSE IF( K.EQ.3 ) THEN
00805 *
00806 *                 Test PSTRMV
00807 *
00808                   CALL PSTRMV( UPLO, TRANS, DIAG, N, MEM( IPA ), IA, JA,
00809      $                         DESCA, MEM( IPX ), IX, JX, DESCX, INCX )
00810 *
00811                ELSE IF( K.EQ.4 ) THEN
00812 *
00813 *                 Test PSTRSV
00814 *
00815                   CALL PSTRSV( UPLO, TRANS, DIAG, N, MEM( IPA ), IA, JA,
00816      $                         DESCA, MEM( IPX ), IX, JX, DESCX, INCX )
00817 *
00818                ELSE IF( K.EQ.5 ) THEN
00819 *
00820 *                 Test PSGER
00821 *
00822                   CALL PSGER( M, N, ALPHA, MEM( IPX ), IX, JX, DESCX,
00823      $                        INCX, MEM( IPY ), IY, JY, DESCY, INCY,
00824      $                        MEM( IPA ), IA, JA, DESCA )
00825 *
00826                ELSE IF( K.EQ.6 ) THEN
00827 *
00828 *                 Test PSSYR
00829 *
00830                   CALL PSSYR( UPLO, N, ALPHA, MEM( IPX ), IX, JX, DESCX,
00831      $                         INCX, MEM( IPA ), IA, JA, DESCA )
00832 *
00833                ELSE IF( K.EQ.7 ) THEN
00834 *
00835 *                 Test PSSYR2
00836 *
00837                   CALL PSSYR2( UPLO, N, ALPHA, MEM( IPX ), IX, JX,
00838      $                         DESCX, INCX, MEM( IPY ), IY, JY, DESCY,
00839      $                         INCY, MEM( IPA ), IA, JA, DESCA )
00840 *
00841                END IF
00842 *
00843 *              Check if the operation has been performed.
00844 *
00845                IF( INFO.NE.0 ) THEN
00846                   KSKIP( K ) = KSKIP( K ) + 1
00847                   IF( IAM.EQ.0 )
00848      $               WRITE( NOUT, FMT = 9974 ) INFO
00849                   GO TO 30
00850                END IF
00851 *
00852 *              Check padding
00853 *
00854                CALL PB_SCHEKPAD( ICTXT, SNAMES( K ), MPA, NQA,
00855      $                           MEM( IPA-IPREA ), DESCA( LLD_ ), IPREA,
00856      $                           IPOSTA, PADVAL )
00857 *
00858                CALL PB_SCHEKPAD( ICTXT, SNAMES( K ), MPX, NQX,
00859      $                           MEM( IPX-IPREX ), DESCX( LLD_ ), IPREX,
00860      $                           IPOSTX, PADVAL )
00861 *
00862                IF( YCHECK( K ) ) THEN
00863                   CALL PB_SCHEKPAD( ICTXT, SNAMES( K ), MPY, NQY,
00864      $                              MEM( IPY-IPREY ), DESCY( LLD_ ),
00865      $                              IPREY, IPOSTY, PADVAL )
00866                END IF
00867 *
00868 *              Check the computations
00869 *
00870                CALL PSBLAS2TSTCHK( ICTXT, NOUT, K, UPLO, TRANS, DIAG, M,
00871      $                             N, ALPHA, MEM( IPMATA ), MEM( IPA ),
00872      $                             IA, JA, DESCA, MEM( IPMATX ),
00873      $                             MEM( IPX ), IX, JX, DESCX, INCX,
00874      $                             BETA, MEM( IPMATY ), MEM( IPY ), IY,
00875      $                             JY, DESCY, INCY, THRESH, ROGUE,
00876      $                             MEM( IPG ), INFO )
00877                IF( MOD( INFO, 2 ).EQ.1 ) THEN
00878                   IERR( 1 ) = 1
00879                ELSE IF( MOD( INFO / 2, 2 ).EQ.1 ) THEN
00880                   IERR( 2 ) = 1
00881                ELSE IF( MOD( INFO / 4, 2 ).EQ.1 ) THEN
00882                   IERR( 3 ) = 1
00883                ELSE IF( INFO.NE.0 ) THEN
00884                   IERR( 1 ) = 1
00885                   IERR( 2 ) = 1
00886                   IERR( 3 ) = 1
00887                END IF
00888 *
00889 *              Check input-only scalar arguments
00890 *
00891                INFO = 1
00892                CALL PSCHKARG2( ICTXT, NOUT, SNAMES( K ), UPLO, TRANS,
00893      $                         DIAG, M, N, ALPHA, IA, JA, DESCA, IX,
00894      $                         JX, DESCX, INCX, BETA, IY, JY, DESCY,
00895      $                         INCY, INFO )
00896 *
00897 *              Check input-only array arguments
00898 *
00899                CALL PSCHKMOUT( NROWA, NCOLA, MEM( IPMATA ), MEM( IPA ),
00900      $                         IA, JA, DESCA, IERR( 4 ) )
00901                CALL PSCHKVOUT( NLX, MEM( IPMATX ), MEM( IPX ), IX, JX,
00902      $                         DESCX, INCX, IERR( 5 ) )
00903 *
00904                IF( IERR( 4 ).NE.0 ) THEN
00905                   IF( IAM.EQ.0 )
00906      $               WRITE( NOUT, FMT = 9982 ) 'PARALLEL_A',
00907      $                                         SNAMES( K )
00908                END IF
00909 *
00910                IF( IERR( 5 ).NE.0 ) THEN
00911                   IF( IAM.EQ.0 )
00912      $               WRITE( NOUT, FMT = 9982 ) 'PARALLEL_X',
00913      $                                         SNAMES( K )
00914                END IF
00915 *
00916                IF( YCHECK( K ) ) THEN
00917                   CALL PSCHKVOUT( NLY, MEM( IPMATY ), MEM( IPY ), IY,
00918      $                            JY, DESCY, INCY, IERR( 6 ) )
00919                   IF( IERR( 6 ).NE.0 ) THEN
00920                      IF( IAM.EQ.0 )
00921      $                  WRITE( NOUT, FMT = 9982 ) 'PARALLEL_Y',
00922      $                                            SNAMES( K )
00923                   END IF
00924                END IF
00925 *
00926 *              Only node 0 prints computational test result
00927 *
00928                IF( INFO.NE.0 .OR. IERR( 1 ).NE.0 .OR.
00929      $             IERR( 2 ).NE.0 .OR. IERR( 3 ).NE.0 .OR.
00930      $             IERR( 4 ).NE.0 .OR. IERR( 5 ).NE.0 .OR.
00931      $             IERR( 6 ).NE.0 ) THEN
00932                   IF( IAM.EQ.0 )
00933      $               WRITE( NOUT, FMT = 9984 ) SNAMES( K )
00934                   KFAIL( K ) = KFAIL( K ) + 1
00935                   ERRFLG = .TRUE.
00936                ELSE
00937                   IF( IAM.EQ.0 )
00938      $               WRITE( NOUT, FMT = 9983 ) SNAMES( K )
00939                   KPASS( K ) = KPASS( K ) + 1
00940                END IF
00941 *
00942 *              Dump matrix if IVERB >= 1 and error.
00943 *
00944                IF( IVERB.GE.1 .AND. ERRFLG ) THEN
00945                   IF( IERR( 4 ).NE.0 .OR. IVERB.GE.3 ) THEN
00946                      CALL PSMPRNT( ICTXT, NOUT, MA, NA, MEM( IPMATA ),
00947      $                             LDA, 0, 0, 'SERIAL_A' )
00948                      CALL PB_PSLAPRNT( MA, NA, MEM( IPA ), 1, 1, DESCA,
00949      $                                 0, 0, 'PARALLEL_A', NOUT,
00950      $                                MEM( IPMATA ) )
00951                   ELSE IF( IERR( 1 ).NE.0 ) THEN
00952                      IF( ( NROWA.GT.0 ).AND.( NCOLA.GT.0 ) )
00953      $                  CALL PSMPRNT( ICTXT, NOUT, NROWA, NCOLA,
00954      $                                MEM( IPMATA+IA-1+(JA-1)*LDA ),
00955      $                                LDA, 0, 0, 'SERIAL_A' )
00956                      CALL PB_PSLAPRNT( NROWA, NCOLA, MEM( IPA ), IA, JA,
00957      $                                 DESCA, 0, 0, 'PARALLEL_A',
00958      $                                 NOUT, MEM( IPMATA ) )
00959                   END IF
00960                   IF( IERR( 5 ).NE.0 .OR. IVERB.GE.3 ) THEN
00961                      CALL PSMPRNT( ICTXT, NOUT, MX, NX, MEM( IPMATX ),
00962      $                             LDX, 0, 0, 'SERIAL_X' )
00963                      CALL PB_PSLAPRNT( MX, NX, MEM( IPX ), 1, 1, DESCX,
00964      $                                 0, 0, 'PARALLEL_X', NOUT,
00965      $                                 MEM( IPMATX ) )
00966                   ELSE IF( IERR( 2 ).NE.0 ) THEN
00967                      IF( NLX.GT.0 )
00968      $                  CALL PSVPRNT( ICTXT, NOUT, NLX,
00969      $                                MEM( IPMATX+IX-1+(JX-1)*LDX ),
00970      $                                INCX, 0, 0, 'SERIAL_X' )
00971                      IF( INCX.EQ.DESCX( M_ ) ) THEN
00972                         CALL PB_PSLAPRNT( 1, NLX, MEM( IPX ), IX, JX,
00973      $                                    DESCX, 0, 0, 'PARALLEL_X',
00974      $                                    NOUT, MEM( IPMATX ) )
00975                      ELSE
00976                         CALL PB_PSLAPRNT( NLX, 1, MEM( IPX ), IX, JX,
00977      $                                    DESCX, 0, 0, 'PARALLEL_X',
00978      $                                    NOUT, MEM( IPMATX ) )
00979                      END IF
00980                   END IF
00981                   IF( YCHECK( K ) ) THEN
00982                      IF( IERR( 6 ).NE.0 .OR. IVERB.GE.3 ) THEN
00983                         CALL PSMPRNT( ICTXT, NOUT, MY, NY,
00984      $                                MEM( IPMATY ), LDY, 0, 0,
00985      $                                'SERIAL_Y' )
00986                         CALL PB_PSLAPRNT( MY, NY, MEM( IPY ), 1, 1,
00987      $                                    DESCY, 0, 0, 'PARALLEL_Y',
00988      $                                    NOUT, MEM( IPMATX ) )
00989                      ELSE IF( IERR( 3 ).NE.0 ) THEN
00990                         IF( NLY.GT.0 )
00991      $                     CALL PSVPRNT( ICTXT, NOUT, NLY,
00992      $                                   MEM( IPMATY+IY-1+(JY-1)*LDY ),
00993      $                                   INCY, 0, 0, 'SERIAL_Y' )
00994                         IF( INCY.EQ.DESCY( M_ ) ) THEN
00995                            CALL PB_PSLAPRNT( 1, NLY, MEM( IPY ), IY, JY,
00996      $                                       DESCY, 0, 0, 'PARALLEL_Y',
00997      $                                       NOUT, MEM( IPMATX ) )
00998                         ELSE
00999                            CALL PB_PSLAPRNT( NLY, 1, MEM( IPY ), IY, JY,
01000      $                                       DESCY, 0, 0, 'PARALLEL_Y',
01001      $                                       NOUT, MEM( IPMATX ) )
01002                         END IF
01003                      END IF
01004                   END IF
01005                END IF
01006 *
01007 *              Leave if error and "Stop On Failure"
01008 *
01009                IF( SOF.AND.ERRFLG )
01010      $            GO TO 70
01011 *
01012    30       CONTINUE
01013 *
01014    40       IF( IAM.EQ.0 ) THEN
01015                WRITE( NOUT, FMT = * )
01016                WRITE( NOUT, FMT = 9981 ) J
01017             END IF
01018 *
01019    50   CONTINUE
01020 *
01021         CALL BLACS_GRIDEXIT( ICTXT )
01022 *
01023    60 CONTINUE
01024 *
01025 *     Come here, if error and "Stop On Failure"
01026 *
01027    70 CONTINUE
01028 *
01029 *     Before printing out final stats, add TSKIP to all skips
01030 *
01031       DO 80 I = 1, NSUBS
01032          IF( LTEST( I ) ) THEN
01033             KSKIP( I ) = KSKIP( I ) + TSKIP
01034             KTESTS( I ) = KSKIP( I ) + KFAIL( I ) + KPASS( I )
01035          END IF
01036    80 CONTINUE
01037 *
01038 *     Print results
01039 *
01040       IF( IAM.EQ.0 ) THEN
01041          WRITE( NOUT, FMT = * )
01042          WRITE( NOUT, FMT = 9977 )
01043          WRITE( NOUT, FMT = * )
01044          WRITE( NOUT, FMT = 9979 )
01045          WRITE( NOUT, FMT = 9978 )
01046 *
01047          DO 90 I = 1, NSUBS
01048             WRITE( NOUT, FMT = 9980 ) '|', SNAMES( I ), KTESTS( I ),
01049      $                                KPASS( I ), KFAIL( I ), KSKIP( I )
01050    90    CONTINUE
01051          WRITE( NOUT, FMT = * )
01052          WRITE( NOUT, FMT = 9976 )
01053          WRITE( NOUT, FMT = * )
01054 *
01055       END IF
01056 *
01057       CALL BLACS_EXIT( 0 )
01058 *
01059  9999 FORMAT( 'ILLEGAL ', A, ': ', A, ' = ', I10,
01060      $        ' should be at least 1' )
01061  9998 FORMAT( 'ILLEGAL GRID: NPROW*NPCOL = ', I4,
01062      $        '. It can be at most', I4 )
01063  9997 FORMAT( 'Bad ', A, ' parameters: going on to next test case.' )
01064  9996 FORMAT( 2X, 'Test number ', I4 , ' started on a ', I6, ' x ',
01065      $        I6, ' process grid.' )
01066  9995 FORMAT( 2X, '   ------------------------------------------------',
01067      $        '--------------------------' )
01068  9994 FORMAT( 2X, '        M      N       UPLO       TRANS       DIAG' )
01069  9993 FORMAT( 5X,I6,1X,I6,9X,A1,11X,A1,10X,A1 )
01070  9992 FORMAT( 2X, '       IA     JA     MA     NA   IMBA   INBA',
01071      $        '    MBA    NBA RSRCA CSRCA' )
01072  9991 FORMAT( 5X,I6,1X,I6,1X,I6,1X,I6,1X,I6,1X,I6,1X,I6,1X,I6,
01073      $        1X,I5,1X,I5 )
01074  9990 FORMAT( 2X, '       IX     JX     MX     NX   IMBX   INBX',
01075      $        '    MBX    NBX RSRCX CSRCX   INCX' )
01076  9989 FORMAT( 5X,I6,1X,I6,1X,I6,1X,I6,1X,I6,1X,I6,1X,I6,1X,I6,
01077      $        1X,I5,1X,I5,1X,I6 )
01078  9988 FORMAT( 2X, '       IY     JY     MY     NY   IMBY   INBY',
01079      $        '    MBY    NBY RSRCY CSRCY   INCY' )
01080  9987 FORMAT( 'Not enough memory for this test: going on to',
01081      $        ' next test case.' )
01082  9986 FORMAT( 'Not enough memory. Need: ', I12 )
01083  9985 FORMAT( 2X, '   Tested Subroutine: ', A )
01084  9984 FORMAT( 2X, '   ***** Computational check: ', A, '       ',
01085      $        ' FAILED ',' *****' )
01086  9983 FORMAT( 2X, '   ***** Computational check: ', A, '       ',
01087      $        ' PASSED ',' *****' )
01088  9982 FORMAT( 2X, '   ***** ERROR ***** Matrix operand ', A,
01089      $        ' modified by ', A, ' *****' )
01090  9981 FORMAT( 2X, 'Test number ', I4, ' completed.' )
01091  9980 FORMAT( 2X,A1,2X,A7,8X,I4,6X,I4,5X,I4,4X,I4 )
01092  9979 FORMAT( 2X, '   SUBROUTINE  TOTAL TESTS  PASSED   FAILED  ',
01093      $        'SKIPPED' )
01094  9978 FORMAT( 2X, '   ----------  -----------  ------   ------  ',
01095      $        '-------' )
01096  9977 FORMAT( 2X, 'Testing Summary')
01097  9976 FORMAT( 2X, 'End of Tests.' )
01098  9975 FORMAT( 2X, 'Tests started.' )
01099  9974 FORMAT( 2X, '   ***** Operation not supported, error code: ',
01100      $        I5, ' *****' )
01101 *
01102       STOP
01103 *
01104 *     End of PSBLA2TST
01105 *
01106       END
01107       SUBROUTINE PSBLA2TSTINFO( SUMMRY, NOUT, NMAT, DIAGVAL, TRANVAL,
01108      $                          UPLOVAL, MVAL, NVAL, MAVAL, NAVAL,
01109      $                          IMBAVAL, MBAVAL, INBAVAL, NBAVAL,
01110      $                          RSCAVAL, CSCAVAL, IAVAL, JAVAL,
01111      $                          MXVAL, NXVAL, IMBXVAL, MBXVAL,
01112      $                          INBXVAL, NBXVAL, RSCXVAL, CSCXVAL,
01113      $                          IXVAL, JXVAL, INCXVAL, MYVAL, NYVAL,
01114      $                          IMBYVAL, MBYVAL, INBYVAL, NBYVAL,
01115      $                          RSCYVAL, CSCYVAL, IYVAL, JYVAL,
01116      $                          INCYVAL, LDVAL, NGRIDS, PVAL, LDPVAL,
01117      $                          QVAL, LDQVAL, NBLOG, LTEST, SOF, TEE,
01118      $                          IAM, IGAP, IVERB, NPROCS, THRESH, ALPHA,
01119      $                          BETA, WORK )
01120 *
01121 *  -- PBLAS test routine (version 2.0) --
01122 *     University of Tennessee, Knoxville, Oak Ridge National Laboratory,
01123 *     and University of California, Berkeley.
01124 *     April 1, 1998
01125 *
01126 *     .. Scalar Arguments ..
01127       LOGICAL            SOF, TEE
01128       INTEGER            IAM, IGAP, IVERB, LDPVAL, LDQVAL, LDVAL, NBLOG,
01129      $                   NGRIDS, NMAT, NOUT, NPROCS
01130       REAL               ALPHA, BETA, THRESH
01131 *     ..
01132 *     .. Array Arguments ..
01133       CHARACTER*( * )    SUMMRY
01134       CHARACTER*1        DIAGVAL( LDVAL ), TRANVAL( LDVAL ),
01135      $                   UPLOVAL( LDVAL )
01136       LOGICAL            LTEST( * )
01137       INTEGER            CSCAVAL( LDVAL ), CSCXVAL( LDVAL ),
01138      $                   CSCYVAL( LDVAL ), IAVAL( LDVAL ),
01139      $                   IMBAVAL( LDVAL ), IMBXVAL( LDVAL ),
01140      $                   IMBYVAL( LDVAL ), INBAVAL( LDVAL ),
01141      $                   INBXVAL( LDVAL ), INBYVAL( LDVAL ),
01142      $                   INCXVAL( LDVAL ), INCYVAL( LDVAL ),
01143      $                   IXVAL( LDVAL ), IYVAL( LDVAL ), JAVAL( LDVAL ),
01144      $                   JXVAL( LDVAL ), JYVAL( LDVAL ), MAVAL( LDVAL ),
01145      $                   MBAVAL( LDVAL ), MBXVAL( LDVAL ),
01146      $                   MBYVAL( LDVAL ), MVAL( LDVAL ), MXVAL( LDVAL ),
01147      $                   MYVAL( LDVAL ), NAVAL( LDVAL ),
01148      $                   NBAVAL( LDVAL ), NBXVAL( LDVAL ),
01149      $                   NBYVAL( LDVAL ), NVAL( LDVAL ), NXVAL( LDVAL ),
01150      $                   NYVAL( LDVAL ), PVAL( LDPVAL ), QVAL( LDQVAL ),
01151      $                   RSCAVAL( LDVAL ), RSCXVAL( LDVAL ),
01152      $                   RSCYVAL( LDVAL ), WORK( * )
01153 *     ..
01154 *
01155 *  Purpose
01156 *  =======
01157 *
01158 *  PSBLA2TSTINFO  get the needed startup information for testing various
01159 *  Level 2 PBLAS routines, and transmits it to all processes.
01160 *
01161 *  Notes
01162 *  =====
01163 *
01164 *  For packing the information we assumed that the length in bytes of an
01165 *  integer is equal to the length in bytes of a real single precision.
01166 *
01167 *  Arguments
01168 *  =========
01169 *
01170 *  SUMMRY  (global output) CHARACTER*(*)
01171 *          On  exit,  SUMMRY  is  the  name of output (summary) file (if
01172 *          any). SUMMRY is only defined for process 0.
01173 *
01174 *  NOUT    (global output) INTEGER
01175 *          On exit, NOUT  specifies the unit number for the output file.
01176 *          When NOUT is 6, output to screen,  when  NOUT is 0, output to
01177 *          stderr. NOUT is only defined for process 0.
01178 *
01179 *  NMAT    (global output) INTEGER
01180 *          On exit,  NMAT  specifies the number of different test cases.
01181 *
01182 *  DIAGVAL (global output) CHARACTER array
01183 *          On entry,  DIAGVAL  is  an array of dimension LDVAL. On exit,
01184 *          this array contains the values of DIAG to run the code with.
01185 *
01186 *  TRANVAL (global output) CHARACTER array
01187 *          On entry, TRANVAL  is an array of dimension LDVAL.  On  exit,
01188 *          this array contains  the  values  of  TRANS  to  run the code
01189 *          with.
01190 *
01191 *  UPLOVAL (global output) CHARACTER array
01192 *          On entry, UPLOVAL  is an array of dimension LDVAL.  On  exit,
01193 *          this array contains the values of UPLO to run the code with.
01194 *
01195 *  MVAL    (global output) INTEGER array
01196 *          On entry, MVAL is an array of dimension LDVAL.  On exit, this
01197 *          array contains the values of M to run the code with.
01198 *
01199 *  NVAL    (global output) INTEGER array
01200 *          On entry, NVAL is an array of dimension LDVAL.  On exit, this
01201 *          array contains the values of N to run the code with.
01202 *
01203 *  MAVAL   (global output) INTEGER array
01204 *          On entry, MAVAL is an array of dimension LDVAL. On exit, this
01205 *          array  contains  the values  of  DESCA( M_ )  to run the code
01206 *          with.
01207 *
01208 *  NAVAL   (global output) INTEGER array
01209 *          On entry, NAVAL is an array of dimension LDVAL. On exit, this
01210 *          array  contains  the values  of  DESCA( N_ )  to run the code
01211 *          with.
01212 *
01213 *  IMBAVAL (global output) INTEGER array
01214 *          On entry,  IMBAVAL  is an array of  dimension LDVAL. On exit,
01215 *          this  array  contains  the values of DESCA( IMB_ ) to run the
01216 *          code with.
01217 *
01218 *  MBAVAL  (global output) INTEGER array
01219 *          On entry,  MBAVAL  is an array of  dimension  LDVAL. On exit,
01220 *          this  array  contains  the values of DESCA( MB_ ) to  run the
01221 *          code with.
01222 *
01223 *  INBAVAL (global output) INTEGER array
01224 *          On entry,  INBAVAL  is an array of  dimension LDVAL. On exit,
01225 *          this  array  contains  the values of DESCA( INB_ ) to run the
01226 *          code with.
01227 *
01228 *  NBAVAL  (global output) INTEGER array
01229 *          On entry,  NBAVAL  is an array of  dimension  LDVAL. On exit,
01230 *          this  array  contains  the values of DESCA( NB_ ) to  run the
01231 *          code with.
01232 *
01233 *  RSCAVAL (global output) INTEGER array
01234 *          On entry, RSCAVAL  is an array of  dimension  LDVAL. On exit,
01235 *          this  array  contains the values of DESCA( RSRC_ ) to run the
01236 *          code with.
01237 *
01238 *  CSCAVAL (global output) INTEGER array
01239 *          On entry, CSCAVAL  is an array of  dimension  LDVAL. On exit,
01240 *          this  array  contains the values of DESCA( CSRC_ ) to run the
01241 *          code with.
01242 *
01243 *  IAVAL   (global output) INTEGER array
01244 *          On entry, IAVAL is an array of dimension LDVAL. On exit, this
01245 *          array  contains the values of IA to run the code with.
01246 *
01247 *  JAVAL   (global output) INTEGER array
01248 *          On entry, JAVAL is an array of dimension LDVAL. On exit, this
01249 *          array  contains the values of JA to run the code with.
01250 *
01251 *  MXVAL   (global output) INTEGER array
01252 *          On entry, MXVAL is an array of dimension LDVAL. On exit, this
01253 *          array  contains  the values  of  DESCX( M_ )  to run the code
01254 *          with.
01255 *
01256 *  NXVAL   (global output) INTEGER array
01257 *          On entry, NXVAL is an array of dimension LDVAL. On exit, this
01258 *          array  contains  the values  of  DESCX( N_ )  to run the code
01259 *          with.
01260 *
01261 *  IMBXVAL (global output) INTEGER array
01262 *          On entry,  IMBXVAL  is an array of  dimension LDVAL. On exit,
01263 *          this  array  contains  the values of DESCX( IMB_ ) to run the
01264 *          code with.
01265 *
01266 *  MBXVAL  (global output) INTEGER array
01267 *          On entry,  MBXVAL  is an array of  dimension  LDVAL. On exit,
01268 *          this  array  contains  the values of DESCX( MB_ ) to  run the
01269 *          code with.
01270 *
01271 *  INBXVAL (global output) INTEGER array
01272 *          On entry,  INBXVAL  is an array of  dimension LDVAL. On exit,
01273 *          this  array  contains  the values of DESCX( INB_ ) to run the
01274 *          code with.
01275 *
01276 *  NBXVAL  (global output) INTEGER array
01277 *          On entry,  NBXVAL  is an array of  dimension  LDVAL. On exit,
01278 *          this  array  contains  the values of DESCX( NB_ ) to  run the
01279 *          code with.
01280 *
01281 *  RSCXVAL (global output) INTEGER array
01282 *          On entry, RSCXVAL  is an array of  dimension  LDVAL. On exit,
01283 *          this  array  contains the values of DESCX( RSRC_ ) to run the
01284 *          code with.
01285 *
01286 *  CSCXVAL (global output) INTEGER array
01287 *          On entry, CSCXVAL  is an array of  dimension  LDVAL. On exit,
01288 *          this  array  contains the values of DESCX( CSRC_ ) to run the
01289 *          code with.
01290 *
01291 *  IXVAL   (global output) INTEGER array
01292 *          On entry, IXVAL is an array of dimension LDVAL. On exit, this
01293 *          array  contains the values of IX to run the code with.
01294 *
01295 *  JXVAL   (global output) INTEGER array
01296 *          On entry, JXVAL is an array of dimension LDVAL. On exit, this
01297 *          array  contains the values of JX to run the code with.
01298 *
01299 *  INCXVAL (global output) INTEGER array
01300 *          On entry,  INCXVAL  is  an array of dimension LDVAL. On exit,
01301 *          this array  contains the values of INCX to run the code with.
01302 *
01303 *  MYVAL   (global output) INTEGER array
01304 *          On entry, MYVAL is an array of dimension LDVAL. On exit, this
01305 *          array  contains  the values  of  DESCY( M_ )  to run the code
01306 *          with.
01307 *
01308 *  NYVAL   (global output) INTEGER array
01309 *          On entry, NYVAL is an array of dimension LDVAL. On exit, this
01310 *          array  contains  the values  of  DESCY( N_ )  to run the code
01311 *          with.
01312 *
01313 *  IMBYVAL (global output) INTEGER array
01314 *          On entry,  IMBYVAL  is an array of  dimension LDVAL. On exit,
01315 *          this  array  contains  the values of DESCY( IMB_ ) to run the
01316 *          code with.
01317 *
01318 *  MBYVAL  (global output) INTEGER array
01319 *          On entry,  MBYVAL  is an array of  dimension  LDVAL. On exit,
01320 *          this  array  contains  the values of DESCY( MB_ ) to  run the
01321 *          code with.
01322 *
01323 *  INBYVAL (global output) INTEGER array
01324 *          On entry,  INBYVAL  is an array of  dimension LDVAL. On exit,
01325 *          this  array  contains  the values of DESCY( INB_ ) to run the
01326 *          code with.
01327 *
01328 *  NBYVAL  (global output) INTEGER array
01329 *          On entry,  NBYVAL  is an array of  dimension  LDVAL. On exit,
01330 *          this  array  contains  the values of DESCY( NB_ ) to  run the
01331 *          code with.
01332 *
01333 *  RSCYVAL (global output) INTEGER array
01334 *          On entry, RSCYVAL  is an array of  dimension  LDVAL. On exit,
01335 *          this  array  contains the values of DESCY( RSRC_ ) to run the
01336 *          code with.
01337 *
01338 *  CSCYVAL (global output) INTEGER array
01339 *          On entry, CSCYVAL  is an array of  dimension  LDVAL. On exit,
01340 *          this  array  contains the values of DESCY( CSRC_ ) to run the
01341 *          code with.
01342 *
01343 *  IYVAL   (global output) INTEGER array
01344 *          On entry, IYVAL is an array of dimension LDVAL. On exit, this
01345 *          array  contains the values of IY to run the code with.
01346 *
01347 *  JYVAL   (global output) INTEGER array
01348 *          On entry, JYVAL is an array of dimension LDVAL. On exit, this
01349 *          array  contains the values of JY to run the code with.
01350 *
01351 *  INCYVAL (global output) INTEGER array
01352 *          On entry,  INCYVAL  is  an array of dimension LDVAL. On exit,
01353 *          this array  contains the values of INCY to run the code with.
01354 *
01355 *  LDVAL   (global input) INTEGER
01356 *          On entry, LDVAL specifies the maximum number of different va-
01357 *          lues that can be used for DIAG, TRANS, UPLO, M, N,  DESCA(:),
01358 *          IA,  JA,  DESCX(:),  IX, JX, INCX, DESCY(:), IY, JY and INCY.
01359 *          This is also the maximum number of test cases.
01360 *
01361 *  NGRIDS  (global output) INTEGER
01362 *          On exit, NGRIDS specifies the number of different values that
01363 *          can be used for P and Q.
01364 *
01365 *  PVAL    (global output) INTEGER array
01366 *          On entry, PVAL is an array of dimension LDPVAL. On exit, this
01367 *          array contains the values of P to run the code with.
01368 *
01369 *  LDPVAL  (global input) INTEGER
01370 *          On entry,  LDPVAL  specifies  the maximum number of different
01371 *          values that can be used for P.
01372 *
01373 *  QVAL    (global output) INTEGER array
01374 *          On entry, QVAL is an array of dimension LDQVAL. On exit, this
01375 *          array contains the values of Q to run the code with.
01376 *
01377 *  LDQVAL  (global input) INTEGER
01378 *          On entry,  LDQVAL  specifies  the maximum number of different
01379 *          values that can be used for Q.
01380 *
01381 *  NBLOG   (global output) INTEGER
01382 *          On exit, NBLOG specifies the logical computational block size
01383 *          to run the tests with. NBLOG must be at least one.
01384 *
01385 *  LTEST   (global output) LOGICAL array
01386 *          On entry,  LTEST  is an array of dimension at least seven. On
01387 *          exit, if LTEST( i ) is .TRUE., the i-th Level 2 PBLAS routine
01388 *          will be tested.  See  the  input file for the ordering of the
01389 *          routines.
01390 *
01391 *  SOF     (global output) LOGICAL
01392 *          On exit, if SOF is .TRUE., the tester will  stop on the first
01393 *          detected failure. Otherwise, it won't.
01394 *
01395 *  TEE     (global output) LOGICAL
01396 *          On exit, if TEE is .TRUE., the tester will  perform the error
01397 *          exit tests. These tests won't be performed otherwise.
01398 *
01399 *  IAM     (local input) INTEGER
01400 *          On entry,  IAM  specifies the number of the process executing
01401 *          this routine.
01402 *
01403 *  IGAP    (global output) INTEGER
01404 *          On exit, IGAP  specifies the user-specified gap used for pad-
01405 *          ding. IGAP must be at least zero.
01406 *
01407 *  IVERB   (global output) INTEGER
01408 *          On exit,  IVERB  specifies  the output verbosity level: 0 for
01409 *          pass/fail, 1, 2 or 3 for matrix dump on errors.
01410 *
01411 *  NPROCS  (global input) INTEGER
01412 *          On entry, NPROCS specifies the total number of processes.
01413 *
01414 *  THRESH  (global output) REAL
01415 *          On exit,  THRESH  specifies the threshhold value for the test
01416 *          ratio.
01417 *
01418 *  ALPHA   (global output) REAL
01419 *          On exit, ALPHA specifies the value of alpha to be used in all
01420 *          the test cases.
01421 *
01422 *  BETA    (global output) REAL
01423 *          On exit, BETA  specifies the value of beta  to be used in all
01424 *          the test cases.
01425 *
01426 *  WORK    (local workspace) INTEGER array
01427 *          On   entry,   WORK   is   an  array  of  dimension  at  least
01428 *          MAX( 3, 2*NGRIDS+37*NMAT+NSUBS+4 )  with  NSUBS  equal  to 7.
01429 *          This array is used to pack all output arrays in order to send
01430 *          the information in one message.
01431 *
01432 *  -- Written on April 1, 1998 by
01433 *     Antoine Petitet, University  of  Tennessee, Knoxville 37996, USA.
01434 *
01435 *  =====================================================================
01436 *
01437 *     .. Parameters ..
01438       INTEGER            NIN, NSUBS
01439       PARAMETER          ( NIN = 11, NSUBS = 7 )
01440 *     ..
01441 *     .. Local Scalars ..
01442       LOGICAL            LTESTT
01443       INTEGER            I, ICTXT, J
01444       REAL               EPS
01445 *     ..
01446 *     .. Local Arrays ..
01447       CHARACTER*7        SNAMET
01448       CHARACTER*79       USRINFO
01449 *     ..
01450 *     .. External Subroutines ..
01451       EXTERNAL           BLACS_ABORT, BLACS_GET, BLACS_GRIDEXIT,
01452      $                   BLACS_GRIDINIT, BLACS_SETUP, ICOPY, IGEBR2D,
01453      $                   IGEBS2D, SGEBR2D, SGEBS2D
01454 *ype real dble cplx zplx
01455 *     ..
01456 *     .. External Functions ..
01457       REAL               PSLAMCH
01458       EXTERNAL           PSLAMCH
01459 *     ..
01460 *     .. Intrinsic Functions ..
01461       INTRINSIC          CHAR, ICHAR, MAX, MIN
01462 *     ..
01463 *     .. Common Blocks ..
01464       CHARACTER*7        SNAMES( NSUBS )
01465       COMMON             /SNAMEC/SNAMES
01466 *     ..
01467 *     .. Executable Statements ..
01468 *
01469 *     Process 0 reads the input data, broadcasts to other processes and
01470 *     writes needed information to NOUT
01471 *
01472       IF( IAM.EQ.0 ) THEN
01473 *
01474 *        Open file and skip data file header
01475 *
01476          OPEN( NIN, FILE='PSBLAS2TST.dat', STATUS='OLD' )
01477          READ( NIN, FMT = * ) SUMMRY
01478          SUMMRY = ' '
01479 *
01480 *        Read in user-supplied info about machine type, compiler, etc.
01481 *
01482          READ( NIN, FMT = 9999 ) USRINFO
01483 *
01484 *        Read name and unit number for summary output file
01485 *
01486          READ( NIN, FMT = * ) SUMMRY
01487          READ( NIN, FMT = * ) NOUT
01488          IF( NOUT.NE.0 .AND. NOUT.NE.6 )
01489      $      OPEN( NOUT, FILE = SUMMRY, STATUS = 'UNKNOWN' )
01490 *
01491 *        Read and check the parameter values for the tests.
01492 *
01493 *        Read the flag that indicates if Stop on Failure
01494 *
01495          READ( NIN, FMT = * ) SOF
01496 *
01497 *        Read the flag that indicates if Test Error Exits
01498 *
01499          READ( NIN, FMT = * ) TEE
01500 *
01501 *        Read the verbosity level
01502 *
01503          READ( NIN, FMT = * ) IVERB
01504          IF( IVERB.LT.0 .OR. IVERB.GT.3 )
01505      $      IVERB = 0
01506 *
01507 *        Read the leading dimension gap
01508 *
01509          READ( NIN, FMT = * ) IGAP
01510          IF( IGAP.LT.0 )
01511      $      IGAP = 0
01512 *
01513 *        Read the threshold value for test ratio
01514 *
01515          READ( NIN, FMT = * ) THRESH
01516          IF( THRESH.LT.0.0 )
01517      $      THRESH = 16.0
01518 *
01519 *        Get logical computational block size
01520 *
01521          READ( NIN, FMT = * ) NBLOG
01522          IF( NBLOG.LT.1 )
01523      $      NBLOG = 32
01524 *
01525 *        Get number of grids
01526 *
01527          READ( NIN, FMT = * ) NGRIDS
01528          IF( NGRIDS.LT.1 .OR. NGRIDS.GT.LDPVAL ) THEN
01529             WRITE( NOUT, FMT = 9998 ) 'Grids', LDPVAL
01530             GO TO 120
01531          ELSE IF( NGRIDS.GT.LDQVAL ) THEN
01532             WRITE( NOUT, FMT = 9998 ) 'Grids', LDQVAL
01533             GO TO 120
01534          END IF
01535 *
01536 *        Get values of P and Q
01537 *
01538          READ( NIN, FMT = * ) ( PVAL( I ), I = 1, NGRIDS )
01539          READ( NIN, FMT = * ) ( QVAL( I ), I = 1, NGRIDS )
01540 *
01541 *        Read ALPHA, BETA
01542 *
01543          READ( NIN, FMT = * ) ALPHA
01544          READ( NIN, FMT = * ) BETA
01545 *
01546 *        Read number of tests.
01547 *
01548          READ( NIN, FMT = * ) NMAT
01549          IF( NMAT.LT.1 .OR. NMAT.GT.LDVAL ) THEN
01550             WRITE( NOUT, FMT = 9998 ) 'Tests', LDVAL
01551             GO TO 120
01552          ENDIF
01553 *
01554 *        Read in input data into arrays.
01555 *
01556          READ( NIN, FMT = * ) ( UPLOVAL( I ),  I = 1, NMAT )
01557          READ( NIN, FMT = * ) ( TRANVAL( I ),  I = 1, NMAT )
01558          READ( NIN, FMT = * ) ( DIAGVAL( I ),  I = 1, NMAT )
01559          READ( NIN, FMT = * ) ( MVAL( I ),     I = 1, NMAT )
01560          READ( NIN, FMT = * ) ( NVAL( I ),     I = 1, NMAT )
01561          READ( NIN, FMT = * ) ( MAVAL( I ),    I = 1, NMAT )
01562          READ( NIN, FMT = * ) ( NAVAL( I ),    I = 1, NMAT )
01563          READ( NIN, FMT = * ) ( IMBAVAL( I ),  I = 1, NMAT )
01564          READ( NIN, FMT = * ) ( INBAVAL( I ),  I = 1, NMAT )
01565          READ( NIN, FMT = * ) ( MBAVAL( I ),   I = 1, NMAT )
01566          READ( NIN, FMT = * ) ( NBAVAL( I ),   I = 1, NMAT )
01567          READ( NIN, FMT = * ) ( RSCAVAL( I ),  I = 1, NMAT )
01568          READ( NIN, FMT = * ) ( CSCAVAL( I ),  I = 1, NMAT )
01569          READ( NIN, FMT = * ) ( IAVAL( I ),    I = 1, NMAT )
01570          READ( NIN, FMT = * ) ( JAVAL( I ),    I = 1, NMAT )
01571          READ( NIN, FMT = * ) ( MXVAL( I ),    I = 1, NMAT )
01572          READ( NIN, FMT = * ) ( NXVAL( I ),    I = 1, NMAT )
01573          READ( NIN, FMT = * ) ( IMBXVAL( I ),  I = 1, NMAT )
01574          READ( NIN, FMT = * ) ( INBXVAL( I ),  I = 1, NMAT )
01575          READ( NIN, FMT = * ) ( MBXVAL( I ),   I = 1, NMAT )
01576          READ( NIN, FMT = * ) ( NBXVAL( I ),   I = 1, NMAT )
01577          READ( NIN, FMT = * ) ( RSCXVAL( I ),  I = 1, NMAT )
01578          READ( NIN, FMT = * ) ( CSCXVAL( I ),  I = 1, NMAT )
01579          READ( NIN, FMT = * ) ( IXVAL( I ),    I = 1, NMAT )
01580          READ( NIN, FMT = * ) ( JXVAL( I ),    I = 1, NMAT )
01581          READ( NIN, FMT = * ) ( INCXVAL( I ),  I = 1, NMAT )
01582          READ( NIN, FMT = * ) ( MYVAL( I ),    I = 1, NMAT )
01583          READ( NIN, FMT = * ) ( NYVAL( I ),    I = 1, NMAT )
01584          READ( NIN, FMT = * ) ( IMBYVAL( I ),  I = 1, NMAT )
01585          READ( NIN, FMT = * ) ( INBYVAL( I ),  I = 1, NMAT )
01586          READ( NIN, FMT = * ) ( MBYVAL( I ),   I = 1, NMAT )
01587          READ( NIN, FMT = * ) ( NBYVAL( I ),   I = 1, NMAT )
01588          READ( NIN, FMT = * ) ( RSCYVAL( I ),  I = 1, NMAT )
01589          READ( NIN, FMT = * ) ( CSCYVAL( I ),  I = 1, NMAT )
01590          READ( NIN, FMT = * ) ( IYVAL( I ),    I = 1, NMAT )
01591          READ( NIN, FMT = * ) ( JYVAL( I ),    I = 1, NMAT )
01592          READ( NIN, FMT = * ) ( INCYVAL( I ),  I = 1, NMAT )
01593 *
01594 *        Read names of subroutines and flags which indicate
01595 *        whether they are to be tested.
01596 *
01597          DO 10 I = 1, NSUBS
01598             LTEST( I ) = .FALSE.
01599    10    CONTINUE
01600    20    CONTINUE
01601          READ( NIN, FMT = 9996, END = 50 ) SNAMET, LTESTT
01602          DO 30 I = 1, NSUBS
01603             IF( SNAMET.EQ.SNAMES( I ) )
01604      $         GO TO 40
01605    30    CONTINUE
01606 *
01607          WRITE( NOUT, FMT = 9995 )SNAMET
01608          GO TO 120
01609 *
01610    40    CONTINUE
01611          LTEST( I ) = LTESTT
01612          GO TO 20
01613 *
01614    50    CONTINUE
01615 *
01616 *        Close input file
01617 *
01618          CLOSE ( NIN )
01619 *
01620 *        For pvm only: if virtual machine not set up, allocate it and
01621 *        spawn the correct number of processes.
01622 *
01623          IF( NPROCS.LT.1 ) THEN
01624             NPROCS = 0
01625             DO 60 I = 1, NGRIDS
01626                NPROCS = MAX( NPROCS, PVAL( I )*QVAL( I ) )
01627    60       CONTINUE
01628             CALL BLACS_SETUP( IAM, NPROCS )
01629          END IF
01630 *
01631 *        Temporarily define blacs grid to include all processes so
01632 *        information can be broadcast to all processes
01633 *
01634          CALL BLACS_GET( -1, 0, ICTXT )
01635          CALL BLACS_GRIDINIT( ICTXT, 'Row-major', 1, NPROCS )
01636 *
01637 *        Compute machine epsilon
01638 *
01639          EPS = PSLAMCH( ICTXT, 'eps' )
01640 *
01641 *        Pack information arrays and broadcast
01642 *
01643          CALL SGEBS2D( ICTXT, 'All', ' ', 1, 1, THRESH, 1 )
01644          CALL SGEBS2D( ICTXT, 'All', ' ', 1, 1, ALPHA, 1 )
01645          CALL SGEBS2D( ICTXT, 'All', ' ', 1, 1, BETA, 1 )
01646 *
01647          WORK( 1 ) = NGRIDS
01648          WORK( 2 ) = NMAT
01649          WORK( 3 ) = NBLOG
01650          CALL IGEBS2D( ICTXT, 'All', ' ', 3, 1, WORK, 3 )
01651 *
01652          I = 1
01653          IF( SOF ) THEN
01654             WORK( I ) = 1
01655          ELSE
01656             WORK( I ) = 0
01657          END IF
01658          I = I + 1
01659          IF( TEE ) THEN
01660             WORK( I ) = 1
01661          ELSE
01662             WORK( I ) = 0
01663          END IF
01664          I = I + 1
01665          WORK( I ) = IVERB
01666          I = I + 1
01667          WORK( I ) = IGAP
01668          I = I + 1
01669          DO 70 J = 1, NMAT
01670             WORK( I )   = ICHAR( DIAGVAL( J ) )
01671             WORK( I+1 ) = ICHAR( TRANVAL( J ) )
01672             WORK( I+2 ) = ICHAR( UPLOVAL( J ) )
01673             I = I + 3
01674    70    CONTINUE
01675          CALL ICOPY( NGRIDS, PVAL,     1, WORK( I ), 1 )
01676          I = I + NGRIDS
01677          CALL ICOPY( NGRIDS, QVAL,     1, WORK( I ), 1 )
01678          I = I + NGRIDS
01679          CALL ICOPY( NMAT,   MVAL,     1, WORK( I ), 1 )
01680          I = I + NMAT
01681          CALL ICOPY( NMAT,   NVAL,     1, WORK( I ), 1 )
01682          I = I + NMAT
01683          CALL ICOPY( NMAT,   MAVAL,    1, WORK( I ), 1 )
01684          I = I + NMAT
01685          CALL ICOPY( NMAT,   NAVAL,    1, WORK( I ), 1 )
01686          I = I + NMAT
01687          CALL ICOPY( NMAT,   IMBAVAL,  1, WORK( I ), 1 )
01688          I = I + NMAT
01689          CALL ICOPY( NMAT,   INBAVAL,  1, WORK( I ), 1 )
01690          I = I + NMAT
01691          CALL ICOPY( NMAT,   MBAVAL,   1, WORK( I ), 1 )
01692          I = I + NMAT
01693          CALL ICOPY( NMAT,   NBAVAL,   1, WORK( I ), 1 )
01694          I = I + NMAT
01695          CALL ICOPY( NMAT,   RSCAVAL,  1, WORK( I ), 1 )
01696          I = I + NMAT
01697          CALL ICOPY( NMAT,   CSCAVAL,  1, WORK( I ), 1 )
01698          I = I + NMAT
01699          CALL ICOPY( NMAT,   IAVAL,    1, WORK( I ), 1 )
01700          I = I + NMAT
01701          CALL ICOPY( NMAT,   JAVAL,    1, WORK( I ), 1 )
01702          I = I + NMAT
01703          CALL ICOPY( NMAT,   MXVAL,    1, WORK( I ), 1 )
01704          I = I + NMAT
01705          CALL ICOPY( NMAT,   NXVAL,    1, WORK( I ), 1 )
01706          I = I + NMAT
01707          CALL ICOPY( NMAT,   IMBXVAL,  1, WORK( I ), 1 )
01708          I = I + NMAT
01709          CALL ICOPY( NMAT,   INBXVAL,  1, WORK( I ), 1 )
01710          I = I + NMAT
01711          CALL ICOPY( NMAT,   MBXVAL,   1, WORK( I ), 1 )
01712          I = I + NMAT
01713          CALL ICOPY( NMAT,   NBXVAL,   1, WORK( I ), 1 )
01714          I = I + NMAT
01715          CALL ICOPY( NMAT,   RSCXVAL,  1, WORK( I ), 1 )
01716          I = I + NMAT
01717          CALL ICOPY( NMAT,   CSCXVAL,  1, WORK( I ), 1 )
01718          I = I + NMAT
01719          CALL ICOPY( NMAT,   IXVAL,    1, WORK( I ), 1 )
01720          I = I + NMAT
01721          CALL ICOPY( NMAT,   JXVAL,    1, WORK( I ), 1 )
01722          I = I + NMAT
01723          CALL ICOPY( NMAT,   INCXVAL,  1, WORK( I ), 1 )
01724          I = I + NMAT
01725          CALL ICOPY( NMAT,   MYVAL,    1, WORK( I ), 1 )
01726          I = I + NMAT
01727          CALL ICOPY( NMAT,   NYVAL,    1, WORK( I ), 1 )
01728          I = I + NMAT
01729          CALL ICOPY( NMAT,   IMBYVAL,  1, WORK( I ), 1 )
01730          I = I + NMAT
01731          CALL ICOPY( NMAT,   INBYVAL,  1, WORK( I ), 1 )
01732          I = I + NMAT
01733          CALL ICOPY( NMAT,   MBYVAL,   1, WORK( I ), 1 )
01734          I = I + NMAT
01735          CALL ICOPY( NMAT,   NBYVAL,   1, WORK( I ), 1 )
01736          I = I + NMAT
01737          CALL ICOPY( NMAT,   RSCYVAL,  1, WORK( I ), 1 )
01738          I = I + NMAT
01739          CALL ICOPY( NMAT,   CSCYVAL,  1, WORK( I ), 1 )
01740          I = I + NMAT
01741          CALL ICOPY( NMAT,   IYVAL,    1, WORK( I ), 1 )
01742          I = I + NMAT
01743          CALL ICOPY( NMAT,   JYVAL,    1, WORK( I ), 1 )
01744          I = I + NMAT
01745          CALL ICOPY( NMAT,   INCYVAL,  1, WORK( I ), 1 )
01746          I = I + NMAT
01747 *
01748          DO 80 J = 1, NSUBS
01749             IF( LTEST( J ) ) THEN
01750                WORK( I ) = 1
01751             ELSE
01752                WORK( I ) = 0
01753             END IF
01754             I = I + 1
01755    80    CONTINUE
01756          I = I - 1
01757          CALL IGEBS2D( ICTXT, 'All', ' ', I, 1, WORK, I )
01758 *
01759 *        regurgitate input
01760 *
01761          WRITE( NOUT, FMT = 9999 ) 'Level 2 PBLAS testing program.'
01762          WRITE( NOUT, FMT = 9999 ) USRINFO
01763          WRITE( NOUT, FMT = * )
01764          WRITE( NOUT, FMT = 9999 )
01765      $               'Tests of the real single precision '//
01766      $               'Level 2 PBLAS'
01767          WRITE( NOUT, FMT = * )
01768          WRITE( NOUT, FMT = 9993 ) NMAT
01769          WRITE( NOUT, FMT = 9979 ) NBLOG
01770          WRITE( NOUT, FMT = 9992 ) NGRIDS
01771          WRITE( NOUT, FMT = 9990 )
01772      $               'P', ( PVAL(I), I = 1, MIN(NGRIDS, 5) )
01773          IF( NGRIDS.GT.5 )
01774      $      WRITE( NOUT, FMT = 9991 ) ( PVAL(I), I = 6,
01775      $                                  MIN( 10, NGRIDS ) )
01776          IF( NGRIDS.GT.10 )
01777      $      WRITE( NOUT, FMT = 9991 ) ( PVAL(I), I = 11,
01778      $                                  MIN( 15, NGRIDS ) )
01779          IF( NGRIDS.GT.15 )
01780      $      WRITE( NOUT, FMT = 9991 ) ( PVAL(I), I = 16, NGRIDS )
01781          WRITE( NOUT, FMT = 9990 )
01782      $               'Q', ( QVAL(I), I = 1, MIN(NGRIDS, 5) )
01783          IF( NGRIDS.GT.5 )
01784      $      WRITE( NOUT, FMT = 9991 ) ( QVAL(I), I = 6,
01785      $                                  MIN( 10, NGRIDS ) )
01786          IF( NGRIDS.GT.10 )
01787      $      WRITE( NOUT, FMT = 9991 ) ( QVAL(I), I = 11,
01788      $                                  MIN( 15, NGRIDS ) )
01789          IF( NGRIDS.GT.15 )
01790      $      WRITE( NOUT, FMT = 9991 ) ( QVAL(I), I = 16, NGRIDS )
01791          WRITE( NOUT, FMT = 9988 ) SOF
01792          WRITE( NOUT, FMT = 9987 ) TEE
01793          WRITE( NOUT, FMT = 9983 ) IGAP
01794          WRITE( NOUT, FMT = 9986 ) IVERB
01795          WRITE( NOUT, FMT = 9980 ) THRESH
01796          WRITE( NOUT, FMT = 9982 ) ALPHA
01797          WRITE( NOUT, FMT = 9981 ) BETA
01798          IF( LTEST( 1 ) ) THEN
01799             WRITE( NOUT, FMT = 9985 ) SNAMES( 1 ), ' ... Yes'
01800          ELSE
01801             WRITE( NOUT, FMT = 9985 ) SNAMES( 1 ), ' ... No '
01802          END IF
01803          DO 90 I = 2, NSUBS
01804             IF( LTEST( I ) ) THEN
01805                WRITE( NOUT, FMT = 9984 ) SNAMES( I ), ' ... Yes'
01806             ELSE
01807                WRITE( NOUT, FMT = 9984 ) SNAMES( I ), ' ... No '
01808             END IF
01809    90    CONTINUE
01810          WRITE( NOUT, FMT = 9994 ) EPS
01811          WRITE( NOUT, FMT = * )
01812 *
01813       ELSE
01814 *
01815 *        If in pvm, must participate setting up virtual machine
01816 *
01817          IF( NPROCS.LT.1 )
01818      $      CALL BLACS_SETUP( IAM, NPROCS )
01819 *
01820 *        Temporarily define blacs grid to include all processes so
01821 *        information can be broadcast to all processes
01822 *
01823          CALL BLACS_GET( -1, 0, ICTXT )
01824          CALL BLACS_GRIDINIT( ICTXT, 'Row-major', 1, NPROCS )
01825 *
01826 *        Compute machine epsilon
01827 *
01828          EPS = PSLAMCH( ICTXT, 'eps' )
01829 *
01830          CALL SGEBR2D( ICTXT, 'All', ' ', 1, 1, THRESH, 1, 0, 0 )
01831          CALL SGEBR2D( ICTXT, 'All', ' ', 1, 1, ALPHA, 1, 0, 0 )
01832          CALL SGEBR2D( ICTXT, 'All', ' ', 1, 1, BETA, 1, 0, 0 )
01833 *
01834          CALL IGEBR2D( ICTXT, 'All', ' ', 3, 1, WORK, 3, 0, 0 )
01835          NGRIDS = WORK( 1 )
01836          NMAT   = WORK( 2 )
01837          NBLOG  = WORK( 3 )
01838 *
01839          I = 2*NGRIDS + 37*NMAT + NSUBS + 4
01840          CALL IGEBR2D( ICTXT, 'All', ' ', I, 1, WORK, I, 0, 0 )
01841 *
01842          I = 1
01843          IF( WORK( I ).EQ.1 ) THEN
01844             SOF = .TRUE.
01845          ELSE
01846             SOF = .FALSE.
01847          END IF
01848          I = I + 1
01849          IF( WORK( I ).EQ.1 ) THEN
01850             TEE = .TRUE.
01851          ELSE
01852             TEE = .FALSE.
01853          END IF
01854          I = I + 1
01855          IVERB = WORK( I )
01856          I = I + 1
01857          IGAP = WORK( I )
01858          I = I + 1
01859          DO 100 J = 1, NMAT
01860             DIAGVAL( J )  = CHAR( WORK( I ) )
01861             TRANVAL( J )  = CHAR( WORK( I+1 ) )
01862             UPLOVAL( J )  = CHAR( WORK( I+2 ) )
01863             I = I + 3
01864   100    CONTINUE
01865          CALL ICOPY( NGRIDS, WORK( I ), 1, PVAL,     1 )
01866          I = I + NGRIDS
01867          CALL ICOPY( NGRIDS, WORK( I ), 1, QVAL,     1 )
01868          I = I + NGRIDS
01869          CALL ICOPY( NMAT,   WORK( I ), 1, MVAL,     1 )
01870          I = I + NMAT
01871          CALL ICOPY( NMAT,   WORK( I ), 1, NVAL,     1 )
01872          I = I + NMAT
01873          CALL ICOPY( NMAT,   WORK( I ), 1, MAVAL,    1 )
01874          I = I + NMAT
01875          CALL ICOPY( NMAT,   WORK( I ), 1, NAVAL,    1 )
01876          I = I + NMAT
01877          CALL ICOPY( NMAT,   WORK( I ), 1, IMBAVAL,  1 )
01878          I = I + NMAT
01879          CALL ICOPY( NMAT,   WORK( I ), 1, INBAVAL,  1 )
01880          I = I + NMAT
01881          CALL ICOPY( NMAT,   WORK( I ), 1, MBAVAL,   1 )
01882          I = I + NMAT
01883          CALL ICOPY( NMAT,   WORK( I ), 1, NBAVAL,   1 )
01884          I = I + NMAT
01885          CALL ICOPY( NMAT,   WORK( I ), 1, RSCAVAL,  1 )
01886          I = I + NMAT
01887          CALL ICOPY( NMAT,   WORK( I ), 1, CSCAVAL,  1 )
01888          I = I + NMAT
01889          CALL ICOPY( NMAT,   WORK( I ), 1, IAVAL,    1 )
01890          I = I + NMAT
01891          CALL ICOPY( NMAT,   WORK( I ), 1, JAVAL,    1 )
01892          I = I + NMAT
01893          CALL ICOPY( NMAT,   WORK( I ), 1, MXVAL,    1 )
01894          I = I + NMAT
01895          CALL ICOPY( NMAT,   WORK( I ), 1, NXVAL,    1 )
01896          I = I + NMAT
01897          CALL ICOPY( NMAT,   WORK( I ), 1, IMBXVAL,  1 )
01898          I = I + NMAT
01899          CALL ICOPY( NMAT,   WORK( I ), 1, INBXVAL,  1 )
01900          I = I + NMAT
01901          CALL ICOPY( NMAT,   WORK( I ), 1, MBXVAL,   1 )
01902          I = I + NMAT
01903          CALL ICOPY( NMAT,   WORK( I ), 1, NBXVAL,   1 )
01904          I = I + NMAT
01905          CALL ICOPY( NMAT,   WORK( I ), 1, RSCXVAL,  1 )
01906          I = I + NMAT
01907          CALL ICOPY( NMAT,   WORK( I ), 1, CSCXVAL,  1 )
01908          I = I + NMAT
01909          CALL ICOPY( NMAT,   WORK( I ), 1, IXVAL,    1 )
01910          I = I + NMAT
01911          CALL ICOPY( NMAT,   WORK( I ), 1, JXVAL,    1 )
01912          I = I + NMAT
01913          CALL ICOPY( NMAT,   WORK( I ), 1, INCXVAL,  1 )
01914          I = I + NMAT
01915          CALL ICOPY( NMAT,   WORK( I ), 1, MYVAL,    1 )
01916          I = I + NMAT
01917          CALL ICOPY( NMAT,   WORK( I ), 1, NYVAL,    1 )
01918          I = I + NMAT
01919          CALL ICOPY( NMAT,   WORK( I ), 1, IMBYVAL,  1 )
01920          I = I + NMAT
01921          CALL ICOPY( NMAT,   WORK( I ), 1, INBYVAL,  1 )
01922          I = I + NMAT
01923          CALL ICOPY( NMAT,   WORK( I ), 1, MBYVAL,   1 )
01924          I = I + NMAT
01925          CALL ICOPY( NMAT,   WORK( I ), 1, NBYVAL,   1 )
01926          I = I + NMAT
01927          CALL ICOPY( NMAT,   WORK( I ), 1, RSCYVAL,  1 )
01928          I = I + NMAT
01929          CALL ICOPY( NMAT,   WORK( I ), 1, CSCYVAL,  1 )
01930          I = I + NMAT
01931          CALL ICOPY( NMAT,   WORK( I ), 1, IYVAL,    1 )
01932          I = I + NMAT
01933          CALL ICOPY( NMAT,   WORK( I ), 1, JYVAL,    1 )
01934          I = I + NMAT
01935          CALL ICOPY( NMAT,   WORK( I ), 1, INCYVAL,  1 )
01936          I = I + NMAT
01937 *
01938          DO 110 J = 1, NSUBS
01939             IF( WORK( I ).EQ.1 ) THEN
01940                LTEST( J ) = .TRUE.
01941             ELSE
01942                LTEST( J ) = .FALSE.
01943             END IF
01944             I = I + 1
01945   110    CONTINUE
01946 *
01947       END IF
01948 *
01949       CALL BLACS_GRIDEXIT( ICTXT )
01950 *
01951       RETURN
01952 *
01953   120 WRITE( NOUT, FMT = 9997 )
01954       CLOSE( NIN )
01955       IF( NOUT.NE.6 .AND. NOUT.NE.0 )
01956      $   CLOSE( NOUT )
01957       CALL BLACS_ABORT( ICTXT, 1 )
01958 *
01959       STOP
01960 *
01961  9999 FORMAT( A )
01962  9998 FORMAT( ' Number of values of ',5A, ' is less than 1 or greater ',
01963      $        'than ', I2 )
01964  9997 FORMAT( ' Illegal input in file ',40A,'.  Aborting run.' )
01965  9996 FORMAT( A7, L2 )
01966  9995 FORMAT( '  Subprogram name ', A7, ' not recognized',
01967      $        /' ******* TESTS ABANDONED *******' )
01968  9994 FORMAT( 2X, 'Relative machine precision (eps) is taken to be ',
01969      $        E18.6 )
01970  9993 FORMAT( 2X, 'Number of Tests           : ', I6 )
01971  9992 FORMAT( 2X, 'Number of process grids   : ', I6 )
01972  9991 FORMAT( 2X, '                          : ', 5I6 )
01973  9990 FORMAT( 2X, A1, '                         : ', 5I6 )
01974  9988 FORMAT( 2X, 'Stop on failure flag      : ', L6 )
01975  9987 FORMAT( 2X, 'Test for error exits flag : ', L6 )
01976  9986 FORMAT( 2X, 'Verbosity level           : ', I6 )
01977  9985 FORMAT( 2X, 'Routines to be tested     :      ', A, A8 )
01978  9984 FORMAT( 2X, '                                 ', A, A8 )
01979  9983 FORMAT( 2X, 'Leading dimension gap     : ', I6 )
01980  9982 FORMAT( 2X, 'Alpha                     : ', G16.6 )
01981  9981 FORMAT( 2X, 'Beta                      : ', G16.6 )
01982  9980 FORMAT( 2X, 'Threshold value           : ', G16.6 )
01983  9979 FORMAT( 2X, 'Logical block size        : ', I6 )
01984 *
01985 *     End of PSBLA2TSTINFO
01986 *
01987       END
01988       SUBROUTINE PSBLAS2TSTCHKE( LTEST, INOUT, NPROCS )
01989 *
01990 *  -- PBLAS test routine (version 2.0) --
01991 *     University of Tennessee, Knoxville, Oak Ridge National Laboratory,
01992 *     and University of California, Berkeley.
01993 *     April 1, 1998
01994 *
01995 *     .. Scalar Arguments ..
01996       INTEGER            INOUT, NPROCS
01997 *     ..
01998 *     .. Array Arguments ..
01999       LOGICAL            LTEST( * )
02000 *     ..
02001 *
02002 *  Purpose
02003 *  =======
02004 *
02005 *  PSBLAS2TSTCHKE tests the error exits of the Level 2 PBLAS.
02006 *
02007 *  Arguments
02008 *  =========
02009 *
02010 *  LTEST   (global input) LOGICAL array
02011 *          On entry, LTEST is an array of dimension at least 7 (NSUBS).
02012 *             If LTEST( 1 ) is .TRUE., PSGEMV will be tested;
02013 *             If LTEST( 2 ) is .TRUE., PSSYMV will be tested;
02014 *             If LTEST( 3 ) is .TRUE., PSTRMV will be tested;
02015 *             If LTEST( 4 ) is .TRUE., PSTRSV will be tested;
02016 *             If LTEST( 5 ) is .TRUE., PSGER  will be tested;
02017 *             If LTEST( 6 ) is .TRUE., PSSYR  will be tested;
02018 *             If LTEST( 7 ) is .TRUE., PSSYR2 will be tested;
02019 *
02020 *  INOUT   (global input) INTEGER
02021 *          On entry,  INOUT  specifies  the unit number for output file.
02022 *          When INOUT is 6, output to screen,  when INOUT = 0, output to
02023 *          stderr. INOUT is only defined in process 0.
02024 *
02025 *  NPROCS  (global input) INTEGER
02026 *          On entry, NPROCS specifies the total number of processes cal-
02027 *          ling this routine.
02028 *
02029 *  Calling sequence encodings
02030 *  ==========================
02031 *
02032 *  code Formal argument list                                Examples
02033 *
02034 *  11   (n,      v1,v2)                                     _SWAP, _COPY
02035 *  12   (n,s1,   v1   )                                     _SCAL, _SCAL
02036 *  13   (n,s1,   v1,v2)                                     _AXPY, _DOT_
02037 *  14   (n,s1,i1,v1   )                                     _AMAX
02038 *  15   (n,u1,   v1   )                                     _ASUM, _NRM2
02039 *
02040 *  21   (     trans,     m,n,s1,m1,v1,s2,v2)                _GEMV
02041 *  22   (uplo,             n,s1,m1,v1,s2,v2)                _SYMV, _HEMV
02042 *  23   (uplo,trans,diag,  n,   m1,v1      )                _TRMV, _TRSV
02043 *  24   (                m,n,s1,v1,v2,m1)                   _GER_
02044 *  25   (uplo,             n,s1,v1,   m1)                   _SYR
02045 *  26   (uplo,             n,u1,v1,   m1)                   _HER
02046 *  27   (uplo,             n,s1,v1,v2,m1)                   _SYR2, _HER2
02047 *
02048 *  31   (          transa,transb,     m,n,k,s1,m1,m2,s2,m3) _GEMM
02049 *  32   (side,uplo,                   m,n,  s1,m1,m2,s2,m3) _SYMM, _HEMM
02050 *  33   (     uplo,trans,               n,k,s1,m1,   s2,m3) _SYRK
02051 *  34   (     uplo,trans,               n,k,u1,m1,   u2,m3) _HERK
02052 *  35   (     uplo,trans,               n,k,s1,m1,m2,s2,m3) _SYR2K
02053 *  36   (     uplo,trans,               n,k,s1,m1,m2,u2,m3) _HER2K
02054 *  37   (                             m,n,  s1,m1,   s2,m3) _TRAN_
02055 *  38   (side,uplo,transa,       diag,m,n,  s1,m1,m2      ) _TRMM, _TRSM
02056 *  39   (          trans,             m,n,  s1,m1,   s2,m3) _GEADD
02057 *  40   (     uplo,trans,             m,n,  s1,m1,   s2,m3) _TRADD
02058 *
02059 *  -- Written on April 1, 1998 by
02060 *     Antoine Petitet, University  of  Tennessee, Knoxville 37996, USA.
02061 *
02062 *  =====================================================================
02063 *
02064 *     .. Parameters ..
02065       INTEGER            NSUBS
02066       PARAMETER          ( NSUBS = 7 )
02067 *     ..
02068 *     .. Local Scalars ..
02069       LOGICAL            ABRTSAV
02070       INTEGER            I, ICTXT, MYCOL, MYROW, NPCOL, NPROW
02071 *     ..
02072 *     .. Local Arrays ..
02073       INTEGER            SCODE( NSUBS )
02074 *     ..
02075 *     .. External Subroutines ..
02076       EXTERNAL           BLACS_GET, BLACS_GRIDEXIT, BLACS_GRIDINFO,
02077      $                   BLACS_GRIDINIT, PSDIMEE, PSGEMV, PSGER,
02078      $                   PSMATEE, PSOPTEE, PSSYMV, PSSYR, PSSYR2,
02079      $                   PSTRMV, PSTRSV, PSVECEE
02080 *     ..
02081 *     .. Common Blocks ..
02082       LOGICAL            ABRTFLG
02083       INTEGER            NOUT
02084       CHARACTER*7        SNAMES( NSUBS )
02085       COMMON             /SNAMEC/SNAMES
02086       COMMON             /PBERRORC/NOUT, ABRTFLG
02087 *     ..
02088 *     .. Data Statements ..
02089       DATA               SCODE/21, 22, 23, 23, 24, 25, 27/
02090 *     ..
02091 *     .. Executable Statements ..
02092 *
02093 *     Temporarily define blacs grid to include all processes so
02094 *     information can be broadcast to all processes.
02095 *
02096       CALL BLACS_GET( -1, 0, ICTXT )
02097       CALL BLACS_GRIDINIT( ICTXT, 'Row-major', 1, NPROCS )
02098       CALL BLACS_GRIDINFO( ICTXT, NPROW, NPCOL, MYROW, MYCOL )
02099 *
02100 *     Set ABRTFLG to FALSE so that the PBLAS error handler won't abort
02101 *     on errors during these tests and set the output device unit for
02102 *     it.
02103 *
02104       ABRTSAV = ABRTFLG
02105       ABRTFLG = .FALSE.
02106       NOUT    = INOUT
02107 *
02108 *     Test PSGEMV
02109 *
02110       I = 1
02111       IF( LTEST( I ) ) THEN
02112          CALL PSOPTEE( ICTXT, NOUT, PSGEMV, SCODE( I ), SNAMES( I ) )
02113          CALL PSDIMEE( ICTXT, NOUT, PSGEMV, SCODE( I ), SNAMES( I ) )
02114          CALL PSMATEE( ICTXT, NOUT, PSGEMV, SCODE( I ), SNAMES( I ) )
02115          CALL PSVECEE( ICTXT, NOUT, PSGEMV, SCODE( I ), SNAMES( I ) )
02116       END IF
02117 *
02118 *     Test PSSYMV
02119 *
02120       I = I + 1
02121       IF( LTEST( I ) ) THEN
02122          CALL PSOPTEE( ICTXT, NOUT, PSSYMV, SCODE( I ), SNAMES( I ) )
02123          CALL PSDIMEE( ICTXT, NOUT, PSSYMV, SCODE( I ), SNAMES( I ) )
02124          CALL PSMATEE( ICTXT, NOUT, PSSYMV, SCODE( I ), SNAMES( I ) )
02125          CALL PSVECEE( ICTXT, NOUT, PSSYMV, SCODE( I ), SNAMES( I ) )
02126       END IF
02127 *
02128 *     Test PSTRMV
02129 *
02130       I = I + 1
02131       IF( LTEST( I ) ) THEN
02132          CALL PSOPTEE( ICTXT, NOUT, PSTRMV, SCODE( I ), SNAMES( I ) )
02133          CALL PSDIMEE( ICTXT, NOUT, PSTRMV, SCODE( I ), SNAMES( I ) )
02134          CALL PSMATEE( ICTXT, NOUT, PSTRMV, SCODE( I ), SNAMES( I ) )
02135          CALL PSVECEE( ICTXT, NOUT, PSTRMV, SCODE( I ), SNAMES( I ) )
02136       END IF
02137 *
02138 *     Test PSTRSV
02139 *
02140       I = I + 1
02141       IF( LTEST( I ) ) THEN
02142          CALL PSOPTEE( ICTXT, NOUT, PSTRSV, SCODE( I ), SNAMES( I ) )
02143          CALL PSDIMEE( ICTXT, NOUT, PSTRSV, SCODE( I ), SNAMES( I ) )
02144          CALL PSMATEE( ICTXT, NOUT, PSTRSV, SCODE( I ), SNAMES( I ) )
02145          CALL PSVECEE( ICTXT, NOUT, PSTRSV, SCODE( I ), SNAMES( I ) )
02146       END IF
02147 *
02148 *     Test PSGER
02149 *
02150       I = I + 1
02151       IF( LTEST( I ) ) THEN
02152          CALL PSDIMEE( ICTXT, NOUT, PSGER, SCODE( I ), SNAMES( I ) )
02153          CALL PSVECEE( ICTXT, NOUT, PSGER, SCODE( I ), SNAMES( I ) )
02154          CALL PSMATEE( ICTXT, NOUT, PSGER, SCODE( I ), SNAMES( I ) )
02155       END IF
02156 *
02157 *     Test PSSYR
02158 *
02159       I = I + 1
02160       IF( LTEST( I ) ) THEN
02161          CALL PSOPTEE( ICTXT, NOUT, PSSYR, SCODE( I ), SNAMES( I ) )
02162          CALL PSDIMEE( ICTXT, NOUT, PSSYR, SCODE( I ), SNAMES( I ) )
02163          CALL PSVECEE( ICTXT, NOUT, PSSYR, SCODE( I ), SNAMES( I ) )
02164          CALL PSMATEE( ICTXT, NOUT, PSSYR, SCODE( I ), SNAMES( I ) )
02165       END IF
02166 *
02167 *     Test PSSYR2
02168 *
02169       I = I + 1
02170       IF( LTEST( I ) ) THEN
02171          CALL PSOPTEE( ICTXT, NOUT, PSSYR2, SCODE( I ), SNAMES( I ) )
02172          CALL PSDIMEE( ICTXT, NOUT, PSSYR2, SCODE( I ), SNAMES( I ) )
02173          CALL PSVECEE( ICTXT, NOUT, PSSYR2, SCODE( I ), SNAMES( I ) )
02174          CALL PSMATEE( ICTXT, NOUT, PSSYR2, SCODE( I ), SNAMES( I ) )
02175       END IF
02176 *
02177       IF( MYROW.EQ.0 .AND. MYCOL.EQ.0 )
02178      $   WRITE( NOUT, FMT = 9999 )
02179 *
02180       CALL BLACS_GRIDEXIT( ICTXT )
02181 *
02182 *     Reset ABRTFLG to the value it had before calling this routine
02183 *
02184       ABRTFLG = ABRTSAV
02185 *
02186  9999 FORMAT( 2X, 'Error-exit tests completed.' )
02187 *
02188       RETURN
02189 *
02190 *     End of PSBLAS2TSTCHKE
02191 *
02192       END
02193       SUBROUTINE PSCHKARG2( ICTXT, NOUT, SNAME, UPLO, TRANS, DIAG, M,
02194      $                      N, ALPHA, IA, JA, DESCA, IX, JX, DESCX,
02195      $                      INCX, BETA, IY, JY, DESCY, INCY, INFO )
02196 *
02197 *  -- PBLAS test routine (version 2.0) --
02198 *     University of Tennessee, Knoxville, Oak Ridge National Laboratory,
02199 *     and University of California, Berkeley.
02200 *     April 1, 1998
02201 *
02202 *     .. Scalar Arguments ..
02203       CHARACTER*1        DIAG, TRANS, UPLO
02204       INTEGER            IA, ICTXT, INCX, INCY, INFO, IX, IY, JA, JX,
02205      $                   JY, M, N, NOUT
02206       REAL               ALPHA, BETA
02207 *     ..
02208 *     .. Array Arguments ..
02209       CHARACTER*(*)      SNAME
02210       INTEGER            DESCA( * ), DESCX( * ), DESCY( * )
02211 *     ..
02212 *
02213 *  Purpose
02214 *  =======
02215 *
02216 *  PSCHKARG2 checks the input-only arguments of the Level 2 PBLAS.  When
02217 *  INFO = 0, this routine makes a copy of its arguments (which are INPUT
02218 *  only arguments to PBLAS routines). Otherwise, it verifies the  values
02219 *  of these arguments against the saved copies.
02220 *
02221 *  Arguments
02222 *  =========
02223 *
02224 *  ICTXT   (local input) INTEGER
02225 *          On entry,  ICTXT  specifies the BLACS context handle, indica-
02226 *          ting the global  context of the operation. The context itself
02227 *          is global, but the value of ICTXT is local.
02228 *
02229 *  NOUT    (global input) INTEGER
02230 *          On entry, NOUT specifies the unit number for the output file.
02231 *          When NOUT is 6, output to screen,  when  NOUT is 0, output to
02232 *          stderr. NOUT is only defined for process 0.
02233 *
02234 *  SNAME   (global input) CHARACTER*(*)
02235 *          On entry, SNAME specifies the subroutine  name  calling  this
02236 *          subprogram.
02237 *
02238 *  UPLO    (global input) CHARACTER*1
02239 *          On entry, UPLO specifies the UPLO option in the Level 2 PBLAS
02240 *          operation.
02241 *
02242 *  TRANS   (global input) CHARACTER*1
02243 *          On entry,  TRANS  specifies  the TRANS  option in the Level 2
02244 *          PBLAS operation.
02245 *
02246 *  DIAG    (global input) CHARACTER*1
02247 *          On entry, DIAG specifies the DIAG option in the Level 2 PBLAS
02248 *          operation.
02249 *
02250 *  M       (global input) INTEGER
02251 *          On entry,  M  specifies  the  dimension of the submatrix ope-
02252 *          rands.
02253 *
02254 *  N       (global input) INTEGER
02255 *          On entry,  N  specifies  the  dimension of the submatrix ope-
02256 *          rands.
02257 *
02258 *  ALPHA   (global input) REAL
02259 *          On entry, ALPHA specifies the scalar alpha.
02260 *
02261 *  IA      (global input) INTEGER
02262 *          On entry, IA  specifies A's global row index, which points to
02263 *          the beginning of the submatrix sub( A ).
02264 *
02265 *  JA      (global input) INTEGER
02266 *          On entry, JA  specifies A's global column index, which points
02267 *          to the beginning of the submatrix sub( A ).
02268 *
02269 *  DESCA   (global and local input) INTEGER array
02270 *          On entry, DESCA  is an integer array of dimension DLEN_. This
02271 *          is the array descriptor for the matrix A.
02272 *
02273 *  IX      (global input) INTEGER
02274 *          On entry, IX  specifies X's global row index, which points to
02275 *          the beginning of the submatrix sub( X ).
02276 *
02277 *  JX      (global input) INTEGER
02278 *          On entry, JX  specifies X's global column index, which points
02279 *          to the beginning of the submatrix sub( X ).
02280 *
02281 *  DESCX   (global and local input) INTEGER array
02282 *          On entry, DESCX  is an integer array of dimension DLEN_. This
02283 *          is the array descriptor for the matrix X.
02284 *
02285 *  INCX    (global input) INTEGER
02286 *          On entry,  INCX   specifies  the  global  increment  for  the
02287 *          elements of  X.  Only two values of  INCX   are  supported in
02288 *          this version, namely 1 and M_X. INCX  must not be zero.
02289 *
02290 *  BETA    (global input) REAL
02291 *          On entry, BETA specifies the scalar beta.
02292 *
02293 *  IY      (global input) INTEGER
02294 *          On entry, IY  specifies Y's global row index, which points to
02295 *          the beginning of the submatrix sub( Y ).
02296 *
02297 *  JY      (global input) INTEGER
02298 *          On entry, JY  specifies Y's global column index, which points
02299 *          to the beginning of the submatrix sub( Y ).
02300 *
02301 *  DESCY   (global and local input) INTEGER array
02302 *          On entry, DESCY  is an integer array of dimension DLEN_. This
02303 *          is the array descriptor for the matrix Y.
02304 *
02305 *  INCY    (global input) INTEGER
02306 *          On entry,  INCY   specifies  the  global  increment  for  the
02307 *          elements of  Y.  Only two values of  INCY   are  supported in
02308 *          this version, namely 1 and M_Y. INCY  must not be zero.
02309 *
02310 *  INFO    (global input/global output) INTEGER
02311 *          When INFO = 0 on entry, the values of the arguments which are
02312 *          INPUT only arguments to a PBLAS routine are copied into  sta-
02313 *          tic variables and INFO is unchanged on exit.  Otherwise,  the
02314 *          values  of  the  arguments are compared against the saved co-
02315 *          pies. In case no error has been found INFO is zero on return,
02316 *          otherwise it is non zero.
02317 *
02318 *  -- Written on April 1, 1998 by
02319 *     Antoine Petitet, University  of  Tennessee, Knoxville 37996, USA.
02320 *
02321 *  =====================================================================
02322 *
02323 *     .. Parameters ..
02324       INTEGER            BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
02325      $                   DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
02326      $                   RSRC_
02327       PARAMETER          ( BLOCK_CYCLIC_2D_INB = 2, DLEN_ = 11,
02328      $                   DTYPE_ = 1, CTXT_ = 2, M_ = 3, N_ = 4,
02329      $                   IMB_ = 5, INB_ = 6, MB_ = 7, NB_ = 8,
02330      $                   RSRC_ = 9, CSRC_ = 10, LLD_ = 11 )
02331 *     ..
02332 *     .. Local Scalars ..
02333       CHARACTER*1        DIAGREF, TRANSREF, UPLOREF
02334       INTEGER            I, IAREF, INCXREF, INCYREF, IXREF, IYREF,
02335      $                   JAREF, JXREF, JYREF, MREF, MYCOL, MYROW, NPCOL,
02336      $                   NPROW, NREF
02337       REAL               ALPHAREF, BETAREF
02338 *     ..
02339 *     .. Local Arrays ..
02340       CHARACTER*15       ARGNAME
02341       INTEGER            DESCAREF( DLEN_ ), DESCXREF( DLEN_ ),
02342      $                   DESCYREF( DLEN_ )
02343 *     ..
02344 *     .. External Subroutines ..
02345       EXTERNAL           BLACS_GRIDINFO, IGSUM2D
02346 *     ..
02347 *     .. External Functions ..
02348       LOGICAL            LSAME
02349       EXTERNAL           LSAME
02350 *     ..
02351 *     .. Save Statements ..
02352       SAVE
02353 *     ..
02354 *     .. Executable Statements ..
02355 *
02356 *     Get grid parameters
02357 *
02358       CALL BLACS_GRIDINFO( ICTXT, NPROW, NPCOL, MYROW, MYCOL )
02359 *
02360 *     Check if first call. If yes, then save.
02361 *
02362       IF( INFO.EQ.0 ) THEN
02363 *
02364          DIAGREF = DIAG
02365          TRANSREF = TRANS
02366          UPLOREF = UPLO
02367          MREF = M
02368          NREF = N
02369          ALPHAREF = ALPHA
02370          IAREF = IA
02371          JAREF = JA
02372          DO 10 I = 1, DLEN_
02373             DESCAREF( I ) = DESCA( I )
02374    10    CONTINUE
02375          IXREF = IX
02376          JXREF = JX
02377          DO 20 I = 1, DLEN_
02378             DESCXREF( I ) = DESCX( I )
02379    20    CONTINUE
02380          INCXREF = INCX
02381          BETAREF = BETA
02382          IYREF = IY
02383          JYREF = JY
02384          DO 30 I = 1, DLEN_
02385             DESCYREF( I ) = DESCY( I )
02386    30    CONTINUE
02387          INCYREF = INCY
02388 *
02389       ELSE
02390 *
02391 *        Test saved args. Return with first mismatch.
02392 *
02393          ARGNAME = ' '
02394          IF( .NOT. LSAME( DIAG, DIAGREF ) ) THEN
02395             WRITE( ARGNAME, FMT = '(A)' ) 'DIAG'
02396          ELSE IF( .NOT. LSAME( TRANS, TRANSREF ) ) THEN
02397             WRITE( ARGNAME, FMT = '(A)' ) 'TRANS'
02398          ELSE IF( .NOT. LSAME( UPLO, UPLOREF ) ) THEN
02399             WRITE( ARGNAME, FMT = '(A)' ) 'UPLO'
02400          ELSE IF( M.NE.MREF ) THEN
02401             WRITE( ARGNAME, FMT = '(A)' ) 'M'
02402          ELSE IF( N.NE.NREF ) THEN
02403             WRITE( ARGNAME, FMT = '(A)' ) 'N'
02404          ELSE IF( ALPHA.NE.ALPHAREF ) THEN
02405             WRITE( ARGNAME, FMT = '(A)' ) 'ALPHA'
02406          ELSE IF( IA.NE.IAREF ) THEN
02407             WRITE( ARGNAME, FMT = '(A)' ) 'IA'
02408          ELSE IF( JA.NE.JAREF ) THEN
02409             WRITE( ARGNAME, FMT = '(A)' ) 'JA'
02410          ELSE IF( DESCA( DTYPE_ ).NE.DESCAREF( DTYPE_ ) ) THEN
02411             WRITE( ARGNAME, FMT = '(A)' ) 'DESCA( DTYPE_ )'
02412          ELSE IF( DESCA( M_ ).NE.DESCAREF( M_ ) ) THEN
02413             WRITE( ARGNAME, FMT = '(A)' ) 'DESCA( M_ )'
02414          ELSE IF( DESCA( N_ ).NE.DESCAREF( N_ ) ) THEN
02415             WRITE( ARGNAME, FMT = '(A)' ) 'DESCA( N_ )'
02416          ELSE IF( DESCA( IMB_ ).NE.DESCAREF( IMB_ ) ) THEN
02417             WRITE( ARGNAME, FMT = '(A)' ) 'DESCA( IMB_ )'
02418          ELSE IF( DESCA( INB_ ).NE.DESCAREF( INB_ ) ) THEN
02419             WRITE( ARGNAME, FMT = '(A)' ) 'DESCA( INB_ )'
02420          ELSE IF( DESCA( MB_ ).NE.DESCAREF( MB_ ) ) THEN
02421             WRITE( ARGNAME, FMT = '(A)' ) 'DESCA( MB_ )'
02422          ELSE IF( DESCA( NB_ ).NE.DESCAREF( NB_ ) ) THEN
02423             WRITE( ARGNAME, FMT = '(A)' ) 'DESCA( NB_ )'
02424          ELSE IF( DESCA( RSRC_ ).NE.DESCAREF( RSRC_ ) ) THEN
02425             WRITE( ARGNAME, FMT = '(A)' ) 'DESCA( RSRC_ )'
02426          ELSE IF( DESCA( CSRC_ ).NE.DESCAREF( CSRC_ ) ) THEN
02427             WRITE( ARGNAME, FMT = '(A)' ) 'DESCA( CSRC_ )'
02428          ELSE IF( DESCA( CTXT_ ).NE.DESCAREF( CTXT_ ) ) THEN
02429             WRITE( ARGNAME, FMT = '(A)' ) 'DESCA( CTXT_ )'
02430          ELSE IF( DESCA( LLD_ ).NE.DESCAREF( LLD_ ) ) THEN
02431             WRITE( ARGNAME, FMT = '(A)' ) 'DESCA( LLD_ )'
02432          ELSE IF( IX.NE.IXREF ) THEN
02433             WRITE( ARGNAME, FMT = '(A)' ) 'IX'
02434          ELSE IF( JX.NE.JXREF ) THEN
02435             WRITE( ARGNAME, FMT = '(A)' ) 'JX'
02436          ELSE IF( DESCX( DTYPE_ ).NE.DESCXREF( DTYPE_ ) ) THEN
02437             WRITE( ARGNAME, FMT = '(A)' ) 'DESCX( DTYPE_ )'
02438          ELSE IF( DESCX( M_ ).NE.DESCXREF( M_ ) ) THEN
02439             WRITE( ARGNAME, FMT = '(A)' ) 'DESCX( M_ )'
02440          ELSE IF( DESCX( N_ ).NE.DESCXREF( N_ ) ) THEN
02441             WRITE( ARGNAME, FMT = '(A)' ) 'DESCX( N_ )'
02442          ELSE IF( DESCX( IMB_ ).NE.DESCXREF( IMB_ ) ) THEN
02443             WRITE( ARGNAME, FMT = '(A)' ) 'DESCX( IMB_ )'
02444          ELSE IF( DESCX( INB_ ).NE.DESCXREF( INB_ ) ) THEN
02445             WRITE( ARGNAME, FMT = '(A)' ) 'DESCX( INB_ )'
02446          ELSE IF( DESCX( MB_ ).NE.DESCXREF( MB_ ) ) THEN
02447             WRITE( ARGNAME, FMT = '(A)' ) 'DESCX( MB_ )'
02448          ELSE IF( DESCX( NB_ ).NE.DESCXREF( NB_ ) ) THEN
02449             WRITE( ARGNAME, FMT = '(A)' ) 'DESCX( NB_ )'
02450          ELSE IF( DESCX( RSRC_ ).NE.DESCXREF( RSRC_ ) ) THEN
02451             WRITE( ARGNAME, FMT = '(A)' ) 'DESCX( RSRC_ )'
02452          ELSE IF( DESCX( CSRC_ ).NE.DESCXREF( CSRC_ ) ) THEN
02453             WRITE( ARGNAME, FMT = '(A)' ) 'DESCX( CSRC_ )'
02454          ELSE IF( DESCX( CTXT_ ).NE.DESCXREF( CTXT_ ) ) THEN
02455             WRITE( ARGNAME, FMT = '(A)' ) 'DESCX( CTXT_ )'
02456          ELSE IF( DESCX( LLD_ ).NE.DESCXREF( LLD_ ) ) THEN
02457             WRITE( ARGNAME, FMT = '(A)' ) 'DESCX( LLD_ )'
02458          ELSE IF( INCX.NE.INCXREF ) THEN
02459             WRITE( ARGNAME, FMT = '(A)' ) 'INCX'
02460          ELSE IF( BETA.NE.BETAREF ) THEN
02461             WRITE( ARGNAME, FMT = '(A)' ) 'BETA'
02462          ELSE IF( IY.NE.IYREF ) THEN
02463             WRITE( ARGNAME, FMT = '(A)' ) 'IY'
02464          ELSE IF( JY.NE.JYREF ) THEN
02465             WRITE( ARGNAME, FMT = '(A)' ) 'JY'
02466          ELSE IF( DESCY( DTYPE_ ).NE.DESCYREF( DTYPE_ ) ) THEN
02467             WRITE( ARGNAME, FMT = '(A)' ) 'DESCY( DTYPE_ )'
02468          ELSE IF( DESCY( M_ ).NE.DESCYREF( M_ ) ) THEN
02469             WRITE( ARGNAME, FMT = '(A)' ) 'DESCY( M_ )'
02470          ELSE IF( DESCY( N_ ).NE.DESCYREF( N_ ) ) THEN
02471             WRITE( ARGNAME, FMT = '(A)' ) 'DESCY( N_ )'
02472          ELSE IF( DESCY( IMB_ ).NE.DESCYREF( IMB_ ) ) THEN
02473             WRITE( ARGNAME, FMT = '(A)' ) 'DESCY( IMB_ )'
02474          ELSE IF( DESCY( INB_ ).NE.DESCYREF( INB_ ) ) THEN
02475             WRITE( ARGNAME, FMT = '(A)' ) 'DESCY( INB_ )'
02476          ELSE IF( DESCY( MB_ ).NE.DESCYREF( MB_ ) ) THEN
02477             WRITE( ARGNAME, FMT = '(A)' ) 'DESCY( MB_ )'
02478          ELSE IF( DESCY( NB_ ).NE.DESCYREF( NB_ ) ) THEN
02479             WRITE( ARGNAME, FMT = '(A)' ) 'DESCY( NB_ )'
02480          ELSE IF( DESCY( RSRC_ ).NE.DESCYREF( RSRC_ ) ) THEN
02481             WRITE( ARGNAME, FMT = '(A)' ) 'DESCY( RSRC_ )'
02482          ELSE IF( DESCY( CSRC_ ).NE.DESCYREF( CSRC_ ) ) THEN
02483             WRITE( ARGNAME, FMT = '(A)' ) 'DESCY( CSRC_ )'
02484          ELSE IF( DESCY( CTXT_ ).NE.DESCYREF( CTXT_ ) ) THEN
02485             WRITE( ARGNAME, FMT = '(A)' ) 'DESCY( CTXT_ )'
02486          ELSE IF( DESCY( LLD_ ).NE.DESCYREF( LLD_ ) ) THEN
02487             WRITE( ARGNAME, FMT = '(A)' ) 'DESCY( LLD_ )'
02488          ELSE IF( INCY.NE.INCYREF ) THEN
02489             WRITE( ARGNAME, FMT = '(A)' ) 'INCY'
02490          ELSE
02491             INFO = 0
02492          END IF
02493 *
02494          CALL IGSUM2D( ICTXT, 'All', ' ', 1, 1, INFO, 1, -1, 0 )
02495 *
02496          IF( MYROW.EQ.0 .AND. MYCOL.EQ.0 ) THEN
02497 *
02498             IF( INFO.NE.0 ) THEN
02499                WRITE( NOUT, FMT = 9999 ) ARGNAME, SNAME
02500             ELSE
02501                WRITE( NOUT, FMT = 9998 ) SNAME
02502             END IF
02503 *
02504          END IF
02505 *
02506       END IF
02507 *
02508  9999 FORMAT( 2X, '   ***** Input-only parameter check: ', A,
02509      $        ' FAILED  changed ', A, ' *****' )
02510  9998 FORMAT( 2X, '   ***** Input-only parameter check: ', A,
02511      $        ' PASSED  *****' )
02512 *
02513       RETURN
02514 *
02515 *     End of PSCHKARG2
02516 *
02517       END
02518       SUBROUTINE PSBLAS2TSTCHK( ICTXT, NOUT, NROUT, UPLO, TRANS, DIAG,
02519      $                          M, N, ALPHA, A, PA, IA, JA, DESCA, X,
02520      $                          PX, IX, JX, DESCX, INCX, BETA, Y, PY,
02521      $                          IY, JY, DESCY, INCY, THRESH, ROGUE,
02522      $                          WORK, INFO )
02523 *
02524 *  -- PBLAS test routine (version 2.0) --
02525 *     University of Tennessee, Knoxville, Oak Ridge National Laboratory,
02526 *     and University of California, Berkeley.
02527 *     April 1, 1998
02528 *
02529 *     .. Scalar Arguments ..
02530       CHARACTER*1        DIAG, TRANS, UPLO
02531       INTEGER            IA, ICTXT, INCX, INCY, INFO, IX, IY, JA, JX,
02532      $                   JY, M, N, NOUT, NROUT
02533       REAL               ALPHA, BETA, ROGUE, THRESH
02534 *     ..
02535 *     .. Array Arguments ..
02536       INTEGER            DESCA( * ), DESCX( * ), DESCY( * )
02537       REAL               A( * ), PA( * ), PX( * ), PY( * ), WORK( * ),
02538      $                   X( * ), Y( * )
02539 *     ..
02540 *
02541 *  Purpose
02542 *  =======
02543 *
02544 *  PSBLAS2TSTCHK performs the computational tests of the Level 2 PBLAS.
02545 *
02546 *  Notes
02547 *  =====
02548 *
02549 *  A description  vector  is associated with each 2D block-cyclicly dis-
02550 *  tributed matrix.  This  vector  stores  the  information  required to
02551 *  establish the  mapping  between a  matrix entry and its corresponding
02552 *  process and memory location.
02553 *
02554 *  In  the  following  comments,   the character _  should  be  read  as
02555 *  "of  the  distributed  matrix".  Let  A  be a generic term for any 2D
02556 *  block cyclicly distributed matrix.  Its description vector is DESCA:
02557 *
02558 *  NOTATION         STORED IN       EXPLANATION
02559 *  ---------------- --------------- ------------------------------------
02560 *  DTYPE_A (global) DESCA( DTYPE_ ) The descriptor type.
02561 *  CTXT_A  (global) DESCA( CTXT_  ) The BLACS context handle, indicating
02562 *                                   the NPROW x NPCOL BLACS process grid
02563 *                                   A  is distributed over.  The context
02564 *                                   itself  is  global,  but  the handle
02565 *                                   (the integer value) may vary.
02566 *  M_A     (global) DESCA( M_     ) The  number of rows in the distribu-
02567 *                                   ted matrix A, M_A >= 0.
02568 *  N_A     (global) DESCA( N_     ) The number of columns in the distri-
02569 *                                   buted matrix A, N_A >= 0.
02570 *  IMB_A   (global) DESCA( IMB_   ) The number of rows of the upper left
02571 *                                   block of the matrix A, IMB_A > 0.
02572 *  INB_A   (global) DESCA( INB_   ) The  number  of columns of the upper
02573 *                                   left   block   of   the   matrix  A,
02574 *                                   INB_A > 0.
02575 *  MB_A    (global) DESCA( MB_    ) The blocking factor used to  distri-
02576 *                                   bute the last  M_A-IMB_A rows of  A,
02577 *                                   MB_A > 0.
02578 *  NB_A    (global) DESCA( NB_    ) The blocking factor used to  distri-
02579 *                                   bute the last  N_A-INB_A  columns of
02580 *                                   A, NB_A > 0.
02581 *  RSRC_A  (global) DESCA( RSRC_  ) The process row over which the first
02582 *                                   row of the matrix  A is distributed,
02583 *                                   NPROW > RSRC_A >= 0.
02584 *  CSRC_A  (global) DESCA( CSRC_  ) The  process  column  over which the
02585 *                                   first  column of  A  is distributed.
02586 *                                   NPCOL > CSRC_A >= 0.
02587 *  LLD_A   (local)  DESCA( LLD_   ) The  leading  dimension of the local
02588 *                                   array  storing  the  local blocks of
02589 *                                   the distributed matrix A,
02590 *                                   IF( Lc( 1, N_A ) > 0 )
02591 *                                      LLD_A >= MAX( 1, Lr( 1, M_A ) )
02592 *                                   ELSE
02593 *                                      LLD_A >= 1.
02594 *
02595 *  Let K be the number of  rows of a matrix A starting at the global in-
02596 *  dex IA,i.e, A( IA:IA+K-1, : ). Lr( IA, K ) denotes the number of rows
02597 *  that the process of row coordinate MYROW ( 0 <= MYROW < NPROW ) would
02598 *  receive if these K rows were distributed over NPROW processes.  If  K
02599 *  is the number of columns of a matrix  A  starting at the global index
02600 *  JA, i.e, A( :, JA:JA+K-1, : ), Lc( JA, K ) denotes the number  of co-
02601 *  lumns that the process MYCOL ( 0 <= MYCOL < NPCOL ) would  receive if
02602 *  these K columns were distributed over NPCOL processes.
02603 *
02604 *  The values of Lr() and Lc() may be determined via a call to the func-
02605 *  tion PB_NUMROC:
02606 *  Lr( IA, K ) = PB_NUMROC( K, IA, IMB_A, MB_A, MYROW, RSRC_A, NPROW )
02607 *  Lc( JA, K ) = PB_NUMROC( K, JA, INB_A, NB_A, MYCOL, CSRC_A, NPCOL )
02608 *
02609 *  Arguments
02610 *  =========
02611 *
02612 *  ICTXT   (local input) INTEGER
02613 *          On entry,  ICTXT  specifies the BLACS context handle, indica-
02614 *          ting the global  context of the operation. The context itself
02615 *          is global, but the value of ICTXT is local.
02616 *
02617 *  NOUT    (global input) INTEGER
02618 *          On entry, NOUT specifies the unit number for the output file.
02619 *          When NOUT is 6, output to screen,  when  NOUT is 0, output to
02620 *          stderr. NOUT is only defined for process 0.
02621 *
02622 *  NROUT   (global input) INTEGER
02623 *          On entry,  NROUT  specifies  which  routine will be tested as
02624 *          follows:
02625 *             If NROUT = 1,      PSGEMV will be tested;
02626 *             else if NROUT = 2, PSSYMV will be tested;
02627 *             else if NROUT = 3, PSTRMV will be tested;
02628 *             else if NROUT = 4, PSTRSV will be tested;
02629 *             else if NROUT = 5, PSGER  will be tested;
02630 *             else if NROUT = 6, PSSYR  will be tested;
02631 *             else if NROUT = 7, PSSYR2 will be tested;
02632 *
02633 *  UPLO    (global input) CHARACTER*1
02634 *          On entry,  UPLO  specifies  if the upper or lower part of the
02635 *          matrix operand is to be referenced.
02636 *
02637 *  TRANS   (global input) CHARACTER*1
02638 *          On entry, TRANS  specifies if the matrix  operand  A is to be
02639 *          transposed.
02640 *
02641 *  DIAG    (global input) CHARACTER*1
02642 *          On entry, DIAG specifies if the  triangular matrix operand is
02643 *          unit or non-unit.
02644 *
02645 *  M       (global input) INTEGER
02646 *          On entry, M specifies the number of rows of A.
02647 *
02648 *  N       (global input) INTEGER
02649 *          On entry, N specifies the number of columns of A.
02650 *
02651 *  ALPHA   (global input) REAL
02652 *          On entry, ALPHA specifies the scalar alpha.
02653 *
02654 *  A       (local input/local output) REAL array
02655 *          On entry, A is an array of  dimension  (DESCA( M_ ),*).  This
02656 *          array contains a local copy of the initial entire matrix PA.
02657 *
02658 *  PA      (local input) REAL array
02659 *          On entry, PA is an array of dimension (DESCA( LLD_ ),*). This
02660 *          array contains the local entries of the matrix PA.
02661 *
02662 *  IA      (global input) INTEGER
02663 *          On entry, IA  specifies A's global row index, which points to
02664 *          the beginning of the submatrix sub( A ).
02665 *
02666 *  JA      (global input) INTEGER
02667 *          On entry, JA  specifies A's global column index, which points
02668 *          to the beginning of the submatrix sub( A ).
02669 *
02670 *  DESCA   (global and local input) INTEGER array
02671 *          On entry, DESCA  is an integer array of dimension DLEN_. This
02672 *          is the array descriptor for the matrix A.
02673 *
02674 *  X       (local input/local output) REAL array
02675 *          On entry, X is an array of  dimension  (DESCX( M_ ),*).  This
02676 *          array contains a local copy of the initial entire matrix PX.
02677 *
02678 *  PX      (local input) REAL array
02679 *          On entry, PX is an array of dimension (DESCX( LLD_ ),*). This
02680 *          array contains the local entries of the matrix PX.
02681 *
02682 *  IX      (global input) INTEGER
02683 *          On entry, IX  specifies X's global row index, which points to
02684 *          the beginning of the submatrix sub( X ).
02685 *
02686 *  JX      (global input) INTEGER
02687 *          On entry, JX  specifies X's global column index, which points
02688 *          to the beginning of the submatrix sub( X ).
02689 *
02690 *  DESCX   (global and local input) INTEGER array
02691 *          On entry, DESCX  is an integer array of dimension DLEN_. This
02692 *          is the array descriptor for the matrix X.
02693 *
02694 *  INCX    (global input) INTEGER
02695 *          On entry,  INCX   specifies  the  global  increment  for  the
02696 *          elements of  X.  Only two values of  INCX   are  supported in
02697 *          this version, namely 1 and M_X. INCX  must not be zero.
02698 *
02699 *  BETA    (global input) REAL
02700 *          On entry, BETA specifies the scalar beta.
02701 *
02702 *  Y       (local input/local output) REAL array
02703 *          On entry, Y is an array of  dimension  (DESCY( M_ ),*).  This
02704 *          array contains a local copy of the initial entire matrix PY.
02705 *
02706 *  PY      (local input) REAL array
02707 *          On entry, PY is an array of dimension (DESCY( LLD_ ),*). This
02708 *          array contains the local entries of the matrix PY.
02709 *
02710 *  IY      (global input) INTEGER
02711 *          On entry, IY  specifies Y's global row index, which points to
02712 *          the beginning of the submatrix sub( Y ).
02713 *
02714 *  JY      (global input) INTEGER
02715 *          On entry, JY  specifies Y's global column index, which points
02716 *          to the beginning of the submatrix sub( Y ).
02717 *
02718 *  DESCY   (global and local input) INTEGER array
02719 *          On entry, DESCY  is an integer array of dimension DLEN_. This
02720 *          is the array descriptor for the matrix Y.
02721 *
02722 *  INCY    (global input) INTEGER
02723 *          On entry,  INCY   specifies  the  global  increment  for  the
02724 *          elements of  Y.  Only two values of  INCY   are  supported in
02725 *          this version, namely 1 and M_Y. INCY  must not be zero.
02726 *
02727 *  THRESH  (global input) REAL
02728 *          On entry, THRESH is the threshold value for the test ratio.
02729 *
02730 *  ROGUE   (global input) REAL
02731 *          On entry,  ROGUE  specifies  the  constant  used  to  pad the
02732 *          non-referenced part of triangular or symmetric matrices.
02733 *
02734 *  WORK    (workspace) REAL array
02735 *          On entry, WORK  is an array of dimension LWORK where LWORK is
02736 *          at least  MAX( M, N ). This array is used to store the compu-
02737 *          ted gauges (see PSMVCH).
02738 *
02739 *  INFO    (global output) INTEGER
02740 *          On exit, if INFO = 0,  no  error  has  been  found, otherwise
02741 *          if( MOD( INFO,   2 ) = 1 ) then an error on A has been found,
02742 *          if( MOD( INFO/2, 2 ) = 1 ) then an error on X has been found,
02743 *          if( MOD( INFO/4, 2 ) = 1 ) then an error on Y has been found.
02744 *
02745 *  -- Written on April 1, 1998 by
02746 *     Antoine Petitet, University  of  Tennessee, Knoxville 37996, USA.
02747 *
02748 *  =====================================================================
02749 *
02750 *     .. Parameters ..
02751       REAL               ONE, ZERO
02752       PARAMETER          ( ONE = 1.0E+0, ZERO = 0.0E+0 )
02753       INTEGER            BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
02754      $                   DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
02755      $                   RSRC_
02756       PARAMETER          ( BLOCK_CYCLIC_2D_INB = 2, DLEN_ = 11,
02757      $                   DTYPE_ = 1, CTXT_ = 2, M_ = 3, N_ = 4,
02758      $                   IMB_ = 5, INB_ = 6, MB_ = 7, NB_ = 8,
02759      $                   RSRC_ = 9, CSRC_ = 10, LLD_ = 11 )
02760 *     ..
02761 *     .. Local Scalars ..
02762       INTEGER            I, MYCOL, MYROW, NPCOL, NPROW
02763       REAL               ERR
02764 *     ..
02765 *     .. Local Arrays ..
02766       INTEGER            IERR( 3 )
02767 *     ..
02768 *     .. External Subroutines ..
02769       EXTERNAL           BLACS_GRIDINFO, PB_SLASET, PSCHKMIN, PSCHKVIN,
02770      $                   PSMVCH, PSTRMV, PSVMCH, PSVMCH2, STRSV
02771 *     ..
02772 *     .. External Functions ..
02773       LOGICAL            LSAME
02774       EXTERNAL           LSAME
02775 *     ..
02776 *     .. Executable Statements ..
02777 *
02778       INFO = 0
02779 *
02780 *     Quick return if possible
02781 *
02782       IF( ( M.LE.0 ).OR.( N.LE.0 ) )
02783      $   RETURN
02784 *
02785 *     Start the operations
02786 *
02787       CALL BLACS_GRIDINFO( ICTXT, NPROW, NPCOL, MYROW, MYCOL )
02788 *
02789       DO 10 I = 1, 3
02790          IERR( I ) = 0
02791    10 CONTINUE
02792 *
02793       IF( NROUT.EQ.1 ) THEN
02794 *
02795 *        Test PSGEMV
02796 *
02797 *        Check the resulting vector Y
02798 *
02799          CALL PSMVCH( ICTXT, TRANS, M, N, ALPHA, A, IA, JA, DESCA, X,
02800      $                IX, JX, DESCX, INCX, BETA, Y, PY, IY, JY, DESCY,
02801      $                INCY, WORK, ERR, IERR( 3 ) )
02802 *
02803          IF( IERR( 3 ).NE.0 ) THEN
02804             IF( MYROW.EQ.0 .AND. MYCOL.EQ.0 )
02805      $         WRITE( NOUT, FMT = 9997 )
02806          ELSE IF( ERR.GT.THRESH ) THEN
02807             IF( MYROW.EQ.0 .AND. MYCOL.EQ.0 )
02808      $         WRITE( NOUT, FMT = 9996 ) ERR
02809          END IF
02810 *
02811 *        Check the input-only arguments
02812 *
02813          CALL PSCHKMIN( ERR, M, N, A, PA, IA, JA, DESCA, IERR( 1 ) )
02814          IF( LSAME( TRANS, 'N' ) ) THEN
02815             CALL PSCHKVIN( ERR, N, X, PX, IX, JX, DESCX, INCX,
02816      $                     IERR( 2 ) )
02817          ELSE
02818             CALL PSCHKVIN( ERR, M, X, PX, IX, JX, DESCX, INCX,
02819      $                     IERR( 2 ) )
02820          END IF
02821 *
02822       ELSE IF( NROUT.EQ.2 ) THEN
02823 *
02824 *        Test PSSYMV
02825 *
02826 *        Check the resulting vector Y
02827 *
02828          CALL PSMVCH( ICTXT, 'No transpose', N, N, ALPHA, A, IA, JA,
02829      $                DESCA, X, IX, JX, DESCX, INCX, BETA, Y, PY, IY,
02830      $                JY, DESCY, INCY, WORK, ERR, IERR( 3 ) )
02831 *
02832          IF( IERR( 3 ).NE.0 ) THEN
02833             IF( MYROW.EQ.0 .AND. MYCOL.EQ.0 )
02834      $         WRITE( NOUT, FMT = 9997 )
02835          ELSE IF( ERR.GT.THRESH ) THEN
02836             IF( MYROW.EQ.0 .AND. MYCOL.EQ.0 )
02837      $         WRITE( NOUT, FMT = 9996 ) ERR
02838          END IF
02839 *
02840 *        Check the input-only arguments
02841 *
02842          IF( LSAME( UPLO, 'L' ) ) THEN
02843             CALL PB_SLASET( 'Upper', N-1, N-1, 0, ROGUE, ROGUE,
02844      $                      A( IA+JA*DESCA( M_ ) ), DESCA( M_ ) )
02845          ELSE
02846             CALL PB_SLASET( 'Lower', N-1, N-1, 0, ROGUE, ROGUE,
02847      $                      A( IA+1+(JA-1)*DESCA( M_ ) ), DESCA( M_ ) )
02848          END IF
02849          CALL PSCHKMIN( ERR, N, N, A, PA, IA, JA, DESCA, IERR( 1 ) )
02850          CALL PSCHKVIN( ERR, N, X, PX, IX, JX, DESCX, INCX, IERR( 2 ) )
02851 *
02852       ELSE IF( NROUT.EQ.3 ) THEN
02853 *
02854 *        Test PSTRMV
02855 *
02856 *        Check the resulting vector X
02857 *
02858          CALL PSMVCH( ICTXT, TRANS, N, N, ONE, A, IA, JA, DESCA, Y, IX,
02859      $                JX, DESCX, INCX, ZERO, X, PX, IX, JX, DESCX, INCX,
02860      $                WORK, ERR, IERR( 2 ) )
02861 *
02862          IF( IERR( 2 ).NE.0 ) THEN
02863             IF( MYROW.EQ.0 .AND. MYCOL.EQ.0 )
02864      $         WRITE( NOUT, FMT = 9997 )
02865          ELSE IF( ERR.GT.THRESH ) THEN
02866             IF( MYROW.EQ.0 .AND. MYCOL.EQ.0 )
02867      $         WRITE( NOUT, FMT = 9996 ) ERR
02868          END IF
02869 *
02870 *        Check the input-only arguments
02871 *
02872          IF( LSAME( UPLO, 'L' ) ) THEN
02873             IF( LSAME( DIAG, 'N' ) ) THEN
02874                CALL PB_SLASET( 'Upper', N-1, N-1, 0, ROGUE, ROGUE,
02875      $                         A( IA+JA*DESCA( M_ ) ), DESCA( M_ ) )
02876             ELSE
02877                CALL PB_SLASET( 'Upper', N, N, 0, ROGUE, ONE,
02878      $                         A( IA+(JA-1)*DESCA( M_ ) ), DESCA( M_ ) )
02879             END IF
02880          ELSE
02881             IF( LSAME( DIAG, 'N' ) ) THEN
02882                CALL PB_SLASET( 'Lower', N-1, N-1, 0, ROGUE, ROGUE,
02883      $                         A( IA+1+(JA-1)*DESCA( M_ ) ),
02884      $                         DESCA( M_ ) )
02885             ELSE
02886                CALL PB_SLASET( 'Lower', N, N, 0, ROGUE, ONE,
02887      $                         A( IA+(JA-1)*DESCA( M_ ) ), DESCA( M_ ) )
02888             END IF
02889          END IF
02890          CALL PSCHKMIN( ERR, N, N, A, PA, IA, JA, DESCA, IERR( 1 ) )
02891 *
02892       ELSE IF( NROUT.EQ.4 ) THEN
02893 *
02894 *        Test PSTRSV
02895 *
02896 *        Check the resulting vector X
02897 *
02898          CALL STRSV( UPLO, TRANS, DIAG, N, A( IA+(JA-1)*DESCA( M_ ) ),
02899      $               DESCA( M_ ), X( IX+(JX-1)*DESCX( M_ ) ), INCX )
02900          CALL PSTRMV( UPLO, TRANS, DIAG, N, PA, IA, JA, DESCA, PX, IX,
02901      $                JX, DESCX, INCX )
02902          CALL PSMVCH( ICTXT, TRANS, N, N, ONE, A, IA, JA, DESCA, X, IX,
02903      $                JX, DESCX, INCX, ZERO, Y, PX, IX, JX, DESCX, INCX,
02904      $                WORK, ERR, IERR( 2 ) )
02905 *
02906          IF( IERR( 2 ).NE.0 ) THEN
02907             IF( MYROW.EQ.0 .AND. MYCOL.EQ.0 )
02908      $         WRITE( NOUT, FMT = 9997 )
02909          ELSE IF( ERR.GT.THRESH ) THEN
02910             IF( MYROW.EQ.0 .AND. MYCOL.EQ.0 )
02911      $         WRITE( NOUT, FMT = 9996 ) ERR
02912          END IF
02913 *
02914 *        Check the input-only arguments
02915 *
02916          IF( LSAME( UPLO, 'L' ) ) THEN
02917             IF( LSAME( DIAG, 'N' ) ) THEN
02918                CALL PB_SLASET( 'Upper', N-1, N-1, 0, ROGUE, ROGUE,
02919      $                         A( IA+JA*DESCA( M_ ) ), DESCA( M_ ) )
02920             ELSE
02921                CALL PB_SLASET( 'Upper', N, N, 0, ROGUE, ONE,
02922      $                         A( IA+(JA-1)*DESCA( M_ ) ), DESCA( M_ ) )
02923             END IF
02924          ELSE
02925             IF( LSAME( DIAG, 'N' ) ) THEN
02926                CALL PB_SLASET( 'Lower', N-1, N-1, 0, ROGUE, ROGUE,
02927      $                         A( IA+1+(JA-1)*DESCA( M_ ) ),
02928      $                         DESCA( M_ ) )
02929             ELSE
02930                CALL PB_SLASET( 'Lower', N, N, 0, ROGUE, ONE,
02931      $                         A( IA+(JA-1)*DESCA( M_ ) ), DESCA( M_ ) )
02932             END IF
02933          END IF
02934          CALL PSCHKMIN( ERR, N, N, A, PA, IA, JA, DESCA, IERR( 1 ) )
02935 *
02936       ELSE IF( NROUT.EQ.5 ) THEN
02937 *
02938 *        Test PSGER
02939 *
02940 *        Check the resulting matrix A
02941 *
02942          CALL PSVMCH( ICTXT, 'Ge', M, N, ALPHA, X, IX, JX, DESCX,
02943      $                INCX, Y, IY, JY, DESCY, INCY, A, PA, IA, JA,
02944      $                DESCA, WORK, ERR, IERR( 1 ) )
02945          IF( IERR( 1 ).NE.0 ) THEN
02946             IF( MYROW.EQ.0 .AND. MYCOL.EQ.0 )
02947      $         WRITE( NOUT, FMT = 9997 )
02948          ELSE IF( ERR.GT.THRESH ) THEN
02949             IF( MYROW.EQ.0 .AND. MYCOL.EQ.0 )
02950      $         WRITE( NOUT, FMT = 9996 ) ERR
02951          END IF
02952 *
02953 *        Check the input-only arguments
02954 *
02955          CALL PSCHKVIN( ERR, M, X, PX, IX, JX, DESCX, INCX, IERR( 2 ) )
02956          CALL PSCHKVIN( ERR, N, Y, PY, IY, JY, DESCY, INCY, IERR( 3 ) )
02957 *
02958       ELSE IF( NROUT.EQ.6 ) THEN
02959 *
02960 *        Test PSSYR
02961 *
02962 *        Check the resulting matrix A
02963 *
02964          CALL PSVMCH( ICTXT, UPLO, N, N, ALPHA, X, IX, JX, DESCX,
02965      $                INCX, X, IX, JX, DESCX, INCX, A, PA, IA, JA,
02966      $                DESCA, WORK, ERR, IERR( 1 ) )
02967          IF( IERR( 1 ).NE.0 ) THEN
02968             IF( MYROW.EQ.0 .AND. MYCOL.EQ.0 )
02969      $         WRITE( NOUT, FMT = 9997 )
02970          ELSE IF( ERR.GT.THRESH ) THEN
02971             IF( MYROW.EQ.0 .AND. MYCOL.EQ.0 )
02972      $         WRITE( NOUT, FMT = 9996 ) ERR
02973          END IF
02974 *
02975 *        Check the input-only arguments
02976 *
02977          CALL PSCHKVIN( ERR, N, X, PX, IX, JX, DESCX, INCX, IERR( 2 ) )
02978 *
02979       ELSE IF( NROUT.EQ.7 ) THEN
02980 *
02981 *        Test PSSYR2
02982 *
02983 *        Check the resulting matrix A
02984 *
02985          CALL PSVMCH2( ICTXT, UPLO, N, N, ALPHA, X, IX, JX, DESCX, INCX,
02986      $                 Y, IY, JY, DESCY, INCY, A, PA, IA, JA, DESCA,
02987      $                 WORK, ERR, IERR( 1 ) )
02988          IF( IERR( 1 ).NE.0 ) THEN
02989             IF( MYROW.EQ.0 .AND. MYCOL.EQ.0 )
02990      $         WRITE( NOUT, FMT = 9997 )
02991          ELSE IF( ERR.GT.THRESH ) THEN
02992             IF( MYROW.EQ.0 .AND. MYCOL.EQ.0 )
02993      $         WRITE( NOUT, FMT = 9996 ) ERR
02994          END IF
02995 *
02996 *        Check the input-only arguments
02997 *
02998          CALL PSCHKVIN( ERR, N, X, PX, IX, JX, DESCX, INCX, IERR( 2 ) )
02999          CALL PSCHKVIN( ERR, N, Y, PY, IY, JY, DESCY, INCY, IERR( 3 ) )
03000 *
03001       END IF
03002 *
03003       IF( IERR( 1 ).NE.0 ) THEN
03004          INFO = INFO + 1
03005          IF( MYROW.EQ.0 .AND. MYCOL.EQ.0 )
03006      $      WRITE( NOUT, FMT = 9999 ) 'A'
03007       END IF
03008 *
03009       IF( IERR( 2 ).NE.0 ) THEN
03010          INFO = INFO + 2
03011          IF( MYROW.EQ.0 .AND. MYCOL.EQ.0 )
03012      $      WRITE( NOUT, FMT = 9998 ) 'X'
03013       END IF
03014 *
03015       IF( IERR( 3 ).NE.0 ) THEN
03016          INFO = INFO + 4
03017          IF( MYROW.EQ.0 .AND. MYCOL.EQ.0 )
03018      $      WRITE( NOUT, FMT = 9998 ) 'Y'
03019       END IF
03020 *
03021  9999 FORMAT( 2X, '   ***** ERROR: Matrix operand ', A,
03022      $        ' is incorrect.' )
03023  9998 FORMAT( 2X, '   ***** ERROR: Vector operand ', A,
03024      $        ' is incorrect.' )
03025  9997 FORMAT( 2X, '   ***** FATAL ERROR - Computed result is less ',
03026      $        'than half accurate *****' )
03027  9996 FORMAT( 2X, '   ***** Test completed with maximum test ratio: ',
03028      $        F11.5, ' SUSPECT *****' )
03029 *
03030       RETURN
03031 *
03032 *     End of PSBLAS2TSTCHK
03033 *
03034       END