使用并行执行时Fortran循环崩溃

时间:2018-10-17 03:02:20

标签: parallel-processing fortran

使用$ 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

0 个答案:

没有答案