1C******************************************************************************
2C FILE: omp_workshare2.f
3C DESCRIPTION:
4C   OpenMP Example - Sections Work-sharing - Fortran Version
5C   In this example, the OpenMP SECTION directive is used to assign
6C   different array operations to threads that execute a SECTION. Each
7C   thread receives its own copy of the result array to work with.
8C AUTHOR: Blaise Barney  5/99
9C LAST REVISED: 01/09/04
10C******************************************************************************
11
12      PROGRAM WORKSHARE2
13
14      INTEGER N, I, NTHREADS, TID, OMP_GET_NUM_THREADS,
15     +        OMP_GET_THREAD_NUM
16      PARAMETER (N=50)
17      REAL A(N), B(N), C(N)
18
19!     Some initializations
20      DO I = 1, N
21        A(I) = I * 1.0
22        B(I) = A(I)
23      ENDDO
24
25!$OMP PARALLEL SHARED(A,B,NTHREADS), PRIVATE(C,I,TID)
26      TID = OMP_GET_THREAD_NUM()
27      IF (TID .EQ. 0) THEN
28        NTHREADS = OMP_GET_NUM_THREADS()
29        PRINT *, 'Number of threads =', NTHREADS
30      END IF
31      PRINT *, 'Thread',TID,' starting...'
32
33!$OMP SECTIONS
34
35!$OMP SECTION
36      PRINT *, 'Thread',TID,' doing section 1'
37      DO I = 1, N
38         C(I) = A(I) + B(I)
39         WRITE(*,100) TID,I,C(I)
40 100     FORMAT(' Thread',I2,': C(',I2,')=',F8.2)
41      ENDDO
42
43!$OMP SECTION
44      PRINT *, 'Thread',TID,' doing section 2'
45      DO I = 1+N/2, N
46         C(I) = A(I) * B(I)
47         WRITE(*,100) TID,I,C(I)
48      ENDDO
49
50!$OMP END SECTIONS NOWAIT
51
52      PRINT *, 'Thread',TID,' done.'
53
54!$OMP END PARALLEL
55
56      END
57