在Fortran中获取无效的浮点数,我不知道为什么

时间:2017-06-02 15:22:03

标签: fortran

所以我得到一个无效的浮动错误,导致我的代码从以下子例程崩溃。子程序将我的分布函数与角度和能量相加(因此我只有半径分布),然后我计算平均光学深度,然后我寻找光学深度超过2/3的径向区域。代码被设计为在多个时间步骤上运行,并且在这个特定的模拟中,它已经运行了49个时间步骤,然后在50日崩溃,这让我更加困惑。

subroutine SAPass(state, step)

use state_vector_module
use boltztran_memory_module, only: fe, trmfpe
use boltztran_parameter_module 
use units_module

implicit none

real, dimension(102) :: Fse
real, dimension(102,8) :: taue
real, dimension(102) :: Te
inetger :: cycsav = -1
integer :: nsze

call opdep(trmfpe, taue)

Fse = 0.
do i=1,102
do j=1,4
do k=1,8
  Fse(i) = Fse(i) + fe(i,j,k)
end do
end do
end do

do i=1,102
do j=1,4
do k=1,8
  if (Fse(i).eq.0.) then
    Te(i) = 0.
  else
    Te(i) = Te(i) + (fe(i,j,k)*taue(i,k))/Fse(i)
  end if
end do
end do
end do 

write(*,*) Te    !debug check to look for where the error is happening

nsze = 1
do i=1,101
  if(Te(i).eq.(2./3.)) then    ! This is the line the invalid float error is reported on. 
    nsze = i
  else if((Te(i).gt.(2./3.)).and.(Te(i+1).lt.(2./3.))) then
    nsze = i
  end if
end do

if(step.eq.cycsav) then
  continue
else
  cycsav = istep
  call tauwrite(taue,step,1)
  open(17,name="NSZones.dat",status="unknown",position="append")
  write(17,i5) nsze
  close(17)
end if

在第50步,代码崩溃,我收到以下错误:

forrtl: error (65): floating invalid

它引用代码中的指定行。当我在时间步骤50期间查看Te的打印输出时,i = 4的条目是'NaN'并且我无法弄清楚代码中的什么可能导致它变成NaN。对于该时间步和区域,分布函数数看起来都是正常的。

1 个答案:

答案 0 :(得分:1)

您使用

Fse(i).eq.0.

Te(i).eq.(2./3.)

比较两个浮点数是否相等是一个非常糟糕的主意。

你可能除以几乎为零
Te(i) = Te(i) + (fe(i,j,k)*taue(i,k))/Fse(i)

,这会导致错误。

不可能多说,因为我们无法看到fe是什么,它有哪些值,taue有哪些值。