2014-10-20 1 views
0

У меня есть простая подкачка fortran (только для тестирования интерфейса python-fortran). Это выглядит следующим образом:Невозможно изменить и вернуть значение в подпрограмме Fortran + блокнот

subroutine sum2(x,y,z) 
real(kind=8),intent(in)::x,y 
real(kind=8),intent(inout)::z 
z = x + y 
print *, "sum is ", z 
end subroutine sum2 

После компиляции с f2py я иду питона и сделать следующее:

>>> import sum2 
>>> x = 1.0 
>>> y = 2.0 
>>> z = 0.0 
>>> sum2.sum2(x,y,z) 
sum is 3 
>>> z 
0.0 

Таким образом, даже если z определяется как inout, его значение не изменяется с помощью функции , Мне нужно знать, почему. Другой вопрос касается notebook. Если я импортирую sum2 и запустил sum2.sum2(x,y,z), я даже не вижу сообщение sum is .... Итак, вопрос в том, можно ли вызвать fortran подпрограммы в записной книжке?

EDIT

Был разумный комментарий, что в моем примере я использовал неизменный тип данных. Итак, я решил изменить его, но все же у меня такая же проблема. Итак, мой новый fortran подпрограммой выглядит следующим образом:

subroutine arr(x) 
    real(kind=8),dimension(1)::x 
    x(1) = 2 ! new value 
    print *, "x[0] = ", x(1) 
end subroutine arr 

Опять же, я скомпилировать его с f2py и перейти к Python:

>>> import arr 
>>> x = [1] 
>>> arr.arr(x) 
x[0] = 2.000000000 
>>> x 
[1] 

Итак, хотя я теперь использовать изменяемый тип данных, я по-прежнему имеют ту же проблему - я не могу передавать переменные между python и fortran кодом (или лучше сказать, что у меня есть односторонняя дорога).

+1

Почему г 'умысел (INOUT)'? В вашем примере это только вывод ... причина, по которой он не изменяется, заключается в том, что float python неизменен. Обходным путем было бы передать в 1-элементный массив и распаковать его с другой стороны, но это было бы довольно уродливо. – mgilson

+0

Как выглядит код Fortran? –

+0

@ Vladimir F. Пожалуйста, посмотрите мой обновленный вопрос. Благодаря! – Jacobian

ответ

5

Для правильной связи между Fortran и Python оболочка C вокруг Fortran нуждается в массивах numpy.

В соответствии с примечаниями в начале учебного пособия по f2py (http://docs.scipy.org/doc/numpy-dev/f2py/getting-started.html#the-quick-way), вы можете наилучшим образом передать массив numpy с совместимым типом данных. Для реального (вид = 8) это np.float64.

Для sum2 подпрограммой следующий код работал для меня:

>>> import sum2 
>>> import numpy as np 
>>> x=np.array(1.0,dtype=np.float64) 
>>> y=np.array(2.0,dtype=np.float64) 
>>> z=np.array(0.0,dtype=np.float64) 
>>> sum2.sum2(x,y,z) 
sum is 3.0000000000000000 
>>> z 
array(3.0) 
>>> 
+0

Правильно, я не заметил, что он использовал обычный список во втором испытании. –