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