dblat2.f

来自「基于Blas CLapck的.用过的人知道是干啥的」· F 代码 · 共 1,741 行 · 第 1/5 页

F
1,741
字号
*  240 CONTINUE      IF( TRACE )     $   CLOSE ( NTRA )      IF (NOUT.NE.6) CLOSE ( NOUT )      STOP* 9999 FORMAT( ' ROUTINES PASS COMPUTATIONAL TESTS IF TEST RATIO IS LES',     $      'S THAN', F8.2 ) 9998 FORMAT( ' RELATIVE MACHINE PRECISION IS TAKEN TO BE', 1P, D9.1 ) 9997 FORMAT( ' NUMBER OF VALUES OF ', A, ' IS LESS THAN 1 OR GREATER ',     $      'THAN ', I2 ) 9996 FORMAT( ' VALUE OF N IS LESS THAN 0 OR GREATER THAN ', I2 ) 9995 FORMAT( ' VALUE OF K IS LESS THAN 0' ) 9994 FORMAT( ' ABSOLUTE VALUE OF INCX OR INCY IS 0 OR GREATER THAN ',     $      I2 ) 9993 FORMAT( ' TESTS OF THE DOUBLE PRECISION LEVEL 2 BLAS', //' THE F',     $      'OLLOWING PARAMETER VALUES WILL BE USED:' ) 9992 FORMAT( '   FOR N              ', 9I6 ) 9991 FORMAT( '   FOR K              ', 7I6 ) 9990 FORMAT( '   FOR INCX AND INCY  ', 7I6 ) 9989 FORMAT( '   FOR ALPHA          ', 7F6.1 ) 9988 FORMAT( '   FOR BETA           ', 7F6.1 ) 9987 FORMAT( ' AMEND DATA FILE OR INCREASE ARRAY SIZES IN PROGRAM',     $      /' ******* TESTS ABANDONED *******' ) 9986 FORMAT( ' SUBPROGRAM NAME ', A6, ' NOT RECOGNIZED', /' ******* T',     $      'ESTS ABANDONED *******' ) 9985 FORMAT( ' ERROR IN DMVCH -  IN-LINE DOT PRODUCTS ARE BEING EVALU',     $      'ATED WRONGLY.', /' DMVCH WAS CALLED WITH TRANS = ', A1,     $      ' AND RETURNED SAME = ', L1, ' AND ERR = ', F12.3, '.', /     $   ' THIS MAY BE DUE TO FAULTS IN THE ARITHMETIC OR THE COMPILER.'     $      , /' ******* TESTS ABANDONED *******' ) 9984 FORMAT( A6, L2 ) 9983 FORMAT( 1X, A6, ' WAS NOT TESTED' ) 9982 FORMAT( /' END OF TESTS' ) 9981 FORMAT( /' ******* FATAL ERROR - TESTS ABANDONED *******' ) 9980 FORMAT( ' ERROR-EXITS WILL NOT BE TESTED' )**     End of DBLAT2.*      END      SUBROUTINE DCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,     $                  FATAL, NIDIM, IDIM, NKB, KB, NALF, ALF, NBET,     $                  BET, NINC, INC, NMAX, INCMAX, A, AA, AS, X, XX,     $                  XS, Y, YY, YS, YT, G )**  Tests DGEMV and DGBMV.**  Auxiliary routine for test program for Level 2 Blas.**  -- Written on 10-August-1987.*     Richard Hanson, Sandia National Labs.*     Jeremy Du Croz, NAG Central Office.**     .. Parameters ..      DOUBLE PRECISION   ZERO, HALF      PARAMETER          ( ZERO = 0.0D0, HALF = 0.5D0 )*     .. Scalar Arguments ..      DOUBLE PRECISION   EPS, THRESH      INTEGER            INCMAX, NALF, NBET, NIDIM, NINC, NKB, NMAX,     $                   NOUT, NTRA      LOGICAL            FATAL, REWI, TRACE      CHARACTER*6        SNAME*     .. Array Arguments ..      DOUBLE PRECISION   A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),     $                   AS( NMAX*NMAX ), BET( NBET ), G( NMAX ),     $                   X( NMAX ), XS( NMAX*INCMAX ),     $                   XX( NMAX*INCMAX ), Y( NMAX ),     $                   YS( NMAX*INCMAX ), YT( NMAX ),     $                   YY( NMAX*INCMAX )      INTEGER            IDIM( NIDIM ), INC( NINC ), KB( NKB )*     .. Local Scalars ..      DOUBLE PRECISION   ALPHA, ALS, BETA, BLS, ERR, ERRMAX, TRANSL      INTEGER            I, IA, IB, IC, IKU, IM, IN, INCX, INCXS, INCY,     $                   INCYS, IX, IY, KL, KLS, KU, KUS, LAA, LDA,     $                   LDAS, LX, LY, M, ML, MS, N, NARGS, NC, ND, NK,     $                   NL, NS      LOGICAL            BANDED, FULL, NULL, RESET, SAME, TRAN      CHARACTER*1        TRANS, TRANSS      CHARACTER*3        ICH*     .. Local Arrays ..      LOGICAL            ISAME( 13 )*     .. External Functions ..      LOGICAL            LDE, LDERES      EXTERNAL           LDE, LDERES*     .. External Subroutines ..      EXTERNAL           DGBMV, DGEMV, DMAKE, DMVCH*     .. Intrinsic Functions ..      INTRINSIC          ABS, MAX, MIN*     .. Scalars in Common ..      INTEGER            INFOT, NOUTC      LOGICAL            LERR, OK*     .. Common blocks ..      COMMON             /INFOC/INFOT, NOUTC, OK, LERR*     .. Data statements ..      DATA               ICH/'NTC'/*     .. Executable Statements ..      FULL = SNAME( 3: 3 ).EQ.'E'      BANDED = SNAME( 3: 3 ).EQ.'B'*     Define the number of arguments.      IF( FULL )THEN         NARGS = 11      ELSE IF( BANDED )THEN         NARGS = 13      END IF*      NC = 0      RESET = .TRUE.      ERRMAX = ZERO*      DO 120 IN = 1, NIDIM         N = IDIM( IN )         ND = N/2 + 1*         DO 110 IM = 1, 2            IF( IM.EQ.1 )     $         M = MAX( N - ND, 0 )            IF( IM.EQ.2 )     $         M = MIN( N + ND, NMAX )*            IF( BANDED )THEN               NK = NKB            ELSE               NK = 1            END IF            DO 100 IKU = 1, NK               IF( BANDED )THEN                  KU = KB( IKU )                  KL = MAX( KU - 1, 0 )               ELSE                  KU = N - 1                  KL = M - 1               END IF*              Set LDA to 1 more than minimum value if room.               IF( BANDED )THEN                  LDA = KL + KU + 1               ELSE                  LDA = M               END IF               IF( LDA.LT.NMAX )     $            LDA = LDA + 1*              Skip tests if not enough room.               IF( LDA.GT.NMAX )     $            GO TO 100               LAA = LDA*N               NULL = N.LE.0.OR.M.LE.0**              Generate the matrix A.*               TRANSL = ZERO               CALL DMAKE( SNAME( 2: 3 ), ' ', ' ', M, N, A, NMAX, AA,     $                     LDA, KL, KU, RESET, TRANSL )*               DO 90 IC = 1, 3                  TRANS = ICH( IC: IC )                  TRAN = TRANS.EQ.'T'.OR.TRANS.EQ.'C'*                  IF( TRAN )THEN                     ML = N                     NL = M                  ELSE                     ML = M                     NL = N                  END IF*                  DO 80 IX = 1, NINC                     INCX = INC( IX )                     LX = ABS( INCX )*NL**                    Generate the vector X.*                     TRANSL = HALF                     CALL DMAKE( 'GE', ' ', ' ', 1, NL, X, 1, XX,     $                           ABS( INCX ), 0, NL - 1, RESET, TRANSL )                     IF( NL.GT.1 )THEN                        X( NL/2 ) = ZERO                        XX( 1 + ABS( INCX )*( NL/2 - 1 ) ) = ZERO                     END IF*                     DO 70 IY = 1, NINC                        INCY = INC( IY )                        LY = ABS( INCY )*ML*                        DO 60 IA = 1, NALF                           ALPHA = ALF( IA )*                           DO 50 IB = 1, NBET                              BETA = BET( IB )**                             Generate the vector Y.*                              TRANSL = ZERO                              CALL DMAKE( 'GE', ' ', ' ', 1, ML, Y, 1,     $                                    YY, ABS( INCY ), 0, ML - 1,     $                                    RESET, TRANSL )*                              NC = NC + 1**                             Save every datum before calling the*                             subroutine.*                              TRANSS = TRANS                              MS = M                              NS = N                              KLS = KL                              KUS = KU                              ALS = ALPHA                              DO 10 I = 1, LAA                                 AS( I ) = AA( I )   10                         CONTINUE                              LDAS = LDA                              DO 20 I = 1, LX                                 XS( I ) = XX( I )   20                         CONTINUE                              INCXS = INCX                              BLS = BETA                              DO 30 I = 1, LY                                 YS( I ) = YY( I )   30                         CONTINUE                              INCYS = INCY**                             Call the subroutine.*                              IF( FULL )THEN                                 IF( TRACE )     $                              WRITE( NTRA, FMT = 9994 )NC, SNAME,     $                              TRANS, M, N, ALPHA, LDA, INCX, BETA,     $                              INCY                                 IF( REWI )     $                              REWIND NTRA                                 CALL DGEMV( TRANS, M, N, ALPHA, AA,     $                                       LDA, XX, INCX, BETA, YY,     $                                       INCY )                              ELSE IF( BANDED )THEN                                 IF( TRACE )     $                              WRITE( NTRA, FMT = 9995 )NC, SNAME,     $                              TRANS, M, N, KL, KU, ALPHA, LDA,     $                              INCX, BETA, INCY                                 IF( REWI )     $                              REWIND NTRA                                 CALL DGBMV( TRANS, M, N, KL, KU, ALPHA,     $                                       AA, LDA, XX, INCX, BETA,     $                                       YY, INCY )                              END IF**                             Check if error-exit was taken incorrectly.*                              IF( .NOT.OK )THEN                                 WRITE( NOUT, FMT = 9993 )                                 FATAL = .TRUE.                                 GO TO 130                              END IF**                             See what data changed inside subroutines.*                              ISAME( 1 ) = TRANS.EQ.TRANSS                              ISAME( 2 ) = MS.EQ.M                              ISAME( 3 ) = NS.EQ.N                              IF( FULL )THEN                                 ISAME( 4 ) = ALS.EQ.ALPHA                                 ISAME( 5 ) = LDE( AS, AA, LAA )                                 ISAME( 6 ) = LDAS.EQ.LDA                                 ISAME( 7 ) = LDE( XS, XX, LX )                                 ISAME( 8 ) = INCXS.EQ.INCX                                 ISAME( 9 ) = BLS.EQ.BETA                                 IF( NULL )THEN                                    ISAME( 10 ) = LDE( YS, YY, LY )                                 ELSE                                    ISAME( 10 ) = LDERES( 'GE', ' ', 1,     $                                            ML, YS, YY,     $                                            ABS( INCY ) )                                 END IF                                 ISAME( 11 ) = INCYS.EQ.INCY                              ELSE IF( BANDED )THEN                                 ISAME( 4 ) = KLS.EQ.KL                                 ISAME( 5 ) = KUS.EQ.KU                                 ISAME( 6 ) = ALS.EQ.ALPHA                                 ISAME( 7 ) = LDE( AS, AA, LAA )                                 ISAME( 8 ) = LDAS.EQ.LDA                                 ISAME( 9 ) = LDE( XS, XX, LX )                                 ISAME( 10 ) = INCXS.EQ.INCX                                 ISAME( 11 ) = BLS.EQ.BETA                                 IF( NULL )THEN                                    ISAME( 12 ) = LDE( YS, YY, LY )                                 ELSE                                    ISAME( 12 ) = LDERES( 'GE', ' ', 1,     $                                            ML, YS, YY,     $                                            ABS( INCY ) )                                 END IF                                 ISAME( 13 ) = INCYS.EQ.INCY                              END IF**                             If data was incorrectly changed, report*                             and return.*                              SAME = .TRUE.                              DO 40 I = 1, NARGS                                 SAME = SAME.AND.ISAME( I )                                 IF( .NOT.ISAME( I ) )     $                              WRITE( NOUT, FMT = 9998 )I   40                         CONTINUE                              IF( .NOT.SAME )THEN                                 FATAL = .TRUE.                                 GO TO 130                              END IF*                              IF( .NOT.NULL )THEN**                                Check the result.*                                 CALL DMVCH( TRANS, M, N, ALPHA, A,     $                                       NMAX, X, INCX, BETA, Y,     $                                       INCY, YT, G, YY, EPS, ERR,     $                                       FATAL, NOUT, .TRUE. )                                 ERRMAX = MAX( ERRMAX, ERR )*                                If got really bad answer, report and*                                return.                                 IF( FATAL )     $                              GO TO 130                              ELSE*                                Avoid repeating tests with M.le.0 or*                                N.le.0.                                 GO TO 110                              END IF*   50                      CONTINUE*   60                   CONTINUE*   70                CONTINUE*   80             CONTINUE*   90          CONTINUE*  100       CONTINUE*  110    CONTINUE*  120 CONTINUE**     Report result.*      IF( ERRMAX.LT.THRESH )THEN         WRITE( NOUT, FMT = 9999 )SNAME, NC      ELSE         WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX      END IF      GO TO 140

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?