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

📄 c_zblat3.f

📁 基本的C语言线性代数函数库,在linux下可直接编译;在windows下要显示地申明包含
💻 F
📖 第 1 页 / 共 5 页
字号:
         CA =  'CblasConjTrans'      END IF      IF (DIAG.EQ.'N')THEN         CD =  '  CblasNonUnit'      ELSE         CD =  '     CblasUnit'      END IF      IF (IORDER.EQ.1)THEN         CRC = ' CblasRowMajor'      ELSE          CRC = ' CblasColMajor'      END IF      WRITE(NOUT, FMT = 9995)NC,SNAME,CRC, CS,CU      WRITE(NOUT, FMT = 9994)CA, CD, M, N, ALPHA, LDA, LDB 9995 FORMAT( 1X, I6, ': ', A12,'(', A14, ',', A14, ',', A14, ',') 9994 FORMAT( 10X, 2( A14, ',') , 2( I3, ',' ), ' (', F4.1, ',',     $    F4.1, '), A,', I3, ', B,', I3, ').' )      END*      SUBROUTINE ZCHK4( 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,     $                  IORDER )**  Tests ZHERK and ZSYRK.**  Auxiliary routine for test program for Level 3 Blas.**  -- 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 ..      COMPLEX*16         ZERO      PARAMETER          ( ZERO = ( 0.0D0, 0.0D0 ) )      DOUBLE PRECISION   RONE, RZERO      PARAMETER          ( RONE = 1.0D0, RZERO = 0.0D0 )*     .. Scalar Arguments ..      DOUBLE PRECISION   EPS, THRESH      INTEGER            NALF, NBET, NIDIM, NMAX, NOUT, NTRA, IORDER      LOGICAL            FATAL, REWI, TRACE      CHARACTER*12       SNAME*     .. Array Arguments ..      COMPLEX*16         A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),     $                   AS( NMAX*NMAX ), B( NMAX, NMAX ),     $                   BB( NMAX*NMAX ), BET( NBET ), BS( NMAX*NMAX ),     $                   C( NMAX, NMAX ), CC( NMAX*NMAX ),     $                   CS( NMAX*NMAX ), CT( NMAX )      DOUBLE PRECISION   G( NMAX )      INTEGER            IDIM( NIDIM )*     .. Local Scalars ..      COMPLEX*16         ALPHA, ALS, BETA, BETS      DOUBLE PRECISION   ERR, ERRMAX, RALPHA, RALS, RBETA, RBETS      INTEGER            I, IA, IB, ICT, ICU, IK, IN, J, JC, JJ, K, KS,     $                   LAA, LCC, LDA, LDAS, LDC, LDCS, LJ, MA, N, NA,     $                   NARGS, NC, NS      LOGICAL            CONJ, NULL, RESET, SAME, TRAN, UPPER      CHARACTER*1        TRANS, TRANSS, TRANST, UPLO, UPLOS      CHARACTER*2        ICHT, ICHU*     .. Local Arrays ..      LOGICAL            ISAME( 13 )*     .. External Functions ..      LOGICAL            LZE, LZERES      EXTERNAL           LZE, LZERES*     .. External Subroutines ..      EXTERNAL           CZHERK, ZMAKE, ZMMCH, CZSYRK*     .. Intrinsic Functions ..      INTRINSIC          DCMPLX, MAX, DBLE*     .. Scalars in Common ..      INTEGER            INFOT, NOUTC      LOGICAL            LERR, OK*     .. Common blocks ..      COMMON             /INFOC/INFOT, NOUTC, OK, LERR*     .. Data statements ..      DATA               ICHT/'NC'/, ICHU/'UL'/*     .. Executable Statements ..      CONJ = SNAME( 8: 9 ).EQ.'he'*      NARGS = 10      NC = 0      RESET = .TRUE.      ERRMAX = RZERO*      DO 100 IN = 1, NIDIM         N = IDIM( IN )*        Set LDC to 1 more than minimum value if room.         LDC = N         IF( LDC.LT.NMAX )     $      LDC = LDC + 1*        Skip tests if not enough room.         IF( LDC.GT.NMAX )     $      GO TO 100         LCC = LDC*N*         DO 90 IK = 1, NIDIM            K = IDIM( IK )*            DO 80 ICT = 1, 2               TRANS = ICHT( ICT: ICT )               TRAN = TRANS.EQ.'C'               IF( TRAN.AND..NOT.CONJ )     $            TRANS = 'T'               IF( TRAN )THEN                  MA = K                  NA = N               ELSE                  MA = N                  NA = K               END IF*              Set LDA to 1 more than minimum value if room.               LDA = MA               IF( LDA.LT.NMAX )     $            LDA = LDA + 1*              Skip tests if not enough room.               IF( LDA.GT.NMAX )     $            GO TO 80               LAA = LDA*NA**              Generate the matrix A.*               CALL ZMAKE( 'ge', ' ', ' ', MA, NA, A, NMAX, AA, LDA,     $                     RESET, ZERO )*               DO 70 ICU = 1, 2                  UPLO = ICHU( ICU: ICU )                  UPPER = UPLO.EQ.'U'*                  DO 60 IA = 1, NALF                     ALPHA = ALF( IA )                     IF( CONJ )THEN                        RALPHA = DBLE( ALPHA )                        ALPHA = DCMPLX( RALPHA, RZERO )                     END IF*                     DO 50 IB = 1, NBET                        BETA = BET( IB )                        IF( CONJ )THEN                           RBETA = DBLE( BETA )                           BETA = DCMPLX( RBETA, RZERO )                        END IF                        NULL = N.LE.0                        IF( CONJ )     $                     NULL = NULL.OR.( ( K.LE.0.OR.RALPHA.EQ.     $                            RZERO ).AND.RBETA.EQ.RONE )**                       Generate the matrix C.*                        CALL ZMAKE( SNAME( 8: 9 ), UPLO, ' ', N, N, C,     $                              NMAX, CC, LDC, RESET, ZERO )*                        NC = NC + 1**                       Save every datum before calling the subroutine.*                        UPLOS = UPLO                        TRANSS = TRANS                        NS = N                        KS = K                        IF( CONJ )THEN                           RALS = RALPHA                        ELSE                           ALS = ALPHA                        END IF                        DO 10 I = 1, LAA                           AS( I ) = AA( I )   10                   CONTINUE                        LDAS = LDA                        IF( CONJ )THEN                           RBETS = RBETA                        ELSE                           BETS = BETA                        END IF                        DO 20 I = 1, LCC                           CS( I ) = CC( I )   20                   CONTINUE                        LDCS = LDC**                       Call the subroutine.*                        IF( CONJ )THEN                           IF( TRACE )     $                        CALL ZPRCN6( NTRA, NC, SNAME, IORDER,     $                        UPLO, TRANS, N, K, RALPHA, LDA, RBETA,     $                        LDC)                           IF( REWI )     $                        REWIND NTRA                           CALL CZHERK( IORDER, UPLO, TRANS, N, K,     $                                 RALPHA, AA, LDA, RBETA, CC,     $                                 LDC )                        ELSE                           IF( TRACE )     $                        CALL ZPRCN4( NTRA, NC, SNAME, IORDER,     $                        UPLO, TRANS, N, K, ALPHA, LDA, BETA, LDC)                           IF( REWI )     $                        REWIND NTRA                           CALL CZSYRK( IORDER, UPLO, TRANS, N, K,     $                                 ALPHA, AA, LDA, BETA, CC, LDC )                        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 ) = UPLOS.EQ.UPLO                        ISAME( 2 ) = TRANSS.EQ.TRANS                        ISAME( 3 ) = NS.EQ.N                        ISAME( 4 ) = KS.EQ.K                        IF( CONJ )THEN                           ISAME( 5 ) = RALS.EQ.RALPHA                        ELSE                           ISAME( 5 ) = ALS.EQ.ALPHA                        END IF                        ISAME( 6 ) = LZE( AS, AA, LAA )                        ISAME( 7 ) = LDAS.EQ.LDA                        IF( CONJ )THEN                           ISAME( 8 ) = RBETS.EQ.RBETA                        ELSE                           ISAME( 8 ) = BETS.EQ.BETA                        END IF                        IF( NULL )THEN                           ISAME( 9 ) = LZE( CS, CC, LCC )                        ELSE                           ISAME( 9 ) = LZERES( SNAME( 8: 9 ), UPLO, N,     $                                  N, CS, CC, LDC )                        END IF                        ISAME( 10 ) = LDCS.EQ.LDC**                       If data was incorrectly changed, report and*                       return.*                        SAME = .TRUE.                        DO 30 I = 1, NARGS                           SAME = SAME.AND.ISAME( I )                           IF( .NOT.ISAME( I ) )     $                        WRITE( NOUT, FMT = 9998 )I   30                   CONTINUE                        IF( .NOT.SAME )THEN                           FATAL = .TRUE.                           GO TO 120                        END IF*                        IF( .NOT.NULL )THEN**                          Check the result column by column.*                           IF( CONJ )THEN                              TRANST = 'C'                           ELSE                              TRANST = 'T'                           END IF                           JC = 1                           DO 40 J = 1, N                              IF( UPPER )THEN                                 JJ = 1                                 LJ = J                              ELSE                                 JJ = J                                 LJ = N - J + 1                              END IF                              IF( TRAN )THEN                                 CALL ZMMCH( TRANST, 'N', LJ, 1, K,     $                                       ALPHA, A( 1, JJ ), NMAX,     $                                       A( 1, J ), NMAX, BETA,     $                                       C( JJ, J ), NMAX, CT, G,     $                                       CC( JC ), LDC, EPS, ERR,     $                                       FATAL, NOUT, .TRUE. )                              ELSE                                 CALL ZMMCH( 'N', TRANST, LJ, 1, K,     $                                       ALPHA, A( JJ, 1 ), NMAX,     $                                       A( J, 1 ), NMAX, BETA,     $                                       C( JJ, J ), NMAX, CT, G,     $                                       CC( JC ), LDC, EPS, ERR,     $                                       FATAL, NOUT, .TRUE. )                              END IF                              IF( UPPER )THEN                                 JC = JC + LDC                              ELSE                                 JC = JC + LDC + 1                              END IF                              ERRMAX = MAX( ERRMAX, ERR )*                             If got really bad answer, report and*                             return.                              IF( FATAL )     $                           GO TO 110   40                      CONTINUE                        END IF*   50                CONTINUE*   60             CONTINUE*   70          CONTINUE*   80       CONTINUE*   90    CONTINUE*  100 CONTINUE**     Report result.*      IF( ERRMAX.LT.THRESH )THEN         IF ( IORDER.EQ.0) WRITE( NOUT, FMT = 10000 )SNAME, NC         IF ( IORDER.EQ.1) WRITE( NOUT, FMT = 10001 )SNAME, NC      ELSE         IF ( IORDER.EQ.0) WRITE( NOUT, FMT = 10002 )SNAME, NC, ERRMAX         IF ( IORDER.EQ.1) WRITE( NOUT, FMT = 10003 )SNAME, NC, ERRMAX      END IF      GO TO 130*  110 CONTINUE      IF( N.GT.1 )     $   WRITE( NOUT, FMT = 9995 )J*  120 CONTINUE      WRITE( NOUT, FMT = 9996 )SNAME      IF( CONJ )THEN      CALL ZPRCN6( NOUT, NC, SNAME, IORDER, UPLO, TRANS, N, K, RALPHA,     $   LDA, rBETA, LDC)      ELSE      CALL ZPRCN4( NOUT, NC, SNAME, IORDER, UPLO, TRANS, N, K, ALPHA,     $   LDA, BETA, LDC)      END IF*  130 CONTINUE      RETURN*10003 FORMAT( ' ', A12,' COMPLETED THE ROW-MAJOR    COMPUTATIONAL ',     $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ',     $ 'RATIO ', F8.2, ' - SUSPECT *******' )10002 FORMAT( ' ', A12,' COMPLETED THE COLUMN-MAJOR COMPUTATIONAL ',     $ 'TESTS (', I6, ' CALLS)', /' ******* BUT WITH MAXIMUM TEST ',     $ 'RATIO ', F8.2, ' - SUSPECT *******' )10001 FORMAT( ' ', A12,' PASSED THE ROW-MAJOR    COMPUTATIONAL TESTS',     $ ' (', I6, ' CALL', 'S)' )10000 FORMAT( ' ', A12,' PASSED THE COLUMN-MAJOR COMPUTATIONAL TESTS',     $ ' (', I6, ' CALL', 'S)' ) 9998 FORMAT(' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',     $      'ANGED INCORRECTLY *******' ) 9996 FORMAT( ' ******* ', A12,' FAILED ON CALL NUMBER:' ) 9995 FORMAT( '      THESE ARE THE RESULTS FOR COLUMN ', I3 ) 9994 FORMAT(1X, I6, ': ', A12,'(', 2( '''', A

⌨️ 快捷键说明

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