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语句的那一行允许我基本上跳过该行,并将后续行读入数组。此外,我不应该这样做