所以我得到一个无效的浮动错误,导致我的代码从以下子例程崩溃。子程序将我的分布函数与角度和能量相加(因此我只有半径分布),然后我计算平均光学深度,然后我寻找光学深度超过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。对于该时间步和区域,分布函数数看起来都是正常的。
答案 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
有哪些值。