Technical data
128
Chapter 6: Compiling and Debugging Parallel Fortran
Repeat Step 4: Rewrite
As before, changes are noted in bold.
SUBROUTINE CALC(NUM_ATOMS,ATOMS,FORCE,THRESHOLD,WEIGHT)
IMPLICIT NONE
INTEGER MAX_ATOMS
PARAMETER(MAX_ATOMS = 1000)
INTEGER NUM_ATOMS
DOUBLE PRECISION ATOMS(MAX_ATOMS,3), FORCE(MAX_ATOMS,3)
DOUBLE PRECISION THRESHOLD
DOUBLE PRECISION WEIGHT(MAX_ATOMS)
DOUBLE PRECISION DIST_SQ(3)
DOUBLE PRECISION THRESHOLD_SQ
INTEGER I, J
INTEGER MP_SET_NUMTHREADS, MP_NUMTHREADS
INTEGER BLOCK_SIZE, THREAD_INDEX
EXTERNAL MP_NUMTHREADS
DOUBLE PRECISION PARTIAL(MAX_ATOMS, 3, 4)
THRESHOLD_SQ = THRESHOLD ** 2
MP_SET_NUMTHREADS = MP_NUMTHREADS()
C
C INITIALIZE THE PARTIAL SUMS
C
C$DOACROSS LOCAL(THREAD_INDEX,I,J)
DO THREAD_INDEX = 1, MP_SET_NUMTHREADS
DO I = 1, NUM_ATOMS
DO J = 1, 3
PARTIAL(I,J,THREAD_INDEX) = 0.0D0
END DO
END DO
END DO
BLOCK_SIZE = (NUM_ATOMS + (MP_SET_NUMTHREADS-1)) /
& MP_SET_NUMTHREADS
C$DOACROSS LOCAL(THREAD_INDEX, I, J, DIST_SQ, TOTAL_DIST_SQ)
DO THREAD_INDEX = 1, MP_SET_NUMTHREADS
DO I = THREAD_INDEX*BLOCK_SIZE - BLOCK_SIZE + 1,
$ MIN(THREAD_INDEX*BLOCK_SIZE, NUM_ATOMS)
DO J = 1, I-1
DIST_SQ1 = (ATOMS(I,1) - ATOMS(J,1)) ** 2
DIST_SQ2 = (ATOMS(I,2) - ATOMS(J,2)) ** 2










