LAPACK 3.3.1
Linear Algebra PACKage
|
00001 PROGRAM ZCHKAB 00002 IMPLICIT NONE 00003 * 00004 * -- LAPACK test routine (version 3.2.1) -- 00005 * 00006 * -- April 2009 -- 00007 * 00008 * -- LAPACK is a software package provided by Univ. of Tennessee, -- 00009 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- 00010 * 00011 * Purpose 00012 * ======= 00013 * 00014 * ZCHKAB is the test program for the COMPLEX*16 LAPACK 00015 * ZCGESV/ZCPOSV routine 00016 * 00017 * The program must be driven by a short data file. The first 5 records 00018 * specify problem dimensions and program options using list-directed 00019 * input. The remaining lines specify the LAPACK test paths and the 00020 * number of matrix types to use in testing. An annotated example of a 00021 * data file can be obtained by deleting the first 3 characters from the 00022 * following 9 lines: 00023 * Data file for testing COMPLEX*16 LAPACK ZCGESV 00024 * 7 Number of values of M 00025 * 0 1 2 3 5 10 16 Values of M (row dimension) 00026 * 1 Number of values of NRHS 00027 * 2 Values of NRHS (number of right hand sides) 00028 * 20.0 Threshold value of test ratio 00029 * T Put T to test the LAPACK routine 00030 * T Put T to test the error exits 00031 * DGE 11 List types on next line if 0 < NTYPES < 11 00032 * DPO 9 List types on next line if 0 < NTYPES < 9 00033 * 00034 * Internal Parameters 00035 * =================== 00036 * 00037 * NMAX INTEGER 00038 * The maximum allowable value for N 00039 * 00040 * MAXIN INTEGER 00041 * The number of different values that can be used for each of 00042 * M, N, NRHS, NB, and NX 00043 * 00044 * MAXRHS INTEGER 00045 * The maximum number of right hand sides 00046 * 00047 * NIN INTEGER 00048 * The unit number for input 00049 * 00050 * NOUT INTEGER 00051 * The unit number for output 00052 * 00053 * ===================================================================== 00054 * 00055 * .. Parameters .. 00056 INTEGER NMAX 00057 PARAMETER ( NMAX = 132 ) 00058 INTEGER MAXIN 00059 PARAMETER ( MAXIN = 12 ) 00060 INTEGER MAXRHS 00061 PARAMETER ( MAXRHS = 16 ) 00062 INTEGER MATMAX 00063 PARAMETER ( MATMAX = 30 ) 00064 INTEGER NIN, NOUT 00065 PARAMETER ( NIN = 5, NOUT = 6 ) 00066 INTEGER LDAMAX 00067 PARAMETER ( LDAMAX = NMAX ) 00068 * .. 00069 * .. Local Scalars .. 00070 LOGICAL FATAL, TSTDRV, TSTERR 00071 CHARACTER C1 00072 CHARACTER*2 C2 00073 CHARACTER*3 PATH 00074 CHARACTER*10 INTSTR 00075 CHARACTER*72 ALINE 00076 INTEGER I, IC, K, LDA, NM, NMATS, 00077 $ NNS, NRHS, NTYPES, 00078 $ VERS_MAJOR, VERS_MINOR, VERS_PATCH 00079 DOUBLE PRECISION EPS, S1, S2, THRESH 00080 REAL SEPS 00081 * .. 00082 * .. Local Arrays .. 00083 LOGICAL DOTYPE( MATMAX ) 00084 INTEGER IWORK( NMAX ), MVAL( MAXIN ), NSVAL( MAXIN ) 00085 DOUBLE PRECISION RWORK(NMAX) 00086 COMPLEX*16 A( LDAMAX*NMAX, 2 ), B( NMAX*MAXRHS, 2 ), 00087 $ WORK( NMAX*MAXRHS*2 ) 00088 COMPLEX SWORK(NMAX*(NMAX+MAXRHS)) 00089 * .. 00090 * .. External Functions .. 00091 DOUBLE PRECISION DLAMCH, DSECND 00092 LOGICAL LSAME, LSAMEN 00093 REAL SLAMCH 00094 EXTERNAL DLAMCH, DSECND, LSAME, LSAMEN, SLAMCH 00095 * .. 00096 * .. External Subroutines .. 00097 EXTERNAL ALAREQ, ZDRVAB, ZDRVAC, ZERRAB, ZERRAC, 00098 $ ILAVER 00099 * .. 00100 * .. Scalars in Common .. 00101 LOGICAL LERR, OK 00102 CHARACTER*32 SRNAMT 00103 INTEGER INFOT, NUNIT 00104 * .. 00105 * .. Common blocks .. 00106 COMMON / INFOC / INFOT, NUNIT, OK, LERR 00107 COMMON / SRNAMC / SRNAMT 00108 * 00109 * .. Data statements .. 00110 DATA INTSTR / '0123456789' / 00111 * .. 00112 * .. Executable Statements .. 00113 * 00114 S1 = DSECND( ) 00115 LDA = NMAX 00116 FATAL = .FALSE. 00117 * 00118 * Read a dummy line. 00119 * 00120 READ( NIN, FMT = * ) 00121 * 00122 * Report values of parameters. 00123 * 00124 CALL ILAVER( VERS_MAJOR, VERS_MINOR, VERS_PATCH ) 00125 WRITE( NOUT, FMT = 9994 ) VERS_MAJOR, VERS_MINOR, VERS_PATCH 00126 * 00127 * Read the values of M 00128 * 00129 READ( NIN, FMT = * )NM 00130 IF( NM.LT.1 ) THEN 00131 WRITE( NOUT, FMT = 9996 )' NM ', NM, 1 00132 NM = 0 00133 FATAL = .TRUE. 00134 ELSE IF( NM.GT.MAXIN ) THEN 00135 WRITE( NOUT, FMT = 9995 )' NM ', NM, MAXIN 00136 NM = 0 00137 FATAL = .TRUE. 00138 END IF 00139 READ( NIN, FMT = * )( MVAL( I ), I = 1, NM ) 00140 DO 10 I = 1, NM 00141 IF( MVAL( I ).LT.0 ) THEN 00142 WRITE( NOUT, FMT = 9996 )' M ', MVAL( I ), 0 00143 FATAL = .TRUE. 00144 ELSE IF( MVAL( I ).GT.NMAX ) THEN 00145 WRITE( NOUT, FMT = 9995 )' M ', MVAL( I ), NMAX 00146 FATAL = .TRUE. 00147 END IF 00148 10 CONTINUE 00149 IF( NM.GT.0 ) 00150 $ WRITE( NOUT, FMT = 9993 )'M ', ( MVAL( I ), I = 1, NM ) 00151 * 00152 * Read the values of NRHS 00153 * 00154 READ( NIN, FMT = * )NNS 00155 IF( NNS.LT.1 ) THEN 00156 WRITE( NOUT, FMT = 9996 )' NNS', NNS, 1 00157 NNS = 0 00158 FATAL = .TRUE. 00159 ELSE IF( NNS.GT.MAXIN ) THEN 00160 WRITE( NOUT, FMT = 9995 )' NNS', NNS, MAXIN 00161 NNS = 0 00162 FATAL = .TRUE. 00163 END IF 00164 READ( NIN, FMT = * )( NSVAL( I ), I = 1, NNS ) 00165 DO 30 I = 1, NNS 00166 IF( NSVAL( I ).LT.0 ) THEN 00167 WRITE( NOUT, FMT = 9996 )'NRHS', NSVAL( I ), 0 00168 FATAL = .TRUE. 00169 ELSE IF( NSVAL( I ).GT.MAXRHS ) THEN 00170 WRITE( NOUT, FMT = 9995 )'NRHS', NSVAL( I ), MAXRHS 00171 FATAL = .TRUE. 00172 END IF 00173 30 CONTINUE 00174 IF( NNS.GT.0 ) 00175 $ WRITE( NOUT, FMT = 9993 )'NRHS', ( NSVAL( I ), I = 1, NNS ) 00176 * 00177 * Read the threshold value for the test ratios. 00178 * 00179 READ( NIN, FMT = * )THRESH 00180 WRITE( NOUT, FMT = 9992 )THRESH 00181 * 00182 * Read the flag that indicates whether to test the driver routine. 00183 * 00184 READ( NIN, FMT = * )TSTDRV 00185 * 00186 * Read the flag that indicates whether to test the error exits. 00187 * 00188 READ( NIN, FMT = * )TSTERR 00189 * 00190 IF( FATAL ) THEN 00191 WRITE( NOUT, FMT = 9999 ) 00192 STOP 00193 END IF 00194 * 00195 * Calculate and print the machine dependent constants. 00196 * 00197 SEPS = SLAMCH( 'Underflow threshold' ) 00198 WRITE( NOUT, FMT = 9991 )'(single precision) underflow', SEPS 00199 SEPS = SLAMCH( 'Overflow threshold' ) 00200 WRITE( NOUT, FMT = 9991 )'(single precision) overflow ', SEPS 00201 SEPS = SLAMCH( 'Epsilon' ) 00202 WRITE( NOUT, FMT = 9991 )'(single precision) precision', SEPS 00203 WRITE( NOUT, FMT = * ) 00204 * 00205 EPS = DLAMCH( 'Underflow threshold' ) 00206 WRITE( NOUT, FMT = 9991 )'(double precision) underflow', EPS 00207 EPS = DLAMCH( 'Overflow threshold' ) 00208 WRITE( NOUT, FMT = 9991 )'(double precision) overflow ', EPS 00209 EPS = DLAMCH( 'Epsilon' ) 00210 WRITE( NOUT, FMT = 9991 )'(double precision) precision', EPS 00211 WRITE( NOUT, FMT = * ) 00212 * 00213 80 CONTINUE 00214 * 00215 * Read a test path and the number of matrix types to use. 00216 * 00217 READ( NIN, FMT = '(A72)', END = 140 )ALINE 00218 PATH = ALINE( 1: 3 ) 00219 NMATS = MATMAX 00220 I = 3 00221 90 CONTINUE 00222 I = I + 1 00223 IF( I.GT.72 ) THEN 00224 NMATS = MATMAX 00225 GO TO 130 00226 END IF 00227 IF( ALINE( I: I ).EQ.' ' ) 00228 $ GO TO 90 00229 NMATS = 0 00230 100 CONTINUE 00231 C1 = ALINE( I: I ) 00232 DO 110 K = 1, 10 00233 IF( C1.EQ.INTSTR( K: K ) ) THEN 00234 IC = K - 1 00235 GO TO 120 00236 END IF 00237 110 CONTINUE 00238 GO TO 130 00239 120 CONTINUE 00240 NMATS = NMATS*10 + IC 00241 I = I + 1 00242 IF( I.GT.72 ) 00243 $ GO TO 130 00244 GO TO 100 00245 130 CONTINUE 00246 C1 = PATH( 1: 1 ) 00247 C2 = PATH( 2: 3 ) 00248 NRHS = NSVAL( 1 ) 00249 NRHS = NSVAL( 1 ) 00250 * 00251 * Check first character for correct precision. 00252 * 00253 IF( .NOT.LSAME( C1, 'Zomplex precision' ) ) THEN 00254 WRITE( NOUT, FMT = 9990 )PATH 00255 * 00256 ELSE IF( NMATS.LE.0 ) THEN 00257 * 00258 * Check for a positive number of tests requested. 00259 * 00260 WRITE( NOUT, FMT = 9990 )'ZCGESV' 00261 GO TO 140 00262 * 00263 ELSE IF( LSAMEN( 2, C2, 'GE' ) ) THEN 00264 * 00265 * GE: general matrices 00266 * 00267 NTYPES = 11 00268 CALL ALAREQ( 'ZGE', NMATS, DOTYPE, NTYPES, NIN, NOUT ) 00269 * 00270 * Test the error exits 00271 * 00272 IF( TSTERR ) 00273 $ CALL ZERRAB( NOUT ) 00274 * 00275 IF( TSTDRV ) THEN 00276 CALL ZDRVAB( DOTYPE, NM, MVAL, NNS, 00277 $ NSVAL, THRESH, LDA, A( 1, 1 ), 00278 $ A( 1, 2 ), B( 1, 1 ), B( 1, 2 ), 00279 $ WORK, RWORK, SWORK, IWORK, NOUT ) 00280 ELSE 00281 WRITE( NOUT, FMT = 9989 )'ZCGESV' 00282 END IF 00283 * 00284 ELSE IF( LSAMEN( 2, C2, 'PO' ) ) THEN 00285 * 00286 * PO: positive definite matrices 00287 * 00288 NTYPES = 9 00289 CALL ALAREQ( 'DPO', NMATS, DOTYPE, NTYPES, NIN, NOUT ) 00290 * 00291 IF( TSTERR ) 00292 $ CALL ZERRAC( NOUT ) 00293 * 00294 * 00295 IF( TSTDRV ) THEN 00296 CALL ZDRVAC( DOTYPE, NM, MVAL, NNS, NSVAL, 00297 $ THRESH, LDA, A( 1, 1 ), A( 1, 2 ), 00298 $ B( 1, 1 ), B( 1, 2 ), 00299 $ WORK, RWORK, SWORK, NOUT ) 00300 ELSE 00301 WRITE( NOUT, FMT = 9989 )'ZCPOSV' 00302 END IF 00303 * 00304 ELSE 00305 * 00306 END IF 00307 * 00308 * Go back to get another input line. 00309 * 00310 GO TO 80 00311 * 00312 * Branch to this line when the last record is read. 00313 * 00314 140 CONTINUE 00315 CLOSE ( NIN ) 00316 S2 = DSECND( ) 00317 WRITE( NOUT, FMT = 9998 ) 00318 WRITE( NOUT, FMT = 9997 )S2 - S1 00319 * 00320 9999 FORMAT( / ' Execution not attempted due to input errors' ) 00321 9998 FORMAT( / ' End of tests' ) 00322 9997 FORMAT( ' Total time used = ', F12.2, ' seconds', / ) 00323 9996 FORMAT( ' Invalid input value: ', A4, '=', I6, '; must be >=', 00324 $ I6 ) 00325 9995 FORMAT( ' Invalid input value: ', A4, '=', I6, '; must be <=', 00326 $ I6 ) 00327 9994 FORMAT( ' Tests of the COMPLEX*16 LAPACK ZCGESV/ZCPOSV routines ', 00328 $ / ' LAPACK VERSION ', I1, '.', I1, '.', I1, 00329 $ / / ' The following parameter values will be used:' ) 00330 9993 FORMAT( 4X, A4, ': ', 10I6, / 11X, 10I6 ) 00331 9992 FORMAT( / ' Routines pass computational tests if test ratio is ', 00332 $ 'less than', F8.2, / ) 00333 9991 FORMAT( ' Relative machine ', A, ' is taken to be', D16.6 ) 00334 9990 FORMAT( / 1X, A6, ' routines were not tested' ) 00335 9989 FORMAT( / 1X, A6, ' driver routines were not tested' ) 00336 9988 FORMAT( / 1X, A3, ': Unrecognized path name' ) 00337 * 00338 * End of ZCHKAB 00339 * 00340 END