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

Fortran subroutine: How to load data only on first call

我正在编写一个链接到外部主程序的 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

第一次调用过程时设置值并保留值可以通过显式初始化来执行。在这个问题中,我们经常使用术语初始化来表示作为设置过程一部分的分配。但是,初始化在 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