2016-12-01 2 views
0

Мой эндшпиль должен взять несколько разных скриптов Fortran, которые я написал и связал с ними через Python. Сами скрипты относительно просты: по существу, просто много математики без каких-либо программных структур, более сложных, чем массивы. Тем не менее, я довольно новичок в этом, поэтому у меня есть небольшой тестовый скрипт, который я пытаюсь выполнить.f2py восстановление переменных из модуля Fortran

Основной сценарий ниже (в сокращенном виде):

subroutine addwake 
use geometry 
implicit none 

    integer::i,j,k,m 
    real(kind=8),allocatable::xn2(:,:),yn2(:,:),zn2(:,:) 
    real(kind=8)::avg,m1,m2,m0 
    character(50)::namefile 

!f2py intent(out) i,j,k,m 
!f2py intent(out),allocatable xn2,yn2,zn2 
!f2py intent(out) avg,m1,m2,m0 
!f2py intout(out) namefile 

! Check if surface node arrays are allocated 
if(allocated(xn))then 
    deallocate(xn,yn,zn) 
end if 

! Read in sectional point distribution 

... 

end subroutine addwake 

Это использует модуль (geometry.f95), который является источником моего горя.

module geometry 
    implicit none 

    ! panel coordinates and connectivity 
    integer::jmax,kmax 
    integer::npts_wake 
    real(kind=8)::dspan 
    real(kind=8),allocatable::xn(:,:),yn(:,:),zn(:,:) 
    !f2py intent(out) jmax,kmax,npts_wake 
    !f2py intent(out) dspan 
    !f2py intent(out),allocatable xn,yn,zn 
end module geometry 

компилировать код непосредственно через f2py -c -m wake geometry.f95 addwake.f95, а затем перейти в интерпретатор Python, чтобы запустить его. Он работает нормально, давая мне ожидаемый результат (текстовый файл с упорядоченными списками чисел), но затем я пытаюсь извлечь значения переменных, что мне нужно будет сделать в моей интеграции. Когда я пытаюсь это, я получаю следующие результаты:

>>> print wake.geometry.xn 
[[ 2.01331785 2.01331785 2.01331785 2.01331785 2.01331785] 
[ 2.00308232 2.00308232 2.00308232 2.00308232 2.00308232] 
[ 1.99284679 1.99284679 1.99284679 1.99284679 1.99284679] 
..., 
[ 0.979798 0.979798 0.979798 0.979798 0.979798 ] 
[ 0.989899 0.989899 0.989899 0.989899 0.989899 ] 
[ 1.   1.   1.   1.   1.  ]] 
>>> print wake.geometry.yn 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: yn 
>>> print wake.geometry.zn 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: zn 

Если я изменяю заявление f2py в geometry.f95 таким образом, что каждый переменном определяются на отдельной строке, я получаю ошибку атрибута для всех трех переменных. Я здесь очень превзойден, поэтому любые идеи?

ответ

0

Хорошо, это не дает никаких объяснений для , почему опубликованный не работает, но он обеспечивает временное решение. Если я просто опускаю объявления f2py для выделяемых переменных в geometry.f95 (модуль), все это hunky dory. Другими словами:

module geometry 
    implicit none 

    ! panel coordinates and connectivity 
    integer::jmax,kmax 
    integer::npts_wake 
    real(kind=8)::dspan 
    real(kind=8),allocatable::xn(:,:),yn(:,:),zn(:,:) 
!f2py intent(out) jmax,kmax,npts_wake 
!f2py intent(out) dspan 

end module geometry 

... позволяет мне использовать интерпретатор для вытягивания значений для всех трех матриц. При попытке вытащить значения для других переменных (jmax, kmax и т. Д.), Я, однако, не увенчался успехом. Что-то об этих объявлениях переменных путают работы, по-видимому, и я не уверен, почему.