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

📄 acou3df2.f

📁 A C++ class library for scientific computing
💻 F
字号:
!! Tuned Fortran 77 version! Optimizations:! - Rather than four separate arrays, one 4D array is allocated.  This!   allows P1, P2, P3, and C to be interlaced in memory, improving data!   locality! - The stencil is tiled to improve cache usage! - Instead of copying, the indices into the 4D array are shuffled.!      INTEGER N, iters!      REAL check!      N = 112!      iters = 210!      CALL acoustic3d_f77Tuned(N,iters,check)!      PRINT *, check!      END      SUBROUTINE acoustic3d_f77Tuned(N, niters, check)      INTEGER N, niters, iter      REAL check      REAL P1(N,N,N), P2(N,N,N), P3(N,N,N), C(N,N,N)      CALL acoust3d_f77Tuned_setup(P1,P2,P3,C,N)      DO iter = 1, niters, 3        CALL acoustic3d_f77Tuned_stencil(P1,P2,P3,C,N)        CALL acoustic3d_f77Tuned_stencil(P2,P3,P1,C,N)        CALL acoustic3d_f77Tuned_stencil(P3,P1,P2,C,N)      END DO      check = P1(N/2,N/2,N/2)      RETURN      END      SUBROUTINE acoustic3d_f77Tuned_stencil(P1,P2,P3,C,N)      INTEGER N      REAL P1(N,N,N), P2(N,N,N), P3(N,N,N), C(N,N,N)      INTEGER i,j,k      INTEGER bi,bj,bk,ni,nj,nk,blockSize      blockSize = 8      DO bk=2,N-1,blockSize        nk = min(bk+blockSize-1,N-1)        DO bj=2,N-1,blockSize          nj = min(bj+blockSize-1,N-1)          DO bi=2,N-1,blockSize            ni = min(bi+blockSize-1,N-1)            DO k=bk,nk              DO j=bj,nj                DO i=bi,ni                  P3(i,j,k) = (2-6*C(i,j,k))*P2(i,j,k)      .              + C(i,j,k) * (P2(i,j-1,k) + P2(i,j+1,k)      .              + P2(i-1,j,k) + P2(i+1,j,k) + P2(i,j,k-1)     .              + P2(i,j,k+1)) - P1(i,j,k)                END DO              END DO            END DO          END DO        END DO      END DO      RETURN      END      SUBROUTINE acoust3d_f77Tuned_setup(P1, P2, P3, c, N)      INTEGER N      REAL P1(N,N,N), P2(N,N,N), P3(N,N,N), c(N,N,N)      INTEGER i, j, k      INTEGER cavityLeft, cavityRight, cavityFront, cavityBack,     .        cavityTop, cavityBottom, cavityTop2, cavityBottom2      REAL ci, cj, ck, s2!     Set up velocity field      DO k=1,N        DO j=1,N          DO i=1,N/2            c(i,j,k) = 0.05          END DO          DO i=N/2+1,N            c(i,j,k) = 0.3          END DO        END DO      END DO!     Cavities      cavityLeft = 3 * N / 7.0       cavityRight = 4 * N / 7.0       cavityFront = 3 * N / 7.0      cavityBack = 4 * N / 7.0      cavityTop = 5 * N / 7.0      cavityBottom = 6 * N / 7.0      cavityTop2 = 1 * N / 7.0      cavityBottom2 = 2 * N / 7.0      DO k=cavityFront, cavityBack        DO j=cavityLeft, cavityRight          DO i=cavityTop, cavityBottom            c(i,j,k) = 0.02          END DO          DO i=cavityTop2, cavityBottom2            c(i,j,k) = 0.001          END DO        END DO      END DO!     Initial pressure distribution      ci = N/2.0      cj = N/2.0      ck = N/2.0      s2 = 64.0 * 9.0 / ((N/2.0) ** 2)        DO k=1,N        DO j=1,N          DO i=1,N            P1(i,j,k) = 0.0            P2(i,j,k) = exp(- ((i-ci)**2+(j-cj)**2+(k-ck)**2) * s2)            P3(i,j,k) = 0.0          END DO        END DO      END DO      CALL acoust3d_f77Tuned_setup_check(P2, N)      CALL acoust3d_f77Tuned_setup_check(c, N)      RETURN      END      SUBROUTINE acoust3d_f77Tuned_setup_check(P, N)      INTEGER N      REAL P(N,N,N)      INTEGER i, j, k      REAL check      check = 0.0      DO k=1,N        DO j=1,N          DO i=1,N            check = check + P(i,j,k) * (i+N*j+N*N*k)          END DO        END DO      END DO           PRINT *, 'Array check: ', check       RETURN      END

⌨️ 快捷键说明

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