⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c_cblat2.f

📁 基本的C语言线性代数函数库,在linux下可直接编译;在windows下要显示地申明包含
💻 F
📖 第 1 页 / 共 5 页
字号:
                              IF( REWI )     $                           REWIND NTRA                              CALL CCTRSV( IORDER, UPLO, TRANS, DIAG,     $                                    N, AA, LDA, XX, INCX )                           ELSE IF( BANDED )THEN                              IF( TRACE )     $                           WRITE( NTRA, FMT = 9994 )NC, SNAME,     $                           CUPLO, CTRANS, CDIAG, N, K, LDA, INCX                              IF( REWI )     $                           REWIND NTRA                              CALL CCTBSV( IORDER, UPLO, TRANS, DIAG,     $                                    N, K, AA, LDA, XX, INCX )                           ELSE IF( PACKED )THEN                              IF( TRACE )     $                           WRITE( NTRA, FMT = 9995 )NC, SNAME,     $                           CUPLO, CTRANS, CDIAG, N, INCX                              IF( REWI )     $                           REWIND NTRA                              CALL CCTPSV( IORDER, 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( 10: 11 ).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( 10: 11 ).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.                           GO TO 110                        END IF*   60                CONTINUE*   70             CONTINUE*   80          CONTINUE*   90       CONTINUE*  100    CONTINUE*  110 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 130*  120 CONTINUE      WRITE( NOUT, FMT = 9996 )SNAME      IF( FULL )THEN         WRITE( NOUT, FMT = 9993 )NC, SNAME, CUPLO, CTRANS, CDIAG, N,     $          LDA, INCX      ELSE IF( BANDED )THEN         WRITE( NOUT, FMT = 9994 )NC, SNAME, CUPLO, CTRANS, CDIAG, N, K,     $      LDA, INCX      ELSE IF( PACKED )THEN         WRITE( NOUT, FMT = 9995 )NC, SNAME, CUPLO, CTRANS, CDIAG, N,     $          INCX      END IF*  130 CONTINUE      RETURN* 9999 FORMAT(' ',A12, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',     $      'S)' ) 9998 FORMAT(' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',     $      'ANGED INCORRECTLY *******' ) 9997 FORMAT(' ',A12, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',     $      'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,     $      ' - SUSPECT *******' ) 9996 FORMAT( ' ******* ',A12, ' FAILED ON CALL NUMBER:' ) 9995 FORMAT(1X, I6, ': ',A12, '(', 3( A14, ',' ),/ 10x, I3, ', AP, ',     $      'X,', I2, ') .' ) 9994 FORMAT(1X, I6, ': ',A12, '(', 3( A14, ',' ),/ 10x,  2( I3, ',' ),     $     ' A,', I3, ', X,', I2, ') .' ) 9993 FORMAT( 1X, I6, ': ',A12, '(', 3( A14, ',' ),/ 10x, I3, ', A,',     $      I3, ', X,', I2, ') .' ) 9992 FORMAT(' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',     $      '******' )**     End of CCHK3.*      END      SUBROUTINE CCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,     $                  FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC, NMAX,     $                  INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS, YT, G,     $                  Z, IORDER )**  Tests CGERC and CGERU.**  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, NALF, NIDIM, NINC, NMAX, NOUT, NTRA,     $                   IORDER      LOGICAL            FATAL, REWI, TRACE      CHARACTER*12       SNAME*     .. Array Arguments ..      COMPLEX            A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),     $                   AS( NMAX*NMAX ), X( NMAX ), XS( NMAX*INCMAX ),     $                   XX( NMAX*INCMAX ), Y( NMAX ),     $                   YS( NMAX*INCMAX ), YT( NMAX ),     $                   YY( NMAX*INCMAX ), Z( NMAX )      REAL               G( NMAX )      INTEGER            IDIM( NIDIM ), INC( NINC )*     .. Local Scalars ..      COMPLEX            ALPHA, ALS, TRANSL      REAL               ERR, ERRMAX      INTEGER            I, IA, IM, IN, INCX, INCXS, INCY, INCYS, IX,     $                  IY, J, LAA, LDA, LDAS, LX, LY, M, MS, N, NARGS,     $                   NC, ND, NS      LOGICAL            CONJ, NULL, RESET, SAME*     .. Local Arrays ..      COMPLEX            W( 1 )      LOGICAL            ISAME( 13 )*     .. External Functions ..      LOGICAL            LCE, LCERES      EXTERNAL           LCE, LCERES*     .. External Subroutines ..      EXTERNAL           CCGERC, CCGERU, CMAKE, CMVCH*     .. Intrinsic Functions ..      INTRINSIC          ABS, CONJG, MAX, MIN*     .. Scalars in Common ..      INTEGER            INFOT, NOUTC      LOGICAL             OK*     .. Common blocks ..      COMMON             /INFOC/INFOT, NOUTC, OK*     .. Executable Statements ..      CONJ = SNAME( 11: 11 ).EQ.'c'*     Define the number of arguments.      NARGS = 9*      NC = 0      RESET = .TRUE.      ERRMAX = RZERO*      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 )**           Set LDA to 1 more than minimum value if room.            LDA = M            IF( LDA.LT.NMAX )     $         LDA = LDA + 1*           Skip tests if not enough room.            IF( LDA.GT.NMAX )     $         GO TO 110            LAA = LDA*N            NULL = N.LE.0.OR.M.LE.0*            DO 100 IX = 1, NINC               INCX = INC( IX )               LX = ABS( INCX )*M**              Generate the vector X.*               TRANSL = HALF               CALL CMAKE( 'ge', ' ', ' ', 1, M, X, 1, XX, ABS( INCX ),     $                     0, M - 1, RESET, TRANSL )               IF( M.GT.1 )THEN                  X( M/2 ) = ZERO                  XX( 1 + ABS( INCX )*( M/2 - 1 ) ) = ZERO               END IF*               DO 90 IY = 1, NINC                  INCY = INC( IY )                  LY = ABS( INCY )*N**                 Generate the vector Y.*                  TRANSL = ZERO                  CALL CMAKE( 'ge', ' ', ' ', 1, N, Y, 1, YY,     $                        ABS( INCY ), 0, N - 1, RESET, TRANSL )                  IF( N.GT.1 )THEN                     Y( N/2 ) = ZERO                     YY( 1 + ABS( INCY )*( N/2 - 1 ) ) = ZERO                  END IF*                  DO 80 IA = 1, NALF                     ALPHA = ALF( IA )**                    Generate the matrix A.*                     TRANSL = ZERO                     CALL CMAKE(SNAME( 8: 9 ), ' ', ' ', M, N, A, NMAX,     $                           AA, LDA, M - 1, N - 1, RESET, TRANSL )*                     NC = NC + 1**                    Save every datum before calling the subroutine.*                     MS = M                     NS = N                     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                     DO 30 I = 1, LY                        YS( I ) = YY( I )   30                CONTINUE                     INCYS = INCY**                    Call the subroutine.*                     IF( TRACE )     $                  WRITE( NTRA, FMT = 9994 )NC, SNAME, M, N,     $                  ALPHA, INCX, INCY, LDA                     IF( CONJ )THEN                        IF( REWI )     $                     REWIND NTRA                        CALL CCGERC( IORDER, M, N, ALPHA, XX, INCX,     $                              YY, INCY, AA, LDA )                     ELSE                        IF( REWI )     $                     REWIND NTRA                        CALL CCGERU( IORDER, M, N, ALPHA, XX, INCX,     $                              YY, INCY, AA, LDA )                     END IF**                    Check if error-exit was taken incorrectly.*                     IF( .NOT.OK )THEN                        WRITE( NOUT, FMT = 9993 )                        FATAL = .TRUE.                        GO TO 140                     END IF**                    See what data changed inside subroutine.*                     ISAME( 1 ) = MS.EQ.M                     ISAME( 2 ) = NS.EQ.N                     ISAM

⌨️ 快捷键说明

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