|
ScaLAPACK
2.0.2
ScaLAPACK: Scalable Linear Algebra PACKage
|
00001 SUBROUTINE PCSEPRREQ( HETERO, NIN, MEM, MEMSIZE, NOUT, ISEED, 00002 $ NTESTS, NSKIPPED, NNOCHECK, NPASSED, INFO ) 00003 * 00004 * -- ScaLAPACK routine (@(MODE)version *TBA*) -- 00005 * University of California, Berkeley and 00006 * University of Tennessee, Knoxville. 00007 * October 21, 2006 00008 * 00009 IMPLICIT NONE 00010 * 00011 * .. Scalar Arguments .. 00012 CHARACTER HETERO 00013 INTEGER INFO, MEMSIZE, NIN, NNOCHECK, NOUT, NPASSED, 00014 $ NSKIPPED, NTESTS 00015 * .. 00016 * .. Array Arguments .. 00017 INTEGER ISEED( 4 ) 00018 COMPLEX MEM( MEMSIZE ) 00019 * 00020 * Purpose 00021 * ======= 00022 * 00023 * PCSEPRREQ performs one request from the input file 'SEPR.dat' 00024 * A request is the cross product of the specifications in the 00025 * input file. It prints one line per test. 00026 * 00027 * Arguments 00028 * ========= 00029 * 00030 * NIN (local input) INTEGER 00031 * The unit number for the input file 'SEPR.dat' 00032 * 00033 * MEM (local input ) COMPLEX ARRAY, dimension MEMSIZE 00034 * Array encompassing the available single precision memory 00035 * 00036 * MEMSIZE (local input) INTEGER 00037 * Size of MEM array 00038 * 00039 * NOUT (local input) INTEGER 00040 * The unit number for output file. 00041 * NOUT = 6, output to screen, 00042 * NOUT = 0, output to stderr. 00043 * NOUT = 13, output to file, divide thresh by 10 00044 * NOUT = 14, output to file, divide thresh by 20 00045 * Only used on node 0. 00046 * NOUT = 13, 14 allow the threshold to be tighter for our 00047 * internal testing which means that when a user reports 00048 * a threshold error, it is more likely to be significant. 00049 * 00050 * ISEED (global input/output) INTEGER array, dimension 4 00051 * Random number generator seed 00052 * 00053 * NTESTS (global input/output) INTEGER 00054 * NTESTS = NTESTS + tests requested 00055 * 00056 * NSKIPPED (global input/output) INTEGER 00057 * NSKIPPED = NSKIPPED + tests skipped 00058 * 00059 * NNOCHECK (global input/output) INTEGER 00060 * NNOCHECK = NNOCHECK + tests completed but not checked 00061 * 00062 * NPASSED (global input/output) INTEGER 00063 * NPASSED = NPASSED + tests which passed all checks 00064 * 00065 * INFO (global output) INTEGER 00066 * 0 = test request ran 00067 * -1 = end of file 00068 * -2 = incorrect .dat file 00069 * 00070 * .. Parameters .. 00071 * 00072 INTEGER DLEN_ 00073 PARAMETER ( DLEN_ = 9 ) 00074 INTEGER REALSZ, INTGSZ 00075 PARAMETER ( REALSZ = 4, INTGSZ = 4 ) 00076 INTEGER KMPXSZ 00077 PARAMETER ( KMPXSZ = 8 ) 00078 INTEGER MAXSETSIZE 00079 PARAMETER ( MAXSETSIZE = 50 ) 00080 * .. 00081 * .. Local Scalars .. 00082 CHARACTER SUBTESTS 00083 INTEGER CONTEXT, IAM, IMIDPAD, INITCON, IPOSTPAD, 00084 $ IPREPAD, ISIZESUBTST, ISIZEEVR, ISIZETST, 00085 $ LDA, LLWORK, MATSIZE, MATTYPE, MYCOL, MYROW, N, 00086 $ NB, NMATSIZES, NMATTYPES, NNODES, NP, NPCOL, 00087 $ NPCONFIGS, NPROW, NQ, NUPLOS, ORDER, PCONFIG, 00088 $ PTRA, PTRCOPYA, PTRGAP, PTRICLUS, PTRIFAIL, 00089 $ PTRIWRK, PTRW, PTRW2, PTRWORK, PTRZ, RES, 00090 $ SIZECHK, SIZEMQRLEFT, SIZEMQRRIGHT, SIZEQRF, 00091 $ SIZEQTQ, SIZESUBTST, SIZEEVR, 00092 $ SIZETMS, SIZETST, UPLO 00093 INTEGER PTRRWORK, RSIZEEVR, RSIZESUBTST, RSIZETST 00094 * 00095 REAL ABSTOL, THRESH 00096 * .. 00097 * .. Local Arrays .. 00098 CHARACTER UPLOS( 2 ) 00099 INTEGER DESCA( DLEN_ ), MATSIZES( MAXSETSIZE ), 00100 $ MATTYPES( MAXSETSIZE ), NBS( MAXSETSIZE ), 00101 $ NPCOLS( MAXSETSIZE ), NPROWS( MAXSETSIZE ) 00102 * .. 00103 * .. External Functions .. 00104 INTEGER ICEIL, NUMROC 00105 EXTERNAL ICEIL, NUMROC 00106 * .. 00107 * .. External Subroutines .. 00108 EXTERNAL BLACS_ABORT, BLACS_GET, BLACS_GRIDEXIT, 00109 $ BLACS_GRIDINFO, BLACS_GRIDINIT, BLACS_PINFO, 00110 $ DESCINIT, PCLASIZESEPR, PSSEPINFO, PCSEPRTST 00111 * .. 00112 * .. Intrinsic Functions .. 00113 INTRINSIC MAX 00114 * .. 00115 * .. Executable Statements .. 00116 * 00117 CALL BLACS_PINFO( IAM, NNODES ) 00118 CALL BLACS_GET( -1, 0, INITCON ) 00119 CALL BLACS_GRIDINIT( INITCON, 'R', 1, NNODES ) 00120 * 00121 CALL PSSEPINFO( INITCON, IAM, NIN, NOUT, MAXSETSIZE, NMATSIZES, 00122 $ MATSIZES, NUPLOS, UPLOS, NPCONFIGS, NPROWS, 00123 $ NPCOLS, NBS, NMATTYPES, MATTYPES, 22, SUBTESTS, 00124 $ THRESH, ORDER, ABSTOL, INFO ) 00125 * 00126 CALL BLACS_GRIDEXIT( INITCON ) 00127 * 00128 IF( INFO.EQ.0 ) THEN 00129 * 00130 DO 40 MATSIZE = 1, NMATSIZES 00131 * 00132 DO 30 PCONFIG = 1, NPCONFIGS 00133 * 00134 DO 20 MATTYPE = 1, NMATTYPES 00135 * 00136 DO 10 UPLO = 1, NUPLOS 00137 * 00138 N = MATSIZES( MATSIZE ) 00139 ORDER = N 00140 * 00141 NPROW = NPROWS( PCONFIG ) 00142 NPCOL = NPCOLS( PCONFIG ) 00143 NB = NBS( PCONFIG ) 00144 * 00145 NP = NUMROC( N, NB, 0, 0, NPROW ) 00146 NQ = NUMROC( N, NB, 0, 0, NPCOL ) 00147 IPREPAD = MAX( NB, NP ) 00148 IMIDPAD = NB 00149 IPOSTPAD = MAX( NB, NQ ) 00150 * 00151 LDA = MAX( NP, 1 ) + IMIDPAD 00152 * 00153 CALL BLACS_GET( -1, 0, CONTEXT ) 00154 CALL BLACS_GRIDINIT( CONTEXT, 'R', NPROW, NPCOL ) 00155 CALL BLACS_GRIDINFO( CONTEXT, NPROW, NPCOL, MYROW, 00156 $ MYCOL ) 00157 * 00158 IF( MYROW.GE.0 ) THEN 00159 CALL DESCINIT( DESCA, N, N, NB, NB, 0, 0, 00160 $ CONTEXT, LDA, INFO ) 00161 CALL PCLASIZESEPR( DESCA, IPREPAD, IPOSTPAD, 00162 $ SIZEMQRLEFT, SIZEMQRRIGHT, 00163 $ SIZEQRF, SIZETMS, SIZEQTQ, 00164 $ SIZECHK, SIZEEVR, RSIZEEVR, 00165 $ ISIZEEVR, SIZESUBTST, 00166 $ RSIZESUBTST, ISIZESUBTST, 00167 $ SIZETST, RSIZETST, ISIZETST ) 00168 * 00169 PTRA = 1 00170 PTRZ = PTRA + LDA*NQ + IPREPAD + IPOSTPAD 00171 PTRCOPYA = PTRZ + LDA*NQ + IPREPAD + IPOSTPAD 00172 PTRW = PTRCOPYA + LDA*NQ + IPREPAD + IPOSTPAD 00173 PTRW2 = PTRW + ICEIL( MAX( N, 1 )+IPREPAD+ 00174 $ IPOSTPAD, KMPXSZ / REALSZ ) 00175 PTRWORK = PTRW2 + ICEIL( MAX( N, 1 )+IPREPAD+ 00176 $ IPOSTPAD, KMPXSZ / REALSZ ) 00177 PTRGAP = PTRWORK + SIZETST + IPREPAD + IPOSTPAD 00178 PTRIFAIL = PTRGAP + ICEIL( NPROW*NPCOL+IPREPAD+ 00179 $ IPOSTPAD, KMPXSZ / REALSZ ) 00180 PTRICLUS = PTRIFAIL + ICEIL( N+IPREPAD+IPOSTPAD, 00181 $ KMPXSZ / INTGSZ ) 00182 PTRIWRK = PTRICLUS + ICEIL( 2*NPROW*NPCOL+ 00183 $ IPREPAD+IPOSTPAD, KMPXSZ / INTGSZ ) 00184 PTRRWORK = PTRIWRK + ICEIL( ISIZETST+IPREPAD+ 00185 $ IPOSTPAD, KMPXSZ / INTGSZ ) 00186 LLWORK = ( MEMSIZE-PTRRWORK+1 )*KMPXSZ / REALSZ 00187 00188 NTESTS = NTESTS + 1 00189 IF( LLWORK.LT.RSIZETST ) THEN 00190 NSKIPPED = NSKIPPED + 1 00191 ELSE 00192 CALL PCSEPRTST( DESCA, UPLOS( UPLO ), N, 00193 $ MATTYPES( MATTYPE ), SUBTESTS, 00194 $ THRESH, N, ABSTOL, ISEED, 00195 $ MEM( PTRA ), MEM( PTRCOPYA ), 00196 $ MEM( PTRZ ), LDA, MEM( PTRW ), 00197 $ MEM( PTRW2 ), MEM( PTRIFAIL ), 00198 $ MEM( PTRICLUS ), 00199 $ MEM( PTRGAP ), IPREPAD, 00200 $ IPOSTPAD, MEM( PTRWORK ), 00201 $ SIZETST, MEM( PTRRWORK ), 00202 $ LLWORK, MEM( PTRIWRK ), 00203 $ ISIZETST, HETERO, NOUT, RES ) 00204 * 00205 IF( RES.EQ.0 ) THEN 00206 NPASSED = NPASSED + 1 00207 ELSE IF( RES.EQ.2 ) THEN 00208 NNOCHECK = NNOCHECK + 1 00209 ELSE IF( RES.EQ.3 ) THEN 00210 NSKIPPED = NSKIPPED + 1 00211 WRITE( NOUT, FMT = * )' PCSEPRREQ failed' 00212 CALL BLACS_ABORT( CONTEXT, -1 ) 00213 END IF 00214 END IF 00215 CALL BLACS_GRIDEXIT( CONTEXT ) 00216 END IF 00217 10 CONTINUE 00218 20 CONTINUE 00219 30 CONTINUE 00220 40 CONTINUE 00221 END IF 00222 * 00223 RETURN 00224 * 00225 * End of PCSEPRREQ 00226 * 00227 END