mirror of
https://github.com/OpenMP/Examples.git
synced 2025-04-10 08:22:11 +01:00
43 lines
1.2 KiB
Fortran
43 lines
1.2 KiB
Fortran
! @@name: masked.1
|
|
! @@type: F-fixed
|
|
! @@operation: compile
|
|
! @@expect: success
|
|
! @@version: omp_5.1
|
|
SUBROUTINE MASKED_EXAMPLE( X, XOLD, N, TOL )
|
|
REAL X(*), XOLD(*), TOL
|
|
INTEGER N
|
|
INTEGER C, I, TOOBIG
|
|
REAL ERROR, Y, AVERAGE
|
|
EXTERNAL AVERAGE
|
|
C = 0
|
|
TOOBIG = 1
|
|
!$OMP PARALLEL
|
|
DO WHILE( TOOBIG > 0 )
|
|
!$OMP DO PRIVATE(I)
|
|
DO I = 2, N-1
|
|
XOLD(I) = X(I)
|
|
ENDDO
|
|
!$OMP SINGLE
|
|
TOOBIG = 0
|
|
!$OMP END SINGLE
|
|
!$OMP DO PRIVATE(I,Y,ERROR), REDUCTION(+:TOOBIG)
|
|
DO I = 2, N-1
|
|
Y = X(I)
|
|
X(I) = AVERAGE( XOLD(I-1), X(I), XOLD(I+1) )
|
|
ERROR = Y-X(I)
|
|
IF( ERROR > TOL .OR. ERROR < -TOL ) TOOBIG = TOOBIG+1
|
|
ENDDO
|
|
!$OMP MASKED ! primary thread (thread 0)
|
|
C = C + 1
|
|
PRINT *, 'Iteration ', C, 'TOOBIG=', TOOBIG
|
|
!$OMP END MASKED
|
|
ENDDO
|
|
!$OMP BARRIER
|
|
!$OMP MASKED FILTER(1) ! thread 1
|
|
! The print statement will not be executed
|
|
! if the number of threads is less than 2.
|
|
PRINT *, 'Total number of iterations =', C
|
|
!$OMP END MASKED
|
|
!$OMP END PARALLEL
|
|
END SUBROUTINE MASKED_EXAMPLE
|