在调试编译的情况下,Fortran 数组似乎可以在 WHERE 条件之外访问

问题描述 投票:0回答:1

我正在考虑一个相当复杂的 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)"
debugging fortran where-clause gfortran
1个回答
1
投票

只有在使用调试选项编译时才会出现浮点异常的原因是这个参数:

-ffpe-trap=invalid,zero,overflow

当您将其添加到正常编译选项时,程序在正常模式下也会失败。

您可以在 -ffpe-trap=list 的文档中找到有关这些调试选项的更多详细信息。仅将三个中的一个一一激活,看看是哪一个导致了异常。该文档有示例:

  • invalid:无效的浮点运算,如
    SQRT(-1.0)
  • :除以零
  • 溢出:浮点运算中的溢出

您的代码使用乘法,因此很可能会产生溢出。

© www.soinside.com 2019 - 2024. All rights reserved.