有没有办法在Fortran的代码文件中包含数据?

时间:2014-02-26 03:31:19

标签: fortran

我的Fortran代码需要从文件中读取初始化数据(大约24000个实数)。有没有办法将数据放入代码中,以便我可以避免访问文件系统?

我尝试使用模块并将所有数据放入变量初始化中,如下所示:

 real(kind=8) :: a(24000)=(/&
 & 1. ,&
 & 2. ,&
 ...
 &/)

但由于源文件有24000行,我一直收到编译错误“Too many continuation lines”。对此有什么解决方法吗?

5 个答案:

答案 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文件。