我需要调试一个包含 forall
block 的程序。它们的内部是pure
子例程或函数。为了暂时禁用 pure
谓词,我使用 C 预编译器,如我提出的以下问题所示:
Gfortran: Treat pure functions as normal functions for debugging purposes?
现在的问题是,如果 forall
block 内的子例程或函数不是 pure
我会收到编译错误。是否有可能处理这些错误
Error: Reference to non-PURE function 'pvkp' at (1) inside a FORALL block
仅作为警告,或者是否有可能使用 C 预编译器进行转换
forall (i=1:n)
...
end forall
进入
do i=1,n
...
end do
任何想法都值得赞赏!
最佳答案
一种简化方法是使用 do并发
循环而不是 forall
block 。这减少了代码中所需的链接更改的数量:只需更改循环规范,而不是将 end forall
更改为 end do
。
一种不值得骄傲的方法,使用cpp
,并且仅适用于简单的情况:
#ifdef DEBUG
#define conloop(var, lower, upper) do var=lower, upper
#else
#define conloop(var, lower, upper) do concurrent (var=lower:upper)
#endif
conloop(i,1,n) ! Either a DO or DO CONCURRENT depending on DEBUG
...
end do
end
如果这确实是您想要的,上面确实有使用 forall
构造的明显扩展(带有额外的 #define
结尾)。或者,虽然制作起来比较乏味,但可以使用诸如
#ifdef DEBUG
do i=1,n
#else
forall (i=1:n)
#endif
...
#ifdef DEBUG
end do
#else
end forall
#end
这太可怕了,但我想这对于所有预处理器方法都是如此。它确实允许更复杂的蒙版并且更加本地化。
关于debugging - Gfortran:将所有 block 视为 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21647064/