Как использовать подпрограммы или функции FORTRAN в Mathematica?

Я заинтересован в вызове кодов fortran в сеансе Mathematica. Я узнал, что Mathlink предлагает способ сделать это. Но у меня мало знаний о C и ничего о C++. Кто-нибудь готов дать мне подробный пример?

Я использую Mathematica 8, MS Visual Studio 2008 и Intel Fortran 11. Система Windows 7 Home Premium.

Большое спасибо!


person unstable    schedule 18.11.2011    source источник
comment
groups.google.com/group/comp. soft-sys.math.mathematica/ может быть вам интересна.   -  person celtschk    schedule 18.11.2011
comment
@celtschk, это очень интересная ссылка. Спасибо.   -  person rcollyer    schedule 18.11.2011
comment
Ха! У меня возникает соблазн опубликовать аналогичный вопрос для COBOL: D   -  person Dr. belisarius    schedule 18.11.2011
comment
У вас есть очень маленький, но полный пример кода FORTRAN для тестирования возможных решений? Я думаю, что это возможно путем преобразования FORTRAN в C с помощью f2c, а затем с помощью LibraryLink для создания динамической библиотеки, которую может загрузить Mathematica.   -  person Arnoud Buzing    schedule 18.11.2011
comment
Это также может быть полезно. Для MathLink вам нужен только C, C++ вообще не нужен, а C довольно легко выучить. Но для его интеграции с Fortran вам может понадобиться немного узнать о соглашениях о вызовах, которые немного более продвинуты (если вы не знакомы с внутренним устройством машины).   -  person Szabolcs    schedule 18.11.2011
comment
Поиск вопросов c и fortran показывает это интересный ответ относительно соглашений о вызовах для использования fortran с c в gcc.   -  person rcollyer    schedule 18.11.2011
comment
Это стоит денег, но может быть полезным, даже если это другой Фортран: wolfram.com/products /приложения/mathcodef90   -  person Verbeia    schedule 19.11.2011
comment
Ответ, на который ссылается @rcollyer, на самом деле более общий. Связывание Fortran ISO C обеспечивает способ вызова Fortran из C или наоборот, что является частью языкового стандарта Fortran 2003 и, следовательно, зависит от компилятора и платформы. Он поддерживается многочисленными компиляторами в дополнение к gfortran и gcc. Он обходит старые проблемы, связанные с необходимостью знать соглашения о внутренних вызовах и искажение имен. Поэтому, если есть способ вызвать C из Mathematica, вы можете вызвать Fortran, используя ISO C Binding, чтобы компилятор Fortran заставил ваши процедуры Fortran использовать соглашения о вызовах C.   -  person M. S. B.    schedule 19.11.2011
comment
InterCall (также здесь) — это старая программа, которая разрешала доступ к подпрограммам Фортрана через MathLink. Очевидно, в Mma V3 была нарушена совместимость, и я не уверен, что произошло с тех пор...   -  person Simon    schedule 19.11.2011
comment
Как насчет использования NetLink, как показано здесь: groups.google.com/group/comp.soft-sys.math.mathematica/   -  person Rolf Mertig    schedule 20.11.2011
comment
@Mertig, это та же ссылка, что и ссылка, опубликованная celtschk. Спасибо вам обоим. Я пока не заставлял это работать таким образом, но, думаю, мне нужно заглянуть в руководство пользователя NetLink...   -  person unstable    schedule 21.11.2011
comment
Если вам удалось заставить это работать, вы можете скопировать свое решение в качестве ответа ниже (можно ответить на свой вопрос и принять ответ после двухдневного периода ожидания). Я думаю, что всем будет полезно иметь это в качестве ссылки.   -  person Szabolcs    schedule 21.11.2011
comment
@Szabolcs: Готово. Спасибо за совет. Это был мой первый вопрос здесь...   -  person unstable    schedule 21.11.2011


Ответы (1)


Ниже приведен явный пример, который мне удалось выполнить с помощью gfortan и gcc в системе Windows:

Я нашел этот блог Приключения в Mathlink. Полезно на конкретном примере. Я установил MinGW, чтобы использовать gfortran и gcc. После установки необходимо установить PATH, чтобы использовать gfortran и gcc без ввода пути каждый раз. Совет по добавлению PATH без перезагрузки системы: после добавления PATH откройте cmd и запустите set PATH=C: Затем закройте cmd, когда вы откроете его снова, с помощью echo %PATH%, вы увидите новый список путей. Я выполнил шаги в связанном блоге, адаптированном для Windows, с учебным примером addtwo:

