1*404b540aSrobert! { dg-do run } 2*404b540aSrobert REAL FUNCTION WORK1(I) 3*404b540aSrobert INTEGER I 4*404b540aSrobert WORK1 = 1.0 * I 5*404b540aSrobert RETURN 6*404b540aSrobert END FUNCTION WORK1 7*404b540aSrobert 8*404b540aSrobert REAL FUNCTION WORK2(I) 9*404b540aSrobert INTEGER I 10*404b540aSrobert WORK2 = 2.0 * I 11*404b540aSrobert RETURN 12*404b540aSrobert END FUNCTION WORK2 13*404b540aSrobert 14*404b540aSrobert SUBROUTINE SUBA16(X, Y, INDEX, N) 15*404b540aSrobert REAL X(*), Y(*) 16*404b540aSrobert INTEGER INDEX(*), N 17*404b540aSrobert INTEGER I 18*404b540aSrobert!$OMP PARALLEL DO SHARED(X, Y, INDEX, N) 19*404b540aSrobert DO I=1,N 20*404b540aSrobert!$OMP ATOMIC 21*404b540aSrobert X(INDEX(I)) = X(INDEX(I)) + WORK1(I) 22*404b540aSrobert Y(I) = Y(I) + WORK2(I) 23*404b540aSrobert ENDDO 24*404b540aSrobert END SUBROUTINE SUBA16 25*404b540aSrobert 26*404b540aSrobert PROGRAM A16 27*404b540aSrobert REAL X(1000), Y(10000) 28*404b540aSrobert INTEGER INDEX(10000) 29*404b540aSrobert INTEGER I 30*404b540aSrobert DO I=1,10000 31*404b540aSrobert INDEX(I) = MOD(I, 1000) + 1 32*404b540aSrobert Y(I) = 0.0 33*404b540aSrobert ENDDO 34*404b540aSrobert DO I = 1,1000 35*404b540aSrobert X(I) = 0.0 36*404b540aSrobert ENDDO 37*404b540aSrobert CALL SUBA16(X, Y, INDEX, 10000) 38*404b540aSrobert DO I = 1,10 39*404b540aSrobert PRINT *, "X(", I, ") = ", X(I), ", Y(", I, ") = ", Y(I) 40*404b540aSrobert ENDDO 41*404b540aSrobert END PROGRAM A16 42