我的2D水力代码在以下子程序(计算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
语句(在返回main时会产生自动解除分配)也会导致停顿。 x方向通量的子程序具有相同的数组,在此子程序之前调用,并且在释放它们时没有问题。
有什么建议吗?
编辑这是在Fedora 18上运行并使用英特尔Fortran 2013.3编译的。它是一个并行化的代码,但我在一个处理器上运行它以进行测试/调试。
答案 0 :(得分:2)
我做了三件不同的事情,突然又开始工作了。其中两个我不相信可以做到,而第三个可能做到了。我所做的改变:
i
和j
循环的界限确实略有不同,所以我在两次定向扫描之间统一了make clean
和make
-check bounds -check pointers -check uninit
个标志
我认为前两个并没有真正做任何事情。上面代码中的变量grid
是一个包含qVar
边界的2x2数组;在x-sweep中我定义了mx = grid(1,2) - grid(1,1) + 1
,类似于my
,但是grid(1,1)是 1,所以它确实没有太大的不同。我上面的第二项至少做了3次。
但最后一次我尝试了一次,它又开始工作了。我不知道怎么能修好它,所以如果有人知道,请告诉我!