Io 关闭输入文件时出现Fortran分段错误
希望有人能帮我解决这个问题。我们将不胜感激 背景。我正在为我们的研究小组扩展一段遗留代码,该研究小组进行一些传热、热对流等类型的数值模拟。我试图做的是读取一个温度输入文件,这样我就可以随着模型的发展调整模型的温度。而这些信息在很大程度上是无关紧要的。在试图关闭打开并读取的文件时,我不断遇到分段错误。我附上了下面的代码,以及典型的温度输入文件的外观(但由于将有数千个数据点,因此大大简化了)。在消除分段错误和/或纠正代码以提高效率方面,如有任何帮助,将不胜感激Io 关闭输入文件时出现Fortran分段错误,io,fortran,modeling,numerical,Io,Fortran,Modeling,Numerical,希望有人能帮我解决这个问题。我们将不胜感激 背景。我正在为我们的研究小组扩展一段遗留代码,该研究小组进行一些传热、热对流等类型的数值模拟。我试图做的是读取一个温度输入文件,这样我就可以随着模型的发展调整模型的温度。而这些信息在很大程度上是无关紧要的。在试图关闭打开并读取的文件时,我不断遇到分段错误。我附上了下面的代码,以及典型的温度输入文件的外观(但由于将有数千个数据点,因此大大简化了)。在消除分段错误和/或纠正代码以提高效率方面,如有任何帮助,将不胜感激 subroutine Read_Tem
subroutine Read_Temp_Input(Temp_in)!(dt)!(filename)!,dt,Temp_out)
implicit none
character*80 :: filename
integer, parameter :: dp = selected_real_kind(15)
real(kind=dp), allocatable, dimension(:,:) :: Temp_in, Temp_out
integer :: i,j,ierror,n
real (kind=dp) :: in_time, in_temp, dt, inter_time, inter_temp, max_time
character*80 :: line
!Variable definitions
!in_time is the time given from the input file
!in_temp is the temp given from the input file
!inter_time is the interpolated time using dt, max_time, and linear interpolation
!inter_temp is the interpolated temp using dt, max_time, and linear interpolation
!max_time is the largest time value in the input file
!dt is the time step utilized in the simulation, provided by main routine
!read in the temperature input file
filename = "temps.txt"
Open(UNIT=1,FILE=filename,ACTION="Read")
!Determine the size of the necessary allocation
n = 0
do
Read(1,*,iostat=ierror) in_time, in_temp
if (ierror.ne.0) then
exit
else
print*, in_time, in_temp
n = n + 1
endif
enddo
!Allocate the Temp_in array to a n x 2 array.
allocate(Temp_in(n,2))
close(unit=1)
Open(UNIT=1,FILE=filename,ACTION="Read")
n = 0
do
Read(1,*,iostat=ierror) in_time, in_temp
if (n.ne.0) then
if (ierror.ne.0) then
exit
else
Temp_in(n-1,0) = in_time
Temp_in(n-1,1) = in_temp
endif
endif
n = n + 1
enddo
dt = 0.5_dp
print*, 'is the fault before here?'
close(1)
print*, 'is the fault here?'
end subroutine
温度文件
Time Temp
1 300
2 400
3 500
5 600
附件也是我得到的一个输出。我将及时消除随机打印语句,只是用它们来测试代码在哪里被破坏
感谢您的帮助,非常感谢。Fortran数组默认是基于1的,在您的示例中,中的
Temp\u也是基于1的。那么台词呢
Temp_in(n-1,0) = in_time
Temp_in(n-1,1) = in_temp
将写入越界(对于n=1
,两者都是越界的,第一个总是越界)
您可以使用--check=bounds
标志让编译器检查,如果您试图以这种方式访问数组,它将抛出运行时错误
因此,在
中分配Temp_作为
allocate(Temp_in(0:n-1,0:1))
或者使用基于1的索引作为解决方案写入
更新
此外,在确定条目数时,读取示例temps.txt
文件的第一行将失败,因为它试图读取两个real
,但却找到了其他内容。因此,在第一行中打开要读取的文件后,需要进行一次虚拟读取(或者使用与第二个循环相同的附加检查)
Fortran数组默认是基于1的,在您的示例中,
中的Temp_也是基于1的。那么台词呢
Temp_in(n-1,0) = in_time
Temp_in(n-1,1) = in_temp
将写入越界(对于n=1
,两者都是越界的,第一个总是越界)
您可以使用--check=bounds
标志让编译器检查,如果您试图以这种方式访问数组,它将抛出运行时错误
因此,在
中分配Temp_作为
allocate(Temp_in(0:n-1,0:1))
或者使用基于1的索引作为解决方案写入
更新
此外,在确定条目数时,读取示例temps.txt
文件的第一行将失败,因为它试图读取两个real
,但却找到了其他内容。因此,在第一行中打开要读取的文件后,需要进行一次虚拟读取(或者使用与第二个循环相同的附加检查)
您是否使用编译器提供的各种调试选项编译了代码?如果你没有,我会非常担心这行Temp\u in(n-1,0)=in\u time
。您的编译器当然应该检查边界问题。与手头的问题无关:首先,代码逐行读取输入文件以确定有多少行(即获取n
的值以分配temp\u in
)。到目前为止还不错,现在代码知道要读取多少数据点。然后,令我惊讶的是,代码使用了相同的策略来读取数据点,即它逐行读取输入文件,每一次检查文件末尾,然后再次显式递增n
。当然,第二个循环可以启动i=1,n
?不要复制输出或将代码作为图像。当你真的要这么做的时候,至少要输入该死的图像描述。如果不这样做,请将所有内容作为文本复制到此处。您是否使用编译器提供的各种调试选项编译了代码?如果你没有,我会非常担心这行Temp\u in(n-1,0)=in\u time
。您的编译器当然应该检查边界问题。与手头的问题无关:首先,代码逐行读取输入文件以确定有多少行(即获取n
的值以分配temp\u in
)。到目前为止还不错,现在代码知道要读取多少数据点。然后,令我惊讶的是,代码使用了相同的策略来读取数据点,即它逐行读取输入文件,每一次检查文件末尾,然后再次显式递增n
。当然,第二个循环可以启动i=1,n
?不要复制输出或将代码作为图像。当你真的要这么做的时候,至少要输入该死的图像描述。不要这样做,将所有内容复制为文本。感谢您的快速响应。我已将分配更改为您推荐的方式。然而,我仍然得到分割错误。另外,我知道第一行将作为错误读入,将字符串作为实数读入,而我设置了if语句的那一行允许我基本上跳过该行,并将后续行读入数组。此外,我应该注意,如果我从数组中打印出值,它们是正确的。这让我相信数组分配是有效的,但在关闭输入文件时,错误不知何故突然出现了。再次感谢。更新:我在错误检查行键入了-1而不是0。用你的分配方法解决这个问题似乎已经成功了。非常感谢您的帮助。感谢您的快速回复。我已将分配更改为您推荐的方式。然而,我仍然得到分割错误。另外,我知道第一行将作为错误读入,将字符串作为实数读入,而我设置了if语句的那一行允许我基本上跳过该行,并将后续行读入数组。此外,我不应该这样做