簡體   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