У меня есть простая подкачка 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
кодом (или лучше сказать, что у меня есть односторонняя дорога).
Почему г 'умысел (INOUT)'? В вашем примере это только вывод ... причина, по которой он не изменяется, заключается в том, что float python неизменен. Обходным путем было бы передать в 1-элементный массив и распаковать его с другой стороны, но это было бы довольно уродливо. – mgilson
Как выглядит код Fortran? –
@ Vladimir F. Пожалуйста, посмотрите мой обновленный вопрос. Благодаря! – Jacobian