【发布时间】:2014-06-16 09:22:22
【问题描述】:
我正在尝试使用包含语句在 Fortran 中初始化查找表,该语句使用 DATA 语句声明 LUT 的值。 LUT 声明如下:
REAL DIMENSION(400, 500, 15) :: my_array
INCLUDE '/path/to/my/file.incf'
包含文件如下所示:
...
DATA my_array (390:400, 499, 5) = / 0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9 /
DATA my_array (1:10, 500, 5) = / 1.0,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9 /
...
我的真实数据不是结构化的,因此 LUT 结构确实是必要的 :) 我想将它编译到程序中,这样我就不必在运行时读取它。
当我尝试编译时,我收到以下错误:
ftn-237 crayftn: LIMIT SRC_RADIATION, File = /path/to/my/file.incf, Line = 127436
Maximum table size has been exceeded for the "ir_list_tbl".
据我了解,ir_list_tbl 用于簿记,但由于我实际上只是将值按位置保存在单个变量中,因此我不了解这里的开销。我们说的是单个数组中的 3,000,000 个值,而不是 3,000,000 个顶级变量。我可以在这里做得更好吗?
【问题讨论】:
-
您正在尝试使用 DATA 语句初始化一个包含 300 万个元素的数组?这太不寻常了,以至于对编译器来说可能太多了。我建议从文件中读取值。
-
我同意这将是最自然的事情,但是这将被集成到天气模型中,因此优先事项之一是尽量减少花在 I/O 等事情上的时间。看来这将是要走的路。
-
如果您将文件设为未格式化(有时称为二进制),则 IO 会很快。但是,这将引入一些平台依赖性。您可以为通用平台提供本机未格式化,为其他所有内容提供文本。或者您可以使用 HDF5 或 FITS 来提供独立于平台的“二进制”。
-
即使你可以嵌入海量数组,你也必须做一些 IO——不管你的操作系统是在执行之前加载可执行文件,还是你的可执行文件在开始时加载输入文件执行。如果输入文件是本机未格式化的,我希望差异可以忽略不计。
标签: arrays multidimensional-array fortran lookup-tables