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