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

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

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

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

Ответы

Ответ 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 wrapper 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 такой же, как в учебнике Todd Gayley. Для полноты он также приводится здесь:

: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."