Сборка мусора в f2py-скомпилированном модуле Fortran - PullRequest
0 голосов
/ 04 ноября 2019

Мой вопрос - как (и делает ли это) сборка мусора для модулей Fortran, скомпилированных как внешние модули (через f2py) и используемых скриптом Python?

Справочная информация

В настоящее время я работаю над программой конечных элементов, в основном написанной на Python (для удобства), которая использует несколько модулей подпрограмм Фортрана для задач, в которых нельзя избежать некоторых циклов (например, сборка / обновлениематрица касательной жесткости). Он успешно скомпилирован с использованием f2py ( быстрый способ ), и полученный DLL-файл импортируется как модуль Python в скрипт Python. Затем функции / подпрограммы могут быть успешно вызваны 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-смежные массивы с правильным типом (вероятно, плохой стиль, но он работает для меня). Это могут быть относительно большие массивы, и я хочу убедиться, что они были освобождены после успешного завершения сценария python ...

Любые другие предложения приветствуются! Большое спасибо

1 Ответ

2 голосов
/ 05 ноября 2019

Во-первых, в Фортране нет сборки мусора. Во-вторых, данные модуля - это те же глобальные переменные, они имеют бесконечное время жизни. Автоматическое освобождение или завершение данных модуля не производится.

Если вы хотите освободить много данных за один раз, создайте производный тип (структуру, класс), который содержит данные, и создайте последнюю подпрограмму (деструктор)) для типа. Затем при необходимости вызовите деструктор из Python. Или создайте прокси-класс Python и вызовите деструктор Fortran из деструктора класса Python.

...