Text 使用Fortran读取未格式化的文本数据(与gfortran和intel Fortran的区别)
我试图在FORTRAN程序中从一个非常大的文本文件中读取数据。使用“英特尔Fortran编译器”编译时,该程序运行良好,但使用gfortran编译时会出现错误 数据文件的格式设置为每行通常有六个单条。但每10k线有一条小于6个值的线。例如:Text 使用Fortran读取未格式化的文本数据(与gfortran和intel Fortran的区别),text,io,segmentation-fault,fortran,Text,Io,Segmentation Fault,Fortran,我试图在FORTRAN程序中从一个非常大的文本文件中读取数据。使用“英特尔Fortran编译器”编译时,该程序运行良好,但使用gfortran编译时会出现错误 数据文件的格式设置为每行通常有六个单条。但每10k线有一条小于6个值的线。例如: 0.1466E+01 0.1459E+01 0.1203E+01 0.1362E+01 0.1281E+01 0.1544E+01 0.1480E+01 0.1517E+01 0.1238E+01 0.1056E+01 0.1204E+01
0.1466E+01 0.1459E+01 0.1203E+01 0.1362E+01 0.1281E+01 0.1544E+01
0.1480E+01 0.1517E+01 0.1238E+01 0.1056E+01 0.1204E+01 0.1269E+01
:
0.3555E+00 0.3253E+00 0.6127E+00 0.6702E+00 0.1848E+01 0.2122E+01
0.2039E+01 0.6350E+00 0.6725E+00
我用FORTRAN编写了一个程序来读取这个文件。最低版本如下所示:
PROGRAM bigdataread
REAL,ALLOCATABLE :: VAR(:)
INTEGER :: NP, NVAR, NPER
CHARACTER(len=80) :: MOPFILE
MOPFILE = 'bigdata.OUT'
NP = 9945 ! Number of grid points
NVAR = 7 ! Number of Variables
NPER = 2920 ! Number of times-steps
ALLOCATE(VAR(NP*NVAR*NPER))
WRITE(LUNCO,*)'Alocated size ',SIZE(VAR)
OPEN(UNIT=8,FILE=MOPFILE)
READ(8,*,END=104,ERR=101)VAR
WRITE(*,*)'Bigdata sucsessfully read'
STOP
104 WRITE(*,*)'Reached end of file'
101 WRITE(*,*)'Problem reading in the .OUT file'
STOP
END
如果“NPER”大于1300,则使用gfortran编译的程序将出错。我已使用“$wc bigdata.OUT”确认数据文件具有正确数量的值。考虑到对可变大小的依赖,这似乎是一个内存问题,但我不知道如何解决。我的理解是,默认情况下,gfortan将数组放在堆上而不是堆栈上。有人知道这是怎么回事吗?也许您对进一步调试此问题有一些有用的建议
以下是我的平台的细节:
gcc版本4.6.3 Ubuntu/Linaro 4.6.3-1ubuntu5
ifort版本12.1.3
处理器:3.20GHz的12x IntelR CoreTM i7-3930K CPU
内存:已使用16412MB 8865MB
操作系统:Linux Mint 13 Maya列出了各种最新的gfortran分段错误。这些是你的吗?谢谢你的建议。据我所知,我遇到的问题不在bug列表中。首先,检查allocate语句的返回状态。第二,控制读取数据,不要使用列表定向输入一次性吞掉var。这两个步骤都不一定能解决问题,但其中一个或两个步骤应该能帮助您更准确地诊断问题。对于Fortran来说,无格式文本不是一个非常幸运的术语。尝试使用编译器的调试选项-g-fbacktrace-fcheck=all,可能还有valgrind来确定问题发生的位置。因此,我会使用编辑器从包含第33869081行的输入文件中剪切一个片段,看看问题是否是gfortran不喜欢的那一行末尾的奇怪字符。