LAPACK 3.3.1 Linear Algebra PACKage

# schkpo.f

Go to the documentation of this file.
```00001       SUBROUTINE SCHKPO( DOTYPE, NN, NVAL, NNB, NBVAL, NNS, NSVAL,
00002      \$                   THRESH, TSTERR, NMAX, A, AFAC, AINV, B, X,
00003      \$                   XACT, WORK, RWORK, IWORK, 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, NNB, NNS, NOUT
00012       REAL               THRESH
00013 *     ..
00014 *     .. Array Arguments ..
00015       LOGICAL            DOTYPE( * )
00016       INTEGER            IWORK( * ), NBVAL( * ), NSVAL( * ), NVAL( * )
00017       REAL               A( * ), AFAC( * ), AINV( * ), B( * ),
00018      \$                   RWORK( * ), WORK( * ), X( * ), XACT( * )
00019 *     ..
00020 *
00021 *  Purpose
00022 *  =======
00023 *
00024 *  SCHKPO tests SPOTRF, -TRI, -TRS, -RFS, and -CON
00025 *
00026 *  Arguments
00027 *  =========
00028 *
00029 *  DOTYPE  (input) LOGICAL array, dimension (NTYPES)
00030 *          The matrix types to be used for testing.  Matrices of type j
00031 *          (for 1 <= j <= NTYPES) are used for testing if DOTYPE(j) =
00032 *          .TRUE.; if DOTYPE(j) = .FALSE., then type j is not used.
00033 *
00034 *  NN      (input) INTEGER
00035 *          The number of values of N contained in the vector NVAL.
00036 *
00037 *  NVAL    (input) INTEGER array, dimension (NN)
00038 *          The values of the matrix dimension N.
00039 *
00040 *  NNB     (input) INTEGER
00041 *          The number of values of NB contained in the vector NBVAL.
00042 *
00043 *  NBVAL   (input) INTEGER array, dimension (NBVAL)
00044 *          The values of the blocksize NB.
00045 *
00046 *  NNS     (input) INTEGER
00047 *          The number of values of NRHS contained in the vector NSVAL.
00048 *
00049 *  NSVAL   (input) INTEGER array, dimension (NNS)
00050 *          The values of the number of right hand sides NRHS.
00051 *
00052 *  THRESH  (input) REAL
00053 *          The threshold value for the test ratios.  A result is
00054 *          included in the output file if RESULT >= THRESH.  To have
00055 *          every test ratio printed, use THRESH = 0.
00056 *
00057 *  TSTERR  (input) LOGICAL
00058 *          Flag that indicates whether error exits are to be tested.
00059 *
00060 *  NMAX    (input) INTEGER
00061 *          The maximum value permitted for N, used in dimensioning the
00062 *          work arrays.
00063 *
00064 *  A       (workspace) REAL array, dimension (NMAX*NMAX)
00065 *
00066 *  AFAC    (workspace) REAL array, dimension (NMAX*NMAX)
00067 *
00068 *  AINV    (workspace) REAL array, dimension (NMAX*NMAX)
00069 *
00070 *  B       (workspace) REAL array, dimension (NMAX*NSMAX)
00071 *          where NSMAX is the largest entry in NSVAL.
00072 *
00073 *  X       (workspace) REAL array, dimension (NMAX*NSMAX)
00074 *
00075 *  XACT    (workspace) REAL array, dimension (NMAX*NSMAX)
00076 *
00077 *  WORK    (workspace) REAL array, dimension
00078 *                      (NMAX*max(3,NSMAX))
00079 *
00080 *  RWORK   (workspace) REAL array, dimension
00081 *                      (max(NMAX,2*NSMAX))
00082 *
00083 *  IWORK   (workspace) INTEGER array, dimension (NMAX)
00084 *
00085 *  NOUT    (input) INTEGER
00086 *          The unit number for output.
00087 *
00088 *  =====================================================================
00089 *
00090 *     .. Parameters ..
00091       REAL               ZERO
00092       PARAMETER          ( ZERO = 0.0E+0 )
00093       INTEGER            NTYPES
00094       PARAMETER          ( NTYPES = 9 )
00095       INTEGER            NTESTS
00096       PARAMETER          ( NTESTS = 8 )
00097 *     ..
00098 *     .. Local Scalars ..
00099       LOGICAL            ZEROT
00100       CHARACTER          DIST, TYPE, UPLO, XTYPE
00101       CHARACTER*3        PATH
00102       INTEGER            I, IMAT, IN, INB, INFO, IOFF, IRHS, IUPLO,
00103      \$                   IZERO, K, KL, KU, LDA, MODE, N, NB, NERRS,
00104      \$                   NFAIL, NIMAT, NRHS, NRUN
00105       REAL               ANORM, CNDNUM, RCOND, RCONDC
00106 *     ..
00107 *     .. Local Arrays ..
00108       CHARACTER          UPLOS( 2 )
00109       INTEGER            ISEED( 4 ), ISEEDY( 4 )
00110       REAL               RESULT( NTESTS )
00111 *     ..
00112 *     .. External Functions ..
00113       REAL               SGET06, SLANSY
00114       EXTERNAL           SGET06, SLANSY
00115 *     ..
00116 *     .. External Subroutines ..
00117       EXTERNAL           ALAERH, ALAHD, ALASUM, SERRPO, SGET04, SLACPY,
00118      \$                   SLARHS, SLATB4, SLATMS, SPOCON, SPORFS, SPOT01,
00119      \$                   SPOT02, SPOT03, SPOT05, SPOTRF, SPOTRI, SPOTRS,
00120      \$                   XLAENV
00121 *     ..
00122 *     .. Scalars in Common ..
00123       LOGICAL            LERR, OK
00124       CHARACTER*32       SRNAMT
00125       INTEGER            INFOT, NUNIT
00126 *     ..
00127 *     .. Common blocks ..
00128       COMMON             / INFOC / INFOT, NUNIT, OK, LERR
00129       COMMON             / SRNAMC / SRNAMT
00130 *     ..
00131 *     .. Intrinsic Functions ..
00132       INTRINSIC          MAX
00133 *     ..
00134 *     .. Data statements ..
00135       DATA               ISEEDY / 1988, 1989, 1990, 1991 /
00136       DATA               UPLOS / 'U', 'L' /
00137 *     ..
00138 *     .. Executable Statements ..
00139 *
00140 *     Initialize constants and the random number seed.
00141 *
00142       PATH( 1: 1 ) = 'Single precision'
00143       PATH( 2: 3 ) = 'PO'
00144       NRUN = 0
00145       NFAIL = 0
00146       NERRS = 0
00147       DO 10 I = 1, 4
00148          ISEED( I ) = ISEEDY( I )
00149    10 CONTINUE
00150 *
00151 *     Test the error exits
00152 *
00153       IF( TSTERR )
00154      \$   CALL SERRPO( PATH, NOUT )
00155       INFOT = 0
00156       CALL XLAENV( 2, 2 )
00157 *
00158 *     Do for each value of N in NVAL
00159 *
00160       DO 120 IN = 1, NN
00161          N = NVAL( IN )
00162          LDA = MAX( N, 1 )
00163          XTYPE = 'N'
00164          NIMAT = NTYPES
00165          IF( N.LE.0 )
00166      \$      NIMAT = 1
00167 *
00168          IZERO = 0
00169          DO 110 IMAT = 1, NIMAT
00170 *
00171 *           Do the tests only if DOTYPE( IMAT ) is true.
00172 *
00173             IF( .NOT.DOTYPE( IMAT ) )
00174      \$         GO TO 110
00175 *
00176 *           Skip types 3, 4, or 5 if the matrix size is too small.
00177 *
00178             ZEROT = IMAT.GE.3 .AND. IMAT.LE.5
00179             IF( ZEROT .AND. N.LT.IMAT-2 )
00180      \$         GO TO 110
00181 *
00182 *           Do first for UPLO = 'U', then for UPLO = 'L'
00183 *
00184             DO 100 IUPLO = 1, 2
00185                UPLO = UPLOS( IUPLO )
00186 *
00187 *              Set up parameters with SLATB4 and generate a test matrix
00188 *              with SLATMS.
00189 *
00190                CALL SLATB4( PATH, IMAT, N, N, TYPE, KL, KU, ANORM, MODE,
00191      \$                      CNDNUM, DIST )
00192 *
00193                SRNAMT = 'SLATMS'
00194                CALL SLATMS( N, N, DIST, ISEED, TYPE, RWORK, MODE,
00195      \$                      CNDNUM, ANORM, KL, KU, UPLO, A, LDA, WORK,
00196      \$                      INFO )
00197 *
00198 *              Check error code from SLATMS.
00199 *
00200                IF( INFO.NE.0 ) THEN
00201                   CALL ALAERH( PATH, 'SLATMS', INFO, 0, UPLO, N, N, -1,
00202      \$                         -1, -1, IMAT, NFAIL, NERRS, NOUT )
00203                   GO TO 100
00204                END IF
00205 *
00206 *              For types 3-5, zero one row and column of the matrix to
00207 *              test that INFO is returned correctly.
00208 *
00209                IF( ZEROT ) THEN
00210                   IF( IMAT.EQ.3 ) THEN
00211                      IZERO = 1
00212                   ELSE IF( IMAT.EQ.4 ) THEN
00213                      IZERO = N
00214                   ELSE
00215                      IZERO = N / 2 + 1
00216                   END IF
00217                   IOFF = ( IZERO-1 )*LDA
00218 *
00219 *                 Set row and column IZERO of A to 0.
00220 *
00221                   IF( IUPLO.EQ.1 ) THEN
00222                      DO 20 I = 1, IZERO - 1
00223                         A( IOFF+I ) = ZERO
00224    20                CONTINUE
00225                      IOFF = IOFF + IZERO
00226                      DO 30 I = IZERO, N
00227                         A( IOFF ) = ZERO
00228                         IOFF = IOFF + LDA
00229    30                CONTINUE
00230                   ELSE
00231                      IOFF = IZERO
00232                      DO 40 I = 1, IZERO - 1
00233                         A( IOFF ) = ZERO
00234                         IOFF = IOFF + LDA
00235    40                CONTINUE
00236                      IOFF = IOFF - IZERO
00237                      DO 50 I = IZERO, N
00238                         A( IOFF+I ) = ZERO
00239    50                CONTINUE
00240                   END IF
00241                ELSE
00242                   IZERO = 0
00243                END IF
00244 *
00245 *              Do for each value of NB in NBVAL
00246 *
00247                DO 90 INB = 1, NNB
00248                   NB = NBVAL( INB )
00249                   CALL XLAENV( 1, NB )
00250 *
00251 *                 Compute the L*L' or U'*U factorization of the matrix.
00252 *
00253                   CALL SLACPY( UPLO, N, N, A, LDA, AFAC, LDA )
00254                   SRNAMT = 'SPOTRF'
00255                   CALL SPOTRF( UPLO, N, AFAC, LDA, INFO )
00256 *
00257 *                 Check error code from SPOTRF.
00258 *
00259                   IF( INFO.NE.IZERO ) THEN
00260                      CALL ALAERH( PATH, 'SPOTRF', INFO, IZERO, UPLO, N,
00261      \$                            N, -1, -1, NB, IMAT, NFAIL, NERRS,
00262      \$                            NOUT )
00263                      GO TO 90
00264                   END IF
00265 *
00266 *                 Skip the tests if INFO is not 0.
00267 *
00268                   IF( INFO.NE.0 )
00269      \$               GO TO 90
00270 *
00271 *+    TEST 1
00272 *                 Reconstruct matrix from factors and compute residual.
00273 *
00274                   CALL SLACPY( UPLO, N, N, AFAC, LDA, AINV, LDA )
00275                   CALL SPOT01( UPLO, N, A, LDA, AINV, LDA, RWORK,
00276      \$                         RESULT( 1 ) )
00277 *
00278 *+    TEST 2
00279 *                 Form the inverse and compute the residual.
00280 *
00281                   CALL SLACPY( UPLO, N, N, AFAC, LDA, AINV, LDA )
00282                   SRNAMT = 'SPOTRI'
00283                   CALL SPOTRI( UPLO, N, AINV, LDA, INFO )
00284 *
00285 *                 Check error code from SPOTRI.
00286 *
00287                   IF( INFO.NE.0 )
00288      \$               CALL ALAERH( PATH, 'SPOTRI', INFO, 0, UPLO, N, N,
00289      \$                            -1, -1, -1, IMAT, NFAIL, NERRS, NOUT )
00290 *
00291                   CALL SPOT03( UPLO, N, A, LDA, AINV, LDA, WORK, LDA,
00292      \$                         RWORK, RCONDC, RESULT( 2 ) )
00293 *
00294 *                 Print information about the tests that did not pass
00295 *                 the threshold.
00296 *
00297                   DO 60 K = 1, 2
00298                      IF( RESULT( K ).GE.THRESH ) THEN
00299                         IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
00300      \$                     CALL ALAHD( NOUT, PATH )
00301                         WRITE( NOUT, FMT = 9999 )UPLO, N, NB, IMAT, K,
00302      \$                     RESULT( K )
00303                         NFAIL = NFAIL + 1
00304                      END IF
00305    60             CONTINUE
00306                   NRUN = NRUN + 2
00307 *
00308 *                 Skip the rest of the tests unless this is the first
00309 *                 blocksize.
00310 *
00311                   IF( INB.NE.1 )
00312      \$               GO TO 90
00313 *
00314                   DO 80 IRHS = 1, NNS
00315                      NRHS = NSVAL( IRHS )
00316 *
00317 *+    TEST 3
00318 *                 Solve and compute residual for A * X = B .
00319 *
00320                      SRNAMT = 'SLARHS'
00321                      CALL SLARHS( PATH, XTYPE, UPLO, ' ', N, N, KL, KU,
00322      \$                            NRHS, A, LDA, XACT, LDA, B, LDA,
00323      \$                            ISEED, INFO )
00324                      CALL SLACPY( 'Full', N, NRHS, B, LDA, X, LDA )
00325 *
00326                      SRNAMT = 'SPOTRS'
00327                      CALL SPOTRS( UPLO, N, NRHS, AFAC, LDA, X, LDA,
00328      \$                            INFO )
00329 *
00330 *                 Check error code from SPOTRS.
00331 *
00332                      IF( INFO.NE.0 )
00333      \$                  CALL ALAERH( PATH, 'SPOTRS', INFO, 0, UPLO, N,
00334      \$                               N, -1, -1, NRHS, IMAT, NFAIL,
00335      \$                               NERRS, NOUT )
00336 *
00337                      CALL SLACPY( 'Full', N, NRHS, B, LDA, WORK, LDA )
00338                      CALL SPOT02( UPLO, N, NRHS, A, LDA, X, LDA, WORK,
00339      \$                            LDA, RWORK, RESULT( 3 ) )
00340 *
00341 *+    TEST 4
00342 *                 Check solution from generated exact solution.
00343 *
00344                      CALL SGET04( N, NRHS, X, LDA, XACT, LDA, RCONDC,
00345      \$                            RESULT( 4 ) )
00346 *
00347 *+    TESTS 5, 6, and 7
00348 *                 Use iterative refinement to improve the solution.
00349 *
00350                      SRNAMT = 'SPORFS'
00351                      CALL SPORFS( UPLO, N, NRHS, A, LDA, AFAC, LDA, B,
00352      \$                            LDA, X, LDA, RWORK, RWORK( NRHS+1 ),
00353      \$                            WORK, IWORK, INFO )
00354 *
00355 *                 Check error code from SPORFS.
00356 *
00357                      IF( INFO.NE.0 )
00358      \$                  CALL ALAERH( PATH, 'SPORFS', INFO, 0, UPLO, N,
00359      \$                               N, -1, -1, NRHS, IMAT, NFAIL,
00360      \$                               NERRS, NOUT )
00361 *
00362                      CALL SGET04( N, NRHS, X, LDA, XACT, LDA, RCONDC,
00363      \$                            RESULT( 5 ) )
00364                      CALL SPOT05( UPLO, N, NRHS, A, LDA, B, LDA, X, LDA,
00365      \$                            XACT, LDA, RWORK, RWORK( NRHS+1 ),
00366      \$                            RESULT( 6 ) )
00367 *
00368 *                    Print information about the tests that did not pass
00369 *                    the threshold.
00370 *
00371                      DO 70 K = 3, 7
00372                         IF( RESULT( K ).GE.THRESH ) THEN
00373                            IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
00374      \$                        CALL ALAHD( NOUT, PATH )
00375                            WRITE( NOUT, FMT = 9998 )UPLO, N, NRHS,
00376      \$                        IMAT, K, RESULT( K )
00377                            NFAIL = NFAIL + 1
00378                         END IF
00379    70                CONTINUE
00380                      NRUN = NRUN + 5
00381    80             CONTINUE
00382 *
00383 *+    TEST 8
00384 *                 Get an estimate of RCOND = 1/CNDNUM.
00385 *
00386                   ANORM = SLANSY( '1', UPLO, N, A, LDA, RWORK )
00387                   SRNAMT = 'SPOCON'
00388                   CALL SPOCON( UPLO, N, AFAC, LDA, ANORM, RCOND, WORK,
00389      \$                         IWORK, INFO )
00390 *
00391 *                 Check error code from SPOCON.
00392 *
00393                   IF( INFO.NE.0 )
00394      \$               CALL ALAERH( PATH, 'SPOCON', INFO, 0, UPLO, N, N,
00395      \$                            -1, -1, -1, IMAT, NFAIL, NERRS, NOUT )
00396 *
00397                   RESULT( 8 ) = SGET06( RCOND, RCONDC )
00398 *
00399 *                 Print the test ratio if it is .GE. THRESH.
00400 *
00401                   IF( RESULT( 8 ).GE.THRESH ) THEN
00402                      IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
00403      \$                  CALL ALAHD( NOUT, PATH )
00404                      WRITE( NOUT, FMT = 9997 )UPLO, N, IMAT, 8,
00405      \$                  RESULT( 8 )
00406                      NFAIL = NFAIL + 1
00407                   END IF
00408                   NRUN = NRUN + 1
00409    90          CONTINUE
00410   100       CONTINUE
00411   110    CONTINUE
00412   120 CONTINUE
00413 *
00414 *     Print a summary of the results.
00415 *
00416       CALL ALASUM( PATH, NOUT, NFAIL, NRUN, NERRS )
00417 *
00418  9999 FORMAT( ' UPLO = ''', A1, ''', N =', I5, ', NB =', I4, ', type ',
00419      \$      I2, ', test ', I2, ', ratio =', G12.5 )
00420  9998 FORMAT( ' UPLO = ''', A1, ''', N =', I5, ', NRHS=', I3, ', type ',
00421      \$      I2, ', test(', I2, ') =', G12.5 )
00422  9997 FORMAT( ' UPLO = ''', A1, ''', N =', I5, ',', 10X, ' type ', I2,
00423      \$      ', test(', I2, ') =', G12.5 )
00424       RETURN
00425 *
00426 *     End of SCHKPO
00427 *
00428       END
```