如何检查子程序之前是否已 运行?
How can I check if a subroutine has been run before?
我目前有一个使用 2008 标准的 Fortran 程序,它有一个子例程,如果它是子例程的第一个 运行,则从文件加载数据。在所有 运行 上,子例程对数据和 returns 两个值进行插值,但目标是避免从文件中重新加载相同的数据。
最初,我有这样的事情:
module myModel_mod
use myModelLoader_mod
use linear_interpolation_module
implicit none
contains
subroutine myModel(A, B, C, modelFile, D, E)
real :: A, B, C, D, E
character(len=*) :: modelFile
type(linear_interp_3d), save :: F, G
real, dimension(:), allocatable, save :: As, Bs, Cs
if (.not. allocated(As)) then
call loadModel(modelFile, As, Bs, Cs)
.
. (processing of loaded data and creation of F and G occurs here)
.
end if
call F%evaluate(A, B, C, D)
call G%evaluate(A, B, C, E)
end subroutine
end module
我的模块使用了 finterp 库。它为两个值 D 和 E 插入一个 3D 网格数据集。我不得不重写这部分代码以修复内存泄漏,我想修复 As
、[=13= 的位置], 和 Cs
被分配。他们不需要 SAVE 属性;它是我使用的旧网格插值实现遗留下来的。但是,如果我删除它,那么根据我的理解,我无法检查是否分配了 As
来查看子程序之前是否已经 运行
我考虑过创建一个带有 SAVE 属性的逻辑标志变量,该变量在子例程 运行 第一次设置时设置,但我相信这仍然会导致小的内存泄漏,尽管很多比我现在拥有的要小。
有没有一种方法可以在不导致内存泄漏的情况下检查 "first run" 条件?
Fortran 中的可分配数组不可能发生内存泄漏。未保存的可分配局部变量在退出过程时被释放。被拯救的人被保留,但不能无限制地增长。您只能分配有限数量的本地可分配变量,然后占用一些内存,但它们不会不受控制地增长。
为了回答你的标题问题,我使用了保存逻辑变量的方法,如果它是关于分配本地或模块数组,我只使用 if (allocated())
.
我目前有一个使用 2008 标准的 Fortran 程序,它有一个子例程,如果它是子例程的第一个 运行,则从文件加载数据。在所有 运行 上,子例程对数据和 returns 两个值进行插值,但目标是避免从文件中重新加载相同的数据。
最初,我有这样的事情:
module myModel_mod
use myModelLoader_mod
use linear_interpolation_module
implicit none
contains
subroutine myModel(A, B, C, modelFile, D, E)
real :: A, B, C, D, E
character(len=*) :: modelFile
type(linear_interp_3d), save :: F, G
real, dimension(:), allocatable, save :: As, Bs, Cs
if (.not. allocated(As)) then
call loadModel(modelFile, As, Bs, Cs)
.
. (processing of loaded data and creation of F and G occurs here)
.
end if
call F%evaluate(A, B, C, D)
call G%evaluate(A, B, C, E)
end subroutine
end module
我的模块使用了 finterp 库。它为两个值 D 和 E 插入一个 3D 网格数据集。我不得不重写这部分代码以修复内存泄漏,我想修复 As
、[=13= 的位置], 和 Cs
被分配。他们不需要 SAVE 属性;它是我使用的旧网格插值实现遗留下来的。但是,如果我删除它,那么根据我的理解,我无法检查是否分配了 As
来查看子程序之前是否已经 运行
我考虑过创建一个带有 SAVE 属性的逻辑标志变量,该变量在子例程 运行 第一次设置时设置,但我相信这仍然会导致小的内存泄漏,尽管很多比我现在拥有的要小。
有没有一种方法可以在不导致内存泄漏的情况下检查 "first run" 条件?
Fortran 中的可分配数组不可能发生内存泄漏。未保存的可分配局部变量在退出过程时被释放。被拯救的人被保留,但不能无限制地增长。您只能分配有限数量的本地可分配变量,然后占用一些内存,但它们不会不受控制地增长。
为了回答你的标题问题,我使用了保存逻辑变量的方法,如果它是关于分配本地或模块数组,我只使用 if (allocated())
.