2015-02-16 1 views
1

Я работаю с f2py, и я довольно застрял. У меня есть функция в Fortran:f2py не возвращает размер (N, 3) на python

!f90 
subroutine f(!args 
implicit none; 

double precision, dimension(N, 3):: fMatrix; 
!f2py double precision, dimension(N,3), intent(out, c) :: fMatrix 
!Stuff happens here 

end subroutine force 

я использовал

f2py -c -m moduleName file.f90 

, чтобы преобразовать его в модуль питона. Он компилируется без ошибок, и python может его вызвать. Но ... К сожалению, он ничего не возвращает. Я думал, что с помощью

!f2py intent(out,c) fMatrix 

следует изменить память сэкономить на питон использование типа и вернуть fMatrix к питону. Но ..

... 
myf = fortranModule.f(args); 
print myf 

Возвращает «Нет».

Я предполагаю, что я делаю что-то неправильно; несколько хитов, которые я нашел, упоминали о том, что fMatrix - N.3, и поэтому у него возникают проблемы с определением типа возврата?

Я попытался добавить намерение (in)/intent (out) к объявлениям fortran, но это дало больше ошибок в начале. Тем не менее, я попробовал это снова сейчас; намерение (в) заявлениях работает, но умысел (уходит) бросает:

double precision, dimension(N, 3), intent(out):: fMatrix;               
Error: Symbol at (1) is not a DUMMY variable 

Я надеюсь, что кто-то есть ответ для меня, Спасибо заранее!

ответ

0

Что я использую что-то как следует, я стараюсь избегать намерений Inout переменной , потому что я считаю, что иногда путая с вызовом ссылочной вещью Вместо этого я определить выходную переменный в самой подпрограмме, и он автоматически возвращает этот

subroutine f(fMatrix,oMatrix,N) 
     implicit none; 
     integer,intent(in)::N 
     double precision,intent(in),dimension(N, 3):: fMatrix 
     double precision,intent(out),dimension(N, 3):: oMatrix 
     !do stuff here with fMatrix 
     !copy stuff to oMatrix using 
     oMatrix = fMatrix 
end subroutine f 

сохранить как "test.f90", компилировать его с

f2py --f90exec=gfortran -DF2PY_REPORT_ON_ARRAY_COPY=1 --noarch 
--f90flags='-march=native' -m test -c test.f90 

протестировать его с

In [6]: import test 

In [7]: fmatrix = np.random.random((2,3)) 

In [8]: fmatrix Out[8]: array([[ 0.19881303, 0.68857701, 
0.90133757], 
     [ 0.92579141, 0.03823548, 0.98172467]]) 

In [9]: test.f(fmatrix) copied an array: size=6, elsize=8 Out[9]: array([[ 0.19881303, 0.68857701, 0.90133757], 
     [ 0.92579141, 0.03823548, 0.98172467]]) 
+0

Я раньше работал на C++ и использовал вызов по ссылке в PHP (& $ bladievar), поэтому я привык к этому. Что касается намерения (inout), вам нужно добавить директиву! F2py (in, out). Не понял, что один! Благодарю. – Daimonie

0

Немного надеемся на данный момент; Думаю, я это исправил. У вас должно быть что-то вроде:

subroutine f(inputA, inputB, output) 

и объявить вывод как цель (out). По крайней мере, когда я сделал, что он вдруг начал печатать матрицы ;-)

Так что я проверил: строка документации

Return objects: 
    fmatrix : rank-2 array('d') with bounds (n,3) 

Правильно!

Спасибо, невидимые люди, с которыми я разговариваю.

+0

Вторая подпрограмма f2py подтверждает это; вам нужно поместить выходные переменные в скобки функции. – Daimonie