Как использовать f2py для вызова большого пакета фортрана

Мне нужно использовать математический пакет, полностью написанный на Фортране. Пакет находится не в одном файле, а скомпилирован в архивный файл (файл .a).

У меня есть полный исходный код. Я не знаю Фортран.

Я быстро прочитал документ f2py здесь:

http://docs.scipy.org/doc/numpy-dev/f2py/

Это просто не работает для меня. Есть ли лучшая документация или руководство по такой проблеме?

ИЗМЕНИТЬ

Как просили в комментариях. Я не уверен, правильно ли я понимаю (я не знаю Fortran), есть некоторая функция, которая, вероятно, будет полезна для меня:

  SUBROUTINE QP_initialize( data, control, inform )
  TYPE ( QP_data_type ), INTENT( INOUT ) :: data
  TYPE ( QP_control_type ), INTENT( OUT ) :: control
  TYPE ( QP_inform_type ), INTENT( OUT ) :: inform

  SUBROUTINE QP_solve( prob, data, control, inform, C_stat, B_stat )
  TYPE ( QPT_problem_type ), INTENT( INOUT ) :: prob
  TYPE ( QP_data_type ), INTENT( INOUT ) :: data
  TYPE ( QP_control_type ), INTENT( IN ) :: control
  TYPE ( QP_inform_type ), INTENT( OUT ) :: inform
  INTEGER, INTENT( OUT ), OPTIONAL, DIMENSION( prob%m ) :: C_stat
  INTEGER, INTENT( OUT ), OPTIONAL, DIMENSION( prob%n ) :: B_stat

person wonghang    schedule 14.12.2015    source источник
comment
Сколько функций Фортрана вам нужно вызвать, и можете ли вы привести один или два примера, включая их списки аргументов?   -  person John Zwinck    schedule 14.12.2015
comment
@JohnZwinck Я не знаю. Возможно, около 3-5 в производстве. Мне нужно попробовать разные алгоритмы, чтобы увидеть, какой из них работает для меня. Но код, который я могу свободно найти в Интернете, написан на фортране.   -  person wonghang    schedule 14.12.2015
comment
Я думаю, что на практике должен быть какой-то способ автоматического извлечения прототипа (подписи?) из кода фортрана, а затем я могу просто связать этот объектный файл с общей библиотекой. Наконец, я вызываю общую библиотеку, используя прототип в python?   -  person wonghang    schedule 14.12.2015
comment
Да, это не так уж и далеко. Однако можете ли вы привести нам один или два примера, включая их списки аргументов? Существует большая разница между вызовом функций, ожидающих int, строкой и массивом....   -  person John Zwinck    schedule 14.12.2015
comment
Я не уверен, правильно ли я понимаю. Я получаю один, который, вероятно, полезен для меня: SUBROUTINE QP_initialize( data, control, inform ) TYPE ( QP_data_type ), INTENT( INOUT ) :: data TYPE ( QP_control_type ), INTENT( OUT ) :: control TYPE ( QP_inform_type ), INTENT( OUT ) :: сообщить   -  person wonghang    schedule 14.12.2015
comment
Пожалуйста, добавьте эту дополнительную информацию к вопросу, а не оставляйте ее в комментариях.   -  person Warren Weckesser    schedule 14.12.2015
comment
какую-то структуру данных, как в C, и усложнить задачу?   -  person wonghang    schedule 14.12.2015
comment
OK. добавил информацию в вопрос   -  person wonghang    schedule 14.12.2015
comment
Итак, вы используете библиотеку Galahad, верно? galahad.rl.ac.uk/doc/qp.pdf См. этот вопрос для другого пользователя, пытающегося выполнить QP в Python: заголовок stackoverflow.com/questions/17009774/   -  person John Zwinck    schedule 14.12.2015
comment
да. Я также знаю о существовании нашей библиотеки, но я хочу проверить, лучше ли работает Galahad.   -  person wonghang    schedule 14.12.2015


Ответы (1)


Поскольку вы говорите, что вам нужно вызвать только 3-5 различных функций, один простой способ - использовать ctypes. Он включен в Python, и хотя на первый взгляд кажется, что он создан для вызова функций C, во многих системах Fortran по большей части совместим с C.

См. здесь: https://docs.python.org/2/library/ctypes.html< /а>

В качестве альтернативы вы можете использовать SciPy для квадратичной оптимизации программы: http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.optimize.minimize.html

person John Zwinck    schedule 14.12.2015
comment
Я не уверен, как ctypes поможет передать здесь производные типы Fortran. По крайней мере, я не вижу преимущества в отношении f2py. - person Vladimir F; 14.12.2015