f2py 编译的 Fortran 模块中的垃圾收集

Garbage collection in f2py-compiled Fortran module

我的问题 是如何(并且确实)对编译为外部模块(通过 f2py)并由 Python 脚本使用的 Fortran 模块进行垃圾收集的?

背景

我目前正在研究一个有限元程序,主要是用 Python 编写的(为方便起见),它使用 Fortran 子程序的几个模块来完成无法避免某些循环的任务(即 assembly/update切线刚度矩阵)。这是使用 f2py (the quick way) 成功编译的,生成的 .dll 文件作为 python 模块导入到 python 脚本中。然后 functions/subroutines 可以被 Python 成功调用。

Fortran 模块的结构如下,不同的子程序使用模块中定义的一些全局变量,并根据需要使用它们自己的虚拟变量。

module mod
  integer, parameter :: iwp = SELECTED_REAL_KIND(15)
  real(iwp), allocatable, dimension(:,:) :: points, der, matrix, jac, deriv, bee, g_coord
  real(iwp), allocatable, dimension(:) :: fun, disps
  real(iwp), allocatable, dimension(:,:,:) :: tensor
  integer, allocatable, dimension(:,:) :: g_num, g_g
  integer, allocatable, dimension(:) :: etype, weights
  integer :: ndof,nodf,ndim,nels,nip,nod
contains

...subroutines,functions...

全局变量是直接从 Python 脚本分配和赋值的,作为具有正确类型的 F-连续 numpy 数组(可能是糟糕的风格,但它对我有用)。 这些可能是相对较大的数组,我想确保它们在 python 脚本成功完成后被释放...

欢迎任何其他建议!非常感谢

首先,Fortran 中没有垃圾回收。其次,模块数据同样是一个全局变量,它的生命周期是无限的。模块数据没有自动解除分配或完成。

如果要一次性释放大量数据,请创建包含数据的派生类型(结构,class)并为该类型创建最终子例程(析构函数)。然后,在需要时,从 Python 调用析构函数。或者,创建代理 Python class 并从 Python class.

的析构函数调用 Fortran 析构函数