我的二维水电代码在以下子程序(计算 y 方向通量)期间停止:
ALLOCATE(W1d(1:my,nFields),q1d(nFields),&
Wl(1:my,nFields),Wr(1:my,nFields))
PRINT *,"Main loop"
DO i=1,mx
DO j=1,my
q1d(1) = qVar(i,j,1,iRho)
q1d(2) = qVar(i,j,1, iE)
q1d(3) = qVar(i,j,1, ivy)
q1d(4) = qVar(i,j,1, ivx)
CALL Cons2Prim(q1d(:), W1d(j,:))
ENDDO
CALL lr_states(grid, W1d, dt, dy, Wl, Wr, dir)
DO j=1,my
Flux(i,j,:) = hllc_flux(wl(j,:), wr(j,:))
ENDDO
DO j=1,my
CALL Prim2Cons(Wl(j,:),Ul(i,j,:))
CALL Prim2Cons(Wr(j,:),Ur(i,j,:))
ENDDO
ENDDO
PRINT *,"Deallocating"
DEALLOCATE(W1d,q1d,Wl,Wr)
PRINT *,"Returning"
我将DEALLOCATE
语句分成 4 个单独的语句,发现无论哪个 2D 数组先出现,W1d
、wl
或wr
, 都是导致停顿的原因。忽略该DEALLOCATE
语句(返回主语句时应该会产生自动释放)也会导致停顿。x 方向通量的子例程具有相同的数组,在此子例程之前调用,并且在解除分配它们时没有问题。
有什么建议么?
编辑这是在 Fedora 18 上运行并使用 Intel Fortran 2013.3 编译的。这是一个并行代码,但我在单个处理器上运行它以进行测试/调试。