Cython, C и Фортран - PullRequest
       10

Cython, C и Фортран

4 голосов
/ 08 декабря 2010

Я хотел бы попросить вас о помощи для вызова функции fortran через функции C. Эти функции C будут использоваться в коде Python через Cython. Собирая вещи вместе, у меня есть такая схема:

Модуль Cython -> функция C -> Fortran, где -> означает «вызовы».

В настоящее время мне удалось вызвать функцию C из Cython, но мне трудно вызывать функцию fortran. Можете ли вы помочь мне? (Простой пример был бы великолепен).

Спасибо заранее. Редактировать: Я использую GCC 4.1.2. И Гфортран

Ответы [ 3 ]

7 голосов
/ 08 декабря 2010

Ссылка в первом ответе описывает устаревшие методы. Стало намного проще звонить на Фортран из C или C из Фортрана с добавлением привязки ISO C к Фортрану. Использование этой функции языка Fortran дает указание компилятору Fortran выдавать исполняемый код, двоично совместимый с C. Программисту не нужно «взламывать» соединение, и поскольку оно является частью языка, зависит ли оно от компилятора и платформы. Технически ISO C Binding является частью Fortran 2003, но он был доступен в течение нескольких лет во многих компиляторах, например, gfortran начиная с версии 4.3 и Intel ifort.

Чтобы вызвать подпрограмму или функцию Fortran из C, вы объявляете подпрограмму или функцию Fortran с опцией bind C и используете C-совместимые типы, предоставляемые в привязке для объявлений аргументов. Есть примеры в руководстве по gfortran в разделе «Программирование на разных языках». Поскольку привязка ISO C является частью языка, этот раздел руководства в значительной степени не зависит от компилятора. В предыдущих ответах есть и другие примеры здесь, о переполнении стека и в других местах в Интернете.

Вот фрагмент быстрого кода (непроверенный) объявления подпрограммы Фортрана подпрограммы, вызываемой из C:

subroutine test ( varint1, varflt2 )  bind ( C, name="MyTest" )

   use iso_c_binding

   integer (kind=c_int32_t), intent (in) :: varint1
   real (kind=c_float), intent (out) :: varflt2

Имя привязки C «MyTest» переопределяет имя Fortran - оно чувствительно к регистру, в отличие от Fortran. Не нужно беспокоиться о подчеркиваниях! Типы переменных должны быть очевидны ... см. Руководство gfortran или где-либо еще.

1 голос
/ 13 декабря 2010

Существует автоматизированный инструмент под названием fwrap, который генерирует привязки C, cython и python к процедурам fortran.Я думаю, что он все еще имеет бета-статус, но вы можете найти его полезным, ссылка здесь .

0 голосов
/ 08 декабря 2010

много хитов Google по этому вопросу (вызов Фортрана из C). попробуйте http://www.yolinux.com/TUTORIALS/LinuxTutorialMixingFortranAndC.html

Я звонил в Fortran-IV из Macro-10 35 лет назад, но у меня нет собственного опыта, которым можно поделиться.

...