zblat3.f

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

F
1,780
字号
                           DO 30 I = 1, LAA                              AS( I ) = AA( I )   30                      CONTINUE                           LDAS = LDA                           DO 40 I = 1, LBB                              BS( I ) = BB( I )   40                      CONTINUE                           LDBS = LDB**                          Call the subroutine.*                           IF( SNAME( 4: 5 ).EQ.'MM' )THEN                              IF( TRACE )     $                           WRITE( NTRA, FMT = 9995 )NC, SNAME,     $                           SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA,     $                           LDA, LDB                              IF( REWI )     $                           REWIND NTRA                              CALL ZTRMM( SIDE, UPLO, TRANSA, DIAG, M,     $                                    N, ALPHA, AA, LDA, BB, LDB )                           ELSE IF( SNAME( 4: 5 ).EQ.'SM' )THEN                              IF( TRACE )     $                           WRITE( NTRA, FMT = 9995 )NC, SNAME,     $                           SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA,     $                           LDA, LDB                              IF( REWI )     $                           REWIND NTRA                              CALL ZTRSM( SIDE, UPLO, TRANSA, DIAG, M,     $                                    N, ALPHA, AA, LDA, BB, LDB )                           END IF**                          Check if error-exit was taken incorrectly.*                           IF( .NOT.OK )THEN                              WRITE( NOUT, FMT = 9994 )                              FATAL = .TRUE.                              GO TO 150                           END IF**                          See what data changed inside subroutines.*                           ISAME( 1 ) = SIDES.EQ.SIDE                           ISAME( 2 ) = UPLOS.EQ.UPLO                           ISAME( 3 ) = TRANAS.EQ.TRANSA                           ISAME( 4 ) = DIAGS.EQ.DIAG                           ISAME( 5 ) = MS.EQ.M                           ISAME( 6 ) = NS.EQ.N                           ISAME( 7 ) = ALS.EQ.ALPHA                           ISAME( 8 ) = LZE( AS, AA, LAA )                           ISAME( 9 ) = LDAS.EQ.LDA                           IF( NULL )THEN                              ISAME( 10 ) = LZE( BS, BB, LBB )                           ELSE                              ISAME( 10 ) = LZERES( 'GE', ' ', M, N, BS,     $                                      BB, LDB )                           END IF                           ISAME( 11 ) = LDBS.EQ.LDB**                          If data was incorrectly changed, report and*                          return.*                           SAME = .TRUE.                           DO 50 I = 1, NARGS                              SAME = SAME.AND.ISAME( I )                              IF( .NOT.ISAME( I ) )     $                           WRITE( NOUT, FMT = 9998 )I   50                      CONTINUE                           IF( .NOT.SAME )THEN                              FATAL = .TRUE.                              GO TO 150                           END IF*                           IF( .NOT.NULL )THEN                              IF( SNAME( 4: 5 ).EQ.'MM' )THEN**                                Check the result.*                                 IF( LEFT )THEN                                    CALL ZMMCH( TRANSA, 'N', M, N, M,     $                                          ALPHA, A, NMAX, B, NMAX,     $                                          ZERO, C, NMAX, CT, G,     $                                          BB, LDB, EPS, ERR,     $                                          FATAL, NOUT, .TRUE. )                                 ELSE                                    CALL ZMMCH( 'N', TRANSA, M, N, N,     $                                          ALPHA, B, NMAX, A, NMAX,     $                                          ZERO, C, NMAX, CT, G,     $                                          BB, LDB, EPS, ERR,     $                                          FATAL, NOUT, .TRUE. )                                 END IF                              ELSE IF( SNAME( 4: 5 ).EQ.'SM' )THEN**                                Compute approximation to original*                                matrix.*                                 DO 70 J = 1, N                                    DO 60 I = 1, M                                       C( I, J ) = BB( I + ( J - 1 )*     $                                             LDB )                                       BB( I + ( J - 1 )*LDB ) = ALPHA*     $                                    B( I, J )   60                               CONTINUE   70                            CONTINUE*                                 IF( LEFT )THEN                                    CALL ZMMCH( TRANSA, 'N', M, N, M,     $                                          ONE, A, NMAX, C, NMAX,     $                                          ZERO, B, NMAX, CT, G,     $                                          BB, LDB, EPS, ERR,     $                                          FATAL, NOUT, .FALSE. )                                 ELSE                                    CALL ZMMCH( 'N', TRANSA, M, N, N,     $                                          ONE, C, NMAX, A, NMAX,     $                                          ZERO, B, NMAX, CT, G,     $                                          BB, LDB, EPS, ERR,     $                                          FATAL, NOUT, .FALSE. )                                 END IF                              END IF                              ERRMAX = MAX( ERRMAX, ERR )*                             If got really bad answer, report and*                             return.                              IF( FATAL )     $                           GO TO 150                           END IF*   80                   CONTINUE*   90                CONTINUE*  100             CONTINUE*  110          CONTINUE*  120       CONTINUE*  130    CONTINUE*  140 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 160*  150 CONTINUE      WRITE( NOUT, FMT = 9996 )SNAME      WRITE( NOUT, FMT = 9995 )NC, SNAME, SIDE, UPLO, TRANSA, DIAG, M,     $   N, ALPHA, LDA, LDB*  160 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, '(', 4( '''', A1, ''',' ), 2( I3, ',' ),     $      '(', F4.1, ',', F4.1, '), A,', I3, ', B,', I3, ')         ',     $      '      .' ) 9994 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',     $      '******' )**     End of ZCHK3.*      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 )**  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      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 ), 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           ZHERK, ZMAKE, ZMMCH, ZSYRK*     .. 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( 2: 3 ).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( 2: 3 ), 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 )     $                        WRITE( NTRA, FMT = 9994 )NC, SNAME, UPLO,     $                        TRANS, N, K, RALPHA, LDA, RBETA, LDC                           IF( REWI )     $                        REWIND NTRA                           CALL ZHERK( UPLO, TRANS, N, K, RALPHA, AA,     $                                 LDA, RBETA, CC, LDC )                        ELSE                           IF( TRACE )     $                        WRITE( NTRA, FMT = 9993 )NC, SNAME, UPLO,     $                        TRANS, N, K, ALPHA, LDA, BETA, LDC                           IF( REWI )     $                        REWIND NTRA                           CALL ZSYRK( 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 )

⌨️ 快捷键说明

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