我的Fortran代码需要从文件中读取初始化数据(大约24000个实数)。有没有办法将数据放入代码中,以便我可以避免访问文件系统?
我尝试使用模块并将所有数据放入变量初始化中,如下所示:
real(kind=8) :: a(24000)=(/&
& 1. ,&
& 2. ,&
...
&/)
但由于源文件有24000行,我一直收到编译错误“Too many continuation lines”。对此有什么解决方法吗?
答案 0 :(得分:5)
您可以使用DATA
语句。
您可以将数组“切片”为多个部分(例如在一个部分中设置a[1..100]
,在下一个部分设置a[101..200]
等等)这意味着您应该能够避免你遇到的大规模语句大小的问题。
答案 1 :(得分:1)
对于如此大量的数据,我会使用一些脚本语言(甚至是Fortran)来生成一大块简单的Fortran代码,如
a(1) = ..
a(2) = ..
a(3) = ..
然后可以将此代码复制粘贴或包含在您的源代码中。
答案 2 :(得分:1)
一个选项可能是指示编译器允许无限制的行长度 把整个事情放在一条线上。
gfortran -ffree-line-length-none
我已经验证了这项工作。我有一个只有3行的2Mb源文件
real(kind=8) :: a(24000)=(/ ......... /)
write(*,*)a(24000)
end
如果某些编译器具有实际的行长度限制,我不会感到惊讶。
顺便说一句,gfortran不喜欢使用大data
语句。
没有错误它只是挂起(或需要很长时间)
//
想象一下,我的大data
版本在1.5小时后实际编译(并运行正常)。为什么编译器处理data
与初始化赋值有很大不同,这是一个很好的问题。
答案 3 :(得分:0)
正如前一作者所述,您可以使用数据语句,但手动将其输入代码可能会非常耗时。您是否有理由担心在do循环中使用READ语句来读入文件?如果您可以向我们提供有关数据文件格式的任何输入,我们可以为您提供更好的帮助。
答案 4 :(得分:0)
它可能看起来很古老,但您可以使用INCLUDE。您需要修改数据文件以获得您提供的表单,
real(8), dimension(24000) :: a=(/1.0,2.0,...24000./)
然后include
在主程序中如此:
program main
implicit none
include "my_data_file.for"
< ... >
end program main
您不需要更改编译命令,只要包含的文件位于同一目录中,您的Fortran编译器就会自行导入include
d文件。