!----------------- Test parallel critical Program Testt integer, parameter :: N=10000000 real, dimension(N), save :: Rmc,Amc Nmz =-10 ; Nbz =30 Nmy =-10 ; Nby =30 Nmx =-10 ; Nbx =30 iFlag =0 do while (iFlag.le.1) Nseed = 12091 Ncentr = 0 write (*,*) ' N=',N !$OMP PARALLEL DO DEFAULT(SHARED) & !$OMP PRIVATE (i,j,k) Do k=Nmz,Nbz !If(mod(k,1)==0)Write(*,*) ' k=',k,' Ncenter=',Ncentr Do j=Nmy,Nby Do i=Nmx,Nbx If(iFlag == 0) Then !$OMP atomic Ncentr=Ncentr+1 Else !$OMP critical Ncentr=Ncentr+1 Rmc(Ncentr) = Randd(Nseed) Amc(Ncentr) = Randd(Nseed) write(*,*) Ncentr,Rmc(Ncentr),Amc(Ncentr) !$OMP end critical EndIf EndDo EndDo EndDo write(*,*) ' Ncentr=',Ncentr,' Flag=',iFlag iFlag = iFlag +1 end Do write(*,'(2f10.6)') (Rmc(i),Amc(i),i=1,Ncentr) stop end program Testt !------------------------------------------------ ! random number generator FUNCTION RANDd (M) !------------------------------------------------ DATA LC, AM, KI, K1, K2, K3, K4, L1, L2, L3, L4 / 453815927, & 2147483648., 2147483647, 536870912, 131072, 256, 16777216, 4, & 16384, 8388608, 128 / ML = M / K1 * K1 M1 = (M - ML) * L1 ML = M / K2 * K2 M2 = (M - ML) * L2 ML = M / K3 * K3 M3 = (M - ML) * L3 ML = M / K4 * K4 M4 = (M - ML) * L4 M5 = KI - M IF (M1.GE.M5) M1 = M1 - KI - 1 ML = M + M1 M5 = KI - ML IF (M2.GE.M5) M2 = M2 - KI - 1 ML = ML + M2 M5 = KI - ML IF (M3.GE.M5) M3 = M3 - KI - 1 ML = ML + M3 M5 = KI - ML IF (M4.GE.M5) M4 = M4 - KI - 1 ML = ML + M4 M5 = KI - ML IF (LC.GE.M5) ML = ML - KI - 1 M = ML + LC RANDd = M / AM RETURN END FUNCTION RANDd