dblat3.f

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

F
1,796
字号
      PROGRAM DBLAT3**  Test program for the DOUBLE PRECISION Level 3 Blas.**  The program must be driven by a short data file. The first 14 records*  of the file are read using list-directed input, the last 6 records*  are read using the format ( A6, L2 ). An annotated example of a data*  file can be obtained by deleting the first 3 characters from the*  following 20 lines:*  'DBLAT3.SUMM'     NAME OF SUMMARY OUTPUT FILE*  6                 UNIT NUMBER OF SUMMARY FILE*  'DBLAT3.SNAP'     NAME OF SNAPSHOT OUTPUT FILE*  -1                UNIT NUMBER OF SNAPSHOT FILE (NOT USED IF .LT. 0)*  F        LOGICAL FLAG, T TO REWIND SNAPSHOT FILE AFTER EACH RECORD.*  F        LOGICAL FLAG, T TO STOP ON FAILURES.*  T        LOGICAL FLAG, T TO TEST ERROR EXITS.*  16.0     THRESHOLD VALUE OF TEST RATIO*  6                 NUMBER OF VALUES OF N*  0 1 2 3 5 9       VALUES OF N*  3                 NUMBER OF VALUES OF ALPHA*  0.0 1.0 0.7       VALUES OF ALPHA*  3                 NUMBER OF VALUES OF BETA*  0.0 1.0 1.3       VALUES OF BETA*  DGEMM  T PUT F FOR NO TEST. SAME COLUMNS.*  DSYMM  T PUT F FOR NO TEST. SAME COLUMNS.*  DTRMM  T PUT F FOR NO TEST. SAME COLUMNS.*  DTRSM  T PUT F FOR NO TEST. SAME COLUMNS.*  DSYRK  T PUT F FOR NO TEST. SAME COLUMNS.*  DSYR2K T PUT F FOR NO TEST. SAME COLUMNS.**  See:**     Dongarra J. J., Du Croz J. J., Duff I. S. and Hammarling S.*     A Set of Level 3 Basic Linear Algebra Subprograms.**     Technical Memorandum No.88 (Revision 1), Mathematics and*     Computer Science Division, Argonne National Laboratory, 9700*     South Cass Avenue, Argonne, Illinois 60439, US.**  -- Written on 8-February-1989.*     Jack Dongarra, Argonne National Laboratory.*     Iain Duff, AERE Harwell.*     Jeremy Du Croz, Numerical Algorithms Group Ltd.*     Sven Hammarling, Numerical Algorithms Group Ltd.**     .. Parameters ..      INTEGER            NIN      PARAMETER          ( NIN = 5 )      INTEGER            NSUBS      PARAMETER          ( NSUBS = 6 )      DOUBLE PRECISION   ZERO, HALF, ONE      PARAMETER          ( ZERO = 0.0D0, HALF = 0.5D0, ONE = 1.0D0 )      INTEGER            NMAX      PARAMETER          ( NMAX = 65 )      INTEGER            NIDMAX, NALMAX, NBEMAX      PARAMETER          ( NIDMAX = 9, NALMAX = 7, NBEMAX = 7 )*     .. Local Scalars ..      DOUBLE PRECISION   EPS, ERR, THRESH      INTEGER            I, ISNUM, J, N, NALF, NBET, NIDIM, NOUT, NTRA      LOGICAL            FATAL, LTESTT, REWI, SAME, SFATAL, TRACE,     $                   TSTERR      CHARACTER*1        TRANSA, TRANSB      CHARACTER*6        SNAMET      CHARACTER*32       SNAPS, SUMMRY*     .. Local Arrays ..      DOUBLE PRECISION   AA( NMAX*NMAX ), AB( NMAX, 2*NMAX ),     $                   ALF( NALMAX ), AS( NMAX*NMAX ),     $                   BB( NMAX*NMAX ), BET( NBEMAX ),     $                   BS( NMAX*NMAX ), C( NMAX, NMAX ),     $                   CC( NMAX*NMAX ), CS( NMAX*NMAX ), CT( NMAX ),     $                   G( NMAX ), W( 2*NMAX )      INTEGER            IDIM( NIDMAX )      LOGICAL            LTEST( NSUBS )      CHARACTER*6        SNAMES( NSUBS )*     .. External Functions ..      DOUBLE PRECISION   DDIFF      LOGICAL            LDE      EXTERNAL           DDIFF, LDE*     .. External Subroutines ..      EXTERNAL           DCHK1, DCHK2, DCHK3, DCHK4, DCHK5, DCHKE, DMMCH*     .. Intrinsic Functions ..      INTRINSIC          MAX, MIN*     .. Scalars in Common ..      INTEGER            INFOT, NOUTC      LOGICAL            LERR, OK      CHARACTER*6        SRNAMT*     .. Common blocks ..      COMMON             /INFOC/INFOT, NOUTC, OK, LERR      COMMON             /SRNAMC/SRNAMT*     .. Data statements ..      DATA               SNAMES/'DGEMM ', 'DSYMM ', 'DTRMM ', 'DTRSM ',     $                   'DSYRK ', 'DSYR2K'/*     .. Executable Statements ..**     Read name and unit number for summary output file and open file.*      READ( NIN, FMT = * )SUMMRY      READ( NIN, FMT = * )NOUT      IF (NOUT.NE.6) OPEN( NOUT, FILE = SUMMRY, STATUS = 'UNKNOWN' )      NOUTC = NOUT**     Read name and unit number for snapshot output file and open file.*      READ( NIN, FMT = * )SNAPS      READ( NIN, FMT = * )NTRA      TRACE = NTRA.GE.0      IF( TRACE )THEN         OPEN( NTRA, FILE = SNAPS, STATUS = 'UNKNOWN' )      END IF*     Read the flag that directs rewinding of the snapshot file.      READ( NIN, FMT = * )REWI      REWI = REWI.AND.TRACE*     Read the flag that directs stopping on any failure.      READ( NIN, FMT = * )SFATAL*     Read the flag that indicates whether error exits are to be tested.      READ( NIN, FMT = * )TSTERR*     Read the threshold value of the test ratio      READ( NIN, FMT = * )THRESH**     Read and check the parameter values for the tests.**     Values of N      READ( NIN, FMT = * )NIDIM      IF( NIDIM.LT.1.OR.NIDIM.GT.NIDMAX )THEN         WRITE( NOUT, FMT = 9997 )'N', NIDMAX         GO TO 220      END IF      READ( NIN, FMT = * )( IDIM( I ), I = 1, NIDIM )      DO 10 I = 1, NIDIM         IF( IDIM( I ).LT.0.OR.IDIM( I ).GT.NMAX )THEN            WRITE( NOUT, FMT = 9996 )NMAX            GO TO 220         END IF   10 CONTINUE*     Values of ALPHA      READ( NIN, FMT = * )NALF      IF( NALF.LT.1.OR.NALF.GT.NALMAX )THEN         WRITE( NOUT, FMT = 9997 )'ALPHA', NALMAX         GO TO 220      END IF      READ( NIN, FMT = * )( ALF( I ), I = 1, NALF )*     Values of BETA      READ( NIN, FMT = * )NBET      IF( NBET.LT.1.OR.NBET.GT.NBEMAX )THEN         WRITE( NOUT, FMT = 9997 )'BETA', NBEMAX         GO TO 220      END IF      READ( NIN, FMT = * )( BET( I ), I = 1, NBET )**     Report values of parameters.*      WRITE( NOUT, FMT = 9995 )      WRITE( NOUT, FMT = 9994 )( IDIM( I ), I = 1, NIDIM )      WRITE( NOUT, FMT = 9993 )( ALF( I ), I = 1, NALF )      WRITE( NOUT, FMT = 9992 )( BET( I ), I = 1, NBET )      IF( .NOT.TSTERR )THEN         WRITE( NOUT, FMT = * )         WRITE( NOUT, FMT = 9984 )      END IF      WRITE( NOUT, FMT = * )      WRITE( NOUT, FMT = 9999 )THRESH      WRITE( NOUT, FMT = * )**     Read names of subroutines and flags which indicate*     whether they are to be tested.*      DO 20 I = 1, NSUBS         LTEST( I ) = .FALSE.   20 CONTINUE   30 READ( NIN, FMT = 9988, END = 60 )SNAMET, LTESTT      DO 40 I = 1, NSUBS         IF( SNAMET.EQ.SNAMES( I ) )     $      GO TO 50   40 CONTINUE      WRITE( NOUT, FMT = 9990 )SNAMET      STOP   50 LTEST( I ) = LTESTT      GO TO 30*   60 CONTINUE      CLOSE ( NIN )**     Compute EPS (the machine precision).*      EPS = ONE   70 CONTINUE      IF( DDIFF( ONE + EPS, ONE ).EQ.ZERO )     $   GO TO 80      EPS = HALF*EPS      GO TO 70   80 CONTINUE      EPS = EPS + EPS      WRITE( NOUT, FMT = 9998 )EPS**     Check the reliability of DMMCH using exact data.*      N = MIN( 32, NMAX )      DO 100 J = 1, N         DO 90 I = 1, N            AB( I, J ) = MAX( I - J + 1, 0 )   90    CONTINUE         AB( J, NMAX + 1 ) = J         AB( 1, NMAX + J ) = J         C( J, 1 ) = ZERO  100 CONTINUE      DO 110 J = 1, N         CC( J ) = J*( ( J + 1 )*J )/2 - ( ( J + 1 )*J*( J - 1 ) )/3  110 CONTINUE*     CC holds the exact result. On exit from DMMCH CT holds*     the result computed by DMMCH.      TRANSA = 'N'      TRANSB = 'N'      CALL DMMCH( TRANSA, TRANSB, N, 1, N, ONE, AB, NMAX,     $            AB( 1, NMAX + 1 ), NMAX, ZERO, C, NMAX, CT, G, CC,     $            NMAX, EPS, ERR, FATAL, NOUT, .TRUE. )      SAME = LDE( CC, CT, N )      IF( .NOT.SAME.OR.ERR.NE.ZERO )THEN         WRITE( NOUT, FMT = 9989 )TRANSA, TRANSB, SAME, ERR         STOP      END IF      TRANSB = 'T'      CALL DMMCH( TRANSA, TRANSB, N, 1, N, ONE, AB, NMAX,     $            AB( 1, NMAX + 1 ), NMAX, ZERO, C, NMAX, CT, G, CC,     $            NMAX, EPS, ERR, FATAL, NOUT, .TRUE. )      SAME = LDE( CC, CT, N )      IF( .NOT.SAME.OR.ERR.NE.ZERO )THEN         WRITE( NOUT, FMT = 9989 )TRANSA, TRANSB, SAME, ERR         STOP      END IF      DO 120 J = 1, N         AB( J, NMAX + 1 ) = N - J + 1         AB( 1, NMAX + J ) = N - J + 1  120 CONTINUE      DO 130 J = 1, N         CC( N - J + 1 ) = J*( ( J + 1 )*J )/2 -     $                     ( ( J + 1 )*J*( J - 1 ) )/3  130 CONTINUE      TRANSA = 'T'      TRANSB = 'N'      CALL DMMCH( TRANSA, TRANSB, N, 1, N, ONE, AB, NMAX,     $            AB( 1, NMAX + 1 ), NMAX, ZERO, C, NMAX, CT, G, CC,     $            NMAX, EPS, ERR, FATAL, NOUT, .TRUE. )      SAME = LDE( CC, CT, N )      IF( .NOT.SAME.OR.ERR.NE.ZERO )THEN         WRITE( NOUT, FMT = 9989 )TRANSA, TRANSB, SAME, ERR         STOP      END IF      TRANSB = 'T'      CALL DMMCH( TRANSA, TRANSB, N, 1, N, ONE, AB, NMAX,     $            AB( 1, NMAX + 1 ), NMAX, ZERO, C, NMAX, CT, G, CC,     $            NMAX, EPS, ERR, FATAL, NOUT, .TRUE. )      SAME = LDE( CC, CT, N )      IF( .NOT.SAME.OR.ERR.NE.ZERO )THEN         WRITE( NOUT, FMT = 9989 )TRANSA, TRANSB, SAME, ERR         STOP      END IF**     Test each subroutine in turn.*      DO 200 ISNUM = 1, NSUBS         WRITE( NOUT, FMT = * )         IF( .NOT.LTEST( ISNUM ) )THEN*           Subprogram is not to be tested.            WRITE( NOUT, FMT = 9987 )SNAMES( ISNUM )         ELSE            SRNAMT = SNAMES( ISNUM )*           Test error exits.            IF( TSTERR )THEN               CALL DCHKE( ISNUM, SNAMES( ISNUM ), NOUT )               WRITE( NOUT, FMT = * )            END IF*           Test computations.            INFOT = 0            OK = .TRUE.            FATAL = .FALSE.            GO TO ( 140, 150, 160, 160, 170, 180 )ISNUM*           Test DGEMM, 01.  140       CALL DCHK1( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,     $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET,     $                  NMAX, AB, AA, AS, AB( 1, NMAX + 1 ), BB, BS, C,     $                  CC, CS, CT, G )            GO TO 190*           Test DSYMM, 02.  150       CALL DCHK2( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,     $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET,     $                  NMAX, AB, AA, AS, AB( 1, NMAX + 1 ), BB, BS, C,     $                  CC, CS, CT, G )            GO TO 190*           Test DTRMM, 03, DTRSM, 04.  160       CALL DCHK3( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,     $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NMAX, AB,     $                  AA, AS, AB( 1, NMAX + 1 ), BB, BS, CT, G, C )            GO TO 190*           Test DSYRK, 05.  170       CALL DCHK4( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,     $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET,     $                  NMAX, AB, AA, AS, AB( 1, NMAX + 1 ), BB, BS, C,     $                  CC, CS, CT, G )            GO TO 190*           Test DSYR2K, 06.  180       CALL DCHK5( SNAMES( ISNUM ), EPS, THRESH, NOUT, NTRA, TRACE,     $                  REWI, FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET,     $                  NMAX, AB, AA, AS, BB, BS, C, CC, CS, CT, G, W )            GO TO 190*  190       IF( FATAL.AND.SFATAL )     $         GO TO 210         END IF  200 CONTINUE      WRITE( NOUT, FMT = 9986 )      GO TO 230*  210 CONTINUE      WRITE( NOUT, FMT = 9985 )      GO TO 230*  220 CONTINUE      WRITE( NOUT, FMT = 9991 )*  230 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( ' TESTS OF THE DOUBLE PRECISION LEVEL 3 BLAS', //' THE F',     $      'OLLOWING PARAMETER VALUES WILL BE USED:' ) 9994 FORMAT( '   FOR N              ', 9I6 ) 9993 FORMAT( '   FOR ALPHA          ', 7F6.1 ) 9992 FORMAT( '   FOR BETA           ', 7F6.1 ) 9991 FORMAT( ' AMEND DATA FILE OR INCREASE ARRAY SIZES IN PROGRAM',     $      /' ******* TESTS ABANDONED *******' ) 9990 FORMAT( ' SUBPROGRAM NAME ', A6, ' NOT RECOGNIZED', /' ******* T',     $      'ESTS ABANDONED *******' ) 9989 FORMAT( ' ERROR IN DMMCH -  IN-LINE DOT PRODUCTS ARE BEING EVALU',     $      'ATED WRONGLY.', /' DMMCH WAS CALLED WITH TRANSA = ', A1,     $      ' AND TRANSB = ', A1, /' AND RETURNED SAME = ', L1, ' AND ',     $      'ERR = ', F12.3, '.', /' THIS MAY BE DUE TO FAULTS IN THE ',     $      'ARITHMETIC OR THE COMPILER.', /' ******* TESTS ABANDONED ',     $      '*******' ) 9988 FORMAT( A6, L2 ) 9987 FORMAT( 1X, A6, ' WAS NOT TESTED' ) 9986 FORMAT( /' END OF TESTS' ) 9985 FORMAT( /' ******* FATAL ERROR - TESTS ABANDONED *******' ) 9984 FORMAT( ' ERROR-EXITS WILL NOT BE TESTED' )**     End of DBLAT3.*      END      SUBROUTINE DCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,     $                  FATAL, NIDIM, IDIM, NALF, ALF, NBET, BET, NMAX,     $                  A, AA, AS, B, BB, BS, C, CC, CS, CT, G )**  Tests DGEMM.

⌨️ 快捷键说明

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