繁体   English   中英

fortran错误回溯导致where循环

[英]fortran error backtrace leads to a where loop

我正在处理大型的fortran代码,并且在使用快速选项进行编译(以便在大型数据库上执行测试)之前,通常会使用“警告”选项进行编译,以便检测并回溯所有问题。

因此,使用gfortran -fbacktrace -ffpe-trap=invalid,zero,overflow,underflow -Wall -fcheck=all -ftrapv -g2编译,我得到以下错误:

Program received signal SIGFPE: Floating-point exception - erroneous arithmetic operation.
Backtrace for this error:
 #0  0x7fec64cdfef7 in ???
 #1  0x7fec64cdf12d in ???
 #2  0x7fec6440e4af in ???
 #3  0x7fec64a200b4 in ???
 #4  0x7fec649dc5ce in ???
 #5  0x4cf93a in __f_mod_MOD
    at /f_mod.f90:132
 #6  0x407d55 in main_loop_
    at main.f90:419
 #7  0x40cf5c in main_prog
    at main.f90:180
 #8  0x40d5d3 in main
    at main.f90:68

代码f_mod.f90:132的一部分包含一个where循环:

! Compute s parameter
do i = 1, Imax
   where (dprim .ne. 1.0)
      s(:,:,:, :) = s(:,:,:, :) +vprim(:,:,:, i,:)*dprim(:,:,:, :)*dprim(:,:,:, :)/(1.0 -dprim(:,:,:, :))
   endwhere
enddo

但我在这里看不到任何错误。 其他所有位置都是通向该部分的子例程的调用。 当然,由于它是SIGFPE错误,因此我在编译gfortran -g1时必须在执行时遇到问题。 (我在Linux上使用gfortran 6.4.0)

此外,随着代码完全不同部分的修改,此错误会出现并消失。 因此,问题出在哪里? 还是其他地方的回溯是错误的? 如果是这种情况,我怎么能找到这个错误?

编辑:

由于我无法在一个最小的示例中重现此错误(它们正在工作),因此我认为问题出在其他地方。 但是如何在大代码中查找问题?

由于代码即将死于SIGFPE,请使用每个单独的陷阱来了解它是FE_DIVBYZERO,FE_INVALID,FE_OVERFLOW还是FE_UNDERFLOW。 如果是下溢,则将掩码更改为'1-dprim .ne。 0'。

PS:当可以使用整个数组引用代替时,请不要使用数组节符号。

PPS:您可能要在do循环之外计算dprim * drpim /(1-dprim),因为它是循环不变的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM