LAPACK  3.4.1
LAPACK: Linear Algebra PACKage
zchkps.f
Go to the documentation of this file.
00001 *> \brief \b ZCHKPS
00002 *
00003 *  =========== DOCUMENTATION ===========
00004 *
00005 * Online html documentation available at 
00006 *            http://www.netlib.org/lapack/explore-html/ 
00007 *
00008 *  Definition:
00009 *  ===========
00010 *
00011 *       SUBROUTINE ZCHKPS( DOTYPE, NN, NVAL, NNB, NBVAL, NRANK, RANKVAL,
00012 *                          THRESH, TSTERR, NMAX, A, AFAC, PERM, PIV, WORK,
00013 *                          RWORK, NOUT )
00014 * 
00015 *       .. Scalar Arguments ..
00016 *       DOUBLE PRECISION   THRESH
00017 *       INTEGER            NMAX, NN, NNB, NOUT, NRANK
00018 *       LOGICAL            TSTERR
00019 *       ..
00020 *       .. Array Arguments ..
00021 *       COMPLEX*16         A( * ), AFAC( * ), PERM( * ), WORK( * )
00022 *       DOUBLE PRECISION   RWORK( * )
00023 *       INTEGER            NBVAL( * ), NVAL( * ), PIV( * ), RANKVAL( * )
00024 *       LOGICAL            DOTYPE( * )
00025 *       ..
00026 *  
00027 *
00028 *> \par Purpose:
00029 *  =============
00030 *>
00031 *> \verbatim
00032 *>
00033 *> ZCHKPS tests ZPSTRF.
00034 *> \endverbatim
00035 *
00036 *  Arguments:
00037 *  ==========
00038 *
00039 *> \param[in] DOTYPE
00040 *> \verbatim
00041 *>          DOTYPE is LOGICAL array, dimension (NTYPES)
00042 *>          The matrix types to be used for testing.  Matrices of type j
00043 *>          (for 1 <= j <= NTYPES) are used for testing if DOTYPE(j) =
00044 *>          .TRUE.; if DOTYPE(j) = .FALSE., then type j is not used.
00045 *> \endverbatim
00046 *>
00047 *> \param[in] NN
00048 *> \verbatim
00049 *>          NN is INTEGER
00050 *>          The number of values of N contained in the vector NVAL.
00051 *> \endverbatim
00052 *>
00053 *> \param[in] NVAL
00054 *> \verbatim
00055 *>          NVAL is INTEGER array, dimension (NN)
00056 *>          The values of the matrix dimension N.
00057 *> \endverbatim
00058 *>
00059 *> \param[in] NNB
00060 *> \verbatim
00061 *>          NNB is INTEGER
00062 *>          The number of values of NB contained in the vector NBVAL.
00063 *> \endverbatim
00064 *>
00065 *> \param[in] NBVAL
00066 *> \verbatim
00067 *>          NBVAL is INTEGER array, dimension (NBVAL)
00068 *>          The values of the block size NB.
00069 *> \endverbatim
00070 *>
00071 *> \param[in] NRANK
00072 *> \verbatim
00073 *>          NRANK is INTEGER
00074 *>          The number of values of RANK contained in the vector RANKVAL.
00075 *> \endverbatim
00076 *>
00077 *> \param[in] RANKVAL
00078 *> \verbatim
00079 *>          RANKVAL is INTEGER array, dimension (NBVAL)
00080 *>          The values of the block size NB.
00081 *> \endverbatim
00082 *>
00083 *> \param[in] THRESH
00084 *> \verbatim
00085 *>          THRESH is DOUBLE PRECISION
00086 *>          The threshold value for the test ratios.  A result is
00087 *>          included in the output file if RESULT >= THRESH.  To have
00088 *>          every test ratio printed, use THRESH = 0.
00089 *> \endverbatim
00090 *>
00091 *> \param[in] TSTERR
00092 *> \verbatim
00093 *>          TSTERR is LOGICAL
00094 *>          Flag that indicates whether error exits are to be tested.
00095 *> \endverbatim
00096 *>
00097 *> \param[in] NMAX
00098 *> \verbatim
00099 *>          NMAX is INTEGER
00100 *>          The maximum value permitted for N, used in dimensioning the
00101 *>          work arrays.
00102 *> \endverbatim
00103 *>
00104 *> \param[out] A
00105 *> \verbatim
00106 *>          A is COMPLEX*16 array, dimension (NMAX*NMAX)
00107 *> \endverbatim
00108 *>
00109 *> \param[out] AFAC
00110 *> \verbatim
00111 *>          AFAC is COMPLEX*16 array, dimension (NMAX*NMAX)
00112 *> \endverbatim
00113 *>
00114 *> \param[out] PERM
00115 *> \verbatim
00116 *>          PERM is COMPLEX*16 array, dimension (NMAX*NMAX)
00117 *> \endverbatim
00118 *>
00119 *> \param[out] PIV
00120 *> \verbatim
00121 *>          PIV is INTEGER array, dimension (NMAX)
00122 *> \endverbatim
00123 *>
00124 *> \param[out] WORK
00125 *> \verbatim
00126 *>          WORK is COMPLEX*16 array, dimension (NMAX*3)
00127 *> \endverbatim
00128 *>
00129 *> \param[out] RWORK
00130 *> \verbatim
00131 *>          RWORK is DOUBLE PRECISION array, dimension (NMAX)
00132 *> \endverbatim
00133 *>
00134 *> \param[in] NOUT
00135 *> \verbatim
00136 *>          NOUT is INTEGER
00137 *>          The unit number for output.
00138 *> \endverbatim
00139 *
00140 *  Authors:
00141 *  ========
00142 *
00143 *> \author Univ. of Tennessee 
00144 *> \author Univ. of California Berkeley 
00145 *> \author Univ. of Colorado Denver 
00146 *> \author NAG Ltd. 
00147 *
00148 *> \date November 2011
00149 *
00150 *> \ingroup complex16_lin
00151 *
00152 *  =====================================================================
00153       SUBROUTINE ZCHKPS( DOTYPE, NN, NVAL, NNB, NBVAL, NRANK, RANKVAL,
00154      $                   THRESH, TSTERR, NMAX, A, AFAC, PERM, PIV, WORK,
00155      $                   RWORK, NOUT )
00156 *
00157 *  -- LAPACK test routine (version 3.4.0) --
00158 *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
00159 *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
00160 *     November 2011
00161 *
00162 *     .. Scalar Arguments ..
00163       DOUBLE PRECISION   THRESH
00164       INTEGER            NMAX, NN, NNB, NOUT, NRANK
00165       LOGICAL            TSTERR
00166 *     ..
00167 *     .. Array Arguments ..
00168       COMPLEX*16         A( * ), AFAC( * ), PERM( * ), WORK( * )
00169       DOUBLE PRECISION   RWORK( * )
00170       INTEGER            NBVAL( * ), NVAL( * ), PIV( * ), RANKVAL( * )
00171       LOGICAL            DOTYPE( * )
00172 *     ..
00173 *
00174 *  =====================================================================
00175 *
00176 *     .. Parameters ..
00177       DOUBLE PRECISION   ONE
00178       PARAMETER          ( ONE = 1.0E+0 )
00179       INTEGER            NTYPES
00180       PARAMETER          ( NTYPES = 9 )
00181 *     ..
00182 *     .. Local Scalars ..
00183       DOUBLE PRECISION   ANORM, CNDNUM, RESULT, TOL
00184       INTEGER            COMPRANK, I, IMAT, IN, INB, INFO, IRANK, IUPLO,
00185      $                   IZERO, KL, KU, LDA, MODE, N, NB, NERRS, NFAIL,
00186      $                   NIMAT, NRUN, RANK, RANKDIFF
00187       CHARACTER          DIST, TYPE, UPLO
00188       CHARACTER*3        PATH
00189 *     ..
00190 *     .. Local Arrays ..
00191       INTEGER            ISEED( 4 ), ISEEDY( 4 )
00192       CHARACTER          UPLOS( 2 )
00193 *     ..
00194 *     .. External Subroutines ..
00195       EXTERNAL           ALAERH, ALAHD, ALASUM, XLAENV, ZERRPS, ZLACPY,
00196      $                   ZLATB5, ZLATMT, ZPST01, ZPSTRF
00197 *     ..
00198 *     .. Scalars in Common ..
00199       INTEGER            INFOT, NUNIT
00200       LOGICAL            LERR, OK
00201       CHARACTER*32       SRNAMT
00202 *     ..
00203 *     .. Common blocks ..
00204       COMMON             / INFOC / INFOT, NUNIT, OK, LERR
00205       COMMON             / SRNAMC / SRNAMT
00206 *     ..
00207 *     .. Intrinsic Functions ..
00208       INTRINSIC          DBLE, MAX, CEILING
00209 *     ..
00210 *     .. Data statements ..
00211       DATA               ISEEDY / 1988, 1989, 1990, 1991 /
00212       DATA               UPLOS / 'U', 'L' /
00213 *     ..
00214 *     .. Executable Statements ..
00215 *
00216 *     Initialize constants and the random number seed.
00217 *
00218       PATH( 1: 1 ) = 'Zomplex Precision'
00219       PATH( 2: 3 ) = 'PS'
00220       NRUN = 0
00221       NFAIL = 0
00222       NERRS = 0
00223       DO 100 I = 1, 4
00224          ISEED( I ) = ISEEDY( I )
00225   100 CONTINUE
00226 *
00227 *     Test the error exits
00228 *
00229       IF( TSTERR )
00230      $   CALL ZERRPS( PATH, NOUT )
00231       INFOT = 0
00232 *
00233 *     Do for each value of N in NVAL
00234 *
00235       DO 150 IN = 1, NN
00236          N = NVAL( IN )
00237          LDA = MAX( N, 1 )
00238          NIMAT = NTYPES
00239          IF( N.LE.0 )
00240      $      NIMAT = 1
00241 *
00242          IZERO = 0
00243          DO 140 IMAT = 1, NIMAT
00244 *
00245 *           Do the tests only if DOTYPE( IMAT ) is true.
00246 *
00247             IF( .NOT.DOTYPE( IMAT ) )
00248      $         GO TO 140
00249 *
00250 *              Do for each value of RANK in RANKVAL
00251 *
00252             DO 130 IRANK = 1, NRANK
00253 *
00254 *              Only repeat test 3 to 5 for different ranks
00255 *              Other tests use full rank
00256 *
00257                IF( ( IMAT.LT.3 .OR. IMAT.GT.5 ) .AND. IRANK.GT.1 )
00258      $            GO TO 130
00259 *
00260                RANK = CEILING( ( N * DBLE( RANKVAL( IRANK ) ) )
00261      $              / 100.E+0 )
00262 *
00263 *
00264 *           Do first for UPLO = 'U', then for UPLO = 'L'
00265 *
00266                DO 120 IUPLO = 1, 2
00267                   UPLO = UPLOS( IUPLO )
00268 *
00269 *              Set up parameters with ZLATB5 and generate a test matrix
00270 *              with ZLATMT.
00271 *
00272                   CALL ZLATB5( PATH, IMAT, N, TYPE, KL, KU, ANORM,
00273      $                         MODE, CNDNUM, DIST )
00274 *
00275                   SRNAMT = 'ZLATMT'
00276                   CALL ZLATMT( N, N, DIST, ISEED, TYPE, RWORK, MODE,
00277      $                         CNDNUM, ANORM, RANK, KL, KU, UPLO, A,
00278      $                         LDA, WORK, INFO )
00279 *
00280 *              Check error code from ZLATMT.
00281 *
00282                   IF( INFO.NE.0 ) THEN
00283                     CALL ALAERH( PATH, 'ZLATMT', INFO, 0, UPLO, N,
00284      $                           N, -1, -1, -1, IMAT, NFAIL, NERRS,
00285      $                           NOUT )
00286                      GO TO 120
00287                   END IF
00288 *
00289 *              Do for each value of NB in NBVAL
00290 *
00291                   DO 110 INB = 1, NNB
00292                      NB = NBVAL( INB )
00293                      CALL XLAENV( 1, NB )
00294 *
00295 *                 Compute the pivoted L*L' or U'*U factorization
00296 *                 of the matrix.
00297 *
00298                      CALL ZLACPY( UPLO, N, N, A, LDA, AFAC, LDA )
00299                      SRNAMT = 'ZPSTRF'
00300 *
00301 *                 Use default tolerance
00302 *
00303                      TOL = -ONE
00304                      CALL ZPSTRF( UPLO, N, AFAC, LDA, PIV, COMPRANK,
00305      $                            TOL, RWORK, INFO )
00306 *
00307 *                 Check error code from ZPSTRF.
00308 *
00309                      IF( (INFO.LT.IZERO)
00310      $                    .OR.(INFO.NE.IZERO.AND.RANK.EQ.N)
00311      $                    .OR.(INFO.LE.IZERO.AND.RANK.LT.N) ) THEN
00312                         CALL ALAERH( PATH, 'ZPSTRF', INFO, IZERO,
00313      $                               UPLO, N, N, -1, -1, NB, IMAT,
00314      $                               NFAIL, NERRS, NOUT )
00315                         GO TO 110
00316                      END IF
00317 *
00318 *                 Skip the test if INFO is not 0.
00319 *
00320                      IF( INFO.NE.0 )
00321      $                  GO TO 110
00322 *
00323 *                 Reconstruct matrix from factors and compute residual.
00324 *
00325 *                 PERM holds permuted L*L^T or U^T*U
00326 *
00327                      CALL ZPST01( UPLO, N, A, LDA, AFAC, LDA, PERM, LDA,
00328      $                            PIV, RWORK, RESULT, COMPRANK )
00329 *
00330 *                 Print information about the tests that did not pass
00331 *                 the threshold or where computed rank was not RANK.
00332 *
00333                      IF( N.EQ.0 )
00334      $                  COMPRANK = 0
00335                      RANKDIFF = RANK - COMPRANK
00336                      IF( RESULT.GE.THRESH ) THEN
00337                         IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
00338      $                     CALL ALAHD( NOUT, PATH )
00339                         WRITE( NOUT, FMT = 9999 )UPLO, N, RANK,
00340      $                     RANKDIFF, NB, IMAT, RESULT
00341                         NFAIL = NFAIL + 1
00342                      END IF
00343                      NRUN = NRUN + 1
00344   110             CONTINUE
00345 *
00346   120          CONTINUE
00347   130       CONTINUE
00348   140    CONTINUE
00349   150 CONTINUE
00350 *
00351 *     Print a summary of the results.
00352 *
00353       CALL ALASUM( PATH, NOUT, NFAIL, NRUN, NERRS )
00354 *
00355  9999 FORMAT( ' UPLO = ''', A1, ''', N =', I5, ', RANK =', I3,
00356      $      ', Diff =', I5, ', NB =', I4, ', type ', I2, ', Ratio =',
00357      $      G12.5 )
00358       RETURN
00359 *
00360 *     End of ZCHKPS
00361 *
00362       END
 All Files Functions