【发布时间】:2017-08-17 04:19:46
【问题描述】:
我需要在 Fortran 子程序中初始化一个静态数组
double precision A(56136,8)
像这样:
A(1,1)=0.999950528145
A(1,2)=0.99982470274
A(1,3)=0.999987006187
.
.
.
A(56136,7)=0.933468163013
A(56136,8)=0.0668926686049
后者是由另一个程序生成的。
使用 ifort 13.0 ifort file.f -O0 编译需要很长时间(大约 30 分钟)。
Q1:这是什么原因,我该如何避免?
我没有处理主程序,子程序链接到第三方文件。该子例程被非常频繁地调用,因此文件访问是不可取的。
Q2:是否可以将初始化放在子程序之外,不用主程序,避免每次调用子程序时进行初始化?
编辑
它是恒定的。在声明语句中初始化它会是这样的吗?
double precision A(56136:8)=reshape(/*
& #, #, #, #, #, #, #, #,
& #, #, #, #, #, #, #, #,
:
& */,(56136,8))
这不起作用,因为换行符太多。
【问题讨论】:
-
因为编译器有很多工作要做。不能在声明语句中初始化吗?它是一个常数还是以后会改变?
-
它是恒定的。在声明语句中初始化它看起来像这样?双精度 A(56136:8)=reshape(/* & #, #, #, #, #, #, #, #, & #, #, #, #, #, #, #, #, : & * /,(56136,8)) 对吗?
-
这段代码很疯狂,它包含了将近 450,000 行的赋值语句。编译器可能会在 WTF ? 中惊呆了大约 25 分钟,然后才停下来继续工作。您确定不能修改代码以在第一次需要时从文件中读取值,并使用
save在调用之间保留它们吗? -
感谢大家的帮助。我通过从文件中读取一次数据并在 save 关键字的帮助下保存它来做到这一点。由于换行符(声明)过多或编译器工作过多(在代码中赋值),将其放入源代码中不起作用
-
有什么地方可以让我安全地对 Fortran 大发雷霆吗? 几乎所有平均年龄在 60 岁以下的技术聚会(即几乎所有技术聚会)。我,我喜欢抱怨 Swift 和 .NET 以及其他玩具编程语言...
标签: arrays compilation fortran initialization