Fortran子例程:如何仅在首次调用时加载数据

时间:2019-07-09 16:32:15

标签: fortran large-data subroutine

我正在编程一个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

1 个答案:

答案 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