LAPACK 3.3.1 Linear Algebra PACKage

# zchktp.f

Go to the documentation of this file.
```00001       SUBROUTINE ZCHKTP( DOTYPE, NN, NVAL, NNS, NSVAL, THRESH, TSTERR,
00002      \$                   NMAX, AP, AINVP, B, X, XACT, WORK, RWORK,
00003      \$                   NOUT )
00004 *
00005 *  -- LAPACK test routine (version 3.1) --
00006 *     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
00007 *     November 2006
00008 *
00009 *     .. Scalar Arguments ..
00010       LOGICAL            TSTERR
00011       INTEGER            NMAX, NN, NNS, NOUT
00012       DOUBLE PRECISION   THRESH
00013 *     ..
00014 *     .. Array Arguments ..
00015       LOGICAL            DOTYPE( * )
00016       INTEGER            NSVAL( * ), NVAL( * )
00017       DOUBLE PRECISION   RWORK( * )
00018       COMPLEX*16         AINVP( * ), AP( * ), B( * ), WORK( * ), X( * ),
00019      \$                   XACT( * )
00020 *     ..
00021 *
00022 *  Purpose
00023 *  =======
00024 *
00025 *  ZCHKTP tests ZTPTRI, -TRS, -RFS, and -CON, and ZLATPS
00026 *
00027 *  Arguments
00028 *  =========
00029 *
00030 *  DOTYPE  (input) LOGICAL array, dimension (NTYPES)
00031 *          The matrix types to be used for testing.  Matrices of type j
00032 *          (for 1 <= j <= NTYPES) are used for testing if DOTYPE(j) =
00033 *          .TRUE.; if DOTYPE(j) = .FALSE., then type j is not used.
00034 *
00035 *  NN      (input) INTEGER
00036 *          The number of values of N contained in the vector NVAL.
00037 *
00038 *  NVAL    (input) INTEGER array, dimension (NN)
00039 *          The values of the matrix column dimension N.
00040 *
00041 *  NNS     (input) INTEGER
00042 *          The number of values of NRHS contained in the vector NSVAL.
00043 *
00044 *  NSVAL   (input) INTEGER array, dimension (NNS)
00045 *          The values of the number of right hand sides NRHS.
00046 *
00047 *  THRESH  (input) DOUBLE PRECISION
00048 *          The threshold value for the test ratios.  A result is
00049 *          included in the output file if RESULT >= THRESH.  To have
00050 *          every test ratio printed, use THRESH = 0.
00051 *
00052 *  TSTERR  (input) LOGICAL
00053 *          Flag that indicates whether error exits are to be tested.
00054 *
00055 *  NMAX    (input) INTEGER
00056 *          The leading dimension of the work arrays.  NMAX >= the
00057 *          maximumm value of N in NVAL.
00058 *
00059 *  AP      (workspace) COMPLEX*16 array, dimension (NMAX*(NMAX+1)/2)
00060 *
00061 *  AINVP   (workspace) COMPLEX*16 array, dimension (NMAX*(NMAX+1)/2)
00062 *
00063 *  B       (workspace) COMPLEX*16 array, dimension (NMAX*NSMAX)
00064 *          where NSMAX is the largest entry in NSVAL.
00065 *
00066 *  X       (workspace) COMPLEX*16 array, dimension (NMAX*NSMAX)
00067 *
00068 *  XACT    (workspace) COMPLEX*16 array, dimension (NMAX*NSMAX)
00069 *
00070 *  WORK    (workspace) COMPLEX*16 array, dimension
00071 *                      (NMAX*max(3,NSMAX))
00072 *
00073 *  RWORK   (workspace) DOUBLE PRECISION array, dimension
00074 *                      (max(NMAX,2*NSMAX))
00075 *
00076 *  NOUT    (input) INTEGER
00077 *          The unit number for output.
00078 *
00079 *  =====================================================================
00080 *
00081 *     .. Parameters ..
00082       INTEGER            NTYPE1, NTYPES
00083       PARAMETER          ( NTYPE1 = 10, NTYPES = 18 )
00084       INTEGER            NTESTS
00085       PARAMETER          ( NTESTS = 9 )
00086       INTEGER            NTRAN
00087       PARAMETER          ( NTRAN = 3 )
00088       DOUBLE PRECISION   ONE, ZERO
00089       PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
00090 *     ..
00091 *     .. Local Scalars ..
00092       CHARACTER          DIAG, NORM, TRANS, UPLO, XTYPE
00093       CHARACTER*3        PATH
00094       INTEGER            I, IDIAG, IMAT, IN, INFO, IRHS, ITRAN, IUPLO,
00095      \$                   K, LAP, LDA, N, NERRS, NFAIL, NRHS, NRUN
00096       DOUBLE PRECISION   AINVNM, ANORM, RCOND, RCONDC, RCONDI, RCONDO,
00097      \$                   SCALE
00098 *     ..
00099 *     .. Local Arrays ..
00100       CHARACTER          TRANSS( NTRAN ), UPLOS( 2 )
00101       INTEGER            ISEED( 4 ), ISEEDY( 4 )
00102       DOUBLE PRECISION   RESULT( NTESTS )
00103 *     ..
00104 *     .. External Functions ..
00105       LOGICAL            LSAME
00106       DOUBLE PRECISION   ZLANTP
00107       EXTERNAL           LSAME, ZLANTP
00108 *     ..
00109 *     .. External Subroutines ..
00110       EXTERNAL           ALAERH, ALAHD, ALASUM, ZCOPY, ZERRTR, ZGET04,
00111      \$                   ZLACPY, ZLARHS, ZLATPS, ZLATTP, ZTPCON, ZTPRFS,
00112      \$                   ZTPT01, ZTPT02, ZTPT03, ZTPT05, ZTPT06, ZTPTRI,
00113      \$                   ZTPTRS
00114 *     ..
00115 *     .. Scalars in Common ..
00116       LOGICAL            LERR, OK
00117       CHARACTER*32       SRNAMT
00118       INTEGER            INFOT, IOUNIT
00119 *     ..
00120 *     .. Common blocks ..
00121       COMMON             / INFOC / INFOT, IOUNIT, OK, LERR
00122       COMMON             / SRNAMC / SRNAMT
00123 *     ..
00124 *     .. Intrinsic Functions ..
00125       INTRINSIC          MAX
00126 *     ..
00127 *     .. Data statements ..
00128       DATA               ISEEDY / 1988, 1989, 1990, 1991 /
00129       DATA               UPLOS / 'U', 'L' / , TRANSS / 'N', 'T', 'C' /
00130 *     ..
00131 *     .. Executable Statements ..
00132 *
00133 *     Initialize constants and the random number seed.
00134 *
00135       PATH( 1: 1 ) = 'Zomplex precision'
00136       PATH( 2: 3 ) = 'TP'
00137       NRUN = 0
00138       NFAIL = 0
00139       NERRS = 0
00140       DO 10 I = 1, 4
00141          ISEED( I ) = ISEEDY( I )
00142    10 CONTINUE
00143 *
00144 *     Test the error exits
00145 *
00146       IF( TSTERR )
00147      \$   CALL ZERRTR( PATH, NOUT )
00148       INFOT = 0
00149 *
00150       DO 110 IN = 1, NN
00151 *
00152 *        Do for each value of N in NVAL
00153 *
00154          N = NVAL( IN )
00155          LDA = MAX( 1, N )
00156          LAP = LDA*( LDA+1 ) / 2
00157          XTYPE = 'N'
00158 *
00159          DO 70 IMAT = 1, NTYPE1
00160 *
00161 *           Do the tests only if DOTYPE( IMAT ) is true.
00162 *
00163             IF( .NOT.DOTYPE( IMAT ) )
00164      \$         GO TO 70
00165 *
00166             DO 60 IUPLO = 1, 2
00167 *
00168 *              Do first for UPLO = 'U', then for UPLO = 'L'
00169 *
00170                UPLO = UPLOS( IUPLO )
00171 *
00172 *              Call ZLATTP to generate a triangular test matrix.
00173 *
00174                SRNAMT = 'ZLATTP'
00175                CALL ZLATTP( IMAT, UPLO, 'No transpose', DIAG, ISEED, N,
00176      \$                      AP, X, WORK, RWORK, INFO )
00177 *
00178 *              Set IDIAG = 1 for non-unit matrices, 2 for unit.
00179 *
00180                IF( LSAME( DIAG, 'N' ) ) THEN
00181                   IDIAG = 1
00182                ELSE
00183                   IDIAG = 2
00184                END IF
00185 *
00186 *+    TEST 1
00187 *              Form the inverse of A.
00188 *
00189                IF( N.GT.0 )
00190      \$            CALL ZCOPY( LAP, AP, 1, AINVP, 1 )
00191                SRNAMT = 'ZTPTRI'
00192                CALL ZTPTRI( UPLO, DIAG, N, AINVP, INFO )
00193 *
00194 *              Check error code from ZTPTRI.
00195 *
00196                IF( INFO.NE.0 )
00197      \$            CALL ALAERH( PATH, 'ZTPTRI', INFO, 0, UPLO // DIAG, N,
00198      \$                         N, -1, -1, -1, IMAT, NFAIL, NERRS, NOUT )
00199 *
00200 *              Compute the infinity-norm condition number of A.
00201 *
00202                ANORM = ZLANTP( 'I', UPLO, DIAG, N, AP, RWORK )
00203                AINVNM = ZLANTP( 'I', UPLO, DIAG, N, AINVP, RWORK )
00204                IF( ANORM.LE.ZERO .OR. AINVNM.LE.ZERO ) THEN
00205                   RCONDI = ONE
00206                ELSE
00207                   RCONDI = ( ONE / ANORM ) / AINVNM
00208                END IF
00209 *
00210 *              Compute the residual for the triangular matrix times its
00211 *              inverse.  Also compute the 1-norm condition number of A.
00212 *
00213                CALL ZTPT01( UPLO, DIAG, N, AP, AINVP, RCONDO, RWORK,
00214      \$                      RESULT( 1 ) )
00215 *
00216 *              Print the test ratio if it is .GE. THRESH.
00217 *
00218                IF( RESULT( 1 ).GE.THRESH ) THEN
00219                   IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
00220      \$               CALL ALAHD( NOUT, PATH )
00221                   WRITE( NOUT, FMT = 9999 )UPLO, DIAG, N, IMAT, 1,
00222      \$               RESULT( 1 )
00223                   NFAIL = NFAIL + 1
00224                END IF
00225                NRUN = NRUN + 1
00226 *
00227                DO 40 IRHS = 1, NNS
00228                   NRHS = NSVAL( IRHS )
00229                   XTYPE = 'N'
00230 *
00231                   DO 30 ITRAN = 1, NTRAN
00232 *
00233 *                 Do for op(A) = A, A**T, or A**H.
00234 *
00235                      TRANS = TRANSS( ITRAN )
00236                      IF( ITRAN.EQ.1 ) THEN
00237                         NORM = 'O'
00238                         RCONDC = RCONDO
00239                      ELSE
00240                         NORM = 'I'
00241                         RCONDC = RCONDI
00242                      END IF
00243 *
00244 *+    TEST 2
00245 *                 Solve and compute residual for op(A)*x = b.
00246 *
00247                      SRNAMT = 'ZLARHS'
00248                      CALL ZLARHS( PATH, XTYPE, UPLO, TRANS, N, N, 0,
00249      \$                            IDIAG, NRHS, AP, LAP, XACT, LDA, B,
00250      \$                            LDA, ISEED, INFO )
00251                      XTYPE = 'C'
00252                      CALL ZLACPY( 'Full', N, NRHS, B, LDA, X, LDA )
00253 *
00254                      SRNAMT = 'ZTPTRS'
00255                      CALL ZTPTRS( UPLO, TRANS, DIAG, N, NRHS, AP, X,
00256      \$                            LDA, INFO )
00257 *
00258 *                 Check error code from ZTPTRS.
00259 *
00260                      IF( INFO.NE.0 )
00261      \$                  CALL ALAERH( PATH, 'ZTPTRS', INFO, 0,
00262      \$                               UPLO // TRANS // DIAG, N, N, -1,
00263      \$                               -1, -1, IMAT, NFAIL, NERRS, NOUT )
00264 *
00265                      CALL ZTPT02( UPLO, TRANS, DIAG, N, NRHS, AP, X,
00266      \$                            LDA, B, LDA, WORK, RWORK,
00267      \$                            RESULT( 2 ) )
00268 *
00269 *+    TEST 3
00270 *                 Check solution from generated exact solution.
00271 *
00272                      CALL ZGET04( N, NRHS, X, LDA, XACT, LDA, RCONDC,
00273      \$                            RESULT( 3 ) )
00274 *
00275 *+    TESTS 4, 5, and 6
00276 *                 Use iterative refinement to improve the solution and
00277 *                 compute error bounds.
00278 *
00279                      SRNAMT = 'ZTPRFS'
00280                      CALL ZTPRFS( UPLO, TRANS, DIAG, N, NRHS, AP, B,
00281      \$                            LDA, X, LDA, RWORK, RWORK( NRHS+1 ),
00282      \$                            WORK, RWORK( 2*NRHS+1 ), INFO )
00283 *
00284 *                 Check error code from ZTPRFS.
00285 *
00286                      IF( INFO.NE.0 )
00287      \$                  CALL ALAERH( PATH, 'ZTPRFS', INFO, 0,
00288      \$                               UPLO // TRANS // DIAG, N, N, -1,
00289      \$                               -1, NRHS, IMAT, NFAIL, NERRS,
00290      \$                               NOUT )
00291 *
00292                      CALL ZGET04( N, NRHS, X, LDA, XACT, LDA, RCONDC,
00293      \$                            RESULT( 4 ) )
00294                      CALL ZTPT05( UPLO, TRANS, DIAG, N, NRHS, AP, B,
00295      \$                            LDA, X, LDA, XACT, LDA, RWORK,
00296      \$                            RWORK( NRHS+1 ), RESULT( 5 ) )
00297 *
00298 *                    Print information about the tests that did not pass
00299 *                    the threshold.
00300 *
00301                      DO 20 K = 2, 6
00302                         IF( RESULT( K ).GE.THRESH ) THEN
00303                            IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
00304      \$                        CALL ALAHD( NOUT, PATH )
00305                            WRITE( NOUT, FMT = 9998 )UPLO, TRANS, DIAG,
00306      \$                        N, NRHS, IMAT, K, RESULT( K )
00307                            NFAIL = NFAIL + 1
00308                         END IF
00309    20                CONTINUE
00310                      NRUN = NRUN + 5
00311    30             CONTINUE
00312    40          CONTINUE
00313 *
00314 *+    TEST 7
00315 *                 Get an estimate of RCOND = 1/CNDNUM.
00316 *
00317                DO 50 ITRAN = 1, 2
00318                   IF( ITRAN.EQ.1 ) THEN
00319                      NORM = 'O'
00320                      RCONDC = RCONDO
00321                   ELSE
00322                      NORM = 'I'
00323                      RCONDC = RCONDI
00324                   END IF
00325                   SRNAMT = 'ZTPCON'
00326                   CALL ZTPCON( NORM, UPLO, DIAG, N, AP, RCOND, WORK,
00327      \$                         RWORK, INFO )
00328 *
00329 *                 Check error code from ZTPCON.
00330 *
00331                   IF( INFO.NE.0 )
00332      \$               CALL ALAERH( PATH, 'ZTPCON', INFO, 0,
00333      \$                            NORM // UPLO // DIAG, N, N, -1, -1,
00334      \$                            -1, IMAT, NFAIL, NERRS, NOUT )
00335 *
00336                   CALL ZTPT06( RCOND, RCONDC, UPLO, DIAG, N, AP, RWORK,
00337      \$                         RESULT( 7 ) )
00338 *
00339 *                 Print the test ratio if it is .GE. THRESH.
00340 *
00341                   IF( RESULT( 7 ).GE.THRESH ) THEN
00342                      IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
00343      \$                  CALL ALAHD( NOUT, PATH )
00344                      WRITE( NOUT, FMT = 9997 ) 'ZTPCON', NORM, UPLO,
00345      \$                  DIAG, N, IMAT, 7, RESULT( 7 )
00346                      NFAIL = NFAIL + 1
00347                   END IF
00348                   NRUN = NRUN + 1
00349    50          CONTINUE
00350    60       CONTINUE
00351    70    CONTINUE
00352 *
00353 *        Use pathological test matrices to test ZLATPS.
00354 *
00355          DO 100 IMAT = NTYPE1 + 1, NTYPES
00356 *
00357 *           Do the tests only if DOTYPE( IMAT ) is true.
00358 *
00359             IF( .NOT.DOTYPE( IMAT ) )
00360      \$         GO TO 100
00361 *
00362             DO 90 IUPLO = 1, 2
00363 *
00364 *              Do first for UPLO = 'U', then for UPLO = 'L'
00365 *
00366                UPLO = UPLOS( IUPLO )
00367                DO 80 ITRAN = 1, NTRAN
00368 *
00369 *                 Do for op(A) = A, A**T, or A**H.
00370 *
00371                   TRANS = TRANSS( ITRAN )
00372 *
00373 *                 Call ZLATTP to generate a triangular test matrix.
00374 *
00375                   SRNAMT = 'ZLATTP'
00376                   CALL ZLATTP( IMAT, UPLO, TRANS, DIAG, ISEED, N, AP, X,
00377      \$                         WORK, RWORK, INFO )
00378 *
00379 *+    TEST 8
00380 *                 Solve the system op(A)*x = b.
00381 *
00382                   SRNAMT = 'ZLATPS'
00383                   CALL ZCOPY( N, X, 1, B, 1 )
00384                   CALL ZLATPS( UPLO, TRANS, DIAG, 'N', N, AP, B, SCALE,
00385      \$                         RWORK, INFO )
00386 *
00387 *                 Check error code from ZLATPS.
00388 *
00389                   IF( INFO.NE.0 )
00390      \$               CALL ALAERH( PATH, 'ZLATPS', INFO, 0,
00391      \$                            UPLO // TRANS // DIAG // 'N', N, N,
00392      \$                            -1, -1, -1, IMAT, NFAIL, NERRS, NOUT )
00393 *
00394                   CALL ZTPT03( UPLO, TRANS, DIAG, N, 1, AP, SCALE,
00395      \$                         RWORK, ONE, B, LDA, X, LDA, WORK,
00396      \$                         RESULT( 8 ) )
00397 *
00398 *+    TEST 9
00399 *                 Solve op(A)*x = b again with NORMIN = 'Y'.
00400 *
00401                   CALL ZCOPY( N, X, 1, B( N+1 ), 1 )
00402                   CALL ZLATPS( UPLO, TRANS, DIAG, 'Y', N, AP, B( N+1 ),
00403      \$                         SCALE, RWORK, INFO )
00404 *
00405 *                 Check error code from ZLATPS.
00406 *
00407                   IF( INFO.NE.0 )
00408      \$               CALL ALAERH( PATH, 'ZLATPS', INFO, 0,
00409      \$                            UPLO // TRANS // DIAG // 'Y', N, N,
00410      \$                            -1, -1, -1, IMAT, NFAIL, NERRS, NOUT )
00411 *
00412                   CALL ZTPT03( UPLO, TRANS, DIAG, N, 1, AP, SCALE,
00413      \$                         RWORK, ONE, B( N+1 ), LDA, X, LDA, WORK,
00414      \$                         RESULT( 9 ) )
00415 *
00416 *                 Print information about the tests that did not pass
00417 *                 the threshold.
00418 *
00419                   IF( RESULT( 8 ).GE.THRESH ) THEN
00420                      IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
00421      \$                  CALL ALAHD( NOUT, PATH )
00422                      WRITE( NOUT, FMT = 9996 )'ZLATPS', UPLO, TRANS,
00423      \$                  DIAG, 'N', N, IMAT, 8, RESULT( 8 )
00424                      NFAIL = NFAIL + 1
00425                   END IF
00426                   IF( RESULT( 9 ).GE.THRESH ) THEN
00427                      IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
00428      \$                  CALL ALAHD( NOUT, PATH )
00429                      WRITE( NOUT, FMT = 9996 )'ZLATPS', UPLO, TRANS,
00430      \$                  DIAG, 'Y', N, IMAT, 9, RESULT( 9 )
00431                      NFAIL = NFAIL + 1
00432                   END IF
00433                   NRUN = NRUN + 2
00434    80          CONTINUE
00435    90       CONTINUE
00436   100    CONTINUE
00437   110 CONTINUE
00438 *
00439 *     Print a summary of the results.
00440 *
00441       CALL ALASUM( PATH, NOUT, NFAIL, NRUN, NERRS )
00442 *
00443  9999 FORMAT( ' UPLO=''', A1, ''', DIAG=''', A1, ''', N=', I5,
00444      \$      ', type ', I2, ', test(', I2, ')= ', G12.5 )
00445  9998 FORMAT( ' UPLO=''', A1, ''', TRANS=''', A1, ''', DIAG=''', A1,
00446      \$      ''', N=', I5, ''', NRHS=', I5, ', type ', I2, ', test(',
00447      \$      I2, ')= ', G12.5 )
00448  9997 FORMAT( 1X, A, '( ''', A1, ''', ''', A1, ''', ''', A1, ''',',
00449      \$      I5, ', ... ), type ', I2, ', test(', I2, ')=', G12.5 )
00450  9996 FORMAT( 1X, A, '( ''', A1, ''', ''', A1, ''', ''', A1, ''', ''',
00451      \$      A1, ''',', I5, ', ... ), type ', I2, ', test(', I2, ')=',
00452      \$      G12.5 )
00453       RETURN
00454 *
00455 *     End of ZCHKTP
00456 *
00457       END
```