REAL FUNCTION WORK1(I) INTEGER I WORK1 = 1.0 * I RETURN END FUNCTION WORK1 REAL FUNCTION WORK2(I) INTEGER I WORK2 = 2.0 * I RETURN END FUNCTION WORK2 SUBROUTINE atomic_example(X, Y, INDEX, N) REAL X(*), Y(*) INTEGER INDEX(*), N INTEGER I !$OMP PARALLEL DO SHARED(X, Y, INDEX, N) DO I=1,N !$OMP ATOMIC UPDATE X(INDEX(I)) = X(INDEX(I)) + WORK1(I) Y(I) = Y(I) + WORK2(I) ENDDO END SUBROUTINE atomic_example PROGRAM ATOMIC_EXAMPLE REAL X(1000000), Y(10000000) INTEGER INDEX(10000000) INTEGER I DO I=1,10000000 INDEX(I) = MOD(I, 1000000) + 1 Y(I) = 0.0 ENDDO DO I = 1,1000000 X(I) = 0.0 ENDDO CALL atomic_example(X, Y, INDEX, 10000000) END PROGRAM ATOMIC_EXAMPLE