使用$ OMP PARALLEL DO时,我的某些代码会崩溃, 但是没有它就可以运行。循环在下面,使用函数“碰撞”时会发生问题
!$OMP PARALLEL DO
DO i=1,M-1
IF(W(i)%link.EQ.0) THEN
DO j=i+1,M
IF(W(j)%link.EQ.0) THEN
IF( collision( W(i)%R , W(j)%R , cDist ) ) THEN
CALL death(i)
CALL death(j)
collisions = collisions + 1
EXIT
END IF
END IF
END DO
END IF
END DO
!$OMP END PARALLEL DO
函数“碰撞”在下面,当我在N = 3时使用函数“ q”时会出现问题
LOGICAL FUNCTION collision( R1 , R2 , cDist)
USE DMCVariables , ONLY : N , bohr
REAL*8 , INTENT(IN) :: R1(N,3) , R2(N,3)
REAL , INTENT(IN) :: cDist
REAL :: radSq
INTEGER :: k , l , m
radSq = (bohr*cDist)**2
collision = .FALSE.
IF(N.EQ.2) THEN
IF( distSq( R1(1,:) , R2(2,:) ).LT.radSq ) THEN
IF( distSq( R1(2,:) , R2(1,:) ).LT.radSq ) THEN
collision = .TRUE.
END IF
END IF
END IF
IF(N.EQ.3) THEN
DO k=1,N-1
DO l=k,N
IF( distSq( R1(k,:) , R2(l,:) ).LT.radSq ) THEN
IF( distSq( R1(l,:) , R2(k,:) ).LT.radSq ) THEN
IF( distSq( R1(q(k,l),:) , R2(q(k,l),:) ).LT.radSq ) THEN
collision = .TRUE.
END IF
END IF
END IF
END DO
END DO
END IF
END FUNCTION collision
函数“ q”在下面,它应该返回一个1到3之间的数字。但是当我使用parallel时,大多数情况下它返回21972,这是超出范围的。
INTEGER FUNCTION q(l,k)
INTEGER , INTENT(IN) :: l , k
IF(l.EQ.1.AND.k.EQ.2.OR.l.EQ.2.AND.k.EQ.1) q = 3
IF(l.EQ.1.AND.k.EQ.3.OR.l.EQ.3.AND.k.EQ.1) q = 2
IF(l.EQ.2.AND.k.EQ.3.OR.l.EQ.3.AND.k.EQ.2) q = 1
END FUNCTION q