pde1.h90
来自「shpf 1.9一个并行编译器」· H90 代码 · 共 256 行 · 第 1/2 页
H90
256 行
PROGRAM PDE1
! ==================================================================
! === ===
! === GENESIS Distributed Memory Benchmarks ===
! === ===
! === 3-Dimensional Poisson Solver Using Red-Black Relaxation ===
! === Subset HPF version ===
! === ===
! === Original author: Max Lemke (1989, PALLAS GmbH) ===
! === PALLAS GmbH ===
! === Hermulheimer Str. 10 ===
! === 5040 Bruhl, GERMANY ===
! === tel.:+49-2232-18960 e-mail:karls@pallas-gmbh.de ===
! === ===
! === Subset HPF: Vladimir Getov ===
! === (1993, University of Southampton) ===
! === ===
! === Last update: May 1993; Release: 2.2 ===
! === ===
! ==================================================================
!
! FOR NUMERICAL VERIFICATION:
! THE AVERAGE CONVERGENCE RATE SHOULD BE SOMEWHERE BETWEEN
! 0.7 AND 0.98
!
!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
!
! THE TIMER (DOUBLE PRECISION IN SECONDS) IS CALLED IN MAIN PROGRAM.
! THE MACHINE DEPENDENT TIMING ROUTINE HAS TO BE INCLUDED.
!
!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
!
IMPLICIT NONE
INTEGER NX, NY, NZ, NPTS, NOP, NW1
DOUBLE PRECISION H, RES, RES1, RES2, CONVR, RMFLOP, SEC1, SEC2
!
!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
!
INCLUDE 'proc.inc'
INCLUDE 'pde1.inc'
!
!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
!
PARAMETER (NX=2**N)
PARAMETER (NY=NX)
PARAMETER (NZ=NX)
PARAMETER(NW1=11)
DOUBLE PRECISION U(NX,NY,NZ),F(NX,NY,NZ)
LOGICAL RED(NX,NY,NZ)
! .. Data Distribution ..
INTEGER I, J, K
!HPF$ ALIGN U(I,J,K) WITH RED(I,J,K)
!HPF$ ALIGN F(I,J,K) WITH RED(I,J,K)
!HPF$ DISTRIBUTE RED(BLOCK,BLOCK,BLOCK) ONTO FARM
H=1.0D0/(NX-1)
OPEN(NW1,FILE='result')
CALL HEADER(NW1)
WRITE(NW1,91000)
91000 FORMAT(' ***** 3D RED BLACK RELAXATION BENCHMARK ************* '/ &
& )
!
CALL INIT(U,F,RED,NX,NY,NZ,H)
RES1=RES(U,F,NX,NY,NZ,H)
!----------------> TIMER IN SECONDS
CALL TIMER(SEC1)
CALL RELAX(U,F,RED,NX,NY,NZ,H,NITER)
CALL TIMER(SEC2)
!----------------> TIMER IN SECONDS
RES2=RES(U,F,NX,NY,NZ,H)
CONVR=(RES2/RES1)**(0.1)
NPTS = (NX-2)*(NY-2)*(NZ-2)
WRITE(NW1,9100) NX-2, NY-2, NZ-2, NPTS, NITER, CONVR
!
NOP = NPTS*8
RMFLOP = (NOP/1000000.)/(SEC2-SEC1)*NITER
WRITE(NW1,900) (SEC2-SEC1)/NITER,NOP, RMFLOP
WRITE(NW1,'(////)')
9100 FORMAT (/' NUMBER OF INTERNAL POINTS PER DIRECTION = ', 3I12 / &
& ' INTERNAL GRIDSIZE OF CUBIC GRID = ', I12/ &
& ' AVERAGE CONV. RATE (', I6, 'ITER.) = ', D12.4/)
900 FORMAT(/' TIME FOR 1 RELAX (SEC.):', E15.8/ &
& ' NUMBER OF OPERATIONS: ',I15/ &
& ' PERFORMANCE IN MFLOP/S: ',F15.5/)
!
CLOSE(NW1)
STOP
END
!
!
SUBROUTINE RELAX(U,F,RED,NX,NY,NZ,H,ITER)
!--------------------------------------------------------C
! 3D RED BLACK RELAXATION STANDARD IMPLEMENTATION C
!--------------------------------------------------------C
IMPLICIT NONE
INTEGER NX, NY, NZ, ITER, NREL
DOUBLE PRECISION H,HSQ,FACTOR
DOUBLE PRECISION U(NX,NY,NZ), F(NX,NY,NZ)
LOGICAL RED(NX,NY,NZ)
! .. Data Distribution ..
INCLUDE 'proc.inc'
INTEGER I, J, K
!HPF$ ALIGN U(I,J,K) WITH *RED(I,J,K)
!HPF$ ALIGN F(I,J,K) WITH *RED(I,J,K)
!HPF$ DISTRIBUTE RED *(BLOCK,BLOCK,BLOCK) ONTO *FARM
HSQ = H*H
FACTOR = 1.0D0/6.0D0
DO NREL=1,ITER
! .. Array Constructs ..
WHERE(RED(2:NX-1,2:NY-1,2:NZ-1))
!
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?