【问题标题】:Fortran subroutine: How to load data only on first callFortran 子例程:如何仅在第一次调用时加载数据
【发布时间】:2019-07-09 16:32:15
【问题描述】:

我正在编写一个链接到外部主程序的 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 的 save 过程变量属性主题的 Qs 和 As hereabouts。
  • 对 save 属性的提示就足够了,这确实是。我会检查

标签: fortran large-data subroutine


【解决方案1】:

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

【讨论】:

  • 非常感谢,我会试试这个并报告!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-28
  • 2017-09-26
  • 1970-01-01
  • 2020-12-31
  • 2020-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多