Проблемы при переносе кодов фортрана, содержащих модули с использованием f2py - PullRequest
2 голосов
/ 31 января 2020

У меня есть код Fortrran, который должен вывести массив, размер которого зависит от переменной в модуле. Нет проблем при компиляции этих файлов для генерации файла .so. Однако, когда я вызываю подпрограмму в python, она получит ошибку. Далее приведен упрощенный код, используемый для объяснения моих вопросов

!fortran code: mod.f90
module constant
  implicit none
  integer(kind=4),parameter :: typenum=8,intype=4
  integer(kind=4) :: cutnum
end module

subroutine test(n,m,a,b)
  use constant
  implicit none
  integer(kind=intype) :: n,m,i,j
  real(kind=typenum) :: b(cutnum,m)
  real(kind=typenum) :: a(n,m)
  !f2py integer,intent(aux) :: cutnum
  !f2py intent(in) :: n,m
  !f2py intent(in) :: a
  !f2py intent(out) :: b
  do j=1,m
    do i=1,n
      a(i,j)=(i+j)*1D0
    end do
  end do
  b=n-a
  return
end subroutine

subroutine init_pes(n)
  use constant
  implicit none
  integer(kind=4) :: n
  !f2py integer,intent(in) :: n
  cutnum=n
  return
 end subroutine

Соберите следующую директиву:

f2py mod.f90 -m f2 -h f2.pyf --overwrite-signature
f2py -c --debug-capi f2.pyf mod.f90

И код python:

#python file : test.py
import numpy as np
import f2

print(f2.test.__doc__)

n=5
m=6
# set value of f2.constant.cutnum
f2.init_pes(n)

a = np.zeros((n, m), dtype=np.float64, order='f')
b = np.zeros((n, m), dtype=np.float64)
b = f2.test(a)
print(b)

Если я запускаю test.py, получим ошибку сегментации и пустой массив ** Согласно моему тесту, если выходной массив представляет собой вектор одного измерения или его измерение не зависит от переменной в модуле, код можно запустить обычно. в противном случае он сломается. **

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...