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