LAPACK 3.3.0

ddrvrf1.f

Go to the documentation of this file.
00001       SUBROUTINE DDRVRF1( NOUT, NN, NVAL, THRESH, A, LDA, ARF, WORK )
00002 *
00003 *  -- LAPACK test routine (version 3.2.0) --
00004 *     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
00005 *     November 2008
00006 *
00007 *     .. Scalar Arguments ..
00008       INTEGER            LDA, NN, NOUT
00009       DOUBLE PRECISION   THRESH
00010 *     ..
00011 *     .. Array Arguments ..
00012       INTEGER            NVAL( NN )
00013       DOUBLE PRECISION   A( LDA, * ), ARF( * ), WORK( * )
00014 *     ..
00015 *
00016 *  Purpose
00017 *  =======
00018 *
00019 *  DDRVRF1 tests the LAPACK RFP routines:
00020 *      DLANSF
00021 *
00022 *  Arguments
00023 *  =========
00024 *
00025 *  NOUT          (input) INTEGER
00026 *                The unit number for output.
00027 *
00028 *  NN            (input) INTEGER
00029 *                The number of values of N contained in the vector NVAL.
00030 *
00031 *  NVAL          (input) INTEGER array, dimension (NN)
00032 *                The values of the matrix dimension N.
00033 *
00034 *  THRESH        (input) DOUBLE PRECISION
00035 *                The threshold value for the test ratios.  A result is
00036 *                included in the output file if RESULT >= THRESH.  To have
00037 *                every test ratio printed, use THRESH = 0.
00038 *
00039 *  A             (workspace) DOUBLE PRECISION array, dimension (LDA,NMAX)
00040 *
00041 *  LDA           (input) INTEGER
00042 *                The leading dimension of the array A.  LDA >= max(1,NMAX).
00043 *
00044 *  ARF           (workspace) DOUBLE PRECISION array, dimension ((NMAX*(NMAX+1))/2).
00045 *
00046 *  WORK          (workspace) DOUBLE PRECISION array, dimension ( NMAX )
00047 *
00048 *  =====================================================================
00049 *     ..
00050 *     .. Parameters ..
00051       DOUBLE PRECISION   ONE
00052       PARAMETER          ( ONE = 1.0D+0 )
00053       INTEGER            NTESTS
00054       PARAMETER          ( NTESTS = 1 )
00055 *     ..
00056 *     .. Local Scalars ..
00057       CHARACTER          UPLO, CFORM, NORM
00058       INTEGER            I, IFORM, IIN, IIT, INFO, INORM, IUPLO, J, N,
00059      +                   NERRS, NFAIL, NRUN
00060       DOUBLE PRECISION   EPS, LARGE, NORMA, NORMARF, SMALL
00061 *     ..
00062 *     .. Local Arrays ..
00063       CHARACTER          UPLOS( 2 ), FORMS( 2 ), NORMS( 4 )
00064       INTEGER            ISEED( 4 ), ISEEDY( 4 )
00065       DOUBLE PRECISION   RESULT( NTESTS )
00066 *     ..
00067 *     .. External Functions ..
00068       DOUBLE PRECISION   DLAMCH, DLANSY, DLANSF, DLARND
00069       EXTERNAL           DLAMCH, DLANSY, DLANSF, DLARND
00070 *     ..
00071 *     .. External Subroutines ..
00072       EXTERNAL           DTRTTF
00073 *     ..
00074 *     .. Scalars in Common ..
00075       CHARACTER*32       SRNAMT
00076 *     ..
00077 *     .. Common blocks ..
00078       COMMON             / SRNAMC / SRNAMT
00079 *     ..
00080 *     .. Data statements ..
00081       DATA               ISEEDY / 1988, 1989, 1990, 1991 /
00082       DATA               UPLOS / 'U', 'L' /
00083       DATA               FORMS / 'N', 'T' /
00084       DATA               NORMS / 'M', '1', 'I', 'F' /
00085 *     ..
00086 *     .. Executable Statements ..
00087 *
00088 *     Initialize constants and the random number seed.
00089 *
00090       NRUN = 0
00091       NFAIL = 0
00092       NERRS = 0
00093       INFO = 0
00094       DO 10 I = 1, 4
00095          ISEED( I ) = ISEEDY( I )
00096    10 CONTINUE
00097 *
00098       EPS = DLAMCH( 'Precision' )
00099       SMALL = DLAMCH( 'Safe minimum' )
00100       LARGE = ONE / SMALL
00101       SMALL = SMALL * LDA * LDA 
00102       LARGE = LARGE / LDA / LDA
00103 *
00104       DO 130 IIN = 1, NN
00105 *
00106          N = NVAL( IIN )
00107 *
00108          DO 120 IIT = 1, 3
00109 *
00110 *           IIT = 1 : random matrix
00111 *           IIT = 2 : random matrix scaled near underflow
00112 *           IIT = 3 : random matrix scaled near overflow
00113 *
00114             DO J = 1, N
00115                DO I = 1, N
00116                   A( I, J) = DLARND( 2, ISEED )
00117                END DO
00118             END DO
00119 *
00120             IF ( IIT.EQ.2 ) THEN
00121                DO J = 1, N
00122                   DO I = 1, N
00123                      A( I, J) = A( I, J ) * LARGE
00124                   END DO
00125                END DO
00126             END IF
00127 *
00128             IF ( IIT.EQ.3 ) THEN
00129                DO J = 1, N
00130                   DO I = 1, N
00131                      A( I, J) = A( I, J) * SMALL
00132                   END DO
00133                END DO
00134             END IF
00135 *
00136 *           Do first for UPLO = 'U', then for UPLO = 'L'
00137 *
00138             DO 110 IUPLO = 1, 2
00139 *
00140                UPLO = UPLOS( IUPLO )
00141 *
00142 *              Do first for CFORM = 'N', then for CFORM = 'C'
00143 *
00144                DO 100 IFORM = 1, 2
00145 *
00146                   CFORM = FORMS( IFORM )
00147 *
00148                   SRNAMT = 'DTRTTF'
00149                   CALL DTRTTF( CFORM, UPLO, N, A, LDA, ARF, INFO )
00150 *
00151 *                 Check error code from DTRTTF
00152 *
00153                   IF( INFO.NE.0 ) THEN
00154                      IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 ) THEN
00155                         WRITE( NOUT, * )
00156                         WRITE( NOUT, FMT = 9999 )
00157                      END IF
00158                      WRITE( NOUT, FMT = 9998 ) SRNAMT, UPLO, CFORM, N
00159                      NERRS = NERRS + 1
00160                      GO TO 100
00161                   END IF
00162 *
00163                   DO 90 INORM = 1, 4
00164 *
00165 *                    Check all four norms: 'M', '1', 'I', 'F'
00166 *
00167                      NORM = NORMS( INORM )
00168                      NORMARF = DLANSF( NORM, CFORM, UPLO, N, ARF, WORK )
00169                      NORMA = DLANSY( NORM, UPLO, N, A, LDA, WORK )
00170 *
00171                      RESULT(1) = ( NORMA - NORMARF ) / NORMA / EPS
00172                      NRUN = NRUN + 1
00173 *
00174                      IF( RESULT(1).GE.THRESH ) THEN
00175                         IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 ) THEN
00176                            WRITE( NOUT, * )
00177                            WRITE( NOUT, FMT = 9999 )
00178                         END IF
00179                         WRITE( NOUT, FMT = 9997 ) 'DLANSF', 
00180      +                      N, IIT, UPLO, CFORM, NORM, RESULT(1)
00181                         NFAIL = NFAIL + 1
00182                      END IF
00183    90             CONTINUE
00184   100          CONTINUE
00185   110       CONTINUE
00186   120    CONTINUE
00187   130 CONTINUE
00188 *
00189 *     Print a summary of the results.
00190 *
00191       IF ( NFAIL.EQ.0 ) THEN
00192          WRITE( NOUT, FMT = 9996 ) 'DLANSF', NRUN
00193       ELSE
00194          WRITE( NOUT, FMT = 9995 ) 'DLANSF', NFAIL, NRUN
00195       END IF
00196       IF ( NERRS.NE.0 ) THEN
00197          WRITE( NOUT, FMT = 9994 ) NERRS, 'DLANSF'
00198       END IF
00199 *
00200  9999 FORMAT( 1X, 
00201 ' *** Error(s) or Failure(s) while testing DLANSF     +         ***')
00202  9998 FORMAT( 1X, '     Error in ',A6,' with UPLO=''',A1,''', FORM=''',
00203      +        A1,''', N=',I5)
00204  9997 FORMAT( 1X, '     Failure in ',A6,' N=',I5,' TYPE=',I5,' UPLO=''',
00205      +        A1, ''', FORM =''',A1,''', NORM=''',A1,''', test=',G12.5)
00206  9996 FORMAT( 1X, 'All tests for ',A6,' auxiliary routine passed the ',
00207      +        'threshold (',I5,' tests run)')
00208  9995 FORMAT( 1X, A6, ' auxiliary routine:',I5,' out of ',I5,
00209      +        ' tests failed to pass the threshold')
00210  9994 FORMAT( 26X, I5,' error message recorded (',A6,')')
00211 *
00212       RETURN
00213 *
00214 *     End of DDRVRF1
00215 *
00216       END
 All Files Functions