REAL*8 FUNCTION OMPMIN(X, NMAX) ! ! X is array, N is length of array ! INTEGER NMAX REAL*8 X(NMAX) !f2py real(8), intent(in), dimension(nmax) :: x INTEGER :: NUM_THREADS INTEGER :: I, N INTEGER :: ITHREAD, ISTART, ISTOP REAL*8 MY_MIN(10) REAL*8 RMIN INTEGER, EXTERNAL :: OMP_GET_THREAD_NUM, OMP_GET_NUM_THREADS !$OMP PARALLEL PRIVATE(I, ITHREAD, ISTART, ISTOP, NUM_THREADS, N) NUM_THREADS = OMP_GET_NUM_THREADS() N = NMAX/NUM_THREADS ITHREAD = OMP_GET_THREAD_NUM() IF ( ITHREAD == 0 ) THEN PRINT *, "num_threads = ", NUM_THREADS PRINT *, "n = ", N ENDIF ! ---------------------------------- ! Find my own starting index ! ---------------------------------- ISTART = ITHREAD * N + 1 ! Array start at 1 ! ---------------------------------- ! Find my own stopping index ! ---------------------------------- ISTOP = NMAX IF (ITHREAD == (NUM_THREADS-1) ) THEN ISTOP = ISTART + N ENDIF ! ---------------------------------- ! Find my own min ! ---------------------------------- MY_MIN(ITHREAD+1) = X(ISTART) DO I = ISTART+1, ISTOP IF ( X(I) < MY_MIN(ITHREAD+1) ) THEN MY_MIN(ITHREAD+1) = X(I) END IF END DO !$OMP END PARALLEL RMIN = MY_MIN(1) DO I = 2, NUM_THREADS IF ( RMIN < MY_MIN(I) ) THEN RMIN = MY_MIN(I) END IF END DO PRINT *, "min = ", RMIN OMPMIN = RMIN RETURN END