zblat3.f

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

F
1,780
字号
      NC = 0      RESET = .TRUE.      ERRMAX = RZERO*      DO 100 IM = 1, NIDIM         M = IDIM( IM )*         DO 90 IN = 1, NIDIM            N = IDIM( IN )*           Set LDC to 1 more than minimum value if room.            LDC = M            IF( LDC.LT.NMAX )     $         LDC = LDC + 1*           Skip tests if not enough room.            IF( LDC.GT.NMAX )     $         GO TO 90            LCC = LDC*N            NULL = N.LE.0.OR.M.LE.0*           Set LDB to 1 more than minimum value if room.            LDB = M            IF( LDB.LT.NMAX )     $         LDB = LDB + 1*           Skip tests if not enough room.            IF( LDB.GT.NMAX )     $         GO TO 90            LBB = LDB*N**           Generate the matrix B.*            CALL ZMAKE( 'GE', ' ', ' ', M, N, B, NMAX, BB, LDB, RESET,     $                  ZERO )*            DO 80 ICS = 1, 2               SIDE = ICHS( ICS: ICS )               LEFT = SIDE.EQ.'L'*               IF( LEFT )THEN                  NA = M               ELSE                  NA = N               END IF*              Set LDA to 1 more than minimum value if room.               LDA = NA               IF( LDA.LT.NMAX )     $            LDA = LDA + 1*              Skip tests if not enough room.               IF( LDA.GT.NMAX )     $            GO TO 80               LAA = LDA*NA*               DO 70 ICU = 1, 2                  UPLO = ICHU( ICU: ICU )**                 Generate the hermitian or symmetric matrix A.*                  CALL ZMAKE( SNAME( 2: 3 ), UPLO, ' ', NA, NA, A, NMAX,     $                        AA, LDA, RESET, ZERO )*                  DO 60 IA = 1, NALF                     ALPHA = ALF( IA )*                     DO 50 IB = 1, NBET                        BETA = BET( IB )**                       Generate the matrix C.*                        CALL ZMAKE( 'GE', ' ', ' ', M, N, C, NMAX, CC,     $                              LDC, RESET, ZERO )*                        NC = NC + 1**                       Save every datum before calling the*                       subroutine.*                        SIDES = SIDE                        UPLOS = UPLO                        MS = M                        NS = N                        ALS = ALPHA                        DO 10 I = 1, LAA                           AS( I ) = AA( I )   10                   CONTINUE                        LDAS = LDA                        DO 20 I = 1, LBB                           BS( I ) = BB( I )   20                   CONTINUE                        LDBS = LDB                        BLS = BETA                        DO 30 I = 1, LCC                           CS( I ) = CC( I )   30                   CONTINUE                        LDCS = LDC**                       Call the subroutine.*                        IF( TRACE )     $                     WRITE( NTRA, FMT = 9995 )NC, SNAME, SIDE,     $                     UPLO, M, N, ALPHA, LDA, LDB, BETA, LDC                        IF( REWI )     $                     REWIND NTRA                        IF( CONJ )THEN                           CALL ZHEMM( SIDE, UPLO, M, N, ALPHA, AA, LDA,     $                                 BB, LDB, BETA, CC, LDC )                        ELSE                           CALL ZSYMM( SIDE, UPLO, M, N, ALPHA, AA, LDA,     $                                 BB, LDB, BETA, CC, LDC )                        END IF**                       Check if error-exit was taken incorrectly.*                        IF( .NOT.OK )THEN                           WRITE( NOUT, FMT = 9994 )                           FATAL = .TRUE.                           GO TO 110                        END IF**                       See what data changed inside subroutines.*                        ISAME( 1 ) = SIDES.EQ.SIDE                        ISAME( 2 ) = UPLOS.EQ.UPLO                        ISAME( 3 ) = MS.EQ.M                        ISAME( 4 ) = NS.EQ.N                        ISAME( 5 ) = ALS.EQ.ALPHA                        ISAME( 6 ) = LZE( AS, AA, LAA )                        ISAME( 7 ) = LDAS.EQ.LDA                        ISAME( 8 ) = LZE( BS, BB, LBB )                        ISAME( 9 ) = LDBS.EQ.LDB                        ISAME( 10 ) = BLS.EQ.BETA                        IF( NULL )THEN                           ISAME( 11 ) = LZE( CS, CC, LCC )                        ELSE                           ISAME( 11 ) = LZERES( 'GE', ' ', M, N, CS,     $                                   CC, LDC )                        END IF                        ISAME( 12 ) = LDCS.EQ.LDC**                       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 110                        END IF*                        IF( .NOT.NULL )THEN**                          Check the result.*                           IF( LEFT )THEN                              CALL ZMMCH( 'N', 'N', M, N, M, ALPHA, A,     $                                    NMAX, B, NMAX, BETA, C, NMAX,     $                                    CT, G, CC, LDC, EPS, ERR,     $                                    FATAL, NOUT, .TRUE. )                           ELSE                              CALL ZMMCH( 'N', 'N', M, N, N, ALPHA, B,     $                                    NMAX, A, NMAX, BETA, C, NMAX,     $                                    CT, G, CC, LDC, EPS, ERR,     $                                    FATAL, NOUT, .TRUE. )                           END IF                           ERRMAX = MAX( ERRMAX, ERR )*                          If got really bad answer, report and*                          return.                           IF( FATAL )     $                        GO TO 110                        END IF*   50                CONTINUE*   60             CONTINUE*   70          CONTINUE*   80       CONTINUE*   90    CONTINUE*  100 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 120*  110 CONTINUE      WRITE( NOUT, FMT = 9996 )SNAME      WRITE( NOUT, FMT = 9995 )NC, SNAME, SIDE, UPLO, M, N, ALPHA, LDA,     $   LDB, BETA, LDC*  120 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, '(', 2( '''', A1, ''',' ), 2( I3, ',' ),     $      '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3, ',(', F4.1,     $      ',', F4.1, '), C,', I3, ')    .' ) 9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',     $      '******' )**     End of ZCHK2.*      END      SUBROUTINE ZCHK3( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,     $                  FATAL, NIDIM, IDIM, NALF, ALF, NMAX, A, AA, AS,     $                  B, BB, BS, CT, G, C )**  Tests ZTRMM and ZTRSM.**  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, ONE      PARAMETER          ( ZERO = ( 0.0D0, 0.0D0 ),     $                   ONE = ( 1.0D0, 0.0D0 ) )      DOUBLE PRECISION   RZERO      PARAMETER          ( RZERO = 0.0D0 )*     .. Scalar Arguments ..      DOUBLE PRECISION   EPS, THRESH      INTEGER            NALF, NIDIM, NMAX, NOUT, NTRA      LOGICAL            FATAL, REWI, TRACE      CHARACTER*6        SNAME*     .. Array Arguments ..      COMPLEX*16         A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),     $                   AS( NMAX*NMAX ), B( NMAX, NMAX ),     $                   BB( NMAX*NMAX ), BS( NMAX*NMAX ),     $                   C( NMAX, NMAX ), CT( NMAX )      DOUBLE PRECISION   G( NMAX )      INTEGER            IDIM( NIDIM )*     .. Local Scalars ..      COMPLEX*16         ALPHA, ALS      DOUBLE PRECISION   ERR, ERRMAX      INTEGER            I, IA, ICD, ICS, ICT, ICU, IM, IN, J, LAA, LBB,     $                   LDA, LDAS, LDB, LDBS, M, MS, N, NA, NARGS, NC,     $                   NS      LOGICAL            LEFT, NULL, RESET, SAME      CHARACTER*1        DIAG, DIAGS, SIDE, SIDES, TRANAS, TRANSA, UPLO,     $                   UPLOS      CHARACTER*2        ICHD, ICHS, ICHU      CHARACTER*3        ICHT*     .. Local Arrays ..      LOGICAL            ISAME( 13 )*     .. External Functions ..      LOGICAL            LZE, LZERES      EXTERNAL           LZE, LZERES*     .. External Subroutines ..      EXTERNAL           ZMAKE, ZMMCH, ZTRMM, ZTRSM*     .. Intrinsic Functions ..      INTRINSIC          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'/, ICHS/'LR'/*     .. Executable Statements ..*      NARGS = 11      NC = 0      RESET = .TRUE.      ERRMAX = RZERO*     Set up zero matrix for ZMMCH.      DO 20 J = 1, NMAX         DO 10 I = 1, NMAX            C( I, J ) = ZERO   10    CONTINUE   20 CONTINUE*      DO 140 IM = 1, NIDIM         M = IDIM( IM )*         DO 130 IN = 1, NIDIM            N = IDIM( IN )*           Set LDB to 1 more than minimum value if room.            LDB = M            IF( LDB.LT.NMAX )     $         LDB = LDB + 1*           Skip tests if not enough room.            IF( LDB.GT.NMAX )     $         GO TO 130            LBB = LDB*N            NULL = M.LE.0.OR.N.LE.0*            DO 120 ICS = 1, 2               SIDE = ICHS( ICS: ICS )               LEFT = SIDE.EQ.'L'               IF( LEFT )THEN                  NA = M               ELSE                  NA = N               END IF*              Set LDA to 1 more than minimum value if room.               LDA = NA               IF( LDA.LT.NMAX )     $            LDA = LDA + 1*              Skip tests if not enough room.               IF( LDA.GT.NMAX )     $            GO TO 130               LAA = LDA*NA*               DO 110 ICU = 1, 2                  UPLO = ICHU( ICU: ICU )*                  DO 100 ICT = 1, 3                     TRANSA = ICHT( ICT: ICT )*                     DO 90 ICD = 1, 2                        DIAG = ICHD( ICD: ICD )*                        DO 80 IA = 1, NALF                           ALPHA = ALF( IA )**                          Generate the matrix A.*                           CALL ZMAKE( 'TR', UPLO, DIAG, NA, NA, A,     $                                 NMAX, AA, LDA, RESET, ZERO )**                          Generate the matrix B.*                           CALL ZMAKE( 'GE', ' ', ' ', M, N, B, NMAX,     $                                 BB, LDB, RESET, ZERO )*                           NC = NC + 1**                          Save every datum before calling the*                          subroutine.*                           SIDES = SIDE                           UPLOS = UPLO                           TRANAS = TRANSA                           DIAGS = DIAG                           MS = M                           NS = N                           ALS = ALPHA

⌨️ 快捷键说明

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