我正在编程一个Fortran模块,该模块链接到外部主程序。我只能更改子例程。我必须详细说明很多数据,但始终保持不变。在子例程的每次调用上花费太多时间。如何仅在第一次通话时初始化数据? 当前,这是子例程:
subroutine sdvini(statev,coords,nstatv,ncrds,noel,npt,layer,kspt)
implicit none
integer imdat(100,100,50)
imdat(1,1,1:33)=(/1,8,13,24,48,72,111,148,156,165,182&
&,189,194,207,210,216,236,247,254,270,311,319,339,343,367,376&
&,393,397,421,438,447,473,492/)
.
. lots of data
.
do something
return
end
答案 0 :(得分:2)
在第一次调用过程时设置值并保留值可以通过显式的初始化进行。在这个问题中,我们经常使用初始化一词来表示分配,这是建立过程的一部分。但是,对于Fortran而言,初始化意味着更加精确。
适合此问题的显式初始化类似于非常简单的情况
integer, save :: i=1 ! SAVE attribute would be implied, but made explicit
这就像是在第一次输入程序时应用分配。
我们还可以使用数据语句:
integer, save :: i
data i /1/
SAVE属性可确保该值在该过程的条目之间持久存在。
对于数组,想法是相同的,也许使用数组构造函数和reshape
。
对于非常大的数组,使用数据语句或初始化程序是不切实际的。此外,在初始化保存的局部变量时可能出现的限制。但是,另一个习惯用法是
subroutine sub
logical, save :: firsttime=.TRUE.
integer, save :: obj(100,100,50)
if (firsttime) then
obj = ... ! Setting the value somehow, maybe even with a read
firsttime = .FALSE.
end if
end subroutine