如何检查子程序之前是否已 运行?

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()).