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