我正在考虑一个相当复杂的 Fortran 代码,其中包含许多互连的模块等。所以我会尽力只记录其中非常具体的部分。
在“正常”条件下编译时代码运行良好(参见下面的详细信息),但是当使用 DEBUG 编译选项时,以下几行会导致错误(SIGFPE:浮点异常 - 错误的算术运算)(讽刺,不是吗? )
WHERE (maskatc_int)
temp_factor = Tfamp*EXP(Tfexp*temp(1:ncloc,1:nrloc,k))
ELSEWHERE
temp_factor = 0.0
END WHERE
这发生在函数中,其中
temp_factor
在本地声明
REAL, DIMENSION(ncloc,nrloc) :: temp_factor
temp
在另一个模块中声明和分配,如
ALLOCATE (temp(1-nhalo:ncloc+nhalo,1-nhalo:nrloc+nhalo,nz),STAT=errstat)
maskatc_int
具有良好的尺寸。
ALLOCATE (maskatc_int(ncloc,nrloc),STAT=errstat)
如果有帮助,我可以提供更多详细信息,但我现在会坚持这些,希望有人已经可以提供解决方案的跟踪(因此,避免在调试模式下编译和执行时出现错误)
编译标志:
“正常”:
# Linux grid0 (GNU Fortran with MPI)
linux-gfortp:
$(MAKE) $(EXEFILE) "FC=mpif90" "FCOPTS= -O3" "FCDEFS=$(FCDEFS)" \
"FCDEBUG=" "CPP=" "CPPF=cpp" "CPPOPTS=-traditional-cpp" \
"CPPDEFS=$(CPPDFLAGS)"
“调试”:
# Linux gfortran debugging (GNU Fortran)
linux-gfort-g:
$(MAKE) $(EXEFILE) "FC=gfortran" "FCOPTS=" "FCDEFS=$(FCDEFS)" \
"FCDEBUG=-fbounds-check -Wall -ffpe-trap=invalid,zero,overflow -fimplicit-none -
fbacktrace" \
"CPP=" "CPPF=cpp" "CPPOPTS=-traditional-cpp" "CPPDEFS=$(CPPDFLAGS)"
只有在使用调试选项编译时才会出现浮点异常的原因是这个参数:
-ffpe-trap=invalid,zero,overflow
当您将其添加到正常编译选项时,程序在正常模式下也会失败。
您可以在 -ffpe-trap=list 的文档中找到有关这些调试选项的更多详细信息。仅将三个中的一个一一激活,看看是哪一个导致了异常。该文档有示例:
SQRT(-1.0)
您的代码使用乘法,因此很可能会产生溢出。