2

我的二维水电代码在以下子程序(计算 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 数组先出现,W1dwlwr, 都是导致停顿的原因。忽略该DEALLOCATE语句(返回主语句时应该会产生自动释放)也会导致停顿。x 方向通量的子例程具有相同的数组,在此子例程之前调用,并且在解除分配它们时没有问题。

有什么建议么?

编辑这是在 Fedora 18 上运行并使用 Intel Fortran 2013.3 编译的。这是一个并行代码,但我在单个处理器上运行它以进行测试/调试。

4

1 回答 1

2

我做了三件不同的事情,它突然又开始工作了。我不相信其中有两个可以做到,而第三个有可能做到了。我所做的更改:

  • 我确实对ij循环的定义略有不同,所以我在两个方向扫描之间使其保持一致
  • 我跑make cleanmake
  • -check bounds -check pointers -check uninit在 Makefile 中添加了标志

我认为前两个并没有真正做任何事情。上面代码中的变量grid是一个 2x2 数组,其中包含qVar; 在我定义的 x-sweep 中mx = grid(1,2) - grid(1,1) + 1,类似地my,但 grid(1,1)1,所以它确实没有太大的不同。上面的第二项我至少做了 3 次。

但是我尝试过的最后一个,它又开始工作了。我不知道如何解决它,所以如果有人知道,请告诉我!

于 2013-07-03T20:01:08.747 回答