Основываясь на этом минимальном примере , я хочу манипулировать переменными модуля Fortran с помощью подпрограмм Python и Fortran. Пожалуйста, взгляните на следующий пример:
vars.f90
module vars
implicit none
real(kind=selected_real_kind(p=15)) :: fk(10)
end module vars
sub.f90
subroutine sub
use vars
print *, "sub: fk(1) = ", fk(1)
print *, "adding 1 to fk(1)"
fk(1) = fk(1) + 1
print *, "fk(1) = ", fk(1)
end
mytest.f90
include "vars.f90"
include "sub.f90"
Компиляция выполняется с помощью следующей команды и gfortran:
f2py -c -m mytest mytest.f90
Наконец, вот тестовый сценарий для воспроизведения проблемы в консоли Python 3.6.5:
>>> import mytest
>>> mytest.vars.fk[1]
0.0
>>> mytest.vars.fk[1]=1.5000
>>> mytest.vars.fk[1]
1.5
>>> mytest.sub()
sub: fk(1) = 0.12500000000000000
adding 1 to fk(1)
fk(1) = 1.1250000000000000
>>> mytest.vars.fk[1]
1.890625
>>>
С моей точки зрения, fk (1) должно быть 2,5 в конце. Но, к сожалению, Fortran неправильно читает переменную в подпрограмме, хотя прямой доступ к переменной через консоль python отображает правильное значение. После изменения переменной консоль python также отображает неправильный номер.
Любой совет или предложение, чтобы решить / обосновать это поведение? Я ценю любую помощь! Спасибо!
P.S .: Сначала я подумал, что это зависит от того, как Python и Fortran по-разному обрабатывают массивы (Python начинается с индекса 0, а Fortran с индекса 1), но это не ошибка. mytest.vars.fk [0] не изменяется после вызова подпрограммы (начальное значение 0.0).