Technical data
132
Chapter 6: Compiling and Debugging Parallel Fortran
Repeat Step 4 Again: Rewrite
The new version looks like this, with changes 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), TOTAL_DIST_SQ
DOUBLE PRECISION THRESHOLD_SQ
INTEGER I, J
INTEGER MP_SET_NUMTHREADS, MP_NUMTHREADS, THREAD_INDEX
EXTERNAL MP_NUMTHREADS
DOUBLE PRECISION PARTIAL(3, MAX_ATOMS, 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
PARTIAL(1,I,THREAD_INDEX) = 0.0D0
PARTIAL(2,I,THREAD_INDEX) = 0.0D0
PARTIAL(3,I,THREAD_INDEX) = 0.0D0
END DO
END DO
C$DOACROSS LOCAL(THREAD_INDEX, I, J, DIST_SQ, TOTAL_DIST_SQ)
DO THREAD_INDEX = 1, MP_SET_NUMTHREADS
DO I = THREAD_INDEX, NUM_ATOMS, MP_SET_NUMTHREADS
DO J = 1, I-1
DIST_SQ1 = (ATOMS(I,1) - ATOMS(J,1)) ** 2
DIST_SQ2 = (ATOMS(I,2) - ATOMS(J,2)) ** 2
DIST_SQ3 = (ATOMS(I,3) - ATOMS(J,3)) ** 2