Коды Mathematica пишут файл .bat и запускают его для создания исполняемого файла.

(* Write a .bat file to compile the MathLink template *.tm, FORTRAN codes *.f and 
C codes *.c files, and run it to create an executable file. *)
CreateExeF[s_String] := 
Module[{dir, libdir, bindir, BatCode, bat}, dir = NotebookDirectory[];
{libdir, bindir} = StringJoin[
  "\"", $InstallationDirectory, 
 "\\SystemFiles\\Links\\MathLink\\DeveloperKit\\Windows\\CompilerAdditions\\mldev32\\",
  #] & /@ {"lib\\", "bin\\"};
BatCode = StringJoin[
 "gfortran -c ", #, ".f -o ", #, "f.o
 gcc -c ", #, ".c -o ", #, ".o
 ",
 bindir, "mprep.exe\" ", #, ".tm -o ", #, "tm.c
 gcc -c ", #, "tm.c -o ", #, "tm.o
 gcc ", #, "tm.o ", #, ".o ", #, "f.o ",
 libdir, "ml32i3m.lib\" ", 
 "-lm -lpthread -mwindows -lstdc++ -o ", #
 ] &;
 (* write the .bat file *)
 bat = Export[FileNameJoin[{dir, # <> ".bat"}], BatCode[dir <> #], 
  "string"] &[s];
 (* run the .bat file *)
 Run[bat]]

Коды FORTRAN addtwo.f

   subroutine addtwof(i,j,k)
   integer i, j, k
   k = i + j
   end

Оболочка C addtwo.c

#include "mathlink.h"

int addtwo(int i, int j) 
{
  int res;
  addtwof_(&i, &j, &res);
  return res;
}

#if WINDOWS_MATHLINK

#if __BORLANDC__
#pragma argsused
#endif

int PASCAL WinMain( HINSTANCE hinstCurrent, HINSTANCE hinstPrevious, LPSTR lpszCmdLine,     int nCmdShow)
{
char  buff[512];
char FAR * buff_start = buff;
char FAR * argv[32];
char FAR * FAR * argv_end = argv + 32;

hinstPrevious = hinstPrevious; /* suppress warning */

if( !MLInitializeIcon( hinstCurrent, nCmdShow)) return 1;
MLScanString( argv, &argv_end, &lpszCmdLine, &buff_start);
return MLMain( (int)(argv_end - argv), argv);
}

#else

int main(int argc, char* argv[])
{
return MLMain(argc, argv);
}

#endif

Файл шаблона addtwo.tm такой же, как и в учебнике Тодда Гейли. Для полноты здесь также приводится:

:Begin:
:Function:       addtwo
:Pattern:        AddTwo[i_Integer, j_Integer]
:Arguments:      { i, j }
:ArgumentTypes:  { Integer, Integer }
:ReturnType:     Integer
:End:

:Evaluate:       AddTwo::usage = "AddTwo[i, j] gives the sum of two integer numbers i and j."
person unstable    schedule 21.11.2011
comment
какова ваша мотивация использовать Fortran из Mathematica? - person Rolf Mertig; 23.11.2011
comment
@Mertig, во-первых, большое спасибо за ваши чудесные усилия, посвященные FeynCalc! Чтобы быть конкретным, мне нужно вычислить некоторые амплитуды затухания, которые содержат довольно много четырехточечных петлевых интегралов. Затем мне нужно построить некоторые инвариантные распределения масс и графики Далица. Только с Mathematica это было бы очень медленно. Но в данном случае мне нужна Mathematica, потому что она предоставляет мне красивую графику. У вас есть лучшие предложения? - person unstable; 23.11.2011
comment
@Mertig, было бы еще лучше, если бы выражения можно было отправлять на FORTRAN (через C), а затем результаты возвращались обратно в Mathematica ... Возможно ли это? - person unstable; 23.11.2011
comment
да. Можно, но причастно. Некоторое время назад я немного поэкспериментировал с этим. Это слишком сложно, чтобы продолжать здесь, в Stackoverflow. Отправить мне письмо напрямую. - person Rolf Mertig; 23.11.2011