2022-11-04 09:35:42 -07:00

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