Files
SAPFOR/dvm/tools/tester/trunk/test-suite/Performance/adi3d.fdv

89 lines
2.7 KiB
Plaintext
Raw Normal View History

2024-05-02 17:08:55 +03:00
program adi
integer nx, ny, nz, itmax
double precision eps, relax, maxeps
double precision startt, endt, dvtime
parameter(nx=384, ny=384, nz=384, maxeps=0.01, itmax=100)
double precision a(nx, ny, nz)
!DVM$ DISTRIBUTE(BLOCK, BLOCK, BLOCK) :: a
call init(a, nx, ny, nz)
!DVM$ BARRIER
startt = dvtime()
do it = 1, itmax
eps=0.D0
!DVM$ ACTUAL(eps)
!DVM$ REGION
!DVM$ PARALLEL(k, j, i) ON a(i, j, k), ACROSS(a(1:1, 0:0, 0:0))
do k = 2, nz - 1
do j = 2, ny - 1
do i = 2, nx - 1
a(i, j, k) = (a(i-1, j, k) + a(i+1, j, k)) / 2
enddo
enddo
enddo
!DVM$ PARALLEL(k, j, i) ON a(i, j, k), ACROSS(a(0:0, 1:1, 0:0))
do k = 2, nz - 1
do j = 2, ny - 1
do i = 2, nx - 1
a(i, j, k) = (a(i, j-1, k) + a(i, j+1, k)) / 2
enddo
enddo
enddo
!DVM$ PARALLEL(k, j, i) ON a(i, j, k), ACROSS(a(0:0, 0:0, 1:1))
!DVM$>, REDUCTION(MAX(eps))
do k = 2, nz - 1
do j = 2, ny - 1
do i = 2, nx - 1
eps = max(eps, abs(a(i, j, k) -
> (a(i,j,k-1) + a(i,j,k+1)) / 2))
a(i, j, k) = (a(i, j, k-1) + a(i, j, k+1)) / 2
enddo
enddo
enddo
!DVM$ END REGION
!DVM$ GET_ACTUAL(eps)
print 200, it, eps
200 format (' IT = ', i4, ' EPS = ', e14.7)
if (eps .lt. maxeps) exit
enddo
!DVM$ BARRIER
endt = dvtime()
print *, 'ADI Benchmark Completed.'
print 201, nx, ny, nz
201 format (' Size = ', i4, ' x ', i4, ' x ', i4)
print 202, itmax
202 format (' Iterations = ', i12)
print 203, endt - startt
203 format (' Time in seconds = ', f12.2)
print *, 'Operation type = double precision'
if (abs(eps - 0.07249074) .lt. 1.0e-6) then
print *, 'Verification = SUCCESSFUL'
else
print *, 'Verification = UNSUCCESSFUL'
endif
print *, 'END OF ADI Benchmark'
end
subroutine init(a, nx, ny, nz)
double precision a(nx, ny, nz)
!DVM$ INHERIT a
integer nx, ny, nz
!DVM$ REGION OUT(a)
!DVM$ PARALLEL(k, j, i) ON a(i, j, k)
do k = 1, nz
do j = 1, ny
do i = 1, nx
if(k.eq.1 .or. k.eq.nz .or. j.eq.1 .or. j.eq.ny .or.
> i.eq.1 .or. i.eq.nx) then
a(i, j, k) = 10.*(i-1)/(nx-1) + 10.*(j-1)/(ny-1)
> + 10.*(k-1)/(nz-1)
else
a(i, j, k) = 0.D0
endif
enddo
enddo
enddo
!DVM$ END REGION
end