我有一个do循环,里面有两个if语句。而且我希望线程在第一个if完成后进行同步,这意味着我想确保它们都已完成对第一个if语句的更新,它们可以开始更新第二个if语句。
我尝试使用!$ OMP BARRIER,但是总迭代时间(变量:ITER)与序列情况不同。
这是我的更新循环:
DO ITER=1,ITERMAX
DUMAX=0.0D0
!$OMP PARALLEL PRIVATE(I,J,K,P,T_OLD), SHARED(T), REDUCTION(MAX:DUMAX)
!$OMP DO
DO I=2, N-1
DO J=2, N-1
! UPDATE BLACK NODES
IF (MOD(I+J,2)==0) THEN
T_OLD=T(I,J)
T(I,J)=0.25*(T(I,J-1)+T(I,J+1)+T(I+1,J)+&
T(I-1,J)-DX**2*S(I,J))
DUMAX=MAX(DUMAX, ABS(T_OLD-T(I,J)))
END IF
END DO
END DO
!$OMP END DO
!$OMP BARRIER
!$OMP DO
DO K=2,N-1
DO P=2,N-1
IF (MOD(K+P,2)==1) THEN
T_OLD=T(K,P)
T(K,P)=0.25*(T(K,P-1)+T(K,P+1)+T(K+1,P)+&
T(K-1,P)-DX**2*S(K,P))
DUMAX=MAX(DUMAX, ABS(T_OLD-T(K,P)))
END IF
END DO
END DO
!$OMP END DO
!$OMP END PARALLEL
! check convergence
IF (DUMAX <= TOL) EXIT
END DO