cblat2.f

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

F
1,739
字号
      IF( ERRMAX.LT.THRESH )THEN         WRITE( NOUT, FMT = 9999 )SNAME, NC      ELSE         WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX      END IF      GO TO 130*  120 CONTINUE      WRITE( NOUT, FMT = 9996 )SNAME      IF( FULL )THEN         WRITE( NOUT, FMT = 9993 )NC, SNAME, UPLO, N, ALPHA, LDA, INCX,     $      BETA, INCY      ELSE IF( BANDED )THEN         WRITE( NOUT, FMT = 9994 )NC, SNAME, UPLO, N, K, ALPHA, LDA,     $      INCX, BETA, INCY      ELSE IF( PACKED )THEN         WRITE( NOUT, FMT = 9995 )NC, SNAME, UPLO, N, ALPHA, INCX,     $      BETA, INCY      END IF*  130 CONTINUE      RETURN* 9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',     $      'S)' ) 9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',     $      'ANGED INCORRECTLY *******' ) 9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',     $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,     $      ' - SUSPECT *******' ) 9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' ) 9995 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', I3, ',(', F4.1, ',',     $      F4.1, '), AP, X,', I2, ',(', F4.1, ',', F4.1, '), Y,', I2,     $      ')                .' ) 9994 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', 2( I3, ',' ), '(',     $      F4.1, ',', F4.1, '), A,', I3, ', X,', I2, ',(', F4.1, ',',     $      F4.1, '), Y,', I2, ')         .' ) 9993 FORMAT( 1X, I6, ': ', A6, '(''', A1, ''',', I3, ',(', F4.1, ',',     $      F4.1, '), A,', I3, ', X,', I2, ',(', F4.1, ',', F4.1, '), ',     $      'Y,', I2, ')             .' ) 9992 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',     $      '******' )**     End of CCHK2.*      END      SUBROUTINE CCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,     $                  FATAL, NIDIM, IDIM, NKB, KB, NINC, INC, NMAX,     $                  INCMAX, A, AA, AS, X, XX, XS, XT, G, Z )**  Tests CTRMV, CTBMV, CTPMV, CTRSV, CTBSV and CTPSV.**  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 ..      COMPLEX            ZERO, HALF, ONE      PARAMETER          ( ZERO = ( 0.0, 0.0 ), HALF = ( 0.5, 0.0 ),     $                   ONE = ( 1.0, 0.0 ) )      REAL               RZERO      PARAMETER          ( RZERO = 0.0 )*     .. Scalar Arguments ..      REAL               EPS, THRESH      INTEGER            INCMAX, NIDIM, NINC, NKB, NMAX, NOUT, NTRA      LOGICAL            FATAL, REWI, TRACE      CHARACTER*6        SNAME*     .. Array Arguments ..      COMPLEX            A( NMAX, NMAX ), AA( NMAX*NMAX ),     $                   AS( NMAX*NMAX ), X( NMAX ), XS( NMAX*INCMAX ),     $                   XT( NMAX ), XX( NMAX*INCMAX ), Z( NMAX )      REAL               G( NMAX )      INTEGER            IDIM( NIDIM ), INC( NINC ), KB( NKB )*     .. Local Scalars ..      COMPLEX            TRANSL      REAL               ERR, ERRMAX      INTEGER            I, ICD, ICT, ICU, IK, IN, INCX, INCXS, IX, K,     $                   KS, LAA, LDA, LDAS, LX, N, NARGS, NC, NK, NS      LOGICAL            BANDED, FULL, NULL, PACKED, RESET, SAME      CHARACTER*1        DIAG, DIAGS, TRANS, TRANSS, UPLO, UPLOS      CHARACTER*2        ICHD, ICHU      CHARACTER*3        ICHT*     .. Local Arrays ..      LOGICAL            ISAME( 13 )*     .. External Functions ..      LOGICAL            LCE, LCERES      EXTERNAL           LCE, LCERES*     .. External Subroutines ..      EXTERNAL           CMAKE, CMVCH, CTBMV, CTBSV, CTPMV, CTPSV,     $                   CTRMV, CTRSV*     .. Intrinsic Functions ..      INTRINSIC          ABS, MAX*     .. Scalars in Common ..      INTEGER            INFOT, NOUTC      LOGICAL            LERR, OK*     .. Common blocks ..      COMMON             /INFOC/INFOT, NOUTC, OK, LERR*     .. Data statements ..      DATA               ICHU/'UL'/, ICHT/'NTC'/, ICHD/'UN'/*     .. Executable Statements ..      FULL = SNAME( 3: 3 ).EQ.'R'      BANDED = SNAME( 3: 3 ).EQ.'B'      PACKED = SNAME( 3: 3 ).EQ.'P'*     Define the number of arguments.      IF( FULL )THEN         NARGS = 8      ELSE IF( BANDED )THEN         NARGS = 9      ELSE IF( PACKED )THEN         NARGS = 7      END IF*      NC = 0      RESET = .TRUE.      ERRMAX = RZERO*     Set up zero vector for CMVCH.      DO 10 I = 1, NMAX         Z( I ) = ZERO   10 CONTINUE*      DO 110 IN = 1, NIDIM         N = IDIM( IN )*         IF( BANDED )THEN            NK = NKB         ELSE            NK = 1         END IF         DO 100 IK = 1, NK            IF( BANDED )THEN               K = KB( IK )            ELSE               K = N - 1            END IF*           Set LDA to 1 more than minimum value if room.            IF( BANDED )THEN               LDA = K + 1            ELSE               LDA = N            END IF            IF( LDA.LT.NMAX )     $         LDA = LDA + 1*           Skip tests if not enough room.            IF( LDA.GT.NMAX )     $         GO TO 100            IF( PACKED )THEN               LAA = ( N*( N + 1 ) )/2            ELSE               LAA = LDA*N            END IF            NULL = N.LE.0*            DO 90 ICU = 1, 2               UPLO = ICHU( ICU: ICU )*               DO 80 ICT = 1, 3                  TRANS = ICHT( ICT: ICT )*                  DO 70 ICD = 1, 2                     DIAG = ICHD( ICD: ICD )**                    Generate the matrix A.*                     TRANSL = ZERO                     CALL CMAKE( SNAME( 2: 3 ), UPLO, DIAG, N, N, A,     $                           NMAX, AA, LDA, K, K, RESET, TRANSL )*                     DO 60 IX = 1, NINC                        INCX = INC( IX )                        LX = ABS( INCX )*N**                       Generate the vector X.*                        TRANSL = HALF                        CALL CMAKE( 'GE', ' ', ' ', 1, N, X, 1, XX,     $                              ABS( INCX ), 0, N - 1, RESET,     $                              TRANSL )                        IF( N.GT.1 )THEN                           X( N/2 ) = ZERO                           XX( 1 + ABS( INCX )*( N/2 - 1 ) ) = ZERO                        END IF*                        NC = NC + 1**                       Save every datum before calling the subroutine.*                        UPLOS = UPLO                        TRANSS = TRANS                        DIAGS = DIAG                        NS = N                        KS = K                        DO 20 I = 1, LAA                           AS( I ) = AA( I )   20                   CONTINUE                        LDAS = LDA                        DO 30 I = 1, LX                           XS( I ) = XX( I )   30                   CONTINUE                        INCXS = INCX**                       Call the subroutine.*                        IF( SNAME( 4: 5 ).EQ.'MV' )THEN                           IF( FULL )THEN                              IF( TRACE )     $                           WRITE( NTRA, FMT = 9993 )NC, SNAME,     $                           UPLO, TRANS, DIAG, N, LDA, INCX                              IF( REWI )     $                           REWIND NTRA                              CALL CTRMV( UPLO, TRANS, DIAG, N, AA, LDA,     $                                    XX, INCX )                           ELSE IF( BANDED )THEN                              IF( TRACE )     $                           WRITE( NTRA, FMT = 9994 )NC, SNAME,     $                           UPLO, TRANS, DIAG, N, K, LDA, INCX                              IF( REWI )     $                           REWIND NTRA                              CALL CTBMV( UPLO, TRANS, DIAG, N, K, AA,     $                                    LDA, XX, INCX )                           ELSE IF( PACKED )THEN                              IF( TRACE )     $                           WRITE( NTRA, FMT = 9995 )NC, SNAME,     $                           UPLO, TRANS, DIAG, N, INCX                              IF( REWI )     $                           REWIND NTRA                              CALL CTPMV( UPLO, TRANS, DIAG, N, AA, XX,     $                                    INCX )                           END IF                        ELSE IF( SNAME( 4: 5 ).EQ.'SV' )THEN                           IF( FULL )THEN                              IF( TRACE )     $                           WRITE( NTRA, FMT = 9993 )NC, SNAME,     $                           UPLO, TRANS, DIAG, N, LDA, INCX                              IF( REWI )     $                           REWIND NTRA                              CALL CTRSV( UPLO, TRANS, DIAG, N, AA, LDA,     $                                    XX, INCX )                           ELSE IF( BANDED )THEN                              IF( TRACE )     $                           WRITE( NTRA, FMT = 9994 )NC, SNAME,     $                           UPLO, TRANS, DIAG, N, K, LDA, INCX                              IF( REWI )     $                           REWIND NTRA                              CALL CTBSV( UPLO, TRANS, DIAG, N, K, AA,     $                                    LDA, XX, INCX )                           ELSE IF( PACKED )THEN                              IF( TRACE )     $                           WRITE( NTRA, FMT = 9995 )NC, SNAME,     $                           UPLO, TRANS, DIAG, N, INCX                              IF( REWI )     $                           REWIND NTRA                              CALL CTPSV( UPLO, TRANS, DIAG, N, AA, XX,     $                                    INCX )                           END IF                        END IF**                       Check if error-exit was taken incorrectly.*                        IF( .NOT.OK )THEN                           WRITE( NOUT, FMT = 9992 )                           FATAL = .TRUE.                           GO TO 120                        END IF**                       See what data changed inside subroutines.*                        ISAME( 1 ) = UPLO.EQ.UPLOS                        ISAME( 2 ) = TRANS.EQ.TRANSS                        ISAME( 3 ) = DIAG.EQ.DIAGS                        ISAME( 4 ) = NS.EQ.N                        IF( FULL )THEN                           ISAME( 5 ) = LCE( AS, AA, LAA )                           ISAME( 6 ) = LDAS.EQ.LDA                           IF( NULL )THEN                              ISAME( 7 ) = LCE( XS, XX, LX )                           ELSE                              ISAME( 7 ) = LCERES( 'GE', ' ', 1, N, XS,     $                                     XX, ABS( INCX ) )                           END IF                           ISAME( 8 ) = INCXS.EQ.INCX                        ELSE IF( BANDED )THEN                           ISAME( 5 ) = KS.EQ.K                           ISAME( 6 ) = LCE( AS, AA, LAA )                           ISAME( 7 ) = LDAS.EQ.LDA                           IF( NULL )THEN                              ISAME( 8 ) = LCE( XS, XX, LX )                           ELSE                              ISAME( 8 ) = LCERES( 'GE', ' ', 1, N, XS,     $                                     XX, ABS( INCX ) )                           END IF                           ISAME( 9 ) = INCXS.EQ.INCX                        ELSE IF( PACKED )THEN                           ISAME( 5 ) = LCE( AS, AA, LAA )                           IF( NULL )THEN                              ISAME( 6 ) = LCE( XS, XX, LX )                           ELSE                              ISAME( 6 ) = LCERES( 'GE', ' ', 1, N, XS,     $                                     XX, ABS( INCX ) )                           END IF                           ISAME( 7 ) = INCXS.EQ.INCX                        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 120                        END IF*                        IF( .NOT.NULL )THEN                           IF( SNAME( 4: 5 ).EQ.'MV' )THEN**                             Check the result.*                              CALL CMVCH( TRANS, N, N, ONE, A, NMAX, X,     $                                    INCX, ZERO, Z, INCX, XT, G,     $                                    XX, EPS, ERR, FATAL, NOUT,     $                                    .TRUE. )                           ELSE IF( SNAME( 4: 5 ).EQ.'SV' )THEN**                             Compute approximation to original vector.*                              DO 50 I = 1, N                                 Z( I ) = XX( 1 + ( I - 1 )*     $                                    ABS( INCX ) )                                 XX( 1 + ( I - 1 )*ABS( INCX ) )     $                              = X( I )   50                         CONTINUE                              CALL CMVCH( TRANS, N, N, ONE, A, NMAX, Z,     $                                    INCX, ZERO, X, INCX, XT, G,     $                                    XX, EPS, ERR, FATAL, NOUT,     $                                    .FALSE. )                           END IF                           ERRMAX = MAX( ERRMAX, ERR )*                          If got really bad answer, report and return.                           IF( FATAL )     $                        GO TO 120                        ELSE*                          Avoid repeating tests with N.le.0.

⌨️ 快捷键说明

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